等待 CloudFlare DDOS 保护 LWP Perl

Spe*_*uex 3 regex perl lwp lwp-useragent cloudflare

编辑:最终使用 WWW::Mechanize::Firefox。我在下面回答了我自己的问题。

我正在尝试访问一个网站并下载它的页面。网站上的cloudflare DDOS防护偶尔会出现,我无法让LWP通过。我可以成功地检测到一个页面带有正则表达式的 cloudflare 启动页面,/Ray ID: [a-f0-9]*/但是每当我尝试再次连接时,我都会得到带有新 Ray ID 的相同启动屏幕。这是一个(精简的)代码示例:

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0');
$signin_url = 'my url';
$signin_page = $ua->get($signin_url);
if($signin_page->content =~ /Ray ID: ([a-f0-9]*)/i) {
     print "DDOS protection page here\n";
     #more code to retry, but just gets back into this part of the IF
 } else {
     print "Not the DDOS page\n";
     #now I would save to file
}
Run Code Online (Sandbox Code Playgroud)

由于那不起作用,我需要能够以另一种方式做到这一点。

Ste*_*ich 5

DDOS 保护拦截请求,设置 cookie,然后将您重定向到目标页面。您必须在下一个请求中提交从拦截中获得的 cookie,才能通过 DDOS 保护。如果您创建一个 cookie jar,LWP将为您执行此操作。

LWP::UserAgent->new( cookie_jar => {} )
Run Code Online (Sandbox Code Playgroud)

WWW::Mechanize是 LWP::UserAgent 的一个子类,它为您将该参数传递给 LWP::UserAgent,因此您也可以使用

 use WWW::Mechanize;
 my $ua = WWW::Mechanize->new;
Run Code Online (Sandbox Code Playgroud)

LWP::UserAgentWWW::MechanizeUA有cookie jar时,get会自动接受cookie,跟随重定向,在后续请求中提交cookie。