以下脚本可以正常工作:
#!/usr/bin/env perl
use strict; use warnings;
use Data::Dumper;
use WWW::Mechanize;
my $loginData = "userName=username&password=password&deeplinkForward=%2Fselfcare%2Frestricted%2FprepareCoCo.do&x=84&y=7";
my $loginUrl = "https://www.login.login/login.do";
my $mech = WWW::Mechanize->new( show_progress => 1 );
my $req = $mech->post( $loginUrl, 'Content' => $loginData );
my $content = $req->content();
print Dumper $content;
但当我更换线
my $req = $mech->post( $loginUrl, 'Content' => $loginData );
与
my %hash = (
'username' => 'username',
'password' => 'password',
'deeplinkForward' => '%2Fselfcare%2Frestricted%2FprepareCoCo.do',
'x' => '84',
'y' => '7'
);
my $req = $mech->post( $loginUrl, 'Content' => \%hash );
它不再起作用(脚本有效,但登录没有)。有什么事吗?
答案 0 :(得分:5)
你必须unescape deeplinkForward
:
'deeplinkForward' => '/selfcare/restricted/prepareCoCo.do',
否则,WWW :: Mechanize认为您要发送文字%符号,并帮助您为它们转义。
要查看出现了什么问题,请尝试在$mech->post
行之前添加此代码:
use HTTP::Request::Common 'POST';
print POST( $loginUrl, 'Content' => $loginData )->as_string;
print POST( $loginUrl, 'Content' => \%hash )->as_string;
它们应该是相同的,除了字段的顺序。
可以想象服务器要求按顺序列出字段(它不应该,但是......)。在这种情况下,您可以使用数组而不是散列(散列不保留排序)。只需将%hash
替换为@fields
,无论它出现在哪里。
print POST( $loginUrl, 'Content' => \@fields )->as_string;
答案 1 :(得分:0)
我没有机械化,但你可以尝试一下,看看它是怎么回事
my $req = $mech->post( $loginUrl, \%hash);