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

Posted

技术标签:

【中文标题】使用代理时如何停止NodeJS“请求”模块更改请求【英文标题】:How to stop NodeJS "Request" module changes request when using proxy 【发布时间】:2019-08-10 03:37:12 【问题描述】:

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

我使用 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, 

【问题讨论】:

你需要展示你是如何使用proxy- proxy: http://xx.xxx.xx.xx:3128 @MarcosCasagrande 记录到请求库中的方式 我认为 HTTP 标头的顺序并不重要。如果你想检查你的标题,你可以使用httpbin.org/anything。 嗨@t.m.adam - 我知道在非常正常的情况下,标题顺序并不重要。在这种情况下,标题顺序很重要并且会阻止执行。我会做一个图表来进一步帮助 ***.com/questions/23585371/… 这个问题对您有帮助吗? 【参考方案1】:

在停用我的旧帐户后,我想回来并给出这个问题的实际答案,现在我完全理解了答案。一年前我问的问题是不可能的,反机器人正在通过 TLS ClientHello 对我进行指纹识别(甚至在 TCP/帧级别上也有一点点)。

首先,我编写了一个名为 request-curl 的包装器,它将 libcurl/curl 二进制文件包装到一个与 request-promise 格式相同的库中,这让我可以更好地控制请求(防止编码、http2/proxy支持和进一步的会话/TLS 控制)这仍然只让我达到了第 687 位最受欢迎的 ClientHello (https://client.tlsfingerprint.io:8443/) 的医学排名。这还不够好。

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

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

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

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

【讨论】:

【参考方案2】:

根据请求模块的the proxies documentation:

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

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

tunnel : true

在请求模块代理设置中。

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

来自文档:

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

【讨论】:

不幸的是,同样的错误发生了。设置隧道,通过隧道创建代理(所有方法)。全部休息:( @ConorReid 你能访问除此之外的其他网址吗?我看到您也在使用“升级不安全请求”,网站网址是“http”还是“https”?如果它支持 https,请尝试设置隧道:false。您可以在此处查看隧道设置:github.com/request/request#requestoptions-callback【参考方案3】:

有一些我能想到的场景

代理实际上是在最终请求中添加一些标头(以便向服务器识别您的身份) 您尝试访问的网站已将您的代理 IP 列入黑名单(公共/付费?)

这真的取决于你为什么需要使用那个代理

是因为网络限制吗? 是不是要隐藏原来的请求地址?

另外,如果您可以控制代理服务器,您能否记录向最终服务器发出的请求?

我的建议

尝试编写自己的代理(反向代理)并将其托管在某个地方。不要向https://target.com 请求,而是向您的 http[s]://proxy.com/ 请求并让反向代理完成工作。 另外,请记住在实现中禁用 X 标头,因为它会更改请求标头

node.js 实现参考:

https://github.com/nodejitsu/node-http-proxy

注意:让我知道我在 cmets 中提出的问题

【讨论】:

代理未添加标头。我已经检查了我自己的网络服务器。我也一次又一次地使用了 20 多个免费/付费代理。很多人似乎不明白这可以在全球范围内设置并作为 chrome 扩展。如果标题是问题,那么它也不起作用。【参考方案4】:

您正在为您的请求使用http-scheme,但是如果网络服务器将http 重定向到https,并且代理服务器未配置为接受重定向(到https),那么问题就来了可能仅与您输入的 URL 相关的方案。

因此必须将代理配置为接受重定向,或者必须在出现故障时手动检查 URL,然后在重定向的情况下进行调整。

您可以在此处阅读有关在一个代理服务器(Apache Traffic Server)上的重定向,其中的场景包括比我上面描述的更多的重定向:https://docs.trafficserver.apache.org/en/4.2.x/admin/reverse-proxy-http-redirects.en.html#handling-origin-server-redirect-responses

如果您仍然遇到问题,代理服务器的服务器日志会很有帮助。

编辑: 根据他的page@Jannes Botis 链接,还有更多的代理设置可能能够支持或破坏所需的功能,所以整个问题可能与正确配置代理服务器有关。以下是一些与重定向直接相关的设置:

followRedirect - follow HTTP 3xx responses as redirects (default: true). This property can also be implemented as function which gets response object as a single argument and should return true if redirects should continue or false otherwise.
followAllRedirects - follow non-GET HTTP 3xx responses as redirects (default: false)
followOriginalHttpMethod - by default we redirect to HTTP method GET. you can enable this property to redirect to the original HTTP method (default: false)
maxRedirects - the maximum number of redirects to follow (default: 10)
removeRefererHeader - removes the referer header when a redirect happens (default: false). Note: if true, referer header set in the initial request is preserved during redirect chain.

代理服务器的其他设置很可能也会影响您的场景的失败或成功。

【讨论】:

以上是关于使用代理时如何停止NodeJS“请求”模块更改请求的主要内容,如果未能解决你的问题,请参考以下文章

迭代代理的python字典

如何使用 NodeJs 代理多个文件上传?

使用代理请求不起作用

使用代理请求不起作用

node 中间层怎样做的请求合并转发

node.js 中的代理身份验证与模块请求