需要重写这个perl函数。作为libperl,UserAgent被阻止

时间:2017-11-30 22:13:22

标签: perl lwp

我处理的其中一个主机阻止我从他们的网站下载图像。我已与他们交谈,他们已要求我将用户代理libwww-perl/更改为Mozilla/5.0。图像链接是http和https。

我尝试了各种选项,例如

my $ua = LWP::UserAgent->new();
$ua->ssl_opts( verify_hostnames => 0 );

但我无法与getstore合作。非常感谢任何帮助。

    sub storeimage {
  my $image = shift;
  if ($image =~ m#^https?://.+\/(.+\.)([a-z]+)$#i) {
    my $ext = $2;
    my $filename = "$1$2";
    if (exists $wantedfiles{$ext}) {
      my $savepath = $localwantedpath.$wantedfiles{$ext};
      if (!-f $savepath.$filename) {
        unless (is_success(getstore($image, $savepath.$filename))) {
          _warn("Couldn't download file $image to $savepath.");
          return '';
        }

    if ( $ext =~ /jpg|jpeg/oi ) {
      system("mogrify -resize '800>' -quality 70 $savepath$filename");

      #mogrify -resize 800x800  -quality 70 -format jpg $imageloc
    }

      }
      return $wantedfiles{$ext}.$filename;

    }
  }
  return '';
}

3 个答案:

答案 0 :(得分:4)

我不确定你为什么要搞乱SSL选项。主机名验证与HTTP标头无关。

您需要的是

my $ua = LWP::UserAgent->new(agent => 'Mozilla/5.0');

设置agent属性。

要使用$ua对象复制getstore函数(来自LWP::Simple),您需要执行以下操作:

unless ($ua->request(HTTP::Request->new('GET' => $image), $savepath.$filename)->is_success) {
    ...
}

请参阅request方法。

或者可以考虑使用mirror

$ua->mirror($your_url, $your_filename)

但它的行为有点不同。

答案 1 :(得分:4)

LWP::Simple has a package variable与用户代理。

您可以使用它来更改代理字符串,但仍然使用getstore

use LWP::Simple;

$LWP::Simple::ua->agent("Mozilla...");
getstore($url, $file);

答案 2 :(得分:2)

my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0' );