我正在编写一个亚马逊 api,当仅使用 python 请求而不使用代理时,它会提示输入验证码。当通过 fiddler 路由这个 python 请求流量时,它似乎没有问题地通过。亚马逊是否有可能对 python 请求进行指纹识别,而 fiddler 由于它是代理而更改了指纹?
我查看了从 fiddler 和 python 请求发送的标头,它们是相同的。
fiddler 上没有设置额外的代理/fiddler 规则/过滤器来创建更改。
需要明确的是,所有提到的代理仅在本地完成,因此不会更改公共IP地址。
谢谢!
原因是网站正在使用 TLS hello 包对您的请求进行指纹识别。存在像
JA3
这样的库来为每个请求生成指纹。他们会故意阻止 http 客户端,例如 requests
或 urllib
。如果您使用 MITM 代理,因为代理服务器会与服务器创建新的 TLS 连接,因此服务器只能看到代理服务器的指纹,因此它们不会阻止它。
如果服务器仅阻止某些流行的http库,您只需更改TLS版本,那么您将拥有与默认指纹不同的指纹。
如果服务器仅允许流行的现实世界浏览器,并且仅接受它们作为有效请求,则您将需要可以模拟浏览器指纹的库,其中之一是curl-impersonate及其Python绑定curl_cffi。
pip install curl_cffi
from curl_cffi import requests
# Notice the impersonate parameter
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome110")
print(r.json())
# output: {'ja3_hash': '53ff64ddf993ca882b70e1c82af5da49'
# the fingerprint should be the same as target browser