使用代理时如何停止NodeJS“请求”模块更改请求

Con*_*eid 11 javascript proxy request http-proxy node.js

抱歉,这令人困惑。

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

proxy: false

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

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, 
Run Code Online (Sandbox Code Playgroud)

Jan*_*tis 2

根据请求模块的代理文档:

默认情况下,当代理 http 流量时,request 将简单地发出标准的代理 http 请求。这是通过将请求的初始行的 url 部分设置为端点的完全限定 url 来完成的。

相反,您可以通过设置使用http 隧道:

tunnel : true
Run Code Online (Sandbox Code Playgroud)

在请求模块代理设置中。

在您的情况下,您可能正在发出 标准的代理 http 请求,而当在您的系统上全局使用代理或 Chrome 扩展时,会创建一个http 隧道。

从文档中:

请注意,使用隧道代理时,代理授权标头和自定义 proxyHeaderExclusiveList 中的任何标头永远不会发送到端点服务器,而只会发送到代理服务器。