Trường Hợp Sử Dụng

Giải CAPTCHA trên các trang web của Nhật Bản và Hàn Quốc

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:

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