Cloudflare Turnstile
在这里,我们将在测试网站 tsmanaged.zlsupport.com 上填写一个小的联系表单,并解决 Cloudflare Turnstile CAPTCHA。与之前的 CAPTCHA 类型一样,我们需要在浏览器的开发者工具中找出 CAPTCHA 的 sitekey。
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'www.example.com';
- 让我们启动浏览器,为 CapMonster Cloud 创建一个任务,将其发送到服务器,接收并将结果插入到页面中:
async function solveCloudflareTurnstileCaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page is open, solving Cloudflare Turnstile CAPTCHA...');
await page.type('#username', 'login');
await page.type('#password', 'pass');
const turnstileTaskRequest = new TurnstileProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Getting a captcha solution from CapMonster
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);
console.log('CapMonster Solution:', solutionObject);
const token = solutionObject.solution.token;
console.log('Captcha solved:', token);
// Inserting a token into the "token" field
await page.evaluate((extractedToken) => {
const tokenField = document.querySelector('#token');
if (tokenField) {
tokenField.value = extractedToken;
}
}, token);
console.log('Token inserted into the "token" field!');
// Click on the "Submit" button after inserting the token
await page.evaluate(() => {
const submitButton = document.querySelector('button[type="submit"]');
if (submitButton) {
submitButton.click();
}
});
console.log('Clicked on the "Submit" button after token insertion!');
await new Promise(resolve => setTimeout(resolve, 5000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileCaptcha();
代码部分解释:
async function solveCloudflareTurnstileCaptcha() { ... }: 声明一个异步函数 `solveCloudflareTurnstileCaptcha`,该函数包含了解决 Cloudflare Turnstile CAPTCHA 的所有代码。
const browser = await launch({ headless: false });: 使用 Puppeteer 启动浏览器。`headless: false` 选项表示浏览器将以图形界面启动。
const page = await browser.newPage();: 在浏览器中创建一个新标签页。
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));: 使用提供的 API 密钥初始化 CapMonster 客户端。
await page.goto(WEBSITE_URL);: 跳转到包含 Cloudflare Turnstile CAPTCHA 的页面。
console.log('Page opened, solving Cloudflare Turnstile CAPTCHA...');: 在控制台显示消息,表示页面已打开,正在解决 Cloudflare Turnstile CAPTCHA。
await page.type('#username', 'login');: 在“用户名”字段输入数据。
await page.type('#password', 'pass');: 在“密码”字段输入数据。
const turnstileTaskRequest = new TurnstileProxylessRequest({ ... });: 创建一个用于 Turnstile CAPTCHA 解决方案的请求对象。设置如网站 URL 和 Turnstile CAPTCHA 密钥等参数。
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);: 向 CapMonster 发送请求以解决 Turnstile CAPTCHA。结果保存在 `solutionObject` 中。
console.log('CapMonster Solution:', solutionObject);: 在控制台显示来自 CapMonster 的解决方案信息。
const token = solutionObject.solution.token;: 从 `solutionObject` 中提取 token(解决方案结果)。
console.log('Captcha solved:', token);: 在控制台显示消息,表示 CAPTCHA 已解决,并显示 token。
await page.evaluate((extractedToken) => { ... }, token);: 使用 Puppeteer 的 `evaluate` 方法将 token 插入到网页中的“token”字段。
console.log('Token inserted into the "token" field!');: 在控制台显示消息,表示 token 已插入到“token”字段。
await page.evaluate(() => { ... });: 在插入 token 后,点击“提交”按钮,使用 Puppeteer 的 `evaluate` 方法。
console.log('Clicked on the "Submit" button after token insertion!');: 在控制台输出消息,表示在插入 token 后执行了点击“提交”按钮操作。
await new Promise(resolve => setTimeout(resolve, 5000));: 使用 Promise 暂停 5 秒钟。
} catch (error) { console.error('Error:', error); } finally { await browser.close(); }: 处理错误(如果有的话),并在控制台输出错误消息。在 `finally` 块中关闭浏览器,确保完成操作。
solveCloudflareTurnstileCaptcha();: 调用 `solveCloudflareTurnstileCaptcha` 函数,完成整个解决 Cloudflare Turnstile CAPTCHA 的过程。
完整代码:
import { launch } from 'puppeteer';
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileProxylessRequest } from '@zennolab_com/capmonstercloud-client';
const CAPMONSTER_API_KEY = 'YOUR_API_KEY';
const WEBSITE_KEY = 'EXAMPLE_SITE_KEY';
const WEBSITE_URL = 'www.example.com';
async function solveCloudflareTurnstileCaptcha() {
const browser = await launch({ headless: false });
const page = await browser.newPage();
// Initializing the CapMonster client
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: CAPMONSTER_API_KEY }));
try {
await page.goto(WEBSITE_URL);
console.log('Page opened, solving Cloudflare Turnstile CAPTCHA...');
await page.type('#username', 'login');
await page.type('#password', 'pass');
const turnstileTaskRequest = new TurnstileProxylessRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Getting a captcha solution from CapMonster
const solutionObject = await cmcClient.Solve(turnstileTaskRequest);
console.log('CapMonster Solution:', solutionObject);
const token = solutionObject.solution.token;
console.log('Captcha solved:', token);
// Inserting a token into the "token" field
await page.evaluate((extractedToken) => {
const tokenField = document.querySelector('#token');
if (tokenField) {
tokenField.value = extractedToken;
}
}, token);
console.log('Token inserted into the "token" field!');
// Click on the "Submit" button after inserting the token
await page.evaluate(() => {
const submitButton = document.querySelector('button[type="submit"]');
if (submitButton) {
submitButton.click();
}
});
console.log('Clicked on the "Submit" button after token insertion!');
await new Promise(resolve => setTimeout(resolve, 5000));
} catch (error) {
console.error('Error:', error);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileCaptcha();
- 让我们运行代码。如果一切正确,代码将解决 CAPTCHA 并打开确认页面: