Use Cases

使用 CaptchaAI 自动登录验证码处理

能不能让脚本自己登录到底?关键往往不在账号密码,而在登录页有没有验证码拦截。CaptchaAI 负责识别验证码、返回 token;填表单、维持 session、处理 MFA,依然要靠你自己的自动化逻辑。

动手写代码前,先确认三件事:

  • 登录表单是否依赖 JavaScript 渲染或二次校验
  • 页面挂的是哪种验证码(reCAPTCHA、Turnstile 还是图片验证码)
  • 登录成功后是否还有一层 MFA 需要处理

国内业务 vs 出海产品,验证码不一样

海外产品登录页多挂 reCAPTCHA 或 Turnstile;国内业务更常见 GeeTest(极验)滑块。脚本骨架不变,把 method 换成 geetest 即可;国内环境跑 Selenium/Puppeteer,建议给 pip install 加国内镜像(清华 TUNA 源)。

登录页常见的验证码类型

验证码 出现形式 CaptchaAI 方法
reCAPTCHA v2 提交前的勾选框或图片挑战 method=userrecaptcha
reCAPTCHA v3 隐形打分,低分用户直接被拦 method=userrecaptcha&version=v3
Cloudflare Turnstile 登录表单前的验证组件 method=turnstile
图片验证码 需要手动输入的文本图片 method=base64

方案一:纯 HTTP 请求,不启动浏览器

适用场景

登录表单接受标准 POST、页面不依赖 JS 校验时,直接用 HTTP 请求配合 CaptchaAI API 最省资源:

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

# Login flow
session = requests.Session()
login_url = "https://staging.example.com/qa-login"

# Load login page to get cookies and site key
page = session.get(login_url)
# Extract site_key from the page HTML...
site_key = "6Le-wvkS..."

# Solve CAPTCHA
token = solve_recaptcha(site_key, login_url)

# Submit login form
resp = session.post(login_url, data={
    "username": "[email protected]",
    "password": "your_password",
    "g-recaptcha-response": token
})

if resp.url != login_url:
    print("Login successful!")
    # session now has auth cookies for subsequent requests

token 拿到手后放进 g-recaptcha-response 字段随表单一起提交即可,这一步就是标准的“提交 token”。

方案二:用 Selenium 处理需要执行 JS 的登录页

适用场景

登录页把验证码渲染或二次校验放进 JavaScript 时,纯请求拿不到完整上下文,得起一个真实浏览器实例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import requests
import time

API_KEY = "YOUR_API_KEY"

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)

# Navigate to login page
driver.get("https://staging.example.com/qa-login")
wait = WebDriverWait(driver, 10)

# Fill in credentials
username_field = wait.until(EC.presence_of_element_located((By.NAME, "username")))
username_field.send_keys("[email protected]")
driver.find_element(By.NAME, "password").send_keys("your_password")

# Extract site key and solve
recaptcha = driver.find_element(By.CLASS_NAME, "g-recaptcha")
site_key = recaptcha.get_attribute("data-sitekey")

token = solve_recaptcha(site_key, driver.current_url)

# Inject token
driver.execute_script(
    f"document.getElementById('g-recaptcha-response').innerHTML = '{token}';"
)

# Submit
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
wait.until(EC.url_changes(driver.current_url))
print(f"Logged in! Now at: {driver.current_url}")

方案三:用 Puppeteer 实现 Node.js 登录自动化

适用场景

Node.js 下 Puppeteer 是等价方案:启动浏览器、拿 sitekey、调用 API 解题、把 token 写回页面再提交。

const puppeteer = require("puppeteer");
const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveRecaptcha(siteKey, pageUrl) {
  const submit = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: siteKey,
      pageurl: pageUrl,
    },
  });
  const taskId = submit.data.split("|")[1];

  while (true) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId },
    });
    if (result.data === "CAPCHA_NOT_READY") continue;
    if (result.data.startsWith("OK|")) return result.data.split("|")[1];
    throw new Error(result.data);
  }
}

(async () => {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto("https://staging.example.com/qa-login");

  // Fill credentials
  await page.type("#username", "[email protected]");
  await page.type("#password", "your_password");

  // Get site key and solve
  const siteKey = await page.$eval(".g-recaptcha", (el) =>
    el.getAttribute("data-sitekey")
  );
  const token = await solveRecaptcha(siteKey, page.url());

  // Inject and submit
  await page.evaluate(
    (t) => (document.getElementById("g-recaptcha-response").innerHTML = t),
    token
  );
  await page.click('button[type="submit"]');
  await page.waitForNavigation();

  console.log("Logged in:", page.url());
  await browser.close();
})();

验证码 + 多因素认证(MFA)组合登录

部分企业级登录页会在验证码之后再加一层 MFA。验证码只是第一关,提交完还要处理跳转到验证页面之后的逻辑,大致分三步:

  1. 解决验证码并提交登录表单
  2. 检查响应 URL 是否跳转到验证/MFA 页面
  3. 提交 MFA 验证码,再确认最终落地页
# Step 1: Solve CAPTCHA and submit login
token = solve_recaptcha(site_key, login_url)
resp = session.post(login_url, data={
    "username": "[email protected]",
    "password": "your_password",
    "g-recaptcha-response": token
})

# Step 2: Handle MFA page (if redirected)
if "verify" in resp.url or "mfa" in resp.url:
    # Your MFA code logic here
    mfa_code = get_mfa_code()
    resp = session.post(resp.url, data={"code": mfa_code})

# Step 3: Verify logged in
assert "dashboard" in resp.url

常见故障排查

问题 原因 处理方式
又跳回验证码页面 token 已过期 60 秒内完成提交
密码正确却提示“凭据无效” 缺少 CSRF token 提取页面 CSRF token,一并提交
登录后请求显示未登录 cookie 未保留 requests.Session() 或持久化浏览器 cookie
reCAPTCHA v3 有 token 仍被拦 分数太低 核对 action 参数是否一致

排查登录自动化问题时,建议按顺序检查:

  • token 是否在有效期内提交(一般几十秒)
  • CSRF token 是否随表单一起提交
  • cookie/session 是否在请求之间持久化

常见问题

登录自动化能覆盖哪些验证码类型?

除 reCAPTCHA v2/v3、Turnstile、图片验证码外,国内常见的 GeeTest(极验)滑块也支持,换个 method 参数即可。

不启动浏览器也能完成登录自动化吗?

可以,前提是表单接受标准 POST 且不依赖 JS;需要执行 JS 时才用 Selenium/Puppeteer。

token 过期或 CSRF 校验失败怎么处理?

token 通常几十秒内失效,拿到后尽快提交;CSRF 报错多半是漏提取了登录页自带的 token。

reCAPTCHA v3 提交了 token,登录还是被拦截,为什么?

v3 是打分机制,token 有效不代表分数够高——核对 action 参数是否一致,分数阈值不受 CaptchaAI 控制。

相关指南

该文章已禁用评论。