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

Giải mã CAPTCHA văn bản Cyrillic bằng CaptchaAI

Form trên site tiếng Nga báo "mã xác nhận không đúng" dù bạn gõ y hệt ký tự hiển thị? Nguyên nhân gần như luôn là Unicode: chữ Cyrillic А (U+0410) và chữ Latin A (U+0041) trông giống hệt nhau nhưng là hai điểm mã khác nhau. CAPTCHA Cyrillic trên site Nga, Ukraina, Bungari, Serbia khai thác đúng điểm mù đó để đánh bại OCR huấn luyện riêng cho bảng chữ Latin.

Đội outsourcing, QA tại Việt Nam nhận dự án cho khách hàng có site tiếng Nga — theo dõi giá sàn kiểu Wildberries, Ozon, hay test luồng đăng ký cho client CIS — gặp bài toán này thường xuyên. CaptchaAI xử lý phần khó nhất bằng một tham số: language=2.

Các dạng CAPTCHA Cyrillic thường gặp

Dạng Mô tả Ví dụ
Từ Cyrillic thuần Từ tiếng Nga ngẫu nhiên ШКАФ, ПИРОГ
Trộn Latin + Cyrillic Cả hai bảng chữ trong cùng một ảnh ABСDе (A, B, D là Latin; С, е là Cyrillic)
Chữ số viết bằng chữ Số được đánh vần thành từ ПЯТЬ (năm), ТРИ (ba)
Toán học viết bằng lời Phép tính diễn đạt bằng tiếng Nga два плюс три = ?
Cyrillic bị bóp méo Văn bản bị làm nhiễu, méo Thách thức OCR thông thường

Vì sao form từ chối văn bản "nhìn đúng"

Giống chữ Latin Cyrillic Ghi chú Unicode
A A (U+0041) А (U+0410) Hai điểm mã khác nhau
B B (U+0042) В (U+0412) Cyrillic đọc là "Ve"
C C (U+0043) С (U+0421) Cyrillic đọc là "Es"
E E (U+0045) Е (U+0415) Hai điểm mã khác nhau
H H (U+0048) Н (U+041D) Cyrillic đọc là "En"
O O (U+004F) О (U+041E) Hai điểm mã khác nhau
P P (U+0050) Р (U+0420) Cyrillic đọc là "Er"

Gửi sai điểm mã khiến bước xác thực từ chối chuỗi mắt thường thấy hoàn toàn đúng. language=2 chuyển solver sang model Cyrillic, trả về đúng dải U+0400–U+04FF thay vì Latin gần giống.

Lỗi thường gặp khi tích hợp và cách xử lý

Vấn đề Nguyên nhân Cách xử lý
Form từ chối văn bản trông đúng Nhầm lẫn đồng dạng Latin/Cyrillic Kiểm tra điểm mã Unicode — А (U+0410) ≠ A (U+0041)
Ký tự hiển thị bị lỗi font Sai encoding Dùng UTF-8 xuyên suốt; đặt response.encoding = 'utf-8'
Văn bản trộn script bị đọc sai một phần OCR nhầm giữa Latin và Cyrillic CaptchaAI với language=2 phân biệt chính xác hai bảng chữ
Thiếu ký tự riêng của tiếng Ukraina ґ, є, і, ї không được nhận diện Các ký tự này được hỗ trợ khi dùng language=2
Sai phân biệt hoa/thường CAPTCHA có phân biệt chữ hoa/chữ thường Gửi lại chính xác như CaptchaAI trả về

Code Python: gửi và giải CAPTCHA ảnh Cyrillic

Đoạn dưới gửi ảnh tới in.php kèm language=2, rồi polling res.php mỗi 5 giây tới khi có kết quả — luồng "gửi → nhận ID task → polling → dùng token" chuẩn của CaptchaAI, không riêng Cyrillic.

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_cyrillic_captcha(image_path: str) -> str:
    """Solve a Cyrillic text 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,          # Non-Latin 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_cyrillic_from_session(session: requests.Session,
                                 captcha_url: str) -> str:
    """Solve a Cyrillic 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": 2,
        "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")

