如何在reCAPTCHA v3重载HTTP请求中正确传入action参数
如何正确在reCAPTCHA v3重载请求中传入action参数
我用blaannk的Invisible reCAPTCHA绕过工具(通过HTTP手动重载验证码)生成v3令牌,工具本身能正常运行,但需要绑定特定页面的action(对应JS代码grecaptcha.execute({action: "GetAvailableDaysForOperation"}))。在重载请求的POST payload里加了"action": action参数后完全没效果,生成的令牌和不加该参数时一模一样。用直接HTTP重载请求时,目标服务器总是返回Error while verifying captcha,但用Selenium或Chrome控制台执行上述JS代码就能得到正确响应。
当前的get_token()函数如下:
def get_token(action): headers = { "User-Agent": "Mozilla/5.0", "Referer": "https://www.google.com/recaptcha/api2/anchor..." } anchorr = "https://www.google.com/recaptcha/api2/anchor..." keysite = anchorr.split('k=')[1].split("&")[0] var_co = anchorr.split("co=")[1].split("&")[0] var_v = anchorr.split("v=")[1].split("&")[0] r1 = requests.get(anchorr, headers=headers).text token1 = r1.split('recaptcha-token" value="')[1].split('"')[0] var_vh = "2283168122" var_bg = "..." payload = { "v": var_v, "reason": "q", "c": token1, "action": action, # this parameter affects nothing "k": keysite, "co": var_co, "hl": "en", "size": "invisible", "vh": var_vh, "bg": var_bg } reload_url = f"https://www.google.com/recaptcha/api2/reload?k={keysite}" r2 = requests.post(reload_url, data=payload, headers=headers) try: token2 = r2.text.split('"rresp","')[1].split('"')[0] except Exception: return None return token2
解决方法
- 修正Referer头:当前Referer设为recaptcha的anchor页面URL,这不符合真实请求逻辑。必须改为调用
grecaptcha.execute的目标页面URL,否则服务器会判定请求来源异常,忽略action参数。 - 动态提取会话参数:不要硬编码
var_vh和var_bg,从anchor页面的响应中动态提取对应的值(比如通过r1.split('data-vh="')[1].split('"')[0]获取var_vh),硬编码的值会导致会话不匹配。 - 添加v3类型标识:在payload中新增
"type": "v3"参数,明确告知服务器这是v3版本的请求,否则服务器会按v2规则处理,直接忽略action参数。 - 核对请求结构:用Chrome开发者工具捕获浏览器执行
grecaptcha.execute时的真实POST请求,对比payload中的参数、headers的细节,确保你的请求和真实请求完全一致。
修改后的示例代码:
def get_token(action): # 替换为目标页面的真实URL headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://target-site.com/your-operation-page", "Content-Type": "application/x-www-form-urlencoded" } anchorr = "https://www.google.com/recaptcha/api2/anchor?k=YOUR_V3_SITE_KEY&co=..." keysite = anchorr.split('k=')[1].split("&")[0] var_co = anchorr.split("co=")[1].split("&")[0] var_v = anchorr.split("v=")[1].split("&")[0] r1 = requests.get(anchorr, headers=headers).text token1 = r1.split('recaptcha-token" value="')[1].split('"')[0] # 动态提取会话参数 var_vh = r1.split('data-vh="')[1].split('"')[0] var_bg = r1.split('data-bg="')[1].split('"')[0] payload = { "v": var_v, "reason": "q", "c": token1, "action": action, "k": keysite, "co": var_co, "hl": "en", "size": "invisible", "vh": var_vh, "bg": var_bg, "type": "v3" # 新增v3类型标识 } reload_url = f"https://www.google.com/recaptcha/api2/reload?k={keysite}" r2 = requests.post(reload_url, data=payload, headers=headers) try: token2 = r2.text.split('"rresp","')[1].split('"')[0] except Exception: return None return token2
内容的提问来源于stack exchange,提问作者ExDoors
相关产品推荐
相关产品推荐

