如何在POST请求中发送加密数据?Recaptcha请求Python调用失败排查
reCAPTCHA POST请求Python复现失败问题
我尝试向reCAPTCHA站点发送POST请求,在Burp Suite的Repeater里能正常获取响应,但用Python实现时始终得不到正常结果。哪怕把Wireshark抓取到的请求数据直接复制到Python代码里调用,还是失败。以下是我的Python代码示例:
import httpx from requests.structures import CaseInsensitiveDict headers = CaseInsensitiveDict() headers['Host'] = 'www.google.com' headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv' headers['Accept'] = '*/*' headers['Accept-Language'] = 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' headers['Accept-Encoding'] = 'gzip, deflate' headers['Content-Type'] = 'application/x-protobuffer' headers['Content-Length'] = '8636' headers['Origin'] = 'https://www.google.com' headers['Referer'] = 'https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Ld74p4lAAAAACY-Z0TzBFkJgWu1DI9siriJqjOG&co=aHR0cHM6Ly9rb250by5nYXpldGEucGw6NDQz&hl=ru&v=sNQO7xVld1CuA2hfFHvkpVL-&size=invisible&cb=fncw2wg8imh3' headers['Sec-Fetch-Dest'] = 'empty' headers['Sec-Fetch-Mode'] = 'cors' headers['Sec-Fetch-Site'] = 'same-origin' headers['Te'] = 'trailers' data = '''(data from wireshark)''' r = httpx.post('https://www.google.com/recaptcha/api2/reload?k=6Ld74p4lAAAAACY-Z0TzBFkJgWu1DI9siriJqjOG', headers=headers, data=data) print(r.text)
排查方向与解决建议
- 修复不完整的User-Agent:当前User-Agent字符串截断了,缺少浏览器版本号(比如
/109.0),服务器会识别为异常请求,补全后再测试。 - 移除手动设置的Content-Length:httpx会自动计算并添加这个请求头,手动指定的长度如果和实际发送的数据长度不匹配,会导致服务器拒绝处理。
- 正确处理Protobuf二进制数据:
application/x-protobuffer是二进制格式,用字符串存储会引入编码错误。应该直接以bytes类型传入数据,比如读取二进制文件:data = open('captcha_request.bin', 'rb').read(),确保数据和Wireshark抓取到的二进制完全一致。 - 模拟浏览器TLS指纹:reCAPTCHA会检测请求的TLS指纹,Python httpx默认指纹和浏览器差异大,容易被拦截。可以尝试使用
curl-cffi库模拟真实浏览器的请求特征,避免被识别为非浏览器请求。 - 动态获取Referer参数:Referer中的
v(版本号)、cb(回调标识)等参数可能会过期,不要硬编码,需要从当前访问的reCAPTCHA页面动态提取这些参数。
内容的提问来源于stack exchange,提问作者Mikhail Popov
相关产品推荐
相关产品推荐