def verify_cyrillic(text: str) -> bool:
    """Verify that solved text contains Cyrillic characters."""
    return any('\u0400' <= ch <= '\u04FF' for ch in text)

# --- Russian website form flow ---

def solve_russian_form(form_url: str, captcha_url: str,
                       form_data: dict) -> requests.Response:
    """Complete a Russian website form with CAPTCHA."""
    session = requests.Session()
    session.headers.update({
        "Accept-Language": "ru-RU,ru;q=0.9",
    })

    # Establish session
    session.get(form_url, timeout=15)

    # Solve CAPTCHA
    captcha_text = solve_cyrillic_from_session(session, captcha_url)
    print(f"Cyrillic CAPTCHA: {captcha_text}")

    if verify_cyrillic(captcha_text):
        print("Confirmed: contains Cyrillic characters")

    form_data["captcha"] = captcha_text
    return session.post(form_url, data=form_data, timeout=30)

# --- Usage ---

text = solve_cyrillic_captcha("russian_captcha.png")
print(f"Solved: {text}")
print(f"Is Cyrillic: {verify_cyrillic(text)}")
print(f"Unicode codepoints: {[hex(ord(c)) for c in text]}")

verify_cyrillic() là bước kiểm tra nhanh: nếu kết quả không chứa ký tự nào trong U+0400–U+04FF, OCR có thể đã đọc nhầm sang Latin — gửi lại ảnh rõ hơn thay vì submit thẳng.

Code JavaScript: xử lý CAPTCHA Cyrillic trong Node.js

Cùng logic bằng JavaScript, dùng fetch thay vì thư viện HTTP riêng — phù hợp khi gắn vào script Puppeteer hoặc Playwright đang chạy sẵ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 solveCyrillicCaptcha(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");
}

function isCyrillic(text) {
  return /[\u0400-\u04FF]/.test(text);
}

function showCodepoints(text) {
  return [...text].map((ch) => `${ch}=U+${ch.codePointAt(0).toString(16).padStart(4, "0")}`);
}

// Usage
const text = await solveCyrillicCaptcha("russian_captcha.png");
console.log(`Solved: ${text}`);
console.log(`Is Cyrillic: ${isCyrillic(text)}`);
console.log(`Codepoints: ${showCodepoints(text).join(", ")}`);

showCodepoints() in từng ký tự kèm điểm mã — hữu ích khi debug lý do form vẫn từ chối dù chuỗi hiển thị trông giống hệt ảnh gốc.

Câu hỏi thường gặp

CaptchaAI phân biệt chữ Cyrillic В với Latin B như thế nào?

Model OCR của CaptchaAI được huấn luyện riêng cho Cyrillic theo ngữ cảnh và nét chữ, không dùng chung engine với Latin. Khi gửi language=2, solver trả về đúng điểm mã Unicode — văn bản tiếng Nga nằm trong dải U+0400–U+04FF thay vì bị đọc nhầm sang Latin trông giống.

Giải một CAPTCHA Cyrillic mất bao lâu?

CaptchaAI xử lý CAPTCHA ảnh/OCR nói chung trong dưới 0,5 giây với tỷ lệ giải thành công cao trên các loại được hỗ trợ; Cyrillic dùng chung engine đó, chỉ khác tham số language=2. Vòng lặp polling trong ví dụ trên chỉ là cơ chế chờ kết quả, không phải thời gian giải thực tế.

CAPTCHA tiếng Bungari hay Serbia có xử lý giống tiếng Nga không?

Có. Cùng tham số language=2 áp dụng cho mọi biến thể Cyrillic CaptchaAI hỗ trợ — Nga, Ukraina, Bungari, Serbia — không cần đổi endpoint hay logic riêng theo từng nước, chỉ khác từ vựng xuất hiện trong ảnh.

Bước tiếp theo

Giải CAPTCHA Cyrillic trên site tiếng Nga và các site Slav khác ngay trong luồng tích hợp hiện có — lấy API key CaptchaAI của bạn.

Hướng dẫn liên quan:

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