1

以下脚本工作正常:

#!/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 );

它不再起作用(脚本起作用,但登录不起作用)。有什么磨损的吗?

4

2 回答 2

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;
于 2010-02-27T10:09:11.780 回答
0

我没有机械化,但你可以试试这个,看看效果如何

my $req = $mech->post( $loginUrl, \%hash);
于 2010-02-27T08:30:40.580 回答