Casos de Uso

Resolvendo CAPTCHAs em sites japoneses e coreanos

Os sites japoneses e coreanos apresentam desafios únicos de CAPTCHA. Sites japoneses podem usar três sistemas de escrita - hiragana (ã²ã‚‰ãŒãª), katakana (カタカナ) e kanji (æ¼¢å—) - às vezes misturados em uma única imagem. Sites coreanos usam caracteres hangul (한글). O OCR padrão com foco no latim falha nesses conjuntos de caracteres.

Tipos de CAPTCHA por região

Região Tipos comuns Conjuntos de caracteres Solucionador CaptchaAI
Japão Imagem com hiragana/katakana, reCAPTCHA, hCaptcha Hiragana, katakana, kanji, latim Imagem/OCR
Coreia Imagem com hangul, reCAPTCHA, controles deslizantes proprietários Hangul, latim Imagem/OCR
Ambos reCAPTCHA v2/v3 (IU localizada) N/A (baseado em token) reCAPTCHA

Python: imagem japonesa CAPTCHA

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_japanese_captcha(image_path: str) -> str:
    """Solve a Japanese 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,          # CJK character support
        "json": 1,
    }, timeout=30).json()

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

    task_id = resp["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")


def solve_korean_captcha(image_path: str) -> str:
    """Solve a Korean hangul 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,
        "json": 1,
    }, timeout=30).json()

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

    task_id = resp["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")


def solve_captcha_from_session(session: requests.Session,
                                captcha_url: str,
                                language: int = 2) -> str:
    """Download and solve a CAPTCHA within a session context."""
    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": str(language),
        "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")


# --- Usage ---

# Japanese CAPTCHA
jp_text = solve_japanese_captcha("japanese_captcha.png")
print(f"Japanese CAPTCHA: {jp_text}")

# Korean CAPTCHA from a live session
session = requests.Session()
session.headers["Accept-Language"] = "ko-KR,ko;q=0.9"
session.get("https://example.kr/login")  # establish session
kr_text = solve_captcha_from_session(session, "https://example.kr/captcha/image")
print(f"Korean CAPTCHA: {kr_text}")

JavaScript: Japonês/Korean Solução CAPTCHA

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 solveAsianCaptcha(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 solveFromUrl(captchaUrl, cookies = "") {
  const resp = await fetch(captchaUrl, {
    headers: { Cookie: cookies, "Accept-Language": "ja-JP,ja;q=0.9" },
  });
  const buffer = await resp.arrayBuffer();
  const imageB64 = Buffer.from(buffer).toString("base64");

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

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

  const taskId = submitResp.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");
}

// Usage
const jpText = await solveAsianCaptcha("japanese_captcha.png");
console.log(`Japanese: ${jpText}`);

Considerações sobre o conjunto de caracteres

Sistema de escrita Personagens Notas
Hiragana (ã²ã‚‰ãŒãª) 46 caracteres básicos Fonética; usado para palavras japonesas nativas
Katakana (カタカナ) 46 caracteres básicos Fonética; usado para palavras de empréstimo estrangeiro
Kanji (æ¼¢å—) Milhares de personagens Compartilhado com chineses; CAPTCHAs usam subconjunto comum
Hangul (한글) 24 letras básicas, aproximadamente 11.000 blocos de sílabas Alfabeto fonético coreano
Misto (JP) Hiragana + katakana + kanji + latim Mais desafiador: vários scripts em uma imagem

Solução de problemas

Problema Causa Correção
Hiragana confundido com katakana Aparência semelhante (por exemplo, ã vs ã‚) Defina language=2 para CJK - CaptchaAI diferencia
Caracteres Hangul ilegíveis Resposta decodificada como Latin-1 Forçar codificação UTF-8: response.encoding = 'utf-8'
O script misto CAPTCHA falha Vários conjuntos de caracteres em uma imagem CaptchaAI lida com scripts mistos com language=2
Baixa precisão em texto estilizado Distorção pesada nos personagens Imagens de resolução mais alta aprimoram o reconhecimento
A sessão expirou após a resolução Longo tempo de resolução de personagens complexos Pré-estabeleça sessão, resolva rapidamente, envie imediatamente

Perguntas frequentes

CaptchaAI consegue distinguir entre caracteres hiragana e katakana semelhantes?

Sim. Com language=2, CaptchaAI usa modelos treinados em conjuntos de caracteres CJK que distinguem caracteres visualmente semelhantes em sistemas de escrita japoneses. A precisão é maior em imagens nítidas e de alta resolução.

Preciso de parâmetros de API diferentes para japonês e coreano?

Não. Ambos usam language=2 para reconhecimento de caracteres CJK. CaptchaAI detecta automaticamente se os caracteres são japoneses, coreanos ou chineses. A única diferença é o contexto do site – use cabeçalhos Accept-Language apropriados.

E quanto ao reCAPTCHA em sites japoneses/Korean?

O reCAPTCHA em sites japoneses/Korean funciona de forma idêntica a qualquer outro site: é baseado em token e independente de idioma. Use o solucionador reCAPTCHA do CaptchaAI com a chave do site da página. A IU localizada não afeta o processo de resolução.

Artigos relacionados

Próximas etapas

Comece a resolver CAPTCHAs de sites japoneses e coreanos -obtenha sua chave API CaptchaAIe lidar com qualquer caractere CJK CAPTCHA.

Guias relacionados:

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