javascript - 使用代理时如何停止NodeJS“请求”模块更改请求
问题描述
抱歉,如果这令人困惑。
我使用 NodeJS 请求模块编写了一个脚本,该模块在网站上运行并执行一个功能,然后返回数据。当我通过将其设置为 false 不使用代理时,此脚本工作得非常好。这不是 Selenium/puppeteer 不允许完成的任务
proxy: false
但是,当我设置(工作)代理时。它无法执行相同的任务,并被网站防火墙/反机器人软件检测到。
proxy: http://xx.xxx.xx.xx:3128
需要注意的一些事项:
- 我尝试了许多(20 多个)不同的代理提供商(住宅和数据中心),他们都有这个问题
- 如果该代理在我的系统上全局设置,则不会出现此问题
- 如果在 chrome 扩展中设置了该代理,则不会出现此问题
- SSL 密码套件与 Chrome 不匹配,但在不使用代理时它们仍然不匹配,所以我认为这不是问题
- 保持标题顺序的一致性非常重要
问题基本上是。使用代理(例如标头顺序)时,请求模块是否会更改任何内容?
唯一的区别是更改导致此失败的代理。一个请求有,一个请求没有。
url : url,
simple : false,
forever: true,
resolveWithFullResponse: true,
gzip: true,
headers: {
'Host' : 'www.sitename.com',
'Connection' : 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-encoding' : 'gzip, deflate, br',
'Accept-Language' : 'en-GB,en-US;q=0.9,en;q=0.8',
},
method : 'GET',
jar: globalJar,
simple: false,
followRedirect: false,
followAllRedirects: false,
解决方案
在停用我的旧帐户后,我想回来并给出这个问题的实际答案,现在我完全理解了答案。一年前我问的是不可能的,反机器人正在通过 TLS ClientHello 对我进行指纹识别(甚至在 TCP/帧级别上也有一点点)。
首先,我编写了一个名为的包装器request-curl
,它将 libcurl/curl 二进制文件包装到一个具有与request-promise
.仍然只让我达到了第 687 位最受欢迎的 ClientHello ( https://client.tlsfingerprint.io:8443/ ) 的医学排名。这还不够好。
我不得不移动语言。NodeJS 是一种高级语言,无法进行真正深入的控制(必须修改从第 3 层发送的数据包)。所以作为我问题的答案。
这在 NodeJS 中尚无法实现 - 更不用说现在未维护的 request.js 库了。
对于阅读本文的任何人,如果您想伪造绕过反机器人安全性的完美请求,您必须转向另一种语言:我推荐 Golang 中的 utls 或 c# 中的 BouncyCastle。祝你好运,因为我花了一年的时间才真正知道如何做到这一点。即便如此,这些语言还有更多的内部问题和他们不认为的功能(Go 不支持“基本”标题排序,您需要猴子补丁/修改内部等,utls 不容易支持代理)。名单还在继续。
如果您还没有深入了解它,那简直就是一个兔子洞,我建议您不要进入它。
推荐阅读
- azure-databricks - 我需要一个 azure_databricks 作业因异常而失败,但它没有这样做
- .net - 如何检查是否在与 xUnit(.net 核心)的集成测试中引发异常?
- python - 计数核苷酸脚本(填补空白)
- diff - Diff/Merge 工具,它也允许编辑文件
- symfony - 下拉菜单中的默认值
- c# - 带有 Prism 库的 Xamarin.Forms 应用程序中的多个 NavigationStack
- javascript - 浏览器 Javascript:将 Json 压缩为 gzip 并上传到 S3 预签名 URL
- amazon-web-services - 是否可以将网络负载均衡器用于使用 UDP 协议的 ECS 服务?
- laravel - Laravel 和 Vuejs axios 删除没有错误但没有删除
- sql-server - 声明具有负长度 varchar 列的表