Les sites Web russes, ukrainiens, bulgares et serbes utilisent des CAPTCHA en cyrillique qui ressemblent trompeusement au latin : des caractères comme А, В, С, Е, Н, О semblent identiques à leurs homologues latins mais sont des points de code Unicode complètement différents. Cela crée des défis de reconnaissance et de soumission uniques que l'OCR latin standard manque.
Caractères cyrilliques ou latins pouvant être confondus
| On dirait | Latin | Cyrillique | Unicode |
|---|---|---|---|
| Un | A (U+0041) | А (U+0410) | Différents points de code |
| B | B (U+0042) | В (U+0412) | Le cyrillique est "Ve" |
| C | C (U+0043) | С (U+0421) | Le cyrillique est "Es" |
| E | E (U+0045) | Е (U+0415) | Encodage différent |
| H | H (U+0048) | Н (U+041D) | Le cyrillique est "En" |
| Ô | O (U+004F) | О (U+041E) | Différents points de code |
| P. | P (U+0050) | Р (U+0420) | Le cyrillique est "Euh" |
La soumission d’un mauvais point de code entraîne le rejet du texte d’apparence correcte lors de la validation du formulaire.
Python : CAPTCHA d'image cyrillique
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 : gestion des CAPTCHA cyrilliques
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(", ")}`);
Modèles CAPTCHA cyrilliques courants
| Modèle | Descriptif | Exemple |
|---|---|---|
| Mot cyrillique pur | Mot russe aléatoire | ШКАФ, ПИРОГ |
| Latin mixte + cyrillique | Les deux scripts dans une seule image | ABСDе (A,B,D latin ; С,е cyrillique) |
| Chiffres cyrilliques épelés | Mots numériques | ПЯТЬ (cinq), ТРИ (trois) |
| Mathématiques en russe | L'arithmétique en mots | два плюс три = ? |
| Cyrillique déformé | Texte russe déformé | Défi OCR standard avec cyrillique |
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Le formulaire rejette le texte d'apparence correcte | Incompatibilité d'homoglyphe Latin/Cyrillic | Vérifiez les points de code Unicode – А (U+0410) ≠A (U+0041) |
| Personnages tronqués affichés | Mauvais encodage | Utilisez UTF-8 partout ; définir response.encoding = 'utf-8' |
| Texte de script mixte partiellement faux | OCR confond le latin et le cyrillique | CaptchaAI avec language=2 distingue correctement |
| Caractères spécifiques à l'ukrainien manquants | ґ, є, і, ї non reconnu | Ceux-ci sont pris en charge avec language=2 |
| Sensibilité à la casse CAPTCHA | Les majuscules/lowercase sont importantes | Soumettre exactement tel que renvoyé par CaptchaAI |
FAQ
Comment CaptchaAI distingue-t-il le cyrillique В du latin B ?
Les modèles OCR de CaptchaAI sont formés sur les fonctionnalités de contexte et de glyphe. Lorsque language=2 est défini, le solveur utilise des modèles prenant en charge le cyrillique qui renvoient les points de code Unicode appropriés. Le texte renvoyé utilisera des caractères cyrilliques (U+0400 – U+04FF) pour le texte russe.
Gère-t-il les caractères spécifiques à l'ukrainien ?
Oui. L'ukrainien utilise des caractères non présents en russe : Ò (U+0491), Ñ » (U+0454), і (U+0456), ї (U+0457). CaptchaAI les reconnaît avec language=2. Le solveur gère tous les scripts cyrilliques, notamment le russe, l'ukrainien, le bulgare et le serbe.
Et si le CAPTCHA mélangeait le cyrillique et le latin ?
Certains CAPTCHA mélangent intentionnellement des scripts pour créer une ambiguïté. CaptchaAI renvoie le texte avec les points de code Unicode corrects pour chaque caractère. Vérifiez à l'aide de la fonction verify_cyrillic() ou en inspectant les points de code.
Prochaines étapes
Résolvez les CAPTCHA cyrilliques sur les sites Web russes et slaves –récupérez votre clé API CaptchaAI.
Guides associés :
- Résoudre les CAPTCHA sur les sites Web chinois
- Jeu de caractères CAPTCHA pour images multilingues
- Localisation CAPTCHA et paramètres de langue