Untuk menyelesaikan CAPTCHA teks Sirilik, Anda hanya perlu satu perubahan pada request: kirim gambar ke CaptchaAI dengan parameter language=2. Dengan setelan itu, model OCR memakai model yang sadar-Sirilik dan mengembalikan Unicode codepoint yang benar — bukan tebakan Latin yang membuat form situs Rusia atau Ukraina menolak jawaban yang secara visual sudah tepat.
Masalahnya bukan pada kualitas OCR, melainkan pada karakter yang saling menyamar. Huruf seperti А, В, С, Е, Н, О di layar tampak persis huruf Latin, padahal codepoint-nya berbeda total. Panduan ini menunjukkan cara mengenali homoglif itu, mengirim gambar dengan benar, dan memverifikasi hasilnya lewat Python maupun Node.js.
Kenapa OCR Latin gagal membaca teks Sirilik
Sebuah OCR yang hanya dilatih untuk skrip Latin akan "membetulkan" karakter Sirilik menjadi padanan Latin terdekatnya. Secara tampilan hasilnya lolos, tetapi secara byte teksnya salah. Situs target membandingkan jawaban Anda dengan token yang tersimpan di sisi server — dan token itu memakai codepoint Sirilik. Begitu satu karakter meleset ke Latin, validasi form menolak seluruh kiriman meski di mata manusia tulisannya identik.
Karena itu, langkah pertama bukan menebak teks, melainkan memastikan solver tahu bahwa yang dikirim adalah skrip non-Latin. Itulah tugas language=2.
Homoglif Sirilik vs Latin yang mudah tertukar
| Tampilan | Latin | Sirilik | Catatan 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" |
Mengirim codepoint yang salah membuat validasi form menolak teks yang tampak benar. Jadi jangan pernah menilai jawaban hanya dari bentuk hurufnya — periksa nilai Unicode-nya.
Skenario: tim monitoring harga yang memproses situs CIS
Banyak pekerjaan scraping freelance dan agensi price-monitoring di Indonesia menyentuh sumber berbahasa Rusia dan Ukraina, mulai dari marketplace CIS hingga direktori bisnis regional. Form pencarian dan halaman pendaftaran di situs-situs itu kerap dilindungi CAPTCHA teks Sirilik.
Alur kerja yang stabil biasanya berjalan begini: buka sesi HTTP, ambil gambar CAPTCHA, kirim ke CaptchaAI dengan language=2, verifikasi codepoint hasilnya, lalu kirim form. Karena CaptchaAI menagih per thread dan bukan per solve, satu worker yang men-scrape ribuan halaman per hari tetap berjalan dengan biaya bulanan tetap — angle yang relevan buat tim yang sensitif terhadap biaya. Jika worker Anda berjalan di region seperti AWS ap-southeast-1 (Singapura), latensi ke solver tetap wajar untuk polling bertahap.
Catatan kepatuhan singkat: proses hanya data yang memang berhak Anda olah dan hindari data pribadi, sejalan dengan UU Pelindungan Data Pribadi (UU 27/2022). Panduan ini bukan nasihat hukum.
Python: solve CAPTCHA gambar Sirilik
Contoh berikut mengikuti pola empat langkah yang sama untuk setiap task: kirim gambar sebagai base64 → simpan task ID → polling res.php → pakai token teks. Perhatikan verify_cyrillic(), yang memastikan hasil benar-benar mengandung karakter di rentang U+0400–U+04FF sebelum dimasukkan ke form.
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]}")
solve_russian_form() menyatukan sesi, penyelesaian, dan pengiriman dalam satu alur — pola yang bisa langsung Anda pakai ulang untuk form berbeda dengan mengganti form_url dan captcha_url.
Node.js: menangani CAPTCHA Sirilik
Versi Node.js memakai URLSearchParams untuk body dan fetch bawaan. Nilai language dikirim sebagai string "2" karena body form-encoded, dan showCodepoints() mempermudah debugging saat hasil terlihat "hampir benar" — Anda bisa langsung melihat apakah ada karakter yang jatuh ke rentang Latin.
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 sering muncul
Tidak semua CAPTCHA Sirilik sama. Mengenali polanya membantu Anda memasang verifikasi yang tepat sebelum mengirim form.
| 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 |
Pola campuran skrip adalah yang paling rawan: satu gambar sengaja menaruh huruf Latin dan Sirilik yang mirip agar solver keliru. Dengan language=2, CaptchaAI mengembalikan codepoint yang benar per karakter sehingga Anda bisa memvalidasinya satu per satu.
Verifikasi codepoint dan perbaikan masalah umum
| 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 | Kirim persis seperti yang dikembalikan CaptchaAI |
Biaya dan kecepatan penyelesaian
CAPTCHA gambar termasuk task respons kompetitif di CaptchaAI: penyelesaian biasanya di bawah 0.5 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung. Untuk teks Sirilik, jalur yang sama dengan CAPTCHA gambar/OCR biasa berlaku — hanya language=2 yang berbeda.
Penagihan berbasis thread, bukan per solve. Paket dimulai dari BASIC ($15/bulan, 5 thread) dan naik lewat STANDARD ($30/bulan, 15 thread) hingga tier VIP untuk beban paralel besar. Untuk pipeline scraping situs CIS yang berjalan sepanjang hari, model ini membuat biaya tetap dapat diprediksi berapa pun volume solve Anda.
Pertanyaan umum
Apakah language=2 juga aman dipakai untuk teks Latin biasa?
language=2 dioptimalkan untuk skrip non-Latin. Untuk CAPTCHA yang murni Latin/angka, cukup pakai pengaturan default tanpa parameter itu. Set language=2 khusus saat gambar memuat karakter Sirilik agar solver tidak "meluruskan" huruf menjadi Latin.
Berapa lama waktu penyelesaian CAPTCHA gambar Sirilik?
CAPTCHA gambar umumnya selesai di bawah 0.5 detik. Dengan polling interval 5 detik seperti pada contoh, Anda biasanya mendapat token pada percobaan polling pertama atau kedua. Sesuaikan jumlah percobaan bila jaringan Anda lambat.
Apakah panduan ini juga berlaku untuk hCaptcha di situs Rusia?
Tidak. hCaptcha tidak didukung saat ini, apa pun bahasa situsnya; untuk hCaptcha Anda memerlukan layanan lain. Panduan ini khusus untuk CAPTCHA gambar berbasis teks Sirilik lewat solver image/OCR.
Bagaimana cara memastikan hasil benar-benar Sirilik, bukan Latin?
Verifikasi codepoint-nya. Karakter Sirilik ada di rentang U+0400–U+04FF; fungsi verify_cyrillic() (Python) atau isCyrillic() (Node.js) mengeceknya. Untuk karakter khas Ukraina seperti ґ, є, і, ї, hasilnya juga jatuh di rentang tersebut.
Paket mana yang cocok untuk scraping situs CIS bervolume tinggi?
Karena penagihan per thread, ukur berdasarkan seberapa banyak solve paralel yang Anda butuhkan, bukan total solve harian. Satu worker sekuensial cukup dengan BASIC ($15/bulan, 5 thread); untuk banyak worker paralel, naik ke STANDARD ($30/bulan, 15 thread) atau lebih tinggi. Lihat harga resmi di captchaai.com.
Langkah selanjutnya
Selesaikan CAPTCHA Sirilik di situs Rusia, Ukraina, dan Slavia lainnya — ambil API key CaptchaAI Anda dan mulai dengan language=2.
Panduan terkait:
- Cara solve CAPTCHA di situs web Tiongkok
- Kumpulan karakter CAPTCHA gambar multi-bahasa
- Pengaturan bahasa dan lokalisasi CAPTCHA