You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:24:03