sid*_*com 1 perl www-mechanize
以下脚本工作正常:
#!/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;
Run Code Online (Sandbox Code Playgroud)
但是当我更换线路时
my $req = $mech->post( $loginUrl, 'Content' => $loginData );
Run Code Online (Sandbox Code Playgroud)
同
my %hash = (
'username' => 'username',
'password' => 'password',
'deeplinkForward' => '%2Fselfcare%2Frestricted%2FprepareCoCo.do',
'x' => '84',
'y' => '7'
);
my $req = $mech->post( $loginUrl, 'Content' => \%hash );
Run Code Online (Sandbox Code Playgroud)
它不再起作用(脚本有效,但登录没有).有什么东西可以吗?
你必须unescape deeplinkForward:
'deeplinkForward' => '/selfcare/restricted/prepareCoCo.do',
Run Code Online (Sandbox Code Playgroud)
否则,WWW :: Mechanize认为您要发送文字%符号,并帮助您为它们转义它们.
要查看出现了什么问题,请尝试在该$mech->post行之前添加此代码:
use HTTP::Request::Common 'POST';
print POST( $loginUrl, 'Content' => $loginData )->as_string;
print POST( $loginUrl, 'Content' => \%hash )->as_string;
Run Code Online (Sandbox Code Playgroud)
它们应该是相同的,除了字段的顺序.
可以想象服务器要求按顺序列出字段(它不应该,但是......).在这种情况下,您可以使用数组而不是散列(散列不保留排序).只需更换%hash与@fields到处出现.
print POST( $loginUrl, 'Content' => \@fields )->as_string;
Run Code Online (Sandbox Code Playgroud)