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 控制。

相关指南

该文章已禁用评论。