应用场景

使用 CaptchaAI 解决中文网站上的验证码问题

中国网站使用西方市场中很少见的验证码类型——汉字图像验证码、普通话算术谜题、GeeTest幻灯片验证以及腾讯验证码等专有提供商。如果您从百度、淘宝、政府门户网站或学术数据库收集数据,则需要应对这些特定于地区的挑战。

中文网站常见的验证码类型

验证码类型 使用地点 CaptchaAI 求解器
汉字形象 政府门户网站、学术数据库 图片/OCR 与 language=chi_sim
算术 中文 登记表 图片/OCR
GeeTest v3 幻灯片拼图 百度、B站、各大平台 GeeTest v3
点击角色 “按顺序点击汉字” Image/OCR(坐标模式)
reCAPTCHA v2 国际中文网站 reCAPTCHA v2

Python:汉字图像验证码

中文图像验证码显示“入验è́ç ”等字符(请输入验证码),并要求对中文文本进行 OCR。

import requests
import base64
import time

API_KEY = "YOUR_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"


def solve_chinese_image_captcha(image_path: str) -> str:
    """Solve a Chinese character image CAPTCHA."""
    with open(image_path, "rb") as f:
        image_b64 = base64.b64encode(f.read()).decode()

    resp = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "language": 2,          # 2 = Chinese characters supported
        "json": 1,
    }, timeout=30).json()

    if resp.get("status") != 1:
        raise RuntimeError(f"Submit failed: {resp.get('request')}")

    task_id = resp["request"]
    start = time.monotonic()

    while time.monotonic() - start < 120:
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            return poll["request"]
        raise RuntimeError(f"Solve failed: {poll.get('request')}")

    raise RuntimeError("Timeout")


def solve_chinese_captcha_from_url(captcha_url: str, cookies: dict = None) -> str:
    """Download and solve a Chinese CAPTCHA from a URL."""
    session = requests.Session()
    if cookies:
        session.cookies.update(cookies)

    resp = session.get(captcha_url, timeout=15)
    image_b64 = base64.b64encode(resp.content).decode()

    submit = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "language": 2,
        "json": 1,
    }, timeout=30).json()

    if submit.get("status") != 1:
        raise RuntimeError(f"Submit: {submit.get('request')}")

    task_id = submit["request"]
    for _ in range(24):
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get", "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            return poll["request"]
        raise RuntimeError(f"Solve: {poll.get('request')}")

    raise RuntimeError("Timeout")


# --- GeeTest on Chinese platforms ---

def solve_geetest_chinese(gt: str, challenge: str, pageurl: str) -> dict:
    """Solve GeeTest v3 commonly found on Baidu, Bilibili, etc."""
    resp = requests.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "geetest",
        "gt": gt,
        "challenge": challenge,
        "pageurl": pageurl,
        "json": 1,
    }, timeout=30).json()

    if resp.get("status") != 1:
        raise RuntimeError(f"Submit: {resp.get('request')}")

    task_id = resp["request"]
    for _ in range(36):
        time.sleep(5)
        poll = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get", "id": task_id, "json": 1,
        }, timeout=15).json()

        if poll.get("request") == "CAPCHA_NOT_READY":
            continue
        if poll.get("status") == 1:
            # GeeTest returns challenge, validate, seccode
            return poll["request"]
        raise RuntimeError(f"Solve: {poll.get('request')}")

    raise RuntimeError("Timeout")


# Usage — Chinese government portal
text = solve_chinese_image_captcha("chinese_captcha.png")
print(f"Chinese CAPTCHA text: {text}")

# GeeTest on a Chinese platform
geetest_result = solve_geetest_chinese(
    gt="b46d1900d0a894591f1561f8c35670a7",
    challenge="dynamic_challenge_string",
    pageurl="https://www.example.cn/login",
)

JavaScript:中文网站验证码流程

const API_KEY = "YOUR_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
const fs = require("fs");

async function solveChineseImageCaptcha(imagePath) {
  const imageB64 = fs.readFileSync(imagePath, "base64");

  const body = new URLSearchParams({
    key: API_KEY,
    method: "base64",
    body: imageB64,
    language: "2",
    json: "1",
  });

  const resp = await (await fetch(SUBMIT_URL, { method: "POST", body })).json();
  if (resp.status !== 1) throw new Error(`Submit: ${resp.request}`);

  const taskId = resp.request;
  for (let i = 0; i < 24; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const url = `${RESULT_URL}?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const poll = await (await fetch(url)).json();
    if (poll.request === "CAPCHA_NOT_READY") continue;
    if (poll.status === 1) return poll.request;
    throw new Error(`Solve: ${poll.request}`);
  }
  throw new Error("Timeout");
}

async function solveGeeTest(gt, challenge, pageurl) {
  const body = new URLSearchParams({
    key: API_KEY,
    method: "geetest",
    gt,
    challenge,
    pageurl,
    json: "1",
  });

  const resp = await (await fetch(SUBMIT_URL, { method: "POST", body })).json();
  if (resp.status !== 1) throw new Error(`Submit: ${resp.request}`);

  const taskId = resp.request;
  for (let i = 0; i < 36; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const url = `${RESULT_URL}?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const poll = await (await fetch(url)).json();
    if (poll.request === "CAPCHA_NOT_READY") continue;
    if (poll.status === 1) return poll.request;
    throw new Error(`Solve: ${poll.request}`);
  }
  throw new Error("Timeout");
}

// Usage
const text = await solveChineseImageCaptcha("chinese_captcha.png");
console.log(`Chinese text: ${text}`);

中文网站抓取技巧

挑战 解决方案
字符渲染不正确 确保请求和响应中的 UTF-8 编码
需要会话cookie 在同一会话中获取验证码图像
JavaScript 中的 GeeTest 参数 从页面脚本或 API 调用中提取 gtchallenge
中国 CDN 的速率限制 使用具有中国 IP 地址的代理以获得更好的可靠性
每次加载时都会刷新验证码 下载图像一次,解决,然后提交 - 不要重新加载

故障排除

问题 原因 处理方式
结果出现中文乱码 编码不匹配 确保响应被解码为 UTF-8
极测 challenge 已过期 挑战的 TTL 较短 加载后几秒内提取并提交
图像验证码返回错误文本 中文和拉丁字符混合 设置language=2进行汉字识别
解决后会话被拒绝 未维护 Cookie 使用同一会话进行验证码获取和表单提交
政府网站解决率低 复杂的角色渲染 更高分辨率的验证码图像可提高准确性

常问问题

CaptchaAI支持简体中文和繁体中文吗?

是的。 Image/OCR 求解器可处理简体 (简体) 和繁体 (ç¤é«”) 汉字。设置language=2以启用汉字识别。 CaptchaAI 可识别所有语言的 27,500 多种图像验证码类型。

如何在Bilibili等中国平台上处理GeeTest?

从页面源或 API 端点提取 gt 参数(每个站点静态)和 challenge 参数(每个会话动态)。将两者提交给 CaptchaAI 的 GeeTest 求解器。响应包括与您的请求一起提交的 challengevalidateseccode 值。

中国网站需要代理吗?

许多中国网站执行基于 IP 的地理检查。使用具有中国 IP 地址的代理可以提高成功率。将代理传递给 CaptchaAI 时,请使用中国自有服务器基础设施以获得最佳结果。

相关文章

下一步

开始解决中文网站上的验证码 -”获取您的 CaptchaAI API 密钥并处理任何中文验证码类型。

相关指南:

该文章已禁用评论。