5

我正在尝试使用 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

4 回答 4

3

抱歉,我已经多年没有编写 Perl 代码了。但是,由于尚未针对此问题发布“复制和粘贴”答案,因此以下是如何在 Ruby 中抓取 Wells Fargo:

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

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

于 2010-12-15T04:38:39.933 回答
2

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

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

于 2010-04-29T19:56:19.730 回答
1

If you know the location of the next page you can try getting it after attaching the extra get parameters using

$mech->add_header($name => $value);
于 2010-04-29T20:00:40.320 回答
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 request 中重复这个 cookie/form 参数

于 2010-12-16T10:59:59.140 回答