Проблема Perl WWW::Mechanize cookie

Я пытаюсь автоматизировать сбор ссылок с сайта, который сначала запрашивает капчу. Для этого я фиксирую изображение капчи, чтобы ее можно было решить извне, а затем отправляю решение как часть полей формы. Почему-то не работает. Я подозреваю, что проблема с файлами cookie, но я не уверен, и был бы признателен, если бы кто-нибудь мог это понять.

Вот код. Сначала я создаю объект меха вместе с его банкой с печеньем:

$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;

Однако это не работает. В результате страница снова запрашивает капчу, а не ожидаемая страница с информацией, которую я ищу.

Мне интересно, теряется ли/сбрасывается ли cookie, когда я делаю $agent->back после сохранения изображения с картинки?

Спасибо за любые подсказки!


person emx    schedule 12.08.2011    source источник


Ответы (2)


Я нашел гораздо более простой способ справиться с этой проблемой. Вот:

  1. Посетите сайт с помощью веб-браузера
  2. Решите капчу
  3. Откройте сгенерированный файл cookie и обратите внимание на идентификатор сеанса.
  4. Затем в сценарии установите файл cookie с этим идентификатором сеанса.

Работает как шарм.

$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);
person emx    schedule 14.08.2011

Весьма возможно, что сайт, к которому вы обращаетесь, имеет какие-то средства обнаружения и препятствует свободному просмотру; это означает, например, вернуться на одну или несколько страниц назад, а затем снова вперед. Обычно это делается путем связывания с каждой страницей уникального идентификатора, так что, когда вы отправляете идентификатор дважды, становится ясно, что вы просматривали назад, а затем снова перешли оттуда. Как вы говорите, это связано с использованием back.

Что меня интересует, так это то, действительно ли вам нужно идти back. Ключевым моментом является загрузка изображения вне агента, чтобы состояние агента не изменялось. Вы можете использовать для этого второго агента или curl, поскольку у вас есть прямой URL-адрес изображения...

person sergio    schedule 12.08.2011
comment
Спасибо за ваши комментарии. Я не буду использовать уникальный идентификатор, но проверю. Однако URL-адрес изображения является динамическим (captcha.php), поэтому получить его снаружи не получится. - person emx; 12.08.2011