如何让WWW-Mechanize登录Wells Fargo的网站?

时间:2010-04-29 19:34:20

标签: perl www-mechanize

我正在尝试使用Perl的WWW::Mechanize登录我的银行并提取交易信息。通过浏览器登录我的银行(富国银行)后,它会短暂显示一个临时网页,上面写着“请等待我们验证您的身份”。几秒钟后,它会进入银行的网页,我可以在那里获取我的银行数据。唯一的区别是URL包含多个附加到临时页面的URL的“GET”参数,这些参数只有一个sessionID参数。

我能够成功地让WWW :: Mechanize从登录页面登录,但它被卡在临时页面上。标题中有一个<meta http-equiv="Refresh" ...标记,所以我尝试$mech->follow_meta_redirect,但它也没有让我超过该临时页面。

任何帮助我们都会感激不尽。提前致谢。

这是让我陷入临时页面的准系统代码:

#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
$mech->agent_alias( 'Linux Mozilla' );

$mech->get( "https://www.wellsfargo.com" );
$mech->submit_form(
    form_number => 2,
    fields => {
        userid => "$userid",
        password => "$password"
    },
    button => "btnSignon"
);

4 个答案:

答案 0 :(得分:3)

抱歉,我编写Perl已经有好几年了。但是,由于此问题还没有发布“复制和粘贴”的答案,这里是如何在Ruby中刮掉富国银行:

require 'rubygems'
require 'mechanize'

username = 'your_username'
password = 'your_password'

agent = Mechanize.new
agent.user_agent_alias = 'Windows IE 6'

# get first page
page = agent.get('https://online.wellsfargo.com/signon/')

# find and fill form
form = page.form_with(:name => 'Signon')      
form['userid'] = username
form['password'] = password
page = agent.submit form

# find the refresh url
page.body.match /content="1;URL=(.*?)"/
nexturl = $1

# wait a little while and then get the next page
sleep 3
page = agent.get nexturl

# If you have multiple accounts, you can use this. If you just have a single account, you can remove this block
companies = [['Account1', '123456789'], 
             ['Account2', '123456789']]

companies.each do |name, id|
  form = page.form_with(:name => 'ChangeViewFormBean')
  form['viewKey'] = id
  page = agent.submit form

  available_balance = page.search("#cashTotalAvailBalance").text.strip

  puts "#{name}: #{available_balance}"
  sleep 2
end

Works引用:有一个人编写了这个脚本的一个版本,将其发布到他的代码目录中,然后将整个内容转发给他的博客。他的姓氏是Youngblood或类似的。我在互联网存档/回程机器中找到了源代码并对其进行了修改以实现您在上面看到的内容。所以,感谢Youngblood先生或类似的人,无论你身在何处 - 并且感谢教我的元刮技巧!

答案 1 :(得分:2)

您需要对该中介页面上发生的事情进行反向工程。例如,它是否使用Javascript来设置一些cookie? Mech不会在页面上解析或执行Javascript,因此它可能会尝试遵循元刷新,但却遗漏了一些关于最终请求需要发生什么的重要信息。

尝试使用Firebug之类的工具来观看浏览器遵循元刷新时发送的请求。检查为请求最终页面而发送的所有请求标头,包括cookie。然后使用Mech复制它。

答案 2 :(得分:1)

如果您知道下一页的位置,可以在使用

附加额外的get参数后尝试获取它
$mech->add_header($name => $value);

答案 3 :(得分:1)

首先你需要知道这个Javascript是不是:我建议使用Web Developer(但你也可以使用NoScript)来禁用Javascript并尝试通过浏览器登录(但首先您需要清除与目标网站相关的所有Cookie!)。

如果仍然(禁用Javascript)可以登录而不是这不是Javascript问题,您需要调查HTTP标头(可能是x,y坐标)例如,单击按钮或仅在加载CSS文件时收到一些cookie。)

我建议使用HttpFox来检查HTTP标头。您需要运行HttpFox日志记录,然后再次执行登录(顺便说一下,在执行此操作之前禁用图像会显着减少日志)。之后,您需要检查每个请求和相应的响应,以找到设置隐藏cookie的位置或创建一些隐藏的表格参数。

如果您在禁用Javascript后无法登录,则需要查看标题。您需要将HTTP标头响应中提供的cookie与您在以后的请求中使用的Cookie进行比较。在您找到带有“恶意”Javascript的HTML后,您可以分析此Javascript以查找此cookie(或表单参数)创建的算法。

你最后一步将是在你的WWW :: Mechanize请求中重复这个cookie / form param

相关问题