Các trang web của Nhật Bản và Hàn Quốc đưa ra những thử thách CAPTCHA độc đáo. Các trang web của Nhật Bản có thể sử dụng ba hệ thống chữ viết — hiragana (ã²ã‚%ãŒãª), katakana (ã‚<ã‚¿ã‚><ナ) và kanji (æ¼¢å—) — đôi khi được trộn lẫn trong một hình ảnh. Các trang web của Hàn Quốc sử dụng ký tự hangul (í·œê¸€). OCR tiêu chuẩn tập trung vào tiếng Latin không thành công trên các bộ ký tự này.
Các loại CAPTCHA theo khu vực
| Vùng | Các loại phổ biến | Bộ ký tự | Bộ giải CaptchaAI |
|---|---|---|---|
| Nhật Bản | Hình ảnh có hiragana/katakana, reCAPTCHA, hCaptcha | Hiragana, katakana, kanji, tiếng Latin | Hình ảnh/OCR |
| Hàn Quốc | Hình ảnh có hangul, reCAPTCHA, thanh trượt độc quyền | Hangul, tiếng Latin | Hình ảnh/OCR |
| Cả hai | reCAPTCHA v2/v3 (Giao diện người dùng được bản địa hóa) | N/A (dựa trên mã thông báo) | reCAPTCHA |
Python: Hình ảnh CAPTCHA của Nhật Bản
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: Giải quyết /Korean CAPTCHA của Nhật Bản
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}`);
Cân nhắc về bộ ký tự
| Hệ thống chữ viết | nhân vật | Ghi chú |
|---|---|---|
| Hiragana (ã²ã‚%ãŒãª) | 46 ký tự cơ bản | Ngữ âm; được sử dụng cho các từ tiếng Nhật bản địa |
| Katakana (ã‚<タんナ) | 46 ký tự cơ bản | Ngữ âm; dùng cho các từ vay mượn nước ngoài |
| Kanji (æ¼¢å—) | Hàng ngàn nhân vật | Chia sẻ với người Trung Quốc; CAPTCHA sử dụng tập hợp con chung |
| Hangul (íœê¸€) | 24 chữ cái cơ bản, ~11.000 khối âm tiết | Bảng chữ cái phiên âm tiếng Hàn |
| Hỗn hợp (JP) | Hiragana + katakana + kanji + tiếng Latin | Thử thách nhất – nhiều tập lệnh trong một hình ảnh |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Hiragana nhầm lẫn với katakana | Ngoại hình tương tự (ví dụ: ã vs ã‚) | Đặt language=2 cho CJK – CaptchaAI khác biệt |
| Ký tự Hangul bị cắt xén | Phản hồi được giải mã thành Latin-1 | Buộc mã hóa UTF-8: response.encoding = 'utf-8' |
| Tập lệnh CAPTCHA hỗn hợp không thành công | Nhiều bộ ký tự trong một hình ảnh | CaptchaAI xử lý các tập lệnh hỗn hợp bằng language=2 |
| Độ chính xác thấp trên văn bản cách điệu | Biến dạng nặng về ký tự | Hình ảnh có độ phân giải cao hơn cải thiện khả năng nhận dạng |
| Phiên hết hạn sau khi giải quyết | Thời gian giải quyết lâu trên các ký tự phức tạp | Đặt trước phiên, giải nhanh, nộp ngay |
Câu hỏi thường gặp
CaptchaAI có thể phân biệt giữa các ký tự hiragana và katakana tương tự nhau không?
Vâng. Với language=2, CaptchaAI sử dụng các mô hình được đào tạo về bộ ký tự CJK để phân biệt giữa các ký tự giống nhau về mặt hình ảnh trên các hệ thống chữ viết tiếng Nhật. Độ chính xác cao nhất trên hình ảnh rõ ràng, độ phân giải cao.
Tôi có cần các tham số API khác nhau cho tiếng Nhật và tiếng Hàn không?
Không. Cả hai đều sử dụng language=2 để nhận dạng ký tự CJK. CaptchaAI tự động phát hiện các ký tự là tiếng Nhật, tiếng Hàn hay tiếng Trung. Sự khác biệt duy nhất là ngữ cảnh trang web - sử dụng tiêu đề Accept-Language thích hợp.
Còn reCAPTCHA trên các trang /Korean của Nhật Bản thì sao?
reCAPTCHA trên các trang web/Korean của Nhật Bản hoạt động giống hệt với bất kỳ trang web nào khác — nó dựa trên mã thông báo và không phụ thuộc vào ngôn ngữ. Sử dụng trình giải reCAPTCHA của CaptchaAI với khóa trang web từ trang. Giao diện người dùng được bản địa hóa không ảnh hưởng đến quá trình giải quyết.
bài viết liên quan
Các bước tiếp theo
Bắt đầu giải CAPTCHA của trang web Nhật Bản và Hàn Quốc —lấy khóa API CaptchaAI của bạnvà xử lý bất kỳ CAPTCHA ký tự CJK nào.
Hướng dẫn liên quan: