هناك بروتوكولان يتحكمان في Chrome للتشغيل الآلي: WebDriver (معيار W3C، الذي يستخدمه السيلينيوم) وبروتوكول Chrome DevTools (CDP، الذي يستخدمه Puppeteer/Playwright). ولكل منها ملفات تعريف وإمكانيات اكتشاف مختلفة وخصائص معالجة اختبار CAPTCHA.
هندسة البروتوكول
WebDriver (Selenium):
Script ──HTTP──▶ ChromeDriver ──DevTools──▶ Chrome
(JSON Wire) (bridge) (internal)
CDP (Puppeteer/Playwright):
Script ──WebSocket──▶ Chrome
(direct) (no middle layer)
مقارنة وجها لوجه
| ميزة | برنامج تشغيل الويب | CDP |
|---|---|---|
| البروتوكول | HTTP + جسون | WebSocket |
| قياسي | معيار W3C | خاص بالكروم |
| سطح الكشف | عالية (navigator.webdriver = true) |
أقل (قابل للتصحيح) |
| اعتراض الشبكة | لا (يحتاج إلى سلك السيلينيوم) | مدمج (Fetch، Network) |
| ** تقييم JavaScript ** | executeScript (ملفوفة) |
Runtime.evaluate (مباشر) |
| طلب التعديل | لا | نعم |
| تعديل الرد | لا | نعم |
| الاتصالات العامة | HTTP لكل أمر | WebSocket المستمر |
| ** عبر المتصفح ** | كروم، فايرفوكس، سفاري، إيدج | Chrome/Chromium فقط |
| إمكانية التخفي | منخفض (يقوم دائمًا بتعيين علامة برنامج تشغيل الويب) | عالية (العلم قابل للتصحيح) |
اختلافات الكشف
كشف WebDriver (السيلينيوم)
// What sites check for Selenium
navigator.webdriver // true (set by ChromeDriver)
document.$cdc_asdjflasutopfhvcZLmcfl // ChromeDriver internal variable
window.callSelenium // Older Selenium versions
window._selenium // Selenium internals
document.__webdriver_evaluate // WebDriver namespace
# Even with flag removal, ChromeDriver leaves traces
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
# Still detectable via $cdc variables in document
كشف CDP (Puppeteer)
// Puppeteer sets webdriver flag too, but it's fully patchable
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined,
});
// No $cdc variables to worry about
// No Selenium-specific traces
});
حل اختبار CAPTCHA: نهج WebDriver
# Selenium (WebDriver) + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
API_URL = "https://ocr.captchaai.com"
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com/form")
time.sleep(2)
# Extract sitekey
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
# Solve via CaptchaAI
resp = requests.post(f"{API_URL}/in.php", data={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": driver.current_url, "json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{API_URL}/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
break
token = data["request"]
# Inject token
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
document.querySelectorAll('[name="g-recaptcha-response"]')
.forEach(el => {{ el.value = '{token}'; }});
""")
driver.find_element(By.CSS_SELECTOR, "form").submit()
driver.quit()
حل اختبار CAPTCHA: نهج CDP
// Puppeteer (CDP) + CaptchaAI
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
const https = require("https");
puppeteer.use(StealthPlugin());
const API_KEY = "YOUR_API_KEY";
const API_URL = "https://ocr.captchaai.com";
function solveCaptcha(siteUrl, sitekey) {
// Submit + poll (simplified)
return new Promise(async (resolve, reject) => {
const submitResp = await httpPost(`${API_URL}/in.php`, {
key: API_KEY, method: "userrecaptcha",
googlekey: sitekey, pageurl: siteUrl, json: "1",
});
const taskId = submitResp.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await httpGet(
`${API_URL}/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`
);
if (result.request !== "CAPCHA_NOT_READY") {
return resolve(result.request);
}
}
reject(new Error("Timeout"));
});
}
(async () => {
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--window-size=1920,1080"],
});
const page = await browser.newPage();
// CDP: Enable network interception
const cdp = await page.createCDPSession();
await cdp.send("Network.enable");
// Monitor CAPTCHA-related requests
cdp.on("Network.requestWillBeSent", (params) => {
if (params.request.url.includes("recaptcha")) {
console.log(`CAPTCHA request: ${params.request.url}`);
}
});
await page.goto("https://example.com/form", { waitUntil: "networkidle0" });
const sitekey = await page.evaluate(() =>
document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
);
if (sitekey) {
const token = await solveCaptcha(page.url(), sitekey);
// CDP: Inject via Runtime.evaluate (lower-level than page.evaluate)
await cdp.send("Runtime.evaluate", {
expression: `
document.querySelector('#g-recaptcha-response').value = '${token}';
document.querySelector('form').submit();
`,
});
}
await browser.close();
})();
مقارنة القدرات لسير عمل اختبار CAPTCHA
اعتراض الشبكة
# WebDriver: Cannot intercept requests natively
# Requires selenium-wire (third-party)
from seleniumwire import webdriver
driver = webdriver.Chrome()
# selenium-wire proxies all traffic through a local proxy
// CDP: Built-in request interception
await cdp.send("Fetch.enable", {
patterns: [{ urlPattern: "*recaptcha*" }],
});
cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
console.log(`Intercepted: ${request.url}`);
await cdp.send("Fetch.continueRequest", { requestId });
});
تعديل الاستجابة
// CDP: Can modify responses (WebDriver cannot)
cdp.on("Fetch.requestPaused", async ({ requestId, request }) => {
if (request.url.includes("captcha-config")) {
// Return modified response
await cdp.send("Fetch.fulfillRequest", {
requestId,
responseCode: 200,
body: btoa(JSON.stringify({ enabled: false })),
});
} else {
await cdp.send("Fetch.continueRequest", { requestId });
}
});
التلاعب بملفات تعريف الارتباط
# WebDriver: Standard cookie API
driver.add_cookie({"name": "session", "value": "abc123"})
cookies = driver.get_cookies()
// CDP: Full cookie control including httpOnly
await cdp.send("Network.setCookie", {
name: "session",
value: "abc123",
domain: "example.com",
httpOnly: true,
secure: true,
});
// Get all cookies including httpOnly (WebDriver can't access these)
const { cookies } = await cdp.send("Network.getAllCookies");
مصفوفة القرار
| السيناريو | موصى به | لماذا |
|---|---|---|
| اختبار متعدد المتصفحات | برنامج تشغيل الويب | دعم عبر المتصفحات |
| أقصى قدر من التخفي | CDP | سطح الكشف السفلي |
| تصحيح أخطاء الشبكة | CDP | اعتراض مدمج |
| فريق غير مطلع على CDP | برنامج تشغيل الويب | واجهة برمجة تطبيقات أبسط، المزيد من المستندات |
| تجريف على نطاق واسع | CDP | انخفاض الحمل لكل جلسة |
| التكامل مع CI/CD | برنامج تشغيل الويب | دعم أفضل للأدوات |
| مواقع CAPTCHA الثقيلة | سي دي بي + CaptchaAI | التخفي + حل التحرير والسرد |
| ملء نموذج بسيط | برنامج تشغيل الويب + CaptchaAI | أسهل في التنفيذ |
النهج الهجين: WebDriver + CDP
يدعم السيلينيوم 4 أوامر CDP من خلال BiDi (ثنائي الاتجاه):
from selenium import webdriver
driver = webdriver.Chrome()
# Use WebDriver for navigation
driver.get("https://example.com")
# Use CDP for stealth patches
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
"""
})
# Use CDP for network events
driver.execute_cdp_cmd("Network.enable", {})
معايير الأداء
| متري | برنامج تشغيل الويب (السيلينيوم) | CDP (Puppeteer) | سي دي بي (كاتب مسرحي) |
|---|---|---|---|
| بداية الجلسة | ~2.5 ثانية | ~1.5 ثانية | ~1.2 ثانية |
| التنقل في الصفحة | ~500 مللي ثانية الحمل | ~100 مللي ثانية الحمل | ~80 مللي ثانية النفقات العامة |
| تنفيذ البرنامج النصي | ~ 200 مللي ثانية لكل مكالمة | ~50 مللي ثانية لكل مكالمة | ~40 مللي ثانية لكل مكالمة |
| الذاكرة لكل جلسة | ~350 ميجابايت | ~280 ميجابايت | ~260 ميجابايت |
| حل اختبار CAPTCHA (CaptchaAI) | 15-30 ثانية | 15-30 ثانية | 15-30 ثانية |
وقت حل CaptchaAI متطابق — إنه استدعاء API مستقل عن بروتوكول المتصفح.
استكشاف الأخطاء وإصلاحها
| قضية | إصلاح برنامج تشغيل الويب | إصلاح CDP |
|---|---|---|
| تم اكتشافه على أنه روبوت | excludeSwitches + الخيارات |
البرنامج المساعد التخفي + التصحيحات |
| لا يمكن اعتراض الطلبات | استخدم سلك السيلينيوم | استخدم Fetch.enable |
| التنفيذ بطيء | تقليل مكالمات execute_script |
أوامر CDP المجمعة |
| فشل حقن الرمز المميز | تحقق من سياق iframe | استخدم Runtime.evaluate مع السياق |
| عدم استقرار الجلسة | قم بتحديث برنامج ChromeDriver | تحقق من اتصال WebSocket |
الأسئلة الشائعة
ما هو البروتوكول الذي يوفر معدلات نجاح أفضل في اختبار CAPTCHA؟
معدلات النجاح متطابقة — CaptchaAI يحل مشكلة جانب الخادم. يؤثر البروتوكول فقط على تكرار الكشف (عدد مرات ظهور اختبار CAPTCHA).
هل يمكنني المزج بين WebDriver وCDP؟
نعم. السيلينيوم 4 يكشف execute_cdp_cmd(). استخدم WebDriver للتنقل وCDP للتصحيحات الخفية.
هل Playwright أفضل من كليهما؟
يستخدم Playwright CDP داخليًا ولكنه يوفر واجهة برمجة تطبيقات ذات مستوى أعلى مع انتظار تلقائي ومعالجة أفضل للأخطاء. إنها حل وسط جيد.
هل يجب أن أتحول من السيلينيوم إلى Puppeteer لكي يعمل اختبار CAPTCHA؟
إذا كان الكشف هو مشكلتك الرئيسية، نعم. إذا كنت بحاجة إلى دعم عبر المتصفحات، فابق مع Selenium + CaptchaAI.
أدلة ذات صلة
- بروتوكول Chrome DevTools + CaptchaAI: أتمتة اختبار CAPTCHA منخفض المستوى
- سلك السيلينيوم + CaptchaAI: طلب اعتراض لحل اختبار CAPTCHA
اختر بروتوكول الأتمتة المناسب لسير عمل CAPTCHA الخاص بك —احصل على مفتاح CaptchaAI الخاص بكوحل اختبارات CAPTCHA بغض النظر عن البروتوكول.