Почему WWW :: Mechanize и входные данные ломаются, когда я переключаюсь со строки запроса на хеш? - PullRequest
1 голос
/ 27 февраля 2010

Следующий скрипт работает нормально:

#!/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 ]

5 голосов
/ 27 февраля 2010

Вы должны убежать 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;
0 голосов
/ 27 февраля 2010

У меня нет механизации на месте, но вы можете попробовать это и посмотреть, как это происходит

my $req = $mech->post( $loginUrl, \%hash);
...