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:
- Solve CAPTCHA di Situs Web Tiongkok
- Kumpulan Karakter CAPTCHA Gambar Multi-Bahasa
- Lokalisasi CAPTCHA dan Pengaturan Bahasa