如何让LWP :: UserAgent看起来像另一个浏览器?

时间:2010-01-23 20:23:21

标签: perl lwp

这是我关于SO的第一篇文章,所以要温柔。我甚至不确定这是否属于这里,但现在就去了。

我想访问我的某个个人帐户的某些信息。该网站写得不好,要求我手动输入我想要的信息日期。这确实很痛苦。我一直在寻找借口来学习更多Perl所以我认为这将是一个很好的机会。我的计划是编写一个Perl脚本,该脚本将登录到我的帐户并为我查询信息。但是,我很快陷入困境。

my $ua = LWP::UserAgent->new;
my $url = url 'https://account.web.site';
my $res = $ua->request(GET $url);

生成的网页基本上表示我的网络浏览器不受支持。我为

尝试了许多不同的值
$ua->agent("");

但是没有任何事情似乎有效。谷歌周围建议使用这种方法,但它也表示perl在网站上被用于恶意原因。网站阻止这种方法吗?我甚至想做什么?是否有更合适的不同语言?我正在努力做甚至合法甚至是好主意?也许我应该放弃我的努力。

请注意,为了防止泄露任何私人信息,我在这里写的代码不是我正在使用的确切代码。但我希望这很明显。

编辑:在FireFox中,我禁用了JavaScript和CSS。我没有“不兼容的浏览器”错误就登录了。它似乎不是JavaScript问题。

8 个答案:

答案 0 :(得分:7)

使用抓取

获取其他网页

我们必须做出一个假设,如果给定相同的输入,Web服务器将返回相同的输出。有了这个假设,我们不可避免地得出结论,我们没有给它相同的输入。在这种情况下,有两个浏览器或http客户端:提供您想要的结果的那个(例如,Firefox,IE,Chrome或Safari),以及给你想要的结果(例如,LWP,wget或cURL)。

首先取消简单的可能性

之前,首先要确保简单的UserAgent是相同的,您可以通过浏览whatsmyuseragent.com并将其他浏览器标题中的UserAgent字符串设置为该网站返回的内容来完成此操作。您还可以使用Firefox的Web Developer's Toolbar来禁用CSS,JavaScript,Java和元重定向:这将帮助您通过删除非常简单的内容来追踪问题。

现在尝试复制工作浏览器

现在使用Firefox,您可以使用FireBug来分析发送的REQUEST。您可以在FireBug中的NET标签下执行此操作,不同的浏览器应该具有可以执行FireBug对FireFox执行操作的工具;但是,如果您不知道相关工具,您仍然可以使用 tshark wireshark ,如下所述。重要的是要注意 tshark wireshark 总是更准确,因为它们工作在较低的水平,至少在我的经验中留下较少的错误空间。例如,您会看到浏览器正在进行的元重定向等操作,有时FireBug可能会失去跟踪。

在您了解了第一个有效的网络请求后,请尽力将第二个网络请求设置为第一个网络请求。我的意思是正确设置请求标头和其他请求元素。如果这仍然不起作用,你必须知道第二个浏览器正在做什么来查看错误。

故障排除

要解决此问题,我们必须完全了解两个浏览器的请求。第二个浏览器通常是tricker,这些浏览器通常是库和非交互式命令行浏览器,它们无法检查请求。如果他们有能力转储请求,您仍然可以选择仅检查它们。为此,我建议wireshark and tshark suite。请立即警告您,因为这些操作在浏览器下方运行。默认情况下,您将看到实际的网络(IP)数据包和数据链路帧。您可以使用这样的命令过滤掉您需要的内容。

sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'

这将捕获所有TCP数据包,仅显示 - 过滤http.requests,然后仅过滤第4层HTTP内容的perl过滤器。您可能希望添加到显示过滤器以仅抓取单个Web服务器-R "http.request and http.host == ''"

您将要检查所有内容以查看这两个请求是否在线,Cookie,GET网址,用户代理等。确保网站不会做一些愚蠢的事情。

2010年1月23日更新:根据新信息,我建议设置AcceptAccept-LanguageAccept-CharsetAccept-Encoding。您可以通过$ua->default_headers()执行此操作。如果您要求的是更多功能,那么您可以随时对其进行子类化。我把这个方法用于我的GData API,你可以找到my example on of a UserAgent subclass on github

答案 1 :(得分:4)

你应该看看WWW::Mechanize,它是LWP::UserAgent的一个子类,面向那种网站自动化。请特别注意agent_alias method

某些网站会阻止基于User-Agent的连接,但您可以使用Perl将其设置为您想要的任何内容。网站可能还会查找通常由特定浏览器生成的其他请求标头(如Accept标头)并拒绝不包含它们的连接,但如果您弄清楚它们要查找的内容,您也可以添加这些标头

通常,网站不可能阻止其他客户端冒充支持的浏览器。无论它在寻找什么,你最终都可以复制它。

它也可能正在寻找JavaScript支持。在这种情况下,您可以查看WWW::Scripter,它是添加JavaScript支持的WWW :: Mechanize的子类。这是相当新的,我还没有尝试过。

答案 2 :(得分:2)

这个线程几乎肯定不仅仅是改变用户代理。

我看到两条路。我们可以尝试在浏览器中关闭javascript和css,并了解有关在依赖LWP :: UserAgent时进入HTTP :: Request和HTTP :: Response对象的更多信息,或者转到WWW :: Scripter并使用javascript。< / p>

