【发布时间】:2012-07-10 15:29:01
【问题描述】:
网站http://openbook.etoro.com/#/main/ 有一个实时提要,该提要由 javascript 通过 XHR 保持活动请求生成,并从服务器作为 gzip 压缩 JSON 字符串获取答案。
我想将提要捕获到一个文件中。
通常的方式 (WWW::Mech..) (可能)不可行,因为需要对页面中的所有 Javascript 进行反向工程并模拟浏览器确实是一项艰巨的任务,因此,寻找替代解决方案。
我的想法是使用中间人策略,因此浏览器将完成他的工作,我想通过 perl 代理捕获通信 - 仅用于此任务。
我能够捕捉到最初的通信,但不能捕捉到提要本身。代理工作正常,因为在浏览器中,提要只运行我的文件管理器不起作用。
use HTTP::Proxy;
use HTTP::Proxy::HeaderFilter::simple;
use HTTP::Proxy::BodyFilter::simple;
use Data::Dumper;
use strict;
use warnings;
my $proxy = HTTP::Proxy->new(
port => 3128, max_clients => 100, max_keep_alive_requests => 100
);
my $hfilter = HTTP::Proxy::HeaderFilter::simple->new(
sub {
my ( $self, $headers, $message ) = @_;
print STDERR "headers", Dumper($headers);
}
);
my $bfilter = HTTP::Proxy::BodyFilter::simple->new(
filter => sub {
my ( $self, $dataref, $message, $protocol, $buffer ) = @_;
print STDERR "dataref", Dumper($dataref);
}
);
$proxy->push_filter( response => $hfilter); #header dumper
$proxy->push_filter( response => $bfilter); #body dumper
$proxy->start;
使用上述代理配置 Firefox 进行所有通信。
提要在浏览器中运行,因此代理向它提供数据。 (当我停止代理时,提要也停止了)。随机(不知道什么时候)我收到以下错误:
[Tue Jul 10 17:13:58 2012] (42289) ERROR: Getting request failed: Client closed
谁能告诉我一个方法,如何为 Dumper 所有浏览器和服务器之间的通信构建正确的 HTTP::Proxy 过滤器,无论 keep_alive XHR 吗?
【问题讨论】:
-
你在重新发明轮子。键入 ctrl+shift+i 以运行 Firefox Firebug/Opera Dragonfly/Chromium Inspecter,并在网络面板中查看 HTTP 请求/响应对的样子。或者,使用 Wireshark,完成捕获,在顶部附近的组合框中过滤表达式
http,选择启动请求的数据包,菜单分析 → 跟踪 TCP 流以查看 HTTP 请求/响应对的文本表示. -
对不起@daxim,但这不是解决方案。 Ofc,我可以使用 firebug 或任何其他浏览器控制面板(并将其用于分析)。我也可以使用 tcpdump 和/或 tcpflow。我想在无头服务器(无 X)、无浏览器上准确捕获提要(供以后工作)。无论如何,感谢您的回答 - 但如果我想捕获普通数据包,则不会要求 perl 解决方案。
-
@daxim,我理解你的观点,但这个问题是合法的并且显示出真正的问题。 (和 IMO,它比通常的 SO-perl 问题要好得多,比如如何使用 tr/// :) 我试过这个脚本,但我自己也不知道答案 - 你能帮忙吗?