相同的代码不同的URL不起作用?

时间:2017-03-21 10:03:37

标签: perl post

好的,这让我很生气。我目前在我们的服务器上运行后台脚本,每5分钟登录我们的SagePay帐户,并在我们的本地数据库中更新当前登录的用户。

SagePay不久前推出了一个新的管理系统,但由于许多投诉使旧版本保持运行,所以我从不打扰更新我的脚本。 SagePay现在决定退役旧版本,所以我别无选择。

以下代码只是登录SagePay的脚本的第一部分:

use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;
use HTTP::Headers;
use HTTP::Request::Common qw(POST);

my $request = "";
my $content = "";
my $req = "";

my $cookie_jar = HTTP::Cookies->new();
my $ua = LWP::UserAgent->new();
$ua->cookie_jar($cookie_jar);
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');

# LOGIN TO SAGEPAGY
$req = (POST 'https://portal.sagepay.com/myoldskool/loginpage.asp',
["vendorname" => "MYVENDORNAME",
"username" => "MYUSERNAME",
"password" => "MYPASSWORD",
"clickedButton" => "login"]);

$request = $ua->request($req);
$content = $request->content;
print $content;

此代码每次都能完美运行并打印SagePay仪表板的HTML,就像您登录时一样。 新的POST网址是https://portal.sagepay.com/mysagepay/j_spring_security_check,并且需要传递的参数几乎相同,所以从技术上讲,我只需要对代码进行以下更改即可:

$req = (POST 'https://portal.sagepay.com/mysagepay/j_spring_security_check',
["inp_vspvendorname" => "MYVENDORNAME",
"inp_username" => "MYUSERNAME",
"inp_password" => "MYPASSWORD",
"CSRFToken" => ""]);

当我在我的脚本$content中更改此代码时,不打印任何内容,我不能为我的生活找出原因。我甚至尝试过使用HttpRequester Firefox插件并将相同的参数发送到同一个网址,并按预期返回仪表板HTML。

$request->status_line已找到' 302'。

显然,我无法向您提供SagePay的登录详细信息,但即使只是将其返回HTML进行无效登录,至少我取得了进展。我已经被困在这几天了,我希望有人可以提供帮助。

1 个答案:

答案 0 :(得分:2)

您收到了HTTP 302响应,这是一个重定向。默认情况下,LWP :: UserAgent不遵循POST请求的重定向。要更改此设置,请在发送请求之前更改用户代理的requests_redirectable阵列:

push @{ $ua->requests_redirectable }, 'POST';
my $response = $ua->request($req);