This is my first post on SO, so be gentle. I'm not even sure if this belongs here, but here goes.
我想访问我的一个个人帐户的一些信息.该网站写得不好,要求我手动输入我想要的信息日期.这确实很痛苦.我一直在寻找借口来学习更多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问题.
我们必须做出一个假设,如果给出相同的输入,web服务器将返回相同的输出.有了这个假设,我们不可避免地得出结论,我们没有给它相同的输入.在这种情况下有两个浏览器或http客户端:一个为您提供所需结果的浏览器(例如,Firefox,IE,Chrome或Safari),以及未提供您想要结果的浏览器(例如.,LWP,wget或cURL).
之前,继续首先确保简单的UserAgent是相同的,您可以通过浏览到whatsmyuseragent.com并将其他浏览器的标题中的UserAgent字符串设置为该网站返回的任何内容来执行此操作.您还可以使用Firefox的Web开发人员工具栏来禁用CSS,JavaScript,Java和元重定向:这将帮助您通过消除非常简单的内容来追踪问题.
现在使用Firefox,您可以使用FireBug来分析REQUEST
发送的内容.您可以NET
在FireBug中的选项卡下执行此操作,不同的浏览器应该具有可以执行FireBug对FireFox执行操作的工具; 但是,如果您不知道相关工具,您仍然可以使用tshark或wireshark,如下所述.重要的是要注意tshark和wireshark总是更准确,因为它们工作在较低的水平,至少在我的经验中留下较少的错误空间.例如,您会看到浏览器正在进行的元重定向等操作,有时FireBug可能无法跟踪.
了解了第一个有效的Web请求后,请尽力将第二个Web请求设置为第一个Web请求.我的意思是正确设置请求标头和其他请求元素.如果这仍然不起作用,你必须知道第二个浏览器正在做什么来查看错误.
为了解决这个问题,我们必须完全理解来自两个浏览器的请求.第二个浏览器通常是tricker,这些浏览器通常是库和非交互式命令行浏览器,它们无法检查请求.如果他们有能力转储请求,您仍然可以选择仅检查它们.要做到这一点,我建议wireshark和tshark套件.请立即警告您,因为这些操作在浏览器下方运行.默认情况下,您将看到实际的网络(IP)数据包和数据链路帧.您可以使用这样的命令过滤掉您需要的内容.
sudo tshark -i-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 URL,用户代理等.确保网站不会做一些愚蠢的事情.
更新2010年1月23日:基于新的信息,我建议设置Accept
,和Accept-Language
,Accept-Charset
和Accept-Encoding
.你可以通过直通$ua->default_headers()
.如果您要求的是更多功能,那么您可以随时对其进行子类化.我把这个方法用于我的GData API,你可以在github上的UserAgent子类上找到我的例子.