javascript - 使用代理时如何停止NodeJS "Request"模块更改请求

标签 javascript node.js proxy request http-proxy

对不起,如果这令人困惑。

我使用 NodeJS 请求模块编写了一个脚本,该模块在网站上运行并执行一个功能,然后返回数据。当我通过将其设置为 false 不使用代理时,此脚本工作得非常好。这不是 Selenium/puppeteer 不允许完成的任务

代理:假

但是,当我设置(工作)代理时。它无法执行相同的任务,并被网站防火墙/反机器人软件检测到。

代理:http://xx.xxx.xx.xx:3128

注意事项:

  • 我尝试了 许多 (20 多个) 不同的代理提供商(住宅和数据中心),他们都有这个问题
  • 如果在我的系统上全局设置该代理,则不会出现此问题
  • 如果在 chrome 扩展中设置了该代理,则不会出现此问题
  • SSL 密码套件与 Chrome 不匹配,但在不使用代理时它们仍然不匹配,所以我认为这不是问题
  • 保持标题顺序的一致性非常重要

问题基本上是。使用代理时,请求模块是否会更改任何内容,例如 header 顺序?

这是通过/失败时发生的情况的图像。 enter image description here

唯一的区别是更改导致此失败的代理。一个请求有,一个请求没有。

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 格式相同的单个库中,这给出了我对请求有更多的控制权(防止编码、http2/proxy 支持和进一步的 session /TLS 控制),这仍然只让我达到了第 687 位最受欢迎的 ClientHello (https://client.tlsfingerprint.io:8443/) 的 medicore 排名。这还不够好。

我不得不改变语言。 NodeJS 是一种高级语言,无法进行真正深入的控制(必须修改从第 3 层发送的数据包)。所以作为我问题的答案。

这在 NodeJS 中还没有可能做到 - 更不用说 now 未维护的 request.js 库了。

对于阅读本文的任何人,如果您想伪造完美的请求以绕过反机器人安全性,您必须改用另一种语言:我推荐 Golang 中的 utls 或 c# 中的 BouncyCaSTLe。祝你好运,因为我花了一年时间才真正知道如何做到这一点。即便如此,这些语言还有更多的内部问题和他们不认为的特性(Go 不支持“基本”标题排序,您需要猴子补丁/修改内部等,utls 不容易支持代理)。名单还在继续。

如果你还没有深入进去,那简直就是个兔子洞,我建议你不要进去。

关于javascript - 使用代理时如何停止NodeJS "Request"模块更改请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55243887/

相关文章:

javascript - 如何在reactJS中从页面底部开始并向上滚动

javascript - 发送 POST 请求 - angular4

javascript - 无法在NodeJS中下载页面

node.js - 连接以打开 Sequelize 连接

javascript - 从 ES6 类构造函数返回 ES6 Proxy

基于主机名的 Azure Web Apps 反向代理

javascript - 使用 jQuery 限制文本区域中的行数和显示行数

node.js - “AWSCognito”未定义

java - 泽西客户端 + 设置代理

node.js - nodejs - 使用 Promise 终止前一个函数后按顺序调用函数