تُقدِّم مواقع الويب العربية والفارسية والعبرية اختبارات CAPTCHA بنصوص مكتوبة من اليمين إلى اليسار (RTL) تُصعِّب على أدوات التعرف الضوئي على الحروف (OCR) وإدخال النص بدقة. ترتبط الأحرف العربية بشكل مختلف بناءً على الموضع - الأشكال الأولية أو المتوسطة أو النهائية أو المعزولة - مما يجعل التعرف على صورة CAPTCHA أكثر صعوبة. إلى جانب تخطيطات صفحة RTL التي تؤثر على موضع العناصر، تحتاج هذه المواقع إلى معالجة محددة.
تحديات RTL CAPTCHA
التحدي
التفاصيل
اتصال الحرف
الحروف العربية تتغير شكلها بناء على الحروف المجاورة
القراءة من اليمين إلى اليسار
تتم قراءة النص الموجود في اختبار CAPTCHA من اليمين إلى اليسار
اتجاه مختلط
مزيج من الأرقام والنص اللاتيني مع اللغة العربية (ثنائي الاتجاه)
علامات التشكيل
النقاط والعلامات فوق الحروف أو تحتها، مثل الفرق بين "شين" و"سين"
تخطيط صفحة RTL
تختلف عناصر النموذج وموضع اختبار CAPTCHA عن LTR
بايثون: الصورة العربية 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: العربية و 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}`);
أنظمة الكتابة RTL المدعومة
نظام الكتابة
اللغات
أمثلة على الأحرف
العربية
العربية، الأردية، الباشتو
عربي - أبجدية
الفارسية/Persian
الفارسية
فارسی - حروف
العبرية
العبرية
עברית - אותיות
استكشاف الأخطاء وإصلاحها
المشكلة
السبب
الإجراء
نتيجة OCR خاطئة للنص العربي
الصورة منخفضة الدقة أو الحروف مشابهة بصريًا
جرّب إرسال الصورة بدقة أعلى؛ يُفيد تضخيمها بمقدار ضعفين قبل الإرسال
الكلمات مقلوبة أو ترتيبها خاطئ
عدم مراعاة اتجاه النص أثناء تحليل الاستجابة
استخدم مكتبة bidi لإعادة ترتيب النص ثنائي الاتجاه قبل حقنه في النموذج
رفض النموذج للنص الصحيح
الموقع يتوقع أحرفًا بترميز Unicode موحّد
تطبيع النص بـ unicodedata.normalize('NFC', text) قبل الإرسال
CAPTCHA يحتوي على أرقام ونص عربي معًا
خلط ثنائي الاتجاه يُشوّش ترتيب الأحرف
فصل الأرقام والنص اللاتيني قبل إعادة تجميع السلسلة النهائية
دليل عملي حول أتمتة إرسال النماذج مع التعامل مع CAPTCHA يشرح السيناريوهات الواقعية ونمط التشغيل الآمن والخطوات التي تجعل هذا المسار قابلاً للتكرار باستخدام Capt...
دليل عملي حول أتمتة إرسال النماذج مع التعامل مع CAPTCHA يشرح السيناريوهات الواقعية ونمط التشغيل الآمن والخطوات...
Apr 19, 2026
Integrations
دليل تكامل لـ Bright Data + Captcha AI: دليل تكامل البروكسي يوضح الإعداد، وأمثلة الكود، ومسار الدمج الأنسب لتشغيل Captcha AI داخل تطبيقاتك بصورة واضحة وقابلة لل...
دليل تكامل لـ Bright Data + Captcha AI: دليل تكامل البروكسي يوضح الإعداد، وأمثلة الكود، ومسار الدمج الأنسب لتش...
Apr 25, 2026
API Tutorials
شرح خطوة بخطوة لـ Bash + c URL + Captcha AI: أتمتة CAPTCHA من سطر الأوامر مع أمثلة مباشرة قابلة لإعادة الاستخدام ومسار واضح لتطبيقه باستخدام Captcha AI.
النقاشات (0)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.