Casos de Uso

Resolvendo CAPTCHAs em sites chineses com CaptchaAI

Os sites chineses usam tipos de CAPTCHA raramente vistos nos mercados ocidentais - CAPTCHAs de imagem de caracteres chineses, quebra-cabeças aritméticos em mandarim, verificações de slides GeeTest e fornecedores proprietários como Tencent CAPTCHA. Se você estiver coletando dados do Baidu, Taobao, portais governamentais ou bancos de dados acadêmicos, precisará lidar com esses desafios específicos da região.

Tipos comuns de CAPTCHA em sites chineses

Tipo CAPTCHA Onde usado Solucionador CaptchaAI
Imagem de caracteres chineses Portais governamentais, bancos de dados acadêmicos Imagem/OCR com language=chi_sim
Aritmética em Chinês Formulários de inscrição Imagem/OCR
Quebra-cabeça deslizante GeeTest v3 Baidu, Bilibili, muitas plataformas importantes GeeTest v3
Clique no personagem "Clique no caractere chinês em ordem" Image/OCR (modo de coordenadas)
reCAPTCHA v2 Sites chineses internacionais reCAPTCHA v2

Python: imagem de caracteres chineses CAPTCHA

CAPTCHAs de imagem em chinês exibem caracteres como 请输入验è¯ç  (insira o código de verificação) e exigem OCR de texto em chinês.

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: Fluxo CAPTCHA do site chinês

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}`);

Dicas para raspagem de sites chineses

Desafio Solução
Caracteres renderizados incorretamente Garanta a codificação UTF-8 em solicitações e respostas
Cookies de sessão necessários Busque a imagem CAPTCHA na mesma sessão
Parâmetros GeeTest em JavaScript Extraia gt e challenge de scripts de página ou chamadas de API
Limitação de taxa por CDNs chineses Use proxies com endereços IP chineses para mais adequado confiabilidade
CAPTCHA é atualizado a cada carregamento Baixe a imagem uma vez, resolva e envie – não recarregue

Solução de problemas

Problema Causa Correção
Caracteres chineses ilegíveis no resultado Incompatibilidade de codificação Certifique-se de que a resposta seja decodificada como UTF-8
GeeTest challenge expirou Desafio tem TTL curto Extraia e envie segundos após o carregamento
Imagem CAPTCHA retorna texto errado Mistura de caracteres chineses e latinos Defina language=2 para reconhecimento de caracteres chineses
Sessão rejeitada após resolução Cookies não mantidos Use a mesma sessão para busca de CAPTCHA e envio de formulário
Resolver taxa baixa em sites governamentais Renderização de caracteres complexos Imagens CAPTCHA de alta resolução aprimoram a precisão

Perguntas frequentes

O CaptchaAI suporta chinês simplificado e tradicional?

Sim. O solucionador Image/OCR lida com caracteres chineses simplificados (简体) e tradicionais (ç¹é«”). Defina language=2 para ativar o reconhecimento de caracteres chineses. CaptchaAI reconhece mais de 27.500 tipos de imagens CAPTCHA em todos os idiomas.

Como faço para lidar com o GeeTest em plataformas chinesas como Bilibili?

Extraia o parâmetro gt (estático por site) e o parâmetro challenge (dinâmico por sessão) da origem da página ou de um endpoint de API. Envie ambos para o solucionador GeeTest do CaptchaAI. A resposta inclui os valores challenge, validate e seccode a serem enviados com sua solicitação.

Os proxies são necessários para sites chineses?

Muitos sites chineses realizam verificações geográficas baseadas em IP. O uso de proxies com endereços IP chineses aprimora as taxas de sucesso. Ao passar um proxy para CaptchaAI, use proxies residenciais chineses para obter mais adequado resultados.

Artigos relacionados

Próximas etapas

Comece a resolver CAPTCHAs em sites chineses –obtenha sua chave API CaptchaAIe lidar com qualquer tipo de CAPTCHA chinês.

Guias relacionados:

Os comentários estão desativados para este artigo.