Как мне получить проверочный код текстовой формы при автоматическом доступе к сайту в Perl?
-
22-09-2019 - |
Вопрос
Я играю с Win32:: IE:Mechanize, чтобы попытаться автоматически получить доступ к некоторым сайтам, требующим аутентификации.Пока я добился умеренного успеха, например, я могу автоматически входить в свой почтовый ящик yahoo.Но я обнаружил, что многие сайты используют какой-то механизм проверки изображений, который, возможно, называется CAPTCHA.Я ничего не могу им сделать.Но один из сайтов, к которым я пытаюсь получить автоматический доступ, использует обычный текстовый проверочный код.Он состоит из четырех цифр, выбираемых и копируемых.Но их нет в исходном файле, который можно извлечь с помощью
$mech->content;
Я искал ключевое слово, которое появляется на веб-странице, но не в исходном файле, по всем файлам во временных файлах Интернета, но все еще не могу его найти.
Есть какие-нибудь идеи, что происходит?Я подозревал, что проверочный код был каким-то образом скрыт в каком-то файле cookie, но, похоже, я не могу его найти: (
Ниже приведен код, который выполняет все требования к полям, за исключением кода подтверждения:
use warnings;
use Win32::IE::Mechanize;
my $url = "http://www.zjsmap.com/smap/smap_login.jsp";
my $eccode = "myeccode";
my $username = "myaccountname";
my $password = "mypassword";
my $verify = "I can't figure out how to let the script get the code yet"
my $mech = Win32::IE::Mechanize->new(visible=>1);
$mech->get($url);
sleep(1); #avoids undefined value error
$mech->form_name("BaseForm");
$mech->field(ECCODE => $eccode);
$mech->field(MEMBERACCOUNT => $username);
$mech->field(PASSWORD => $password);
$mech->field(verify => $verify);
$mech->click();
Как всегда, мы будем очень признательны за любые предложения / комментарии :)
Обновить
Я придумал не очень умный способ решить эту проблему.Пожалуйста, прокомментируйте мой собственный ответ, опубликованный ниже.Спасибо, как всегда :)
Решение 4
Спасибо james2vegas, зоулу и Шобану.
Я, наконец, самостоятельно придумал не очень умный, но, по крайней мере, работоспособный способ решения проблемы, которую я описал здесь.Я хотел бы поделиться этим здесь.Я думаю, что подход, предложенный @james2vegas, вероятно, намного лучше...но в любом случае я учусь на этом пути.
Мой подход заключается в следующем:
Хотя кода подтверждения нет в исходном файле, но поскольку он по-прежнему выбирается и копируется, я могу позволить своему скрипту скопировать все со страницы входа в систему, а затем извлечь код подтверждения.
Для этого я использую функции sendkeys в модуле Win32::Guitest, чтобы выполнить "Выбрать все" и "Скопировать" на страницу входа в систему.
Затем я использую Win32: Clipboard для получения содержимого буфера обмена, а затем регулярное выражение для извлечения кода.Что- то вроде этого:
$verify = Win32::Clipboard::GetText();
$verify =~ s/.* (\d{4}).*/$1/msg;
Несколько мыслей:
Случайное число генерируется чем-то вроде этого в Perl мой $random_number = int (rand(8999)) + 1000;#var random_number = ранд (1000,10000);И затем он проверяет, является ли $verify == $random_number .Я не знаю, как определить значение $ random_number только для одного сеанса.Я думаю, что это хранится где-то в памяти.Если бы я мог зафиксировать значение напрямую, то у меня не было бы столько проблем с использованием того или иного дополнительного модуля.
Другие советы
Это причина, по которой они существуют.Чтобы остановить программу, подобную вашей, чтобы делать автоматизированные вещи ;-)
КАПЧА или Captcha - это тип теста "запрос-ответ", используемого в вычислениях для гарантии того, что ответ не генерируется компьютером.
Это, по-видимому, неуместное число.Страница использует его в 3 местах:генерируя его;отображение его в форме рядом с полем ввода для него;и проверка того, что входное значение равно выбранному случайным образом числу.То есть это проверка только для клиента.Тем не менее, если вы отключите javascript, я предполагаю, что, похоже, важные файлы cookie не будут установлены.Если вы можете выполнить JavaScript в контексте страницы (вы должны быть в состоянии сделать это с помощью вызова метода get и URI javascript), вы могли бы изменить значение random_number на f.e.42 и заполните это в форме.
Код вставляется с помощью JavaScript – отключите JS, перезагрузите страницу и увидите, как она исчезнет.Вам нужно порыться в JS-коде, чтобы получить представление о том, откуда он взят и как его воспроизвести.