WWW: механизировать выбор формы
Я пытаюсь войти в Youtube с помощью WWW: Механизировать и использовать формы (), чтобы распечатать все формы на странице после входа в систему. Мой сценарий входит в систему успешно, а также успешно переходит на Youtube.com/inbox; Однако по какой-то причине Mechanize не видит никаких форм на Youtube.com/inbox. Это просто возвращает пустым. Вот мой код:
#!"C:\Perl64\bin\perl.exe" -T
use strict;
use warnings;
use CGI;
use CGI::Carp qw/fatalsToBrowser/;
use WWW::Mechanize;
use Data::Dumper;
my $q = CGI->new;
$q->header();
my $url = 'https://www.google.com/accounts/ServiceLogin?uilel=3&service=youtube&passive=true&continue=http://www.youtube.com/signin%3Faction_handle_signin%3Dtrue%26nomobiletemp%3D1%26hl%3Den_US%26next%3D%252Findex&hl=en_US<mpl=sso';
my $mechanize = WWW::Mechanize->new(autocheck => 1);
$mechanize->agent_alias( 'Windows Mozilla' );
$mechanize->get($url);
$mechanize->submit_form(
form_id => 'gaia_loginform',
fields => { Email => 'myemail',Passwd => 'mypassword' },
);
die unless ($mechanize->success);
$url = 'http://www.youtube.com/inbox';
$mechanize->get($url);
$mechanize->form_id('comeposeform');
my $page = $mechanize->content();
print Dumper($mechanize->forms());
Mechanize не может видеть никаких форм на youtube.com/inbox, однако, как я уже сказал, я могу распечатать все формы по исходной ссылке, независимо от того, что я изменяю на...
Заранее спасибо.
1 ответ
Как всегда, одним из лучших подходов к отладке является print
что вы получаете, и проверьте, если это то, что вы ожидали. Это относится и к вашей проблеме.
В вашем случае, если вы print $mechanize->content()
вы увидите, что вы не получили ожидаемую страницу. YouTube хочет, чтобы вы выполнили редирект JavaScript, чтобы выполнить междоменный вход в систему. У вас есть несколько вариантов здесь:
- разобрать возвращенный контент вручную - т.е.
/location\.replace\("(.+?)"/
- попробуй, чтобы твой код анализировал JavaScript (взгляни на WWW:: Scripter)
- [рекомендуется] использовать API YouTube для управления почтовыми ящиками