如何使用Perl的LWP登录Web应用程序?

5
我想编写一个脚本来登录到一个Web应用程序,然后转移到应用程序的其他部分。
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use Data::Dumper;

$ua = LWP::UserAgent->new(keep_alive=>1);

my $req = POST "http://example.com:5002/index.php",
[ user_name     => 'username',
  user_password => "password",
  module        => 'Users',
  action        => 'Authenticate',
  return_module => 'Users',
  return_action => 'Login',
];

my $res = $ua->request($req);
print Dumper(\$res);
if ( $res->is_success ) {
    print $res->as_string;
}

当我尝试这段代码时,无法登录应用程序。返回的HTTP状态码是302,即找到,但没有数据。
如果我使用所有必需的用户名/密码并发布,则应该返回应用程序的主页并保持连接以移动应用程序的其他部分。
3个回答

15

您可以尝试使用WWW::Mechanize来完成此操作:

Mech支持执行一系列页面抓取操作,包括跟随链接和提交表单。每个已抓取的页面都会被解析,并且其中的链接和表单会被提取出来。您可以选择一个链接或一个表单,填写表单字段并获取下一页。Mech还会存储您访问过的URL历史记录,这些记录可以进行查询和再次访问。


9
我猜测 LWP 没有遵循重定向:
push @{ $ua->requests_redirectable }, 'POST';

为什么不使用WWW::Mechanize


1

我已经使用LWP登录了很多网站并处理了其中的内容,所以做你想做的事情应该没有问题。你的代码看起来不错,但我有两个建议:

  1. 如上所述,你可能需要使请求可重定向
  2. 你还需要启用cookies: $ua->cookie_jar( {} );

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接