Situs web Jepang dan Korea menghadirkan tantangan CAPTCHA yang unik. Situs-situs di Jepang mungkin menggunakan tiga sistem penulisan — hiragana (ã²ã‚%ãŒãª), katakana (カタカナ), dan kanji (æ¼¢å—) — terkadang tercampur dalam satu gambar. Situs Korea menggunakan karakter hangul (한글). OCR standard yang berfokus pada Latin gagal pada rangkaian karakter ini.
Jenis CAPTCHA berdasarkan Wilayah
| Wilayah | Tipe umum | Kumpulan karakter | Pemecah CaptchaAI |
|---|---|---|---|
| Jepang | Gambar dengan hiragana/katakana, reCAPTCHA, hCaptcha | Hiragana, katakana, kanji, Latin | Gambar/OCR |
| Korea | Gambar dengan hangul, reCAPTCHA, penggeser berpemilik | Hangul, Latin | Gambar/OCR |
| Keduanya | reCAPTCHA v2/v3 (UI yang dilokalkan) | N/A (berbasis token) | reCAPTCHA |
Python: CAPTCHA Gambar Jepang
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: Pemecahan CAPTCHA Jepang/Korean
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}`);
Pertimbangan Kumpulan Karakter
| Sistem penulisan | Karakter | Catatan |
|---|---|---|
| Hiragana (ã²ã‚%ãŒãª) | 46 karakter dasar | Fonetik; digunakan untuk kata-kata asli Jepang |
| Katakana (。。》》。。。。。。。。 | 46 karakter dasar | Fonetik; digunakan untuk kata-kata pinjaman luar negeri |
| Kanji (æ¼¢å—) | Ribuan karakter | Dibagikan dengan orang Cina; CAPTCHA menggunakan subset umum |
| Hangul (한글) | 24 huruf dasar, ~11.000 blok suku kata | Alfabet fonetik Korea |
| Campuran (JP) | Hiragana + katakana + kanji + Latin | Yang paling menantang – banyak skrip dalam satu gambar |
Pemecahan Masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| Hiragana bingung dengan katakana | Penampilan serupa (misalnya, ã vs ã‚) | Tetapkan language=2 untuk CJK — CaptchaAI membedakannya |
| Karakter Hangul kacau | Respons diterjemahkan sebagai Latin-1 | Paksa pengkodean UTF-8: response.encoding = 'utf-8' |
| Skrip campuran CAPTCHA gagal | Beberapa kumpulan karakter dalam satu gambar | CaptchaAI menangani skrip campuran dengan language=2 |
| Akurasi rendah pada teks bergaya | Distorsi berat pada karakter | Gambar beresolusi lebih tinggi meningkatkan pengenalan |
| Sesi berakhir setelah solve | Waktu solve yang lama pada karakter yang kompleks | Sesi pra-pembuatan, selesaikan dengan cepat, segera kirimkan |
Pertanyaan Umum
Bisakah CaptchaAI membedakan karakter hiragana dan katakana yang mirip?
Ya. Dengan language=2, CaptchaAI menggunakan model yang dilatih pada rangkaian karakter CJK yang membedakan karakter yang mirip secara visual di seluruh sistem penulisan Jepang. Akurasi paling tinggi pada gambar yang jernih dan beresolusi tinggi.
Apakah saya memerlukan parameter API yang berbeda untuk bahasa Jepang vs. Korea?
Tidak. Keduanya menggunakan language=2 untuk pengenalan karakter CJK. CaptchaAI secara otomatis mendeteksi apakah karakternya Jepang, Korea, atau Cina. Satu-satunya perbedaan adalah konteks situs web – gunakan header Accept-Language yang sesuai.
Bagaimana dengan reCAPTCHA di situs Japanese/Korean?
reCAPTCHA di situs Japanese/Korean berfungsi sama dengan situs lainnya - berbasis token dan tidak bergantung pada bahasa. Gunakan pemecah reCAPTCHA CaptchaAI dengan sitekey dari halaman. UI yang dilokalkan tidak memengaruhi proses solve.
Artikel Terkait
- Mengatasi Captcha Website China
Langkah Selanjutnya
Mulai selesaikan CAPTCHA situs web Jepang dan Korea —dapatkan kunci API CaptchaAI Andadan menangani CAPTCHA karakter CJK apa pun.
Panduan terkait:
- Memecahkan CAPTCHA di Situs Web China
- Kumpulan Karakter CAPTCHA Gambar Multi-Bahasa
- Lokalisasi CAPTCHA dan Pengaturan Bahasa