Python环境下如何通过turnstile.render绕过Cloudflare Turnstile验证?
解决Cloudflare Turnstile验证:通过turnstile.render获取有效token
核心逻辑
turnstile.render是Cloudflare官方前端API,用于渲染Turnstile验证组件,用户完成验证后会生成合法的cf-turnstile-response token。你之前直接注入token失败,是因为Cloudflare会校验token的生成环境(浏览器指纹、IP、会话上下文等),只有通过官方组件生成的token才会被认可。
步骤1:用turnstile.render正确生成token
需要在前端环境(可通过Python无头浏览器模拟)中执行以下逻辑,确保组件加载并返回有效token:
// 先加载Turnstile官方脚本 (function(){ const script = document.createElement('script'); script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js'; script.async = true; document.body.appendChild(script); })(); // 脚本加载完成后渲染验证组件 setTimeout(() => { turnstile.render('#cf-turnstile-container', { sitekey: '你的站点密钥', // 替换为实际sitekey callback: (token) => { // 验证成功后,将token赋值给表单字段或直接用于请求参数 document.getElementById('cf-turnstile-response').value = token; } }); }, 1000);
步骤2:Python中用无头浏览器模拟获取token
以Playwright为例,模拟真实浏览器环境生成token:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page(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") page.goto("目标页面URL") # 注入JS渲染Turnstile并获取token sitekey = "你的站点密钥" token = page.evaluate(""" (sitekey) => { return new Promise(resolve => { const script = document.createElement('script'); script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js'; script.async = true; document.body.appendChild(script); script.onload = () => { turnstile.render('#cf-turnstile-container', { sitekey: sitekey, callback: resolve }); }; }); } """, sitekey) print("生成的有效token:", token) # 携带token提交请求 page.fill("#username", "你的账号") page.fill("#password", "你的密码") page.evaluate(f"document.getElementById('cf-turnstile-response').value = '{token}'") page.click("button[type='submit']") browser.close()
步骤3:后端校验token合法性
即使拿到token,必须通过Cloudflare官方接口校验有效性,否则请求会被拦截:
import requests def verify_turnstile(token, secret_key, user_ip): verify_url = "https://challenges.cloudflare.com/turnstile/v0/siteverify" payload = { "secret": secret_key, # 注意这是Cloudflare后台获取的secret key,不是sitekey "response": token, "remoteip": user_ip } resp = requests.post(verify_url, data=payload) return resp.json().get("success", False) # 使用示例 secret_key = "你的站点secret key" user_ip = "用户请求IP" if verify_turnstile(token, secret_key, user_ip): print("token验证通过,处理请求") else: print("token无效,拦截请求")
常见问题排查
- 不要手动伪造
cf-turnstile-response值,Cloudflare会校验token的生成上下文,伪造值100%会被拒绝。 - 确保无头浏览器启用了正常的User-Agent、JS支持,避免被检测为自动化工具。
- 确认
sitekey和secret_key配对正确,二者均需从Cloudflare后台对应站点获取。
内容的提问来源于stack exchange,提问作者Md. Abdullah Al Baki
相关产品推荐
相关产品推荐

