应用场景

解决日语和韩语网站上的验证码

日本和韩国网站提出了独特的验证码挑战。日本网站可能使用三种书写系统——平假名 (あんんある)、片假名 (あんん) 和汉字 (こと—)——有时会混合在单个图像中。韩国网站使用朝鲜文 (한글) 字符。标准的以拉丁文为中心的 OCR 在这些字符集上失败。

按地区划分的验证码类型

地区 常见类型 字符集 CaptchaAI 求解器
日本 图像包含平假名/katakana、reCAPTCHA、hCaptcha 平假名、片假名、汉字、拉丁语 图片/OCR
韩国 带有朝鲜文、reCAPTCHA、专有滑块的图像 韩文、拉丁文 图片/OCR
两个都 reCAPTCHA v2/v3(本地化 UI) N/A(基于代币) 验证码

Python:日语图像验证码

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: 日语/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}`);

字符集注意事项

书写系统 人物 笔记
平假名(カイナナ) 46个基本字符 语音;用于日语母语单词
片假名(あんん) 46个基本字符 语音;用于外来词
汉字 (æ/¡-) 数千个字符 与中国人共享;验证码使用公共子集
韩文 (한글) 24 个基本字母,约 11,000 个音节块 韩语拼音
混合(日本) 平假名+片假名+汉字+拉丁语 最具挑战性——一张图像中的多个脚本

故障排除

问题 原因 处理方式
平假名与片假名混淆 相似的外观(例如,“vs”) language=2 设置为 CJK – CaptchaAI 区分
韩文字符乱码 响应解码为 Latin-1 强制 UTF-8 编码:response.encoding = 'utf-8'
混合脚本验证码失败 一张图像中的多个字符集 CaptchaAI 与 language=2 处理混合脚本
风格化文本的准确性较低 人物严重变形 更高分辨率的图像可提高识别能力
解决后会话过期 复杂角色的求解时间较长 预建立会话,快速解决,立即提交

常问问题

CaptchaAI 能否区分相似的平假名和片假名字符?

是的。借助 language=2,CaptchaAI 使用在 CJK 字符集上训练的模型来区分日语书写系统中视觉上相似的字符。清晰、高分辨率图像的准确度最高。

日语和韩语是否需要不同的 API 参数?

不会。两者都使用 language=2 进行 CJK 字符识别。 CaptchaAI 自动检测字符是日语、韩语还是中文。唯一的区别是网站上下文 - 使用适当的 Accept-Language 标头。

日本/Korean 网站上的reCAPTCHA 怎么样?

日本/Korean 网站上的 reCAPTCHA 与任何其他网站的工作方式相同 - 它基于令牌且与语言无关。使用 CaptchaAI 的 reCAPTCHA 求解器和页面中的 sitekey。本地化的 UI 不会影响求解过程。

相关文章

下一步

开始解决日语和韩语网站验证码 -”获取您的 CaptchaAI API 密钥并处理任何 CJK 字符验证码。

相关指南:

该文章已禁用评论。