Kasus Penggunaan

Solve CAPTCHA Teks Sirilik dengan CaptchaAI

Situs Rusia, Ukraina, Bulgaria, dan Serbia menggunakan CAPTCHA teks Sirilik yang tampak mirip dengan karakter Latin — karakter seperti А, В, С, Е, Н, О tampak identik dengan karakter Latin-nya, namun merupakan Unicode codepoint yang sangat berbeda. Ini menciptakan tantangan pengenalan dan pengiriman unik yang tidak dapat ditangani oleh OCR Latin standar.

Karakter Sirilik vs. Latin yang Mirip

Tampilan Latin Sirilik Unicode
A A (U+0041) А (U+0410) Codepoint berbeda
B B (U+0042) В (U+0412) Sirilik = "Ve"
C C (U+0043) С (U+0421) Sirilik = "Es"
E E (U+0045) Е (U+0415) Encoding berbeda
H H (U+0048) Н (U+041D) Sirilik = "En"
O O (U+004F) О (U+041E) Codepoint berbeda
P P (U+0050) Р (U+0420) Sirilik = "Er"

Mengirimkan codepoint yang salah menyebabkan validasi form menolak teks yang tampaknya benar.

Mengirimkan titik kode yang salah menyebabkan validasi formulir menolak teks yang tampak benar.

Python: CAPTCHA Gambar Sirilik

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: Penanganan CAPTCHA Sirilik

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

Pola CAPTCHA Sirilik yang Umum

Pola Deskripsi Contoh
Kata Sirilik murni Kata acak bahasa Rusia ШКАФ, ПИРОГ
Campuran Latin + Sirilik Kedua skrip dalam satu gambar ABСDе (A,B,D Latin; С,е Sirilik)
Digit Sirilik dieja Kata angka ПЯТЬ (lima), ТРИ (tiga)
Matematika dalam bahasa Rusia Aritmatika dalam kata-kata два плюс три = ?
Sirilik terdistorsi Teks Rusia yang menyesatkan Challenge OCR standar dengan Cyrillic

Pemecahan Masalah

Masalah Penyebab Perbaikan
Form menolak teks yang tampak benar Mismatch homoglif Latin/Sirilik Periksa Unicode codepoint — А (U+0410) ≠ A (U+0041)
Karakter berantakan di layar Encoding salah Gunakan UTF-8 di seluruh kode; set response.encoding = 'utf-8'
Teks skrip campuran sebagian salah OCR mengacaukan Latin dan Sirilik CaptchaAI dengan language=2 membedakannya dengan benar
Karakter khusus Ukraina tidak ada ґ, є, і, ї tidak dikenali Didukung dengan language=2
Sensitivitas huruf besar/kecil Huruf besar/kecil penting Kirimkan persis seperti yang dikembalikan CaptchaAI

Pertanyaan Umum

Bagaimana CaptchaAI membedakan Sirilik В dari Latin B?

Model OCR CaptchaAI dilatih berdasarkan konteks dan fitur glyph. Saat language=2 diset, solver menggunakan model Sirilik yang mengembalikan Unicode codepoint yang tepat. Teks yang dikembalikan akan menggunakan karakter Sirilik (U+0400–U+04FF) untuk teks Rusia.

Apakah CaptchaAI mendukung karakter khusus Ukraina?

Ya. Bahasa Ukraina menggunakan karakter yang tidak ada dalam bahasa Rusia — ґ (U+0491), є (U+0454), і (U+0456), ї (U+0457). CaptchaAI mengenalinya dengan language=2. Solver mendukung semua skrip Sirilik termasuk Rusia, Ukraina, Bulgaria, dan Serbia.

Bagaimana jika CAPTCHA mencampurkan Sirilik dan Latin?

Beberapa CAPTCHA sengaja mencampurkan skrip untuk menciptakan ambiguitas. CaptchaAI mengembalikan teks dengan Unicode codepoint yang benar untuk setiap karakter. Verifikasi menggunakan fungsi verify_cyrillic() atau dengan memeriksa codepoint.

Langkah Selanjutnya

Solve CAPTCHA Sirilik di situs Rusia dan Slavia — dapatkan API key CaptchaAI Anda.

Panduan terkait:

Komentar dinonaktifkan untuk artikel ini.