You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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示例的问题,可以直接参考下面的可运行实现逻辑。

完整实现步骤

  1. 提前注入参数拦截钩子
    在Puppeteer页面初始化完成、导航到TikTok站点前,提前注入脚本劫持验证码渲染方法,捕获动态参数:
// 注入后只要触发验证码,就会自动把参数存在window对象上
await page.evaluateOnNewDocument(() => {
  window.renderCaptcha = ({aid, host}) => {
    window.__captchaParams = {aid, host};
  };
});
  1. 检测验证码触发
    在业务流程中轮询页面特征元素(比如验证码iframe、验证弹窗容器),判断验证码是否弹出。
  2. 对接2Captcha提交验证任务
    提取验证码的sitekey(从验证码iframe的src参数或者data-sitekey属性获取),结合捕获到的aid、host参数,向2Captcha接口提交验证任务。
  3. 轮询获取验证结果并回填
    提交任务后每隔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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:12:25