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

2023-12-21

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

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

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

生成的网页基本上表明我的网络浏览器不受支持。我尝试了许多不同的值

$ua->agent("");

但似乎什么都不起作用。谷歌搜索建议使用这种方法,但它也说 Perl 在网站上被用于恶意目的。网站会阻止此方法吗?我想做的事情可能吗?是否有更合适的不同语言?我想做的事情合法甚至是个好主意吗?也许我应该放弃我的努力。

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

EDIT:在 FireFox 中,我禁用了 JavaScript 和 CSS。我登录得很好,没有出现“浏览器不兼容”错误。这似乎不是 JavaScript 的问题。


通过抓取获取不同的网页

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

首先消除简单的可能性

之前,首先继续确保简单的 UserAgents 相同,您可以通过浏览到Whatsmyuseragent.com http://whatsmyuseragent.com/并将另一个浏览器标头中的 UserAgent 字符串设置为该网站返回的任何内容。您还可以使用 Firefox 的Web 开发人员的工具栏 https://addons.mozilla.org/en-US/firefox/addon/60禁用 CSS、JavaScript、Java 和元重定向:这将帮助您通过消除真正简单的东西来追踪问题。

现在尝试复制工作浏览器

现在有了 Firefox,您可以使用FireBug http://www.getfirebug.com/来分析REQUEST已发送。您可以在以下位置执行此操作NETFireBug 中的选项卡,不同的浏览器应该具有可以完成 FireBug 与 FireFox 的功能的工具;但是,如果您不知道有问题的工具,您仍然可以使用tshark or 线鲨如下所述。重要的是要注意tshark and 线鲨总是会更准确,因为它们在较低的水平上工作,至少根据我的经验,犯错的空间更小。例如,您会看到浏览器正在执行的元重定向等操作,有时 FireBug 可能会丢失这些操作。

了解第一个有效的 Web 请求后,请尽力将第二个 Web 请求设置为第一个 Web 请求。我的意思是正确设置请求标头和其他请求元素。如果这仍然不起作用,您必须知道第二个浏览器正在做什么才能找出问题所在。

故障排除

为了解决这个问题,我们必须全面了解来自both浏览器。第二个浏览器通常是骗子,这些通常是库和非交互式命令行浏览器,缺乏检查请求的能力。如果他们有能力转储请求,您仍然可以选择简单地检查它们。为此,我建议wireshark 和 tshark 套件 http://www.wireshark.org/。您应该立即收到警告,因为这些操作是在浏览器下运行的。默认情况下,您将看到实际的网络 (IP) 数据包和数据链路帧。您可以使用这样的命令过滤出您专门需要的内容。

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

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

您需要检查所有内容,看看两个请求是否一致、cookies、GET url、用户代理等。确保网站不会做一些愚蠢的事情。

更新于 2010 年 1 月 23 日:根据新信息我建议设置Accept, and Accept-Language, Accept-Charset and Accept-Encoding。你可以通过以下方式做到这一点$ua->default_headers()。如果您需要用户代理的更多功能,您始终可以对其进行子类化。我对我的 GData API 采用了这种方法,你可以找到我在 github 上的 UserAgent 子类示例 http://github.com/EvanCarroll/GoogleAPI/blob/master/lib/GoogleAPI/UserAgent.pm.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 LWP::UserAgent 看起来像另一个浏览器? 的相关文章

