Use Cases

Xử lý CAPTCHA tiếng Ả Rập và RTL bằng CaptchaAI

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:

Os comentários estão desativados para este artigo.

Postagens relacionadas

Use Cases Gửi biểu mẫu tự động với xử lý CAPTCHA
Hướng dẫn thực hành về Gửi biểu mẫu tự động với quy trình xử lý CAPTCHA, với các tình huống thực tế, lời khuyên về quy trình làm việc và các bước có thể thực hi...

Hướng dẫn thực hành về Gửi biểu mẫu tự động với quy trình xử lý CAPTCHA, với các tình huống thực tế, lời khuyê...

Apr 24, 2026
DevOps & Scaling Xây dựng giải quyết CAPTCHA theo sự kiện bằng AWS SNS và CaptchaAI
Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết định về kiến ​​trúc, các cân nhắc vận hành và mô hì...

Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết đ...

Apr 25, 2026
Troubleshooting CAPTCHA tự động hóa trình duyệt không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ lỗi
Hướng dẫn thực hành về trình duyệt tự động hóa CAPTCHA không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ lỗi, với các nguyên nhân phổ biến, các bước chẩn đ...

Hướng dẫn thực hành về trình duyệt tự động hóa CAPTCHA không thành công nhưng API vẫn hoạt động: Hướng dẫn gỡ...

Apr 29, 2026