Tutorial

如何用 Python 绕过 Cloudflare Turnstile

2026-04-135 分钟阅读

Cloudflare Turnstile 是网络上最常见的验证码之一。在本教程中,您将学习如何使用 Python 和 NSLSolver API 以编程方式绕过它。我们将在 5 分钟内从零开始实现一个可用的解决方案。

前置条件

  • 已安装 Python 3.7 或更高版本
  • requests 库(pip install requests)
  • NSLSolver API 密钥 — 免费注册

第一步:安装依赖

您只需要 requests 库。使用 pip 安装:

terminal
$pip install requests

第二步:获取 API 密钥

使用 NSLSolver API 需要一个 API 密钥:

  1. 在 nslsolver.com 创建免费账户
  2. 验证邮箱即可获得 100 次免费请求
  3. 从控制台复制您的 API 密钥

第三步:发送解决请求

以下是解决 Turnstile 验证码的最简代码:

solve_turnstile.py
import requests

API_KEY = "nsl_YOUR_API_KEY"

response = requests.post(
    "https://api.nslsolver.com/solve",
    headers={"X-API-Key": API_KEY},
    json={
        "type": "turnstile",
        "siteKey": "0x4XXXXXXXXXXXXXXXXX",
        "url": "https://example.com"
    }
)

data = response.json()
print(data["token"])

API 返回包含已解决令牌的 JSON 响应:

response.json
{
  "success": true,
  "token": "1.AgAAAIxD...a_long_token_string",
  "cost": 0.001
}

第四步:使用令牌

现在将令牌连同表单数据一起提交到目标网站:

use_token.py
# After getting the token from NSLSolver:
token = data["token"]

# Submit the form with the solved token
result = requests.post(
    "https://example.com/login",
    data={
        "username": "[email protected]",
        "password": "your_password",
        "cf-turnstile-response": token
    }
)

print(result.status_code)

完整示例(含错误处理)

以下是适用于生产环境的示例,包含重试和错误处理:

turnstile_bypass.py
import requests
import time

API_KEY  = "nsl_YOUR_API_KEY"
SITE_KEY = "0x4XXXXXXXXXXXXXXXXX"
PAGE_URL = "https://example.com/protected-page"


def solve_turnstile(site_key, url, retries=3):
    """Solve a Cloudflare Turnstile challenge via NSLSolver."""
    for attempt in range(retries):
        try:
            resp = requests.post(
                "https://api.nslsolver.com/solve",
                headers={"X-API-Key": API_KEY},
                json={
                    "type": "turnstile",
                    "siteKey": site_key,
                    "url": url
                },
                timeout=30
            )
            resp.raise_for_status()
            data = resp.json()

            if data.get("success"):
                return data["token"]

            print(f"Attempt {attempt + 1} failed: {data}")

        except requests.RequestException as e:
            print(f"Request error: {e}")

        if attempt < retries - 1:
            time.sleep(2)

    return None


# Solve and use the token
token = solve_turnstile(SITE_KEY, PAGE_URL)

if token:
    print("Got token, submitting form...")
    result = requests.post(
        PAGE_URL,
        data={"cf-turnstile-response": token}
    )
    print(f"Status: {result.status_code}")
else:
    print("Failed to solve turnstile after retries.")

错误处理

您可能遇到的常见 HTTP 状态码:

  • 401API 密钥无效。请检查您的 X-API-Key 请求头。
  • 402余额不足。请为账户充值。
  • 429请求被限流。请稍等片刻后重试。
  • 500服务器错误。请重试请求。如果持续出现,请联系客服。

小贴士:务必实现重试逻辑。虽然偶发故障很少见,但仍有可能。上面的完整示例已自动处理了这种情况。

准备好开始了吗?

创建免费账户,获取 100 次请求体验。无需信用卡。