Các trang web tiếng Ả Rập, tiếng Farsi và tiếng Do Thái trình bày CAPTCHA với các tập lệnh từ phải sang trái (RTL) thách thức OCR tiêu chuẩn và chèn văn bản. Các ký tự tiếng Ả Rập kết nối khác nhau dựa trên vị trí - dạng ban đầu, trung gian, cuối cùng hoặc tách biệt - khiến việc nhận dạng CAPTCHA hình ảnh trở nên khó khăn hơn. Kết hợp với bố cục trang RTL ảnh hưởng đến việc định vị thành phần, những trang này cần được xử lý cụ thể.
Những thách thức của RTL CAPTCHA
| Thử thách | Chi tiết |
|---|---|
| Kết nối ký tự | Chữ Ả Rập thay đổi hình dạng dựa trên các ký tự liền kề |
| Đọc từ phải sang trái | Văn bản trong CAPTCHA đọc từ phải sang trái |
| Hướng hỗn hợp | Số A và văn bản Latinh trộn với tiếng Ả Rập (hai chiều) |
| Dấu phụ | Dấu chấm và dấu phía trên ký tự/below (شاين vs ساين) |
| Bố cục trang RTL | Các thành phần biểu mẫu và vị trí CAPTCHA khác với LTR |
Python: CAPTCHA hình ảnh tiếng Ả Rập
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: Tiếng Ả Rập và 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}`);
Tập lệnh RTL được hỗ trợ
| kịch bản | Ngôn ngữ | Ký tự mẫu |
|---|---|---|
| tiếng Ả Rập | Tiếng Ả Rập, tiếng Urdu, tiếng Pashto | عربي - أبØиدية |
| Tiếng Farsi/Persian | tiếng Ba Tư | ÙØ§Ø±Ø³ÛŒ - ØØ±ÙˆÙ |
| tiếng Do Thái | tiếng Do Thái | ×¢×'רית - ××Ãתי×Ãת |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Văn bản tiếng Ả Rập bị đảo ngược ở đầu ra | Máy khách hiển thị văn bản RTL dưới dạng LTR | Gói đầu ra trong \u202B (nhúng RTL) hoặc sử dụng màn hình nhận biết RTL |
| Thiếu dấu phụ | Hình ảnh có độ phân giải thấp | Sử dụng hình ảnh CAPTCHA có độ phân giải cao hơn |
| Văn bản hai chiều (tiếng Ả Rập+số) bị xáo trộn | Thuật toán BiDi được áp dụng không nhất quán | Xử lý các ký tự định hướng rõ ràng bằng dấu Unicode |
| Gửi biểu mẫu không thành công với đầu vào tiếng Ả Rập | Mã hóa không khớp | Sử dụng charset=UTF-8 trong tiêu đề Kiểu nội dung |
| Vị trí CAPTCHA khác với dự kiến | Vị trí phần tử phản ánh bố cục RTL | Sử dụng bộ chọn CSS thay vì phát hiện dựa trên vị trí |
Câu hỏi thường gặp
CaptchaAI có xử lý tập lệnh tiếng Ả Rập được kết nối không?
Vâng. Các ký tự tiếng Ả Rập kết nối khi liền kề - cùng một chữ cái trông khác nhau tùy thuộc vào vị trí của nó trong một từ. Bộ giải Image/OCR của CaptchaAI nhận dạng chữ viết Ả Rập được kết nối bao gồm các dạng chữ cái đầu, trung gian, cuối cùng và tách biệt.
Làm cách nào để xử lý CAPTCHA tiếng Farsi so với CAPTCHA tiếng Ả Rập?
Cả hai đều sử dụng chữ Ả Rập nhưng có thêm ký tự (như Ù¾, Ú†, Ú˜, Ú¯ trong tiếng Farsi). Sử dụng language=2 cho cả hai. CaptchaAI tự động nhận dạng bộ ký tự mở rộng.
Bố cục trang RTL có ảnh hưởng đến việc phát hiện CAPTCHA không?
Bố cục RTL phản chiếu trang - các biểu mẫu và CAPTCHA có thể xuất hiện ở các phía đối diện so với các trang LTR. Sử dụng bộ chọn CSS hoặc ID để xác định vị trí các phần tử CAPTCHA thay vì dựa vào vị trí trực quan.
Các bước tiếp theo
Giải CAPTCHA trên các trang web tiếng Ả Rập và RTL —lấy khóa API CaptchaAI của bạnvà xử lý bất kỳ bộ ký tự RTL nào.
Hướng dẫn liên quan:
- Giải CAPTCHA trên các trang web Trung Quốc
- Bộ ký tự CAPTCHA hình ảnh đa ngôn ngữ
- Cài đặt ngôn ngữ và bản địa hóa CAPTCHA