Perl WWW :: Mechanize cookie问题

时间:2011-08-12 15:20:01

标签: perl cookies captcha mechanize

我正在尝试从首先要求验证码的网站自动收集链接。 为此,我捕获验证码图像,以便可以在外部解决,然后将解决方案作为表单字段的一部分提交。 不知怎的,它不起作用。我怀疑是一个cookie问题,但我不确定,如果有人能解决这个问题我会很感激。

这是代码。首先,我创建mech对象及其cookie jar:

$cookie_jar = HTTP::Cookies->new;
$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar);
$agent->get("http://www.site.com/page.html");

我找到感兴趣的链接:

$link = $agent->find_link(tag => "a", text_regex => qr{regex});
$url = $link->url;
$agent->get($url);

在此阶段,该网站提供验证码。我提取图像并将其保存,以便人类可以解决,然后输入解决方案继续:

$captcha = $agent->find_image(url_regex => qr{captcha\.php});
$agent->get($captcha->url, ':content_file' => 'captcha.jpg');
print "Please solve captcha at http://my.own.site/captcha.jpg\n";
$agent->back;
print "Enter answer: ";
$solved = <>;

现在脚本已手动输入验证码解决方案,它可以通过提交表单继续:

$agent->form_with_fields('code');
$agent->set_fields(code => $solved, action => 'download');
$agent->submit;

然而,这不起作用。结果是页面再次询问验证码,而不是预期的页面,其中包含我之后的信息。

我想知道在保存验证码图像后,当我执行$ agent-&gt;时,cookie是否会丢失/重置?

感谢任何提示!

2 个答案:

答案 0 :(得分:1)

您访问的网站很可能有一些方法可以检测并阻碍免费冲浪;这意味着,例如,返回一个或多个页面然后再转发。这通常是通过将每个页面的唯一ID相关联来完成的,这样当您提交两次ID时,很明显您会向后冲浪,然后再从那里继续前进。正如您所说,这与使用back

有关

我想知道你真的需要去back。关键是下载代理的外部图像,以便不修改代理状态。您可以使用第二个代理或curl,因为您有图像的直接URL ...

答案 1 :(得分:1)

我找到了一种更简单的方法来处理这个问题。这是:

  1. 使用网络浏览器访问该网站
  2. 解决验证码
  3. 打开生成的Cookie并记下sessionid
  4. 然后在脚本中,使用该sessionid设置cookie
  5. 像魅力一样。

    $phpsessid = '4d93c8f247b49780';
    $cookie_jar = HTTP::Cookies->new;
    $agent = WWW::Mechanize->new(cookie_jar => $cookie_jar);
    $agent->get($url);
    $cookie_jar->clear;
    $cookie_jar->set_cookie(undef, "SESSIONID", $sessionid, "/", $domain, undef, 1, 0, undef, 1);