似乎无法从脚本中使用githubusercontent

时间:2016-08-29 11:39:07

标签: perl github lwp-useragent

我一直在尝试从此脚本自动下载一些GitHub内容

#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;
use File::Slurp::Tiny qw(write_file);
use v5.16;
my $dir = shift || ".";
my $previo = shift || "IV-2015-16";
my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0");
for my $d ( qw( ejercicios objetivos practicas sesiones ) ) {
    my $url = "https://raw.githubusercontent.com/JJ/$previo/master/$d/README.md";
    my $response = $ua->get( $url );
    if ($response->is_success ) {
        my $file = $response->decoded_content;
        say "$url gave $file";
        write_file($file, "$dir/$d/README.md" ) || die "Can't write file";
    } else {
        die "Can't download this $url because ". $response->status_line;
    }
}

网址是正确的,但是

失败了
'_msg' => 'Can\'t connect to raw.githubusercontent.com:443'
'_rc' => 500

即返回500错误。

Can't download this https://raw.githubusercontent.com/JJ/IV-2015-16/master/ejercicios/README.md because 500 Can't connect to raw.githubusercontent.com:443 at /tmp/cosas.pl line 19.

at /tmp/cosas.pl第19行。

我尝试设置用户代理,但仍然无效。我想知道它是否需要身份验证,但是使用wget或只是将其放在URL栏上正确下载内容。任何的想法?也许某些API禁止或限制?

2 个答案:

答案 0 :(得分:1)

这个问题很老了,但人们很可能对 LWP 有同样的疑问。

首先,除非您安装 LWP::Protocol::https,否则 LWP 无法处理 HTTPS。

其次,您在评论中提到您知道您已连接,因为您收到 500 错误。这根本不是真的。 LWP 无法连接时使用 500。这可能是因为没有这样的主机,主机不接受连接,或者您没有连接到网络。所有这些都是500个错误。在这里,例如,我关闭网络,尝试连接,然后得到 500:

$ ping 1.1.1.1
ping: sending packet: No route to host
$ perl -MLWP::UserAgent -le 'print LWP::UserAgent->new->get(shift)->status_line' http://www.example.com
500 Can't connect to www.example.com:80 (nodename nor servname provided, or not known)

但是,我可以很好地获取您的文件:

$ perl -MLWP::UserAgent -le 'print LWP::UserAgent->new->get(shift)->status_line' https://raw.githubusercontent.com/JJ/IV-2015-16/master/ejercicios/README.md
200 OK

但是,如果您想获取文件,则可以使用 Contents API,它具有用于获取 README 的特定端点(尽管只是顶级的)。而且,您可以获取原始数据或解释数据。使用 API,您可以查看响应标头中的速率限制信息。

答案 1 :(得分:0)

这看起来像连接问题。您的浏览器可能使用代理。 wget也因为环境变量设置正确:http_proxyHTTPS_PROXYALL_PROXY ...

但是LWP :: UserAgent不会使用这些环境变量,除非明确告知。在用户代理构造之后添加此行:

$ua->env_proxy;
相关问题