簡體   English   中英

使用代理時如何停止NodeJS“請求”模塊更改請求

[英]How to stop NodeJS "Request" module changes request when using proxy

對不起,如果這令人困惑。

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

根據請求模塊的代理文檔

默認情況下,在代理 http 流量時,請求將簡單地發出一個標准的代理 http 請求。 這是通過使請求的初始行的 url 部分成為端點的完全限定 url 來完成的。

相反,您可以通過設置使用http 隧道

tunnel : true

在請求模塊代理設置中。

可能是在您的情況下,您正在發出一個標准的代理 http 請求,而在您的系統上全局使用代理或 chrome 擴展程序時,會創建一個http 隧道

從文檔:

請注意,當使用隧道代理時,代理授權標頭和來自自定義 proxyHeaderExclusiveList 的任何標頭永遠不會發送到端點服務器,而只會發送到代理服務器。

停用我的舊帳戶后,我想回來並實際回答這個問題,現在我完全理解了答案。 一年前我問的是不可能的,antibot 正在通過 TLS ClientHello 對我進行指紋識別(甚至在 TCP/幀級別上也有一些)。

首先,我編寫了一個名為request-curl的包裝器,它將 libcurl/curl 二進制文件包裝到一個與request-promise格式相同的庫中,這讓我可以更好地控制請求(防止編碼、http2/proxy 支持和進一步session/TLS 控制)這仍然只讓我達到第 687 位最受歡迎的 ClientHello ( https://client.tlsfingerprint.io:8443/ ) 的中等排名。 這還不夠好。

我不得不移動語言。 NodeJS 是一種高級語言,無法進行真正深入的控制(必須修改從第 3 層發送的數據包)。 所以作為我問題的答案。

這在 NodeJS 中無法做到——更不用說現在沒有維護的 request.js 庫了。

對於閱讀本文的任何人,如果您想偽造繞過反機器人安全性的完美請求,您必須改用另一種語言:我推薦 Golang 中的 utls 或 c# 中的 BouncyCastle。 祝你好運,因為我花了一年時間才真正知道如何做到這一點。 即便如此,這些語言還有更多的內部問題和他們還沒有想到的功能(Go 不支持“基本”標頭排序,你需要猴子補丁/修改內部等,utls 不容易支持代理)。 這份清單不勝枚舉。

如果您還沒有深入了解它,那簡直就是一個地獄,我建議您不要進入它。

有一些場景我能想到

  • 代理實際上是在最終請求中添加了一些標頭(為了向服務器識別您的身份)
  • 您嘗試訪問的網站將您的代理 IP 列入黑名單(公共/付費的?)

這實際上取決於您為什么需要使用該代理

  • 是不是因為網絡限制?
  • 是不是因為要隱藏原來的請求地址?

另外,如果您可以控制代理服務器,您能否記錄對最終服務器的請求?

我的建議

嘗試編寫自己的代理(反向代理)並將其托管在某個地方。 不是請求https://target.com ,而是請求您的 http[s]://proxy.com/ 並讓反向代理完成工作。 另外,請記住在實現上禁用 X 標頭,因為它會更改請求標頭

node.js 實現參考:

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

注意:讓我知道我在評論中提出的問題

您正在為您的請求使用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

如果您仍然遇到問題,代理服務器的服務器日志會有所幫助。

編輯:
根據他的頁面@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.

代理服務器的其他設置很可能也會影響您的方案的失敗或成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM