2011-02-04 2 views
1

Я пытаюсь войти на Youtube с помощью WWW: Механизировать и использовать формы() для распечатки всех форм на странице после входа в систему. Мой скрипт успешно регистрируется, а также успешно переходит на Youtube .com/Входящие; Однако по какой-то причине Mechanize не может видеть какие-либо формы на Youtube.com/inbox. Он просто возвращает пустое. Вот мой код:WWW: Механизировать форму Выбрать

#!"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&ltmpl=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, однако, как я уже сказал, я не могу печатать все формы из начального звена, независимо от того, что я могу изменить его ...

Заранее благодарим.

+2

У меня нет учетной записи Youtube, поэтому я не могу проверить запуск вашей программы. Я предполагаю, что это обычная проблема создаваемых JavaScript форм; когда вы печатаете '$ page', вы не увидите их в HTML. Если это действительно так, либо используйте один из трех классов класса Mechanize, совместимых с JS, или, лучше, отказаться от скрининга экрана и использовать API вместо этого: см. Http://youtube.com/dev и [WebService :: GData :: YouTube] (http://p3rl.org/WebService::GData::YouTube). – daxim

ответ

2

Как всегда, один из лучших подходов к отладке - это print, что вы получаете, и убедитесь, что это то, чего вы ожидали. Это относится и к вашей проблеме.

В вашем случае, если вы print $mechanize->content(), вы увидите, что не получили страницу, которую ожидаете. YouTube хочет, чтобы вы выполнили переадресацию JavaScript, чтобы завершить действие входа в междоменный вход. У вас есть несколько вариантов здесь:

  • разобрать возвращаемый содержание вручную - т.е. /location\.replace\("(.+?)"/
  • попробовать, чтобы ваш код разбора JavaScript (взгляните на WWW::Scripter)
  • [рекомендуется] использовать YouTube API для управления почтового ящика
+0

Спасибо за советы alessandro! Единственное, когда я печатаю содержимое, он отображает страницу входящих сообщений точно так, как я ожидал бы ... она просто не может видеть никаких форм на странице. Как он может отображать правильную страницу входящих сообщений при печати содержимого и правильно просматривать исходный текст печатного контента в браузере (когда я просматриваю источник), но не могу увидеть этот источник с помощью www: mechanize? – nicktendo

+0

@ user589294 - Если результат вашего последнего '-> get' не содержит тега

с id =" composeform ", как вы ожидаете, тогда он может быть сгенерирован с помощью JavaScript, как сказал daxim, или его можно исключить потому что сервер обнаруживает, что у вас есть браузер, отличный от JavaScript, или множество других причин, связанных с сложностью приложения YouTube. Вы могли только попытаться использовать Firebug и обнюхивать каждое сообщение между вашим браузером и сервером и имитировать его с помощью Mech. Я не даю вам решения, я знаю, но метод исследования. Единственный серьезный совет, который я могу вам дать, это использовать публичный API. – Alessandro

+0

Спасибо, ребята, я теперь использую публичный API. Хороший совет. – nicktendo