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...');
}
);