CAPTCHA trên các trang tiếng Ả Rập, Farsi và Do Thái không đọc được bằng cùng một pipeline OCR bạn dùng cho tiếng Anh. Chữ Ả Rập nối liền theo vị trí trong từ — một chữ cái mang tới bốn hình dạng khác nhau (đầu, giữa, cuối, tách biệt) — nên bộ nhận dạng ký tự tiêu chuẩn dễ đọc sai. Cộng thêm bố cục RTL đảo ngược vị trí phần tử trên trang, bạn phải giải hai bài toán cùng lúc: đọc đúng ký tự và định vị đúng CAPTCHA. CaptchaAI xử lý cả hai qua bộ giải Image/OCR với tham số language=2.
Ví dụ thực tế: một đội QA ở Việt Nam làm outsourcing cho khách hàng Trung Đông cần kiểm thử luồng đăng ký trên cổng tiếng Ả Rập, hoặc theo dõi giá trên sàn thương mại điện tử UAE, Ả Rập Xê Út. Không cần máy chủ hay hạ tầng đặt tại khu vực đó — CaptchaAI xử lý dựa trên ảnh và tham số ngôn ngữ gửi kèm request.
Vì sao CAPTCHA tiếng Ả Rập khó hơn CAPTCHA tiếng Anh
- Ký tự nối liền — chữ Ả Rập đổi hình dạng tùy ký tự liền kề.
- Đọc từ phải sang trái — văn bản trong CAPTCHA hiển thị theo hướng RTL.
- Hướng hỗn hợp (bidirectional) — số và chữ Latinh trộn lẫn với tiếng Ả Rập trong cùng một chuỗi.
- Dấu phụ (diacritics) — chấm và dấu trên/dưới ký tự, ví dụ ش khác س chỉ bởi ba chấm.
- Bố cục trang RTL — vị trí form và CAPTCHA đảo ngược so với trang LTR.
Câu hỏi thường gặp về CAPTCHA tiếng Ả Rập
CaptchaAI có nhận diện chữ Ả Rập viết liền không?
Có. Chữ Ả Rập nối liền khi đứng cạnh nhau — cùng chữ cái trông khác nhau tùy vị trí trong từ (đầu, giữa, cuối, tách biệt). Bộ giải Image/OCR của CaptchaAI nhận diện đủ bốn dạng, không cần tiền xử lý ảnh riêng.
Giải một CAPTCHA hình ảnh tiếng Ả Rập qua API mất bao lâu và tốn bao nhiêu?
Chi phí tính theo thread, không theo từng lần giải — BASIC ($15/tháng, 5 thread) đủ chạy song song nhiều CAPTCHA tiếng Ả Rập ở khối lượng nhỏ. Thời gian giải phụ thuộc độ phức tạp ảnh; code mẫu dưới đây polling mỗi 5 giây, timeout sau 24 lần thử.
CaptchaAI có hỗ trợ hCaptcha trên các trang tiếng Ả Rập không?
Chưa. CaptchaAI hiện không hỗ trợ hCaptcha, kể cả trên trang RTL. Bộ giải Image/OCR trong bài này chỉ dành cho CAPTCHA dạng ảnh/văn bản; hCaptcha là luồng tích hợp khác, ngoài phạm vi bài này.
Code mẫu: giải CAPTCHA hình ảnh tiếng Ả Rập bằng Python và JavaScript
Ví dụ Python dưới đây gửi ảnh CAPTCHA dạng base64 tới CaptchaAI với language=2, sau đó polling res.php cho tới khi có kết quả:
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": "[email protected]",
},
)
Bản JavaScript tương đương dùng với Playwright — lấy ảnh CAPTCHA trực tiếp từ DOM trang RTL rồi điền token vào input:
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}`);
Lỗi thường gặp khi tích hợp CAPTCHA trên trang RTL
- Văn bản Ả Rập hiển thị ngược ở output — do client hiển thị text RTL như LTR; bọc output trong dấu RTL embedding (U+202B) hoặc dùng màn hình hỗ trợ RTL.
- Thiếu dấu phụ trong kết quả — do ảnh CAPTCHA độ phân giải thấp; dùng ảnh độ phân giải cao hơn trước khi gửi.
- Chuỗi hai chiều (Ả Rập + số) bị xáo trộn — do thuật toán BiDi áp dụng không nhất quán; xử lý ký tự định hướng rõ ràng bằng Unicode marker.
- Submit form thất bại với input tiếng Ả Rập — do sai lệch encoding; dùng
charset=UTF-8trong headerContent-Type. - Vị trí CAPTCHA khác so với dự kiến — do bố cục RTL đảo ngược vị trí phần tử; dùng CSS selector hoặc ID thay vì định vị theo tọa độ.
Farsi, Do Thái và các script RTL khác CaptchaAI xử lý được
Farsi dùng chung bảng chữ Ả Rập, thêm bốn ký tự riêng (پ, چ, ژ, گ); tiếng Do Thái dùng script khác hẳn nhưng cũng viết RTL. Cùng tham số language=2, CaptchaAI nhận diện được cả ba, không cần đổi endpoint.
| Script | Ngôn ngữ | Ký tự ví dụ |
|---|---|---|
| Ả Rập | Ả Rập, Urdu, Pashto | عربي |
| Farsi/Persian | Farsi | فارسی |
| Do Thái | Do Thái | עברית |
Bước tiếp theo
Lấy API key CaptchaAI và chạy thử code Python hoặc JavaScript ở trên với ảnh CAPTCHA tiếng Ả Rập thật từ trang bạn đang test. Xem thêm giải CAPTCHA trên các trang web Trung Quốc, bộ ký tự CAPTCHA hình ảnh đa ngôn ngữ và cài đặt ngôn ngữ, bản địa hóa CAPTCHA.