Casos de Uso

Manipulação de árabe e RTL CAPTCHA com CaptchaAI

Sites em árabe, farsi e hebraico apresentam CAPTCHAs com scripts da direita para a esquerda (RTL) que desafiam o OCR padrão e a injeção de texto. Os caracteres árabes se conectam de maneira diferente com base na posição – formas iniciais, mediais, finais ou isoladas – dificultando o reconhecimento da imagem CAPTCHA. Combinados com layouts de página RTL que afetam o posicionamento dos elementos, esses sites precisam de tratamento específico.

Desafios RTL CAPTCHA

Desafio Detalhe
Conexão de personagem As letras árabes mudam de forma com base nos caracteres adjacentes
Leitura da direita para a esquerda O texto em CAPTCHA é lido da direita para a esquerda
Direção mista Números e texto latino misturados com árabe (bidirecional)
Marcas diacríticas Pontos e marcas acima dos caracteres /below (شاين vs ساين)
Layout de página RTL Os elementos do formulário e o posicionamento do CAPTCHA diferem do LTR

Python: imagem árabe 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: Árabe e 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}`);

Scripts RTL suportados

Roteiro Idiomas Personagens de exemplo
Árabe Árabe, Urdu, Pashto عربي - أبجدية
Farsi/Persian persa ÙØ§Ø±Ø³ÛŒ - ØØ±ÙˆÙ
Hebraico Hebraico עברית - ×ותיות

Solução de problemas

Problema Causa Correção
Texto árabe invertido na saída Cliente exibindo texto RTL como LTR Envolva a saída em \u202B (incorporação RTL) ou use display compatível com RTL
Marcas diacríticas faltando Imagem de baixa resolução Use imagens CAPTCHA de alta resolução
Texto bidirecional (árabe+números) confuso Algoritmo BiDi aplicado de forma inconsistente Lidar explicitamente com caracteres direcionais com marcadores Unicode
O envio do formulário falha com entrada em árabe Incompatibilidade de codificação Use charset=UTF-8 no cabeçalho Content-Type
A posição do CAPTCHA difere do esperado O layout RTL espelha as posições dos elementos Use seletores CSS em vez de detecção baseada em posição

Perguntas frequentes

CaptchaAI lida com escrita árabe conectada?

Sim. Os caracteres árabes se conectam quando adjacentes - a mesma letra parece diferente dependendo de sua posição em uma palavra. O solucionador Image/OCR do CaptchaAI reconhece a escrita árabe conectada, incluindo formas de letras iniciais, mediais, finais e isoladas.

Como lidar com CAPTCHAs farsi versus CAPTCHAs árabes?

Ambos usam a escrita árabe, mas com caracteres adicionais (como Ù¾, Ú†, Ú˜, Ú¯ em farsi). Use language=2 para ambos. CaptchaAI reconhece o conjunto de caracteres estendido automaticamente.

Os layouts de página RTL afetam a detecção de CAPTCHA?

Os layouts RTL espelham a página – formulários e CAPTCHAs podem aparecer em lados opostos em comparação com as páginas LTR. Use seletores CSS ou IDs para localizar elementos CAPTCHA em vez de depender da posição visual.

Próximas etapas

Resolva CAPTCHAs em sites em árabe e RTL —obtenha sua chave API CaptchaAIe lidar com qualquer conjunto de caracteres RTL.

Guias relacionados:

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