Perl WWW :: Механизировать проблему с cookie - PullRequest
2 голосов
/ 12 августа 2011

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

Вот код.Сначала я создаю объект меха вместе с его jar-файлом 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-> обратно после сохраненияизображение с картинки?

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

Ответы [ 2 ]

1 голос
/ 14 августа 2011

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

  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);
1 голос
/ 12 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...