Arapça, Farsça ve İbranice web siteleri, standart OCR ve metin enjeksiyonuna meydan okuyan sağdan sola (RTL) komut dosyalarıyla CAPTCHA'lar sunar. Arapça karakterler konuma (başlangıç, orta, son veya izole formlar) göre farklı şekilde bağlanır ve bu da resim CAPTCHA'sının tanınmasını zorlaştırır. Öğe konumlandırmasını etkileyen RTL sayfa düzenleriyle birleştiğinde bu sitelerin özel bir şekilde ele alınması gerekir.
RTL CAPTCHA Zorlukları
| Mücadele | Detay |
|---|---|
| Karakter bağlantısı | Arap harfleri bitişik karakterlere göre şekil değiştirir |
| Sağdan sola okuma | CAPTCHA'daki metin sağdan sola okunur |
| Karışık yön | ANayırlar ve Latince metinlerin Arapça ile karışımı (çift yönlü) |
| Aksan işaretleri | /below karakterlerin üzerindeki noktalar ve işaretler (شاين vs ساين) |
| RTL sayfa düzeni | Form öğeleri ve CAPTCHA yerleşimi LTR'den farklıdır |
Python: Arapça Resim CAPTCHA
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_arabic_captcha(image_path: str) -> str:
"""Solve an Arabic script 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_arabic_captcha_from_url(session: requests.Session,
captcha_url: str) -> str:
"""Download and solve an Arabic CAPTCHA from a URL."""
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")
# --- RTL-aware form submission ---
def submit_form_with_arabic_captcha(
form_url: str,
captcha_url: str,
form_data: dict,
captcha_field: str = "captcha",
) -> requests.Response:
"""Complete an Arabic website form with CAPTCHA."""
session = requests.Session()
session.headers.update({
"Accept-Language": "ar-SA,ar;q=0.9",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
})
# Load the form page to establish session
session.get(form_url, timeout=15)
# Solve the CAPTCHA
captcha_text = solve_arabic_captcha_from_url(session, captcha_url)
print(f"Arabic CAPTCHA solved: {captcha_text}")
# Submit with the solved text
form_data[captcha_field] = captcha_text
response = session.post(form_url, data=form_data, timeout=30)
return response
# --- Usage ---
# Simple Arabic image CAPTCHA
text = solve_arabic_captcha("arabic_captcha.png")
print(f"Arabic text: {text}")
# Form submission on Arabic site
response = submit_form_with_arabic_captcha(
form_url="https://example.sa/registration",
captcha_url="https://example.sa/captcha/generate",
form_data={
"name": "اسم المستخدم",
"email": "user@example.com",
},
)
JavaScript: Arapça ve RTL CAPTCHA
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 solveArabicCaptcha(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");
}
// Inject CAPTCHA token into RTL page with Playwright
async function solveAndInjectRTL(page) {
// RTL pages may position the CAPTCHA differently
const captchaImg = await page.locator("img[id*='captcha'], img[class*='captcha']");
const imgSrc = await captchaImg.getAttribute("src");
// Download the image
const buffer = await (await fetch(imgSrc)).arrayBuffer();
const imageB64 = Buffer.from(buffer).toString("base64");
// Solve
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) {
// Fill the input — RTL input handles text direction automatically
await page.locator("input[name*='captcha']").fill(poll.request);
return poll.request;
}
throw new Error(`Solve: ${poll.request}`);
}
}
// Usage
const text = await solveArabicCaptcha("arabic_captcha.png");
console.log(`Arabic text: ${text}`);
Desteklenen RTL Komut Dosyaları
| Senaryo | Diller | Örnek karakterler |
|---|---|---|
| Arapça | Arapça, Urduca, Peştuca | عربي - أبجدية |
| Farsça/Persian | Farsça | ÙØ§Ø±Ø³ÛŒ - ØØ±ÙˆÙ |
| İbranice | İbranice | ×¢×'רית - ×ותיות |
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Çıktıda ters çevrilmiş Arapça metin | İstemci RTL metnini LTR olarak görüntülüyor | Çıktıyı \u202B'ye sarın (RTL yerleştirme) veya RTL uyumlu ekranı kullanın |
| Aksan işaretleri eksik | Düşük çözünürlüklü görüntü | Daha yüksek çözünürlüklü CAPTCHA görselleri kullanın |
| Çift yönlü metin (Arapça+sayılar) karışık | BiDi algoritması tutarsız bir şekilde uygulandı | Yön karakterlerini Unicode işaretleyicilerle açıkça işleyin |
| Form gönderimi Arapça girişle başarısız oluyor | Kodlama uyuşmazlığı | İçerik Türü başlığında charset=UTF-8 kullanın |
| CAPTCHA konumu beklenenden farklı | RTL düzeni öğe konumlarını yansıtır | Konuma dayalı algılama yerine CSS seçicileri kullanın |
SSS
CaptchaAI bağlantılı Arap alfabesini işliyor mu?
Evet. Arapça karakterler bitişik olduklarında bağlanırlar; aynı harf, bir kelimedeki konumuna bağlı olarak farklı görünür.CaptchaAI'nin Image/OCR çözücüsü, başlangıç, orta, son ve izole harf formları dahil olmak üzere bağlantılı Arap alfabesini tanır.
Farsça CAPTCHA'ları ve Arapça CAPTCHA'ları nasıl hallederim?
Her ikisi de Arap alfabesini kullanıyor ancak ek karakterler içeriyor (Farsça'da Ù¾, Ú†, Ú˜, Ú¯ gibi). Her ikisi için de language=2 kullanın. CaptchaAI genişletilmiş karakter setini otomatik olarak tanır.
RTL sayfa düzenleri CAPTCHA algılamayı etkiler mi?
RTL düzenleri sayfayı yansıtır; formlar ve CAPTCHA'lar, LTR sayfalarına kıyasla zıt kenarlarda görünebilir. CAPTCHA öğelerini bulmak için görsel konuma güvenmek yerine CSS seçicilerini veya kimliklerini kullanın.
Sonraki Adımlar
Arapça ve RTL web sitelerindeki CAPTCHA'ları çözün —CaptchaAI API anahtarınızı alınve herhangi bir RTL karakter kümesini işleyin.
İlgili kılavuzlar: