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

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

Các trang web của Nga, Ukraina, Bungari và Serbia sử dụng CAPTCHA văn bản Cyrillic trông có vẻ giống với tiếng Latinh - các ký tự như А, В, С, Е, Н, О có vẻ giống với các bản sao tiếng Latinh nhưng là các điểm mã Unicode hoàn toàn khác nhau. Điều này tạo ra những thách thức về nhận dạng và gửi độc đáo mà OCR tiêu chuẩn của tiếng Latinh bỏ qua.

Ký tự Cyrillic và Latin khó hiểu

Có vẻ như tiếng Latinh chữ cái Cyrillic bảng mã Unicode
A A (U+0041) А (U+0410) Các điểm mã khác nhau
B B (U+0042) В (U+0412) Chữ Cyrillic là "Ve"
C C (U+0043) С (U+0421) Chữ Cyrillic là "Es"
E E (U+0045) Е (U+0415) Mã hóa khác nhau
H H (U+0048) Н (U+041D) Chữ Cyrillic là "En"
Ô O (U+004F) О (U+041E) Các điểm mã khác nhau
P P (U+0050) Р (U+0420) Chữ Cyrillic là "Er"

Việc gửi điểm mã sai khiến việc xác thực biểu mẫu từ chối văn bản trông đúng.

Python: CAPTCHA hình ảnh 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]}")

JavaScript: Xử lý CAPTCHA bằng chữ Cyrillic

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(", ")}`);

Các mẫu CAPTCHA Cyrillic phổ biến

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

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Biểu mẫu từ chối văn bản trông đúng Latin/Cyrillic từ đồng âm không khớp Kiểm tra các điểm mã Unicode — А (U+0410) ≠ A (U+0041)
Các ký tự bị cắt xén trên màn hình Mã hóa sai Sử dụng UTF-8 xuyên suốt; đặt response.encoding = 'utf-8'
Văn bản tập lệnh hỗn hợp sai một phần OCR nhầm lẫn tiếng Latin và Cyrillic CaptchaAI với language=2 phân biệt chính xác
Thiếu ký tự dành riêng cho tiếng Ukraina ґ, є, і, ї không được nhận dạng Chúng được hỗ trợ với language=2
Phân biệt chữ hoa chữ CAPTCHA Chữ hoa/lowercase quan trọng Gửi chính xác như được CaptchaAI trả về

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

CaptchaAI phân biệt chữ Cyrillic В với tiếng Latin B bằng cách nào?

Các mô hình OCR của CaptchaAI được đào tạo về các tính năng ngữ cảnh và hình tượng. Khi language=2 được đặt, bộ giải sử dụng các mô hình nhận biết Cyrillic để trả về các điểm mã Unicode thích hợp. Văn bản trả về sẽ sử dụng các ký tự Cyrillic (U+0400–U+04FF) cho văn bản tiếng Nga.

Nó có xử lý các ký tự dành riêng cho tiếng Ukraina không?

Vâng. Tiếng Ukraina sử dụng các ký tự không có trong tiếng Nga — ґ (U+0491), є (U+0454), і (U+0456), ї (U+0457). CaptchaAI nhận dạng những điều này bằng language=2. Bộ giải xử lý tất cả các tập lệnh Cyrillic bao gồm tiếng Nga, tiếng Ukraina, tiếng Bungari và tiếng Serbia.

Điều gì sẽ xảy ra nếu CAPTCHA kết hợp giữa Cyrillic và Latin?

Một số CAPTCHA cố tình trộn lẫn các tập lệnh để tạo ra sự mơ hồ. CaptchaAI trả về văn bản với các điểm mã Unicode chính xác cho mỗi ký tự. Xác minh bằng hàm verify_cyrillic() hoặc bằng cách kiểm tra các điểm mã.

Các bước tiếp theo

Giải CAPTCHA Cyrillic trên các trang web tiếng Nga và tiếng Slav —lấy khóa API CaptchaAI của bạn.

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

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