只是粗糙的Craigslist文字广告,有三页密集,几乎没有空间的javascript和css,然后他们加载更多和专门的代码,以便如果我通过comcast进入我然后找到特殊的JavaScript,只是针对comcast用户,已经加载到最后一页。他们这样做的方法是试图通过在HEAD中放置代码来破坏机器人,律师在HTML 1.0和1.1之间的差异说,哦,有一些有点错误,你需要一个http刷新,然后扼杀你有额外的代码来窥探出ISP,谁知道,cookie的信息肯定(你可以动辄打印出饼干当你学会如何减缓LWP下来,插入回调代码窥探像*鲨鱼,但里面的perl,也看到服务器一直试图改变“你的”标题和“你的”请求 - 重新协商“你的”请求 - 哦,你不想买一辆便宜的汽车,你想买一辆玛莎拉蒂并抵押你的房子去做,即窥探你的ISP以及为什么不是你的联系人和你所有的谷歌历史!!!谁知道?!)。

CL将一个随机ID号码放入Alice的HEAD中,然后低声说你需要一个http请求来吞下红色药丸,然后将它隐藏在你的舌下。这样,大多数机器人都会窒息并接受假的消毒页面,即截断的“主页”。此外,如果我从网页上抓取网址,我不能使用LWP“点击”它们,因为我从未学过我的ID,也没有学习javascript以在$ ua&gt;获取之前将该ID反馈给javascript( $ URL和ID = 9dd887f8f89d9" );或者也许是简单的GET将与和放大器工作; ID它比用户代理方式更多,但你可以做到这一点,你得到所有你从

所需要的帮助

正如您所看到的,第一条路径是关闭所有这些,看看您是否可以了解重新协商的请求的URI,而不是原始URL而是URI。然后得到它,没有javascript,没有WWW :: Scripter。听起来LWP会对你有用。我想听到更多关于最初在default_header中更改ACCEPT的信息,以及服务器是否说,哦,你的意思是接受这个以及这个和这个,在重新协商Request对象中吞下红色药丸。您可以通过在请求和响应对话中插入回调来窥探它。

第二条路径,WWW :: Scripter,只有当我们决定吞下红色药丸,然后沿着爱丽丝的兔子洞(又名Matrix)走下去。 perl哲学决定在努力工作之前耗尽其他可能性。否则我们就不会学到我们的101个http先决条件,所以升级到更大的锤子就是这样,或者不用阿司匹林滴酸?或者不是?

答案 3 :(得分:0)

  

我为

尝试了许多不同的值      

$ UA-&GT;代理( “”);

     

但似乎没有什么好处。

那么,您想告诉我们您尝试过的是什么吗?

我通常做的是输入

javascript:prompt('your agent string is',navigator.userAgent)

进入我常规浏览器的网址栏,按回车键,然后剪切并粘贴它告诉我的内容。当然使用wireshark并监控实际数据包是否过度杀伤?您尝试访问的网站无法知道您正在使用Perl。只要告诉它预期听到的内容。

答案 4 :(得分:0)

工具:带有TamperData和LiveHTTPHeaders的Firefox,Devel :: REPL,LWP。

分析:在浏览器中,关闭Javascript和Java,从目标网站删除任何cookie,启动TamperData日志记录,登录网站。停止TamperData日志记录并回顾您在登录过程中可能发出的许多请求。找到第一个请求(您故意制作的请求)并查看其详细信息。

实验:启动re.pl,然后开始重新创建浏览器的互动。

use LWP::UserAgent;

my $ua = LWP::UserAgent->new(
  agent      => $the_UA_of_the_browser,
  cookie_jar => HTTP::Cookies->new(hide_cookie2 => 1),
);
$ua->default_headers(HTTP::Headers->new(
  %the_headers_sent_by_the_browser,
));

my $r = $ua->get($the_URL);
$r->content($r->decoded_content); print $r->as_string;

这就是第一步。如果您在任何时候得到不匹配的答案,那么您做错了。您通常可以[1]通过查看$r->request并与Firefox发送的请求进行比较来找出相应内容。重要的是要记住,没有魔法,你知道服务器知道的一切。如果您无法对看似相同的请求做出相同的回复,那么您就错过了一些内容。

到第一页通常是不够的。您可能需要解析表单(使用HTML::Form),然后按照重定向(如上所述,UA会自动执行此操作,但有时需要将其关闭并手动执行),并尝试对其进行反向工程从最简单的提示中奇怪地破解了一起登录序列。祝你好运。

[1]:除了LWP的cookie实现中的某些错误之外,我在此不再详述。即使这样,如果你知道你在寻找什么,你也可以发现它。

答案 5 :(得分:0)

你的perl脚本是否与你引用的firefox浏览器在同一台机器上运行?它可以基于子网或传入IP地址进行过滤。您的网址是https,因此服务器可能会在您的浏览器上加载一些PSK(预共享密钥)或证书。在内部公司内部网站之外极不可能。

答案 6 :(得分:0)

我刚注意到了一些事情。 这一行:

my $res = $ua->request(GET $url);

它根本无法在我的机器上运行。但是我把它改成了:

my $res = $ua->get($url);

答案 7 :(得分:0)

添加推荐人部分使其适用于我:

$req = HTTP::Request->new(GET => $url);
$req->header(Accept => "text/html, */*;q=0.1", referer => 'http://google.com');
$res = $ua->request($req);
print $res->status_line;
相关问题