Почему Perl WWW :: Mechanize не может найти форму по именам полей? - PullRequest
0 голосов
/ 23 апреля 2010
#!/usr/bin/perl

use WWW::Mechanize;
use Compress::Zlib;

my $mech = WWW::Mechanize->new();

my $username = ""; #fill in username here
my $keyword = "";  #fill in password here

my $mobile = $ARGV[0];
my $text = $ARGV[1];

$deb = 1;

print length($text)."\n" if($deb);

$text = $text."\n\n\n\n\n" if(length($text) < 135);

$mech->get("http://wwwl.way2sms.com/content/index.html");
unless($mech->success())
{
 exit;
}
$dest = $mech->response->content;

print "Fetching...\n" if($deb);

if($mech->response->header("Content-Encoding") eq "gzip")
{
 $dest = Compress::Zlib::memGunzip($dest);
 $mech->update_html($dest);
}

$dest =~ s/<form name="loginForm"/<form action='..\/auth.cl' name="loginForm"/g;


$mech->update_html($dest);
$mech->form_with_fields(("username","password"));
$mech->field("username",$username);
$mech->field("password",$keyword);

print "Loggin...\n" if($deb);

$mech->submit_form();

$dest= $mech->response->content;

if($mech->response->header("Content-Encoding") eq "gzip")
{
        $dest = Compress::Zlib::memGunzip($dest);
        $mech->update_html($dest);
}

$mech->get("http://wwwl.way2sms.com//jsp/InstantSMS.jsp?val=0");
$dest= $mech->response->content;
if($mech->response->header("Content-Encoding") eq "gzip")
{
        $dest = Compress::Zlib::memGunzip($dest);
        $mech->update_html($dest);
}

print "Sending ... \n" if($deb);

$mech->form_with_fields(("MobNo","textArea"));
$mech->field("MobNo",$mobile);
$mech->field("textArea",$text);
$mech->submit_form();

if($mech->success())
{
print "Done \n" if($deb);
}
else
{
print "Failed \n" if($deb);
exit;
}

$dest =  $mech->response->content;
if($mech->response->header("Content-Encoding") eq "gzip")
{
        $dest = Compress::Zlib::memGunzip($dest);
  #print $dest if($deb);
}

if($dest =~ m/successfully/sig)
{
  print "Message sent successfully" if($deb);
}

exit;

При запуске этот код останавливается с ошибкой:

Нет формы с запрошенными полями в строке ./sms.pl 65
Невозможно вызвать метод "значение "в неопределенном значении в /usr/share/perl5/vendor_perl/WWW/Mechanize.pm строка 1348.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

Я бы предположил, что в http://wwwl.way2sms.com//jsp/InstantSMS.jsp?val=0 нет формы с полями"MobNo" и "textArea", чего на самом деле нет, поскольку на странице по этому URL отсутствует даже тег <body> .

1 голос
/ 31 октября 2011
$dest =~ s/<form name="loginForm"/<form action='..\/auth.cl' name="loginForm"/g;

найдите вышеуказанную строку в скрипте и замените ее на следующую

$dest =~ s/<form name="loginForm"/<form action='..\/Login1.action' name="loginForm"/ig; 

Это необходимо, поскольку недавно way2sms реструктурировал свою домашнюю страницу, и поэтому форма auth.cl была переименована в Login1.action

0 голосов
/ 24 апреля 2010

Когда я сталкиваюсь с такими проблемами, я печатаю всю HTML-страницу, чтобы я мог на нее взглянуть. Форма, которую вы ожидаете, вероятно, не там. Я подозреваю, что вы не получаете страницу, о которой вы думаете.

Первая страница выполняет небольшую обработку JavaScript для отправки формы. Поскольку WWW :: Mechanize не обрабатывает для вас ни одного из этих битов, я предполагаю, что ваша первая отправка формы как-то неполна или недействительна, поэтому следующая страница, которую вы получаете, является своего рода страницей ошибок. Это довольно распространенная проблема с динамическими сайтами.

Вы также можете сравнить, что делает мех с тем, что делает браузер с поддержкой JavaScript. Используйте какой-нибудь HTTP-сниффинг-инструмент для наблюдения за транзакциями. Делает ли интерактивный браузер что-то большее, чем мех?

...