无法使用UserAgent登录

时间:2014-12-24 08:59:04

标签: perl login html-form

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

"<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"

我也注意到,虽然我无法登录,但我在调试器中得到了这个部分:

_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

有任何线索吗?

这里是代码:

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

2 个答案:

答案 0 :(得分:0)

您需要通过referer() LWP::UserAgentsub 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); 添加引荐来重新请求该页面(或者如果您没有与该模块结合,请参阅我的第二个答案)

{{1}}

参考文献:

答案 1 :(得分:0)

如果您没有使用LWP::UserAgent,请改用WWW::Mechanize

  • 最佳方法:使用WWW::Mechanize::Plugin::FollowMetaRedirect。概要非常简短,重点:

    use WWW::Mechanize;
    use WWW::Mechanize::Plugin::FollowMetaRedirect;
    
    my $mech = WWW::Mechanize->new;
    $mech->get( $url );
    $mech->follow_meta_redirect;
    
    # Optionally, skip emulating the waiting time
    $mech->follow_meta_redirect( ignore_wait => 1 );
    
  • 如果您无权访问该模块,则可以创建自己的模块,类似于:http://www.perlmonks.org/?node_id=487286

    (基本上,使用正则表达式 shudder 解析返回的内容以提取刷新URL,并获取该URL。根据我的其他答案,可能需要添加推荐人标题)