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:
- Resolvendo CAPTCHAs em sites chineses
- Conjunto de caracteres CAPTCHA de imagem multilíngue
- Localização CAPTCHA e configurações de idioma