Casos de Uso

Resolver CAPTCHA en sitios web chinos con CaptchaAI

Los sitios web chinos utilizan tipos CAPTCHA que rara vez se ven en los mercados occidentales: CAPTCHA de imágenes de caracteres chinos, acertijos aritméticos en mandarín, verificaciones de diapositivas GeeTest y proveedores propietarios como Tencent CAPTCHA. Si está recopilando datos de Baidu, Taobao, portales gubernamentales o bases de datos académicas, debe manejar estos desafíos específicos de la región.

Tipos de CAPTCHA comunes en sitios web chinos

tipo CAPTCHA donde se usa solucionador CaptchaAI
Imagen de carácter chino Portales gubernamentales, bases de datos académicas. Imagen/OCR con language=chi_sim
Aritmética en chino Formularios de registro Imagen/OCR
GeeTest v3 rompecabezas deslizante Baidu, Bilibili, muchas plataformas importantes GeeTest v3
Hacer clic en el personaje "Haga clic en el carácter chino en orden" Image/OCR (modo de coordenadas)
reCAPTCHA v2 Sitios chinos internacionales reCAPTCHA v2

Python: CAPTCHA de imagen de caracteres chinos

Los CAPTCHA de imágenes chinas muestran caracteres como 请输入验è¯ç  (ingrese el código de verificación) y requieren OCR del texto chino.

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: flujo CAPTCHA del sitio web chino

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

Consejos para el scraping de sitios web chinos

Desafío Solución
Los caracteres se representan incorrectamente Garantizar la codificación UTF-8 en solicitudes y respuestas.
Se requieren cookies de sesión Obtener la imagen CAPTCHA dentro de la misma sesión
Parámetros de GeeTest en JavaScript Extraiga gt y challenge de scripts de página o llamadas API
Limitación de tarifas por CDN chinos Utilice proxies con direcciones IP chinas para una mayor confiabilidad
CAPTCHA se actualiza en cada carga Descargue la imagen una vez, resuélvala y luego envíela; no la vuelva a cargar.

Solución de problemas

Problema causa Solución
Caracteres chinos confusos como resultado La codificación no coincide Asegúrese de que la respuesta esté decodificada como UTF-8
GeeTest challenge caducado El desafío tiene TTL corto Extraiga y envíe a los pocos segundos de la carga
La imagen CAPTCHA devuelve texto incorrecto Mezcla de caracteres chinos y latinos. Configure language=2 para el reconocimiento de caracteres chinos
Sesión rechazada después de resolver Cookies no mantenidas Utilice la misma sesión para buscar CAPTCHA y enviar formularios
Tasa de resolución baja en sitios gubernamentales Representación de caracteres complejos Las imágenes CAPTCHA de mayor resolución mejoran la precisión

Preguntas frecuentes

¿CaptchaAI admite chino simplificado y tradicional?

Sí. El solucionador Image/OCR maneja caracteres chinos simplificados (简体) y tradicionales (ç¹é«”). Configure language=2 para habilitar el reconocimiento de caracteres chinos. CaptchaAI reconoce más de 27.500 tipos de CAPTCHA de imágenes en todos los idiomas.

¿Cómo manejo GeeTest en plataformas chinas como Bilibili?

Extraiga el parámetro gt (estático por sitio) y el parámetro challenge (dinámico por sesión) del origen de la página o de un punto final de API. Envíe ambos al solucionador GeeTest de CaptchaAI. La respuesta incluye los valores challenge, validate y seccode para enviar con su solicitud.

¿Se requieren servidores proxy para los sitios web chinos?

Muchos sitios web chinos realizan comprobaciones geográficas basadas en IP. El uso de servidores proxy con direcciones IP chinas mejora las tasas de éxito. Al pasar un proxy a CaptchaAI, utilice proxies chinos residenciales para obtener mejores resultados.

Artículos relacionados

Próximos pasos

Empiece a resolver CAPTCHA en sitios web chinos:obtenga su clave API CaptchaAIy manejar cualquier tipo de CAPTCHA chino.

Guías relacionadas:

Los comentarios están deshabilitados para este artículo.