ينقر المستخدم على "إرسال" وينبثق نموذج مع تحدي CAPTCHA. مفتاح الموقع ليس موجودًا في مصدر الصفحة الأولي - فهو يتم تحميله ديناميكيًا عند فتح الوسائط. يحتاج البرنامج النصي للأتمتة إلى تشغيل الوسائط، وانتظار عرض اختبار CAPTCHA، واستخراج المعلمات، وحل الرمز المميز وإدخاله قبل انتهاء مهلة الوسائط أو انتهاء جلسة المستخدم.
أنماط CAPTCHA المشروطة
نمط
المحفّز
التحدي
مشروط تسجيل الدخول
انقر على زر "تسجيل الدخول".
يتم تحميل اختبار CAPTCHA داخل قسم التراكب
إعلان بيني مضاد للبوتات
تلقائي بعد السلوك المشبوه
صفحة الكتل المشروطة بملء الشاشة
تأكيد الخروج
إرسال نموذج الدفع
يظهر مشروط للتحقق
مربع حوار الحد الأقصى للسعر
تم اكتشاف عدد كبير جدًا من الطلبات
مشروط مع بوابة CAPTCHA
موافقة ملفات تعريف الارتباط + اختبار CAPTCHA
الزيارة الأولى
CAPTCHA مضمن في مربع حوار الموافقة
بايثون: معالج CAPTCHA للكاتب المسرحي
import requests
import time
from playwright.sync_api import sync_playwright
API_KEY = "YOUR_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def solve_captcha(sitekey, pageurl, method="userrecaptcha"):
"""Submit and poll a CAPTCHA."""
params = {
"key": API_KEY,
"method": method,
"json": 1,
}
if method == "userrecaptcha":
params["googlekey"] = sitekey
params["pageurl"] = pageurl
elif method == "turnstile":
params["sitekey"] = sitekey
params["pageurl"] = pageurl
resp = requests.post(SUBMIT_URL, data=params, timeout=30).json()
if resp.get("status") != 1:
raise RuntimeError(f"Submit failed: {resp.get('request')}")
task_id = resp["request"]
for _ in range(60):
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 failed: {poll.get('request')}")
raise RuntimeError("Timeout")
def detect_modal_captcha(page):
"""
Detect CAPTCHA inside a visible modal/dialog.
Returns (sitekey, method) or (None, None).
"""
return page.evaluate("""
() => {
// Find visible modals
const modalSelectors = [
'.modal.show',
'.modal[style*="display: block"]',
'dialog[open]',
'[role="dialog"]:not([aria-hidden="true"])',
'.overlay.visible',
'.popup.active',
'[class*="modal"][class*="open"]',
];
let modal = null;
for (const sel of modalSelectors) {
const el = document.querySelector(sel);
if (el && el.offsetParent !== null) {
modal = el;
break;
}
}
// If no modal found, search entire document
const searchRoot = modal || document;
// Check for reCAPTCHA
const recaptcha = searchRoot.querySelector('.g-recaptcha[data-sitekey]');
if (recaptcha) {
return { sitekey: recaptcha.dataset.sitekey, method: 'userrecaptcha' };
}
// Check for Turnstile
const turnstile = searchRoot.querySelector('.cf-turnstile[data-sitekey]');
if (turnstile) {
return { sitekey: turnstile.dataset.sitekey, method: 'turnstile' };
}
// Check for hCaptcha
const hcaptcha = searchRoot.querySelector('.h-captcha[data-sitekey]');
if (hcaptcha) {
return { sitekey: hcaptcha.dataset.sitekey, method: 'hcaptcha' };
}
return null;
}
""")
def inject_token_in_modal(page, token, method="userrecaptcha"):
"""Inject token into the CAPTCHA inside the modal."""
if method == "userrecaptcha":
page.evaluate("""
(token) => {
// Find response textarea (may be inside modal)
const textareas = document.querySelectorAll('#g-recaptcha-response, [name="g-recaptcha-response"]');
textareas.forEach(ta => {
ta.value = token;
ta.style.display = 'block';
});
// Trigger callback
if (typeof ___grecaptcha_cfg !== 'undefined') {
Object.values(___grecaptcha_cfg.clients).forEach(client => {
Object.values(client).forEach(val => {
if (val && typeof val === 'object') {
Object.values(val).forEach(v => {
if (v && typeof v.callback === 'function') v.callback(token);
});
}
});
});
}
}
""", token)
elif method == "turnstile":
page.evaluate("""
(token) => {
const inputs = document.querySelectorAll('[name="cf-turnstile-response"]');
inputs.forEach(inp => { inp.value = token; });
if (typeof window.turnstileCallback === 'function') {
window.turnstileCallback(token);
}
}
""", token)
def handle_modal_captcha(page, trigger_selector=None, timeout=10000):
"""
Full workflow: trigger modal, detect CAPTCHA, solve, inject.
"""
# Step 1: Trigger the modal if needed
if trigger_selector:
print(f"Clicking trigger: {trigger_selector}")
page.click(trigger_selector)
# Step 2: Wait for modal to become visible
print("Waiting for modal...")
modal_selectors = [
".modal.show",
"dialog[open]",
'[role="dialog"]:not([aria-hidden="true"])',
".popup.active",
]
modal_visible = False
for selector in modal_selectors:
try:
page.wait_for_selector(selector, timeout=timeout)
modal_visible = True
print(f" Modal detected: {selector}")
break
except Exception:
continue
if not modal_visible:
print(" No modal detected")
return None
# Step 3: Wait for CAPTCHA to render inside modal
time.sleep(2) # Brief pause for dynamic CAPTCHA loading
captcha_info = detect_modal_captcha(page)
if not captcha_info:
print(" No CAPTCHA found in modal")
return None
sitekey = captcha_info["sitekey"]
method = captcha_info["method"]
print(f" Found {method} CAPTCHA: {sitekey[:20]}...")
# Step 4: Solve via CaptchaAI
token = solve_captcha(sitekey, page.url, method)
print(f" Solved: {token[:30]}...")
# Step 5: Inject token
inject_token_in_modal(page, token, method)
print(" Token injected")
return token
def main():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://example.com")
page.wait_for_load_state("networkidle")
# Handle CAPTCHA that appears in login modal
token = handle_modal_captcha(
page,
trigger_selector="button#login-btn",
timeout=10000,
)
if token:
# Fill form fields inside modal
page.fill('dialog input[name="email"]', "user@example.com")
page.fill('dialog input[name="password"]', "password123")
# Submit modal form
page.click('dialog button[type="submit"]')
page.wait_for_load_state("networkidle")
browser.close()
main()
عزل ملفات تعريف المتصفح عند دمج Captcha AI: فصل الجلسات، الحفاظ على ملفات تعريف الارتباط، وإدارة الحسابات المملوكة بصورة مستقرة داخل بيئات الاختبار والتشغيل الآ...
دليل عملي حول استمرارية جلسة المتصفح لسير عمل اختبار CAPTCHA يجمع أمثلة واضحة ونقاطًا تشغيلية مفيدة لبناء سير...
Apr 28, 2026
الدروس التطبيقية
إعادة استخدام رموز CAPTCHA بأمان: متى يصلح التخزين المؤقت، كيف تتابع نافذة الصلاحية، وما الضوابط التي تمنع إعادة حقن رمز منتهي الصلاحية في التدفقات الآلية.
إعادة استخدام رموز CAPTCHA بأمان: متى يصلح التخزين المؤقت، كيف تتابع نافذة الصلاحية، وما الضوابط التي تمنع إعا...
Apr 30, 2026
حالات الاستخدام
دليل عملي حول اختبار تدفق الدفع عالي الطلب في المتاجر المملوكة يشرح السيناريوهات الواقعية ونمط التشغيل الآمن والخطوات التي تجعل هذا المسار قابلاً للتكرار باستخد...
دليل عملي حول اختبار تدفق الدفع عالي الطلب في المتاجر المملوكة يشرح السيناريوهات الواقعية ونمط التشغيل الآمن و...
May 03, 2026
حالات الاستخدام
دليل عملي حول اختبار غرف الانتظار ومسارات الدفع في منصات التذاكر المملوكة يشرح السيناريوهات الواقعية ونمط التشغيل الآمن والخطوات التي تجعل هذا المسار قابلاً للت...