首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用UserAgent登录

无法使用UserAgent登录
EN

Stack Overflow用户
提问于 2014-12-24 16:59:04
回答 2查看 85关注 0票数 0

我已经用下面的代码登录了。现在我一天只能做一次。然后我无法登录,但在响应中获得登录页面。但当我从下面的代码打印$reqstr并将其粘贴到浏览器(如火狐)时,我就可以登录了。Wget不能工作,不能工作。只有普通的浏览器。有时,我似乎登录了,但只得到了这样的内容:

代码语言:javascript
复制
"<html>\cJ<head>\cJ\cI<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\"><meta http-equiv=\"expires\" content=\"0\"><meta http-equiv=\"pragma\" content=\"no-cache\">\cJ\cI<meta http-equiv=\"refresh\" content=\"0; URL='https://www.address.com/'\">\cJ</head>\cJ</html>\cJ"

我还注意到,虽然我不能登录,但我在调试器中获得了这一部分:

代码语言:javascript
复制
_uri_canonical' => URI::https=SCALAR(0x17dad28)
         -> REUSED_ADDRESS
   'handlers' => HASH(0x22dc0c0)
      'response_data' => ARRAY(0x22ee8b8)
         0  HASH(0x22d9a48)
            'callback' => CODE(0x22dba30)
               -> &LWP::UserAgent::__ANON__[/usr/lib/perl5/vendor_perl/5.10.0/LWP/UserAgent.pm:682] in /usr/lib/perl5/vendor_perl/5.10.0/LWP/UserAgent.pm:679-682
         1  HASH(0x22eea08)
            'callback' => CODE(0x22d9cb8)
               -> &LWP::Protocol::__ANON__[/usr/lib/perl5/vendor_perl/5.10.0/LWP/Protocol.pm:138] in /usr/lib/perl5/vendor_perl/5.10.0/LWP/Protocol.pm:135-138

有什么线索吗?

代码如下:

代码语言:javascript
复制
my $b = LWP::UserAgent->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/31.2.0',);


my $cookie_jar = HTTP::Cookies->new(
    file => 'lwp_cookies.txt',
    autosave => 1,
    ignore_discard => 1,
);
$cookie_jar->clear;
$cookie_jar->clear_temporary_cookies;
$b->cookie_jar($cookie_jar);
my $url = "https://www.address.com";

my $r = $b->get($url);
$r->decoded_content =~ /FORM ACTION="(.*?)" METHOD/msgi;
my $a = "$url$1";
print $a."\n";
my $reqstr =  $a."&LoginAction=Login&Number=55555&KPassword=passw&UserID=uid";
my $req = HTTP::Request->new(POST => $reqstr);
$req->header('Host', 'www.address.com');
$req->header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0');
$req->header('Connection', 'keep-alive');
$req->header('Accept',  'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
my $c = $b->request($req);
EN

回答 2

Stack Overflow用户

发布于 2014-12-27 03:51:33

您需要重新请求该页面,并通过LWP::UserAgentreferer()添加推荐人(如果您不执着于该模块,请参阅我的第二个答案)。

代码语言:javascript
复制
sub login { # Code not tested and not really compilable, just a stub for you
    my (@other_args, $url, $referrer_url) = @_;
    # Add your login code from the question, up to calling $b->request()
    $req->referer($referrer_url) if $referrer_url;
    my $c = $b->request($req);
    return $c; # Or return the response?
}

my $result1 = login($original_login_url); #first try
# Obtain the redirect_url from the response.
# If it was a 301 redirect, you can do it via
# my @redirects = $response->redirects();
my $referrer_url = $original_login_url;
my $result2 = login($redirect_url, $referrer_url);

参考文献:

  • http://forums.devshed.com/perl-programming-6/lwp-meta-refresh-tag-handling-63484.html
  • http://www.herongyang.com/Perl/LWP-UserAgent-Follow-HTTP-Redirects.html
票数 0
EN

Stack Overflow用户

发布于 2014-12-27 03:57:28

如果你不是一心想使用LWP::UserAgent,那就改用WWW::Mechanize

  • 最佳方法:使用WWW::Mechanize::Plugin::FollowMetaRedirect。概要相当简短,而且切中要害:

使用WWW::Mechanize;使用WWW::Mechanize::Plugin::FollowMetaRedirect;my $mech =WWW::Mechanize>new;$mech->get( $url );$mech->follow_meta_redirect;#可选的,跳过模拟等待时间$mech->follow_

  • ( ignore_wait => 1);

  • 如果您没有访问该模块的权限,您可以创建自己的模块,如下所示:http://www.perlmonks.org/?node_id=487286

(基本上,使用regex shudder解析返回的内容以提取刷新URL,并获得该URL。根据我的另一个回答,您可能需要添加referrer标题(

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27634180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档