如何用2Captcha解决TikTok验证码?Node.js Puppeteer实现咨询
Node.js + Puppeteer 环境下TikTok验证码自动求解方案
核心疑问解答
- 控制台运行代码仅返回函数的原因:官方给出的示例代码不是直接执行取值的命令,作用是重写TikTok原生的验证码渲染钩子函数。需要在验证码组件加载前提前注入这段代码,等TikTok自身触发验证码渲染流程时,才会自动把内置的
aid、host参数传入并打印,输入代码后需要等验证码弹出才会拿到值。 aid和host参数含义:aid:TikTok分配给对应端的应用ID,网页端TikTok通用固定值为1988,如果验证失败可以通过钩子方法抓取当前环境的实际值host:TikTok验证码服务的请求域名,网页端通用值为https://www.tiktok.com
- 官方没有提供JS/Node.js示例的问题,可以直接参考下面的可运行实现逻辑。
完整实现步骤
- 提前注入参数拦截钩子
在Puppeteer页面初始化完成、导航到TikTok站点前,提前注入脚本劫持验证码渲染方法,捕获动态参数:
// 注入后只要触发验证码,就会自动把参数存在window对象上 await page.evaluateOnNewDocument(() => { window.renderCaptcha = ({aid, host}) => { window.__captchaParams = {aid, host}; }; });
- 检测验证码触发
在业务流程中轮询页面特征元素(比如验证码iframe、验证弹窗容器),判断验证码是否弹出。 - 对接2Captcha提交验证任务
提取验证码的sitekey(从验证码iframe的src参数或者data-sitekey属性获取),结合捕获到的aid、host参数,向2Captcha接口提交验证任务。 - 轮询获取验证结果并回填
提交任务后每隔3秒查询一次任务状态,拿到验证通过的token后,注入页面触发验证完成逻辑即可。
核心代码参考
const axios = require('axios'); const puppeteer = require('puppeteer'); // 替换为你自己的2Captcha密钥 const TWO_CAPTCHA_API_KEY = ''; async function solveTikTokCaptcha(page) { // 优先取捕获的动态参数,拿不到就用网页端通用固定值 const captchaParams = await page.evaluate(() => window.__captchaParams || { aid: 1988, host: 'https://www.tiktok.com' }); // 从iframe提取验证码sitekey const siteKey = await page.$eval('iframe[src*="captcha"]', el => { const iframeSrc = new URL(el.src); return iframeSrc.searchParams.get('sitekey') || el.dataset.sitekey; }); const currentPageUrl = page.url(); // 创建验证任务 const createTaskResp = await axios.post('https://api.2captcha.com/createTask', { clientKey: TWO_CAPTCHA_API_KEY, task: { type: 'TikTokCaptcha', websiteURL: currentPageUrl, websiteKey: siteKey, aid: captchaParams.aid, host: captchaParams.host } }); if (createTaskResp.data.errorId) { throw new Error(`创建验证任务失败: ${createTaskResp.data.errorDescription}`); } const taskId = createTaskResp.data.taskId; // 轮询获取验证结果 let verifyResult = null; while (!verifyResult) { // 间隔3秒查询一次,避免触发接口频率限制 await new Promise(resolve => setTimeout(resolve, 3000)); const taskResp = await axios.post('https://api.2captcha.com/getTaskResult', { clientKey: TWO_CAPTCHA_API_KEY, taskId: taskId }); if (taskResp.data.status === 'ready') { verifyResult = taskResp.data.solution; } if (taskResp.data.errorId) { throw new Error(`验证失败: ${taskResp.data.errorDescription}`); } } // 回填验证结果,完成验证 await page.evaluate((solution) => { // 优先调用原生回调 if (typeof window.captchaCallback === 'function') { window.captchaCallback(solution.token); } // 兜底:点击验证确认按钮 document.querySelector('.captcha-verify-btn, [data-e2e="captcha-verify-button"]')?.click(); }, verifyResult); return true; } // 调用示例 (async () => { const browser = await puppeteer.launch({ headless: false, defaultViewport: null }); const page = await browser.newPage(); // 提前注入参数捕获钩子 await page.evaluateOnNewDocument(() => { window.renderCaptcha = ({aid, host}) => { window.__captchaParams = {aid, host}; }; }); await page.goto('https://www.tiktok.com', {waitUntil: 'networkidle2'}); // 业务逻辑中检测到验证码弹出时,调用 await solveTikTokCaptcha(page) 即可 })();
其他可选方案
除2Captcha外,其他主流验证码解决服务的对接逻辑基本一致,仅需替换对应API地址和参数格式即可。自建验证码识别模型的成功率不足30%,不推荐投入开发成本。
内容的提问来源于stack exchange,提问作者Billi Alt
相关产品推荐
相关产品推荐