随机推荐

  • Rails:使用 CanCan 根据单个模型的实例定义多个角色?

    我目前陷入如何根据我们想要的每个条件来分离 CanCan 角色的问题 在我们的应用程序中 有很多类别 例如数学 英语 历史等 每个类别都有很多课程 每个用户可以在每个类别上拥有许多不同的角色 例如 约翰可以是数学 读者 这意味着他可以阅读数
  • 在 C# 中分割、编码和合并视频部分

    可以将文件分成许多部分 是否可以对每个部分进行编码 然后再次将它们连接起来 这个想法是在多台计算机上对一个视频进行编码 在 NET中 谢谢 您可以从 C 代码中调用 ffmpeg exe 来完成此操作 还有一些库可以完成此任务
  • SNMP:ifAdminStatus 与 ifOperStatus

    我有关于 ifAdminStatus 和 ifOperStatus 的问题 以下是使用 ifAdminStatus 的网络接口状态的输出 snmpwalk Os c public v 1 192 168 1 1 1 3 6 1 2 1 2
  • 通过扩展 Django-Registration 应用程序创建 Django 注册表单

    我尝试通过扩展 django registration 应用程序并使用 Django Profile 创建注册表单 我已经为配置文件创建了模型和表单 当我通过 django shell 检查时 它正在生成字段 对于配置文件字段 我使用 Mo
  • 在续集中的嵌套急切加载中排序不起作用

    我有四个模型 Tehsil Ilr Patwar 和 Village 他们的关联是 Tehsil gt 1 m gt Ilr gt 1 m gt Patwar gt 1 m gt 村庄 我想在我的所有四个模型上应用 order by Que
  • 使用 Android Studio 和 Facebook 4.6.0 膨胀类 com.facebook.login.widget.LoginButton 时出错

    在我的 build gradle 中 我正在导入 Facebook compile com facebook android facebook android sdk 4 6 0 在我的应用程序类中 我正在初始化 Facebook SDK
  • MySQL中反斜杠\算作一个字符吗?

    如果我有一个包含固定长度列的表 mySQL 会将反斜杠算作字符吗 例子 people name 10 age 3 如果我在名称列中存储 MySQL 转义值 例如 Blahblah sMySQL会按照报价砍掉它吗 Thanks 不 转义字符不
  • 如何实际重置 $httpBackend 期望?

    我已经尝试过并试图让它发挥作用 这文档 https docs angularjs org api ngMock service 24httpBackend充其量是简洁的 重置期望 重置所有请求期望 但保留所有后端定义 通常 当您想要重用 h
  • 信号分配在进程中如何工作?

    我了解到信号在遇到表达式时不会立即改变 而是在进程结束时立即改变 在此示例中 signal x y z bit process y begin x lt y z lt not x end process 这个例子是这样说的 如果信号 y 发
  • 我无法获得正确的 StoreContext

    我已将我的应用程序提交到 Windows 应用商店并通过了认证 根据测试说明 https learn microsoft com en us windows uwp monetize in app purchases and Trials
  • 如何配置简单注入器 IoC 以使用 RavenDB

    我在用着简易注射器 http simpleinjector codeplex com用于 MVC 3 Web 应用程序中的 IOC 我在用RavenDB http ravendb net用于数据存储 在 mvc 3 应用程序中使用 Rave
  • Spyder 中的简单 Python 多重处理函数不输出结果

    我在这里有一个非常简单的函数 我试图在其中运行和测试 但是 它不会输出任何内容 也没有任何错误 我多次检查了代码 但没有任何错误 我打印了作业 这就是我得到的
  • 阻止对 Redis 密钥的访问 (ServiceStack)

    我正在尝试使用 ServiceStack Redis 客户端来实现我认为非常常见的缓存场景 但我很难找到一个很好的例子 在 ASP NET MVC 应用程序中 我们对外部 Web 服务进行相对长时间运行 且按计量 的调用 并将结果缓存一段时
  • 函数调用中的多个括号

    我对这个 Scala 表示法有点困惑 List 1 2 3 foldLeft 0 x acc gt acc x 0 和函数都是foldLeft的参数 为什么它们被传递到两个相邻的括号组中 我认为这是可行的 List 1 2 3 foldLe
  • XNA 与 DirectX 的比较 (C#)

    在PC开发方面 不包括Xbox和Zune XNA 和 C DirectX 有什么区别 C DirectX 是否比 XNA 具有显着优势 在速度 版税等方面 与非托管 C DirectX 相比 两者的速度如何 游戏编程行业正在走向何方 如果您
  • if 语句之外的变量访问

    我正在尝试访问 java 中 if 语句之外的变量 变量是axeMinDmg 这是我所拥有的 但出现错误 我想minDmg axeMinDmg thanks SuppressWarnings unused public static voi
  • 我应该使用哪种算法进行信号(声音)一类分类?

    Update我总结了问题及其答案here https jaderdias github io posts signal one class classification 我的目标是检测噪声信号中给定模式的存在 我想检测一种用麦克风记录声音的
  • 无论 Zsh 中的上下文如何,都将密钥绑定到完整的文件名

    有时我想要一个文件名 而不是 zsh 为我猜测的文件名 例如 我有一个 PNG 文件 没有正确的 png后缀 这会让 zsh 认为它不是图片 并且在我输入时不会列出它Tab完成论证display 我想知道是否有一个关键序列可以在上下文所在的
  • 如何在WebFilter的实现中获取路径变量? (服务器网络交换)

    我在 Spring Reactive 应用程序中工作 我知道如何使用 HttpServletRequest 在拦截器中获取 PathVariable 有些类似 request getAttribute HandlerMapping URI
  • 如何使 LWP::UserAgent 看起来像另一个浏览器?

    这是我关于 SO 的第一篇文章 所以要温柔 我什至不确定这是否属于这里 但就在这里 我想访问我的一个个人帐户上的一些信息 该网站写得不好 需要我手动输入我想要的信息的日期 这确实是一种痛苦 我一直在寻找一个学习更多 Perl 的借口 所以我