如何用 Node.js 绕过 Cloudflare Turnstile

4 分钟阅读

Cloudflare Turnstile 是一种广泛使用的验证码替代方案,覆盖数百万网站。如果您使用 Node.js 并需要以编程方式绕过 Turnstile,本指南将展示如何通过 NSLSolver API 实现。

无需 puppeteer,无需无头浏览器,除了 Node.js 18+ 内置的 fetch() 外无需任何依赖。

前置条件

  • Node.js 18+(支持原生 fetch)
  • NSLSolver API 密钥(在 nslsolver.com 免费注册)

第一步:创建项目

创建新目录并初始化 Node.js 项目:

Terminal
mkdir turnstile-solver && cd turnstile-solver
npm init -y

无需安装额外包——我们使用内置的 fetch() API。

第二步:解决 Turnstile 质询

向 NSLSolver API 发送 POST 请求,包含目标站点的 Turnstile sitekey 和 URL:

solve.mjs
const response = await fetch('https://api.nslsolver.com/solve', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'x-api-key': 'YOUR_API_KEY',
  },
  body: JSON.stringify({
    type: 'turnstile',
    site_key: '0x4AAAAAAXXXXXXXXXXXXXXX',
    url: 'https://example.com/login',
  }),
});

const data = await response.json();
console.log('Token:', data.token);

API 同步响应,无需轮询。平均响应时间约 250ms。

第三步:使用令牌

将返回的令牌传入您向目标站点提交的表单或 API 调用中:

JavaScript
// Use the token in your form submission or API call
const result = await fetch('https://example.com/api/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    username: '[email protected]',
    password: 'password123',
    'cf-turnstile-response': data.token,
  }),
});

完整示例

以下是一个独立脚本,可以直接保存并运行:

solve-turnstile.mjs
// solve-turnstile.mjs
// Run: node solve-turnstile.mjs

const API_KEY = process.env.NSLSOLVER_API_KEY || 'YOUR_API_KEY';
const SITE_KEY = '0x4AAAAAAXXXXXXXXXXXXXXX';
const TARGET_URL = 'https://example.com/login';

async function solveTurnstile() {
  const res = await fetch('https://api.nslsolver.com/solve', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': API_KEY,
    },
    body: JSON.stringify({
      type: 'turnstile',
      site_key: SITE_KEY,
      url: TARGET_URL,
    }),
  });

  if (!res.ok) {
    throw new Error(`Solve failed: ${res.status} ${await res.text()}`);
  }

  const { token } = await res.json();
  console.log('Solved! Token:', token.slice(0, 40) + '...');
  return token;
}

solveTurnstile().catch(console.error);

Async/Await 辅助模式

将解决逻辑封装在可复用函数中,使代码更简洁:

JavaScript
async function withTurnstileToken(siteKey, url, callback) {
  const res = await fetch('https://api.nslsolver.com/solve', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': process.env.NSLSOLVER_API_KEY,
    },
    body: JSON.stringify({ type: 'turnstile', site_key: siteKey, url }),
  });

  const { token } = await res.json();
  return callback(token);
}

// Usage
await withTurnstileToken(
  '0x4AAAAAAXXXXXXXXXXXXXXX',
  'https://example.com/login',
  async (token) => {
    // your logic here
    console.log('Got token, submitting form...');
  }
);

用 Node.js 开始解决 Turnstile

创建免费账户,获取 API 密钥,粘贴上面的代码。不到一分钟即可开始。