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: