当我从查询字符串切换到哈希时,为什么WWW :: Mechanize和login-data会中断?

时间:2010-02-27 08:12:25

标签: 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;

但当我更换线

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 );

它不再起作用(脚本有效,但登录没有)。有什么事吗?

2 个答案:

答案 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);