欢迎阅读本教程!在本教程中,我们将使用 Nstbrowser 完成从 Cloudflare 上获取 Turnstile 令牌的全部步骤。
通过简单的演示,然后根据具体步骤完成您的工作!
首先,让我们来谈谈 Cloudflare。Cloudflare 成立于 2009 年,是一家提供旨在提高网站和互联网应用程序的安全性、速度和可用性的解决方案的知名公司。
Cloudflare 主要提供以下服务:
Cloudflare Turnstile 为网站和网络应用程序的用户身份验证和访问控制提供了强大而灵活的解决方案。它有助于增强安全性、保护敏感资源并改善用户体验。
其实获取令牌的方法并不难!
为了获得更好的体验,您需要在在 Nstbrowser 官方网站上注册一个新账户:https://app.nstbrowser.io/account/register。
使用注册信息登录 Nstbrowser 客户端。登录成功后,别忘了在 API 菜单中生成自己的专属API Key
!
现在!是时候创建一个节点项目了。如果你创建了,这项工作就完成了:
api.js
文件// Api Docs: https://apidocs.nstbrowser.io/api-5418530
export async function getBrowserWSEndpoint(apiKey) {
const config = {
once: true, // one_time browser
headless: false, // support: true, 'new'
autoClose: false,
// remoteDebuggingPort: 9223,
fingerprint: {
name: 'test-turnstile',
platform: 'windows', // support: windows, mac, linux
kernel: 'chromium', // only support: chromium
kernelMilestone: '120',
hardwareConcurrency: 2, // support: 2, 4, 8, 10, 12, 14, 16
deviceMemory: 8, // support: 2, 4, 8
proxy: "" // input format: schema://user:password@host:port
},
};
const query = new URLSearchParams({
'x-api-key': apiKey,
config: JSON.stringify(config),
}).toString();
const resp = await fetch(`http://localhost:8848/api/agent/devtool/launch?${query}`)
const json = await resp.json();
return json.data
}
有关更多 API 参数,请参阅 Nstbrowser API 文档
您对网页抓取和 Browseless 有什么好的想法或疑惑吗?
快来看看其他开发人员在 Discord 和 Telegram 上分享了什么!
turnstile.js
文件,并插入以下代码,以便通过 Puppeteer 自动检索 Turnstile Token 数据。import puppeteer from "puppeteer-core";
import {getBrowserWSEndpoint} from "./api.js";
const apiKey = 'API Key'
async function delay(time) {
return new Promise(resolve => setTimeout(resolve, time));
}
let browser = null;
async function getTurnstileToken() {
const {webSocketDebuggerUrl} = await getBrowserWSEndpoint(apiKey)
browser = await puppeteer.connect({
browserWSEndpoint: webSocketDebuggerUrl,
defaultViewport: null,
});
const page = await browser.newPage();
let resolveToken = null;
const tokenPromise = new Promise(resolve => resolveToken = resolve);
// This method is used to monitor whether the Checkbox exists on the page and click it
const checkbox = async () => {
while (true) {
try {
if (page.isClosed()) return;
const targetFrameUrl = 'cdn-cgi/challenge-platform/';
const iframe = page.frames().find((frame) => frame.url().includes(targetFrameUrl));
if (iframe) {
const box_element = await iframe.waitForSelector('input[type="checkbox"]', {
timeout: 1000,
visible: true,
});
await box_element.click();
}
} catch (e) {
} finally {
await delay(1000)
}
}
}
// This method is used to monitor whether the token is returned
const findToken = async () => {
while (true) {
if (page.isClosed()) return;
const response = await page.evaluate(() => {
const token = window?.turnstile?.getResponse()
if (token) {
return {token: token}
}
});
if (response) {
resolveToken(response);
return;
}
await delay(1000)
}
}
findToken().then()
checkbox().then()
await page.goto('https://xxx.com/login.html');
return tokenPromise;
}
// Test get trunstile token
getTurnstileToken()
.then(result => console.log(result))
.catch(err => console.error(err))
turnstile.js
,等待结果。输出结果可能显示为{ token: '0.ZDHeg0BH58fAptHKige3NNlwavjsNJtp9mIHOxV6Qbqp30cpqwi7ib2M7utunoXsOAf2EYd71XFzJnMw2rA_Zi5VuAFqe-CaXx7bHdecjxrjOaTdOGWQ_0mk9WA3v-FfJgXaJZD5FVmp1UCtQuzrxt4__TVYwytrbtrKbFpBJKqKH6CdY5MCnORHgcjc2FXS9PD0rCBdzJuicWJedZkmDvvGeWG2iKQ5D1T85oUoqkKpT-NMkSt1webVc_Yfa0sPXmbw8DKkYsauwJPvqfbqyfSdrDi17qK2APCQANeWdXgd-1NsHdlkV4OMdZuunbsoROJVXIOu-i1R_8rkWKiejsGQfkubX8Y8_xempdEO0LfYEBmrMUbPzyr12QcEefE5r_BPmdn_RTX_dU2kh734G3qaodxCcOOcCo5UKM1cvHI.D_fh7cB0Bxhb4b0PHB7jew.451b703e4df2a4e8cd61d90d175329883eb3af85d72e77787959c0b52fe112e2' }
获得 Turnstile 令牌后,我们通常需要将该令牌作为表单请求的一部分提交给服务器。根据实际网站的不同,这一步骤的实现方式也会有所不同。
因此,您需要根据实际网站的要求修改并应用以下代码示例。
async function submitForm(token) {
const formData = new FormData();
formData.append('username', 'your_username');
formData.append('password', 'your_password');
formData.append('cf-turnstile-response', token);
const response = await fetch('
https://xxx.com/login
', {
method: 'POST',
body: formData,
});
if (response.ok) {
console.log('Form submitted successfully!');
} else {
console.error('Form submission failed!');
}
}
在上述代码中,我们创建了一个新的 FormData 对象,并添加了用户名、密码和 Cloudflare Turnstile 令牌。请注意,您需要根据实际网站要求修改这些值:
https://xxx.com/login
有关完整的 Cloudflare Turnstile 代码示例,请参阅 GitHub