python 请求上的 SSL/TLS 握手配置

问题描述 投票:0回答:1

所以,我已经抓取一个页面大约一年了,从上周开始,每次我尝试使用 python-requests 连接到它时,我都开始收到 HTTP 代码 403。

从我的网络浏览器和curl 来看,完全没有问题。因此,我假设问题是在发送 HTTP 数据包之前进行了某种验证,并通过 WireShark 分析数据包,我可以看到发送 HTTP 数据包之前进行的 TLS 握手有一些细微的差异。

我想做的是对连接上使用的握手进行一些基本更改。例如,与 python 和我的curl/Web 浏览器明显不同的事情之一是,python/OPENSSL 似乎总是在握手中添加填充,而其他 2 个则不会(curl/Web 浏览器)。

是否有任何方法可以更改,例如通过请求中的某些选项在 TLS 握手上使用填充?如果不是,如何通过修改对 SSL 源代码或任何其他库的某种调用来做到这一点?

这是给出 403 错误的 python-requests 代码:

import requests

s = requests.session()

s.headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'pt-BR,pt;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'DNT': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

response = s.get(
    'https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx'
)

这是一个不会给出 403 并让我到达我想要的页面的卷曲:

curl "https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx" ^
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ^
  -H "Accept-Language: pt-BR,pt;q=0.9" ^
  -H "Cache-Control: max-age=0" ^
  -H "Connection: keep-alive" ^
  -H "DNT: 1" ^
  -H "Sec-Fetch-Dest: document" ^
  -H "Sec-Fetch-Mode: navigate" ^
  -H "Sec-Fetch-Site: none" ^
  -H "Sec-Fetch-User: ?1" ^
  -H "Upgrade-Insecure-Requests: 1" ^
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36" ^
  -H "sec-ch-ua: \"Chromium\";v=\"130\", \"Google Chrome\";v=\"130\", \"Not?A_Brand\";v=\"99\"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: \"Windows\""

我已经尝试过查看请求和 SSL 模块源代码,但找不到任何有关 TLS 握手配置的有用信息。

python-requests openssl
1个回答
0
投票

本站使用Cloudflare Cloudflare Bot Fight模式,需要使用TLS Client,尝试使用TLS Requests绕过。

pip install wrapper-tls-requests

示例

import tls_requests
r = tls_requests.get('https://www63.bb.com.br/portalbb/djo/id/resgate/dadosResgate.bbx')
print(r) # <Response [200]>
© www.soinside.com 2019 - 2024. All rights reserved.