يُعنى هذا الدليل بسيناريوهات الاختبار والتشغيل الآلي المملوكة والمصرح بها، حيث تحتاج الفرق إلى اتساق الجلسات بين البيئات أو إدارة حسابات متعددة مملوكة في وقت واحد.
تعمل أدوات عزل ملف تعريف المتصفح على إنشاء بيئات متصفح متميزة بإعدادات مستقلة لكل جلسة. بالاشتراك مع CaptchaAI، يحصل كل ملف تعريف على حل CAPTCHA موثوق به داخل نفس سياق الجلسة الذي يجري اختباره.
كيف يساعد عزل ملف تعريف المتصفح في بيئات الاختبار
| ميزة | Chrome عادي | متصفح مع ملف تعريف معزول |
|---|---|---|
| بصمة الجلسة | متشابكة بين الجلسات | فريدة لكل ملف تعريف |
| عزل ملفات تعريف الارتباط | مشتركة افتراضيًا | منفصلة لكل ملف تعريف |
| مخاطر التداخل بين الجلسات | عالية | منخفض |
تسجيل الدخول المتعدد + CaptchaAI
ابدأ ملفًا شخصيًا عبر واجهة برمجة التطبيقات (API).
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
MULTILOGIN_TOKEN = "your_multilogin_token"
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def start_multilogin_profile(profile_id):
"""Start a Multilogin browser profile and return WebDriver."""
# Start profile via Multilogin API
resp = requests.get(
f"http://127.0.0.1:35000/api/v1/profile/start"
f"?automation=true&profileId={profile_id}",
headers={"Authorization": f"Bearer {MULTILOGIN_TOKEN}"},
)
data = resp.json()
port = data["value"]
# Connect Selenium to the running profile
options = webdriver.ChromeOptions()
options.debugger_address = f"127.0.0.1:{port}"
driver = webdriver.Chrome(options=options)
return driver
def solve_recaptcha(site_url, sitekey):
"""Solve via CaptchaAI API."""
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY,
"action": "get",
"id": task_id,
"json": 1,
})
data = resp.json()
if data["request"] == "CAPCHA_NOT_READY":
continue
if data["status"] == 1:
return data["request"]
raise TimeoutError("Solve timeout")
def run_with_multilogin(profile_id, target_url):
driver = start_multilogin_profile(profile_id)
try:
driver.get(target_url)
time.sleep(3)
# Detect sitekey
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
if sitekey:
# Solve CAPTCHA
token = solve_recaptcha(target_url, sitekey)
# Inject token
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
document.querySelectorAll('[name="g-recaptcha-response"]')
.forEach(el => {{ el.value = '{token}'; }});
""")
# Submit form
driver.find_element(By.CSS_SELECTOR, "form").submit()
time.sleep(3)
return driver.page_source
finally:
driver.quit()
# Run across multiple profiles
profile_ids = [
"profile-uuid-1",
"profile-uuid-2",
"profile-uuid-3",
]
for pid in profile_ids:
result = run_with_multilogin(pid, "https://target-site.com/form")
print(f"Profile {pid}: done")
تسجيل الدخول + CaptchaAI
إدارة الملف الشخصي
import requests
import time
import subprocess
from selenium import webdriver
GOLOGIN_TOKEN = "your_gologin_token"
GOLOGIN_API = "https://api.gologin.com/browser"
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def create_gologin_profile():
"""Create a new GoLogin profile with controlled browser settings."""
resp = requests.post(
GOLOGIN_API,
headers={"Authorization": f"Bearer {GOLOGIN_TOKEN}"},
json={
"name": f"captcha-profile-{int(time.time())}",
"os": "win",
"navigator": {
"userAgent": "random",
"resolution": "1920x1080",
"language": "en-US",
},
"proxy": {
"mode": "none",
},
},
)
return resp.json()["id"]
def start_gologin_profile(profile_id):
"""Start GoLogin profile and connect WebDriver."""
resp = requests.get(
f"{GOLOGIN_API}/{profile_id}/start",
headers={"Authorization": f"Bearer {GOLOGIN_TOKEN}"},
)
data = resp.json()
debug_port = data.get("debugPort", 0)
ws_url = data.get("wsUrl", "")
options = webdriver.ChromeOptions()
options.debugger_address = f"127.0.0.1:{debug_port}"
driver = webdriver.Chrome(options=options)
return driver
def stop_gologin_profile(profile_id):
requests.get(
f"{GOLOGIN_API}/{profile_id}/stop",
headers={"Authorization": f"Bearer {GOLOGIN_TOKEN}"},
)
def solve_and_submit(driver, url):
"""Navigate, solve CAPTCHA, submit form."""
driver.get(url)
time.sleep(3)
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
if not sitekey:
return {"status": "no_captcha"}
# Solve via CaptchaAI
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
break
token = data["request"]
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
""")
return {"status": "solved", "token": token[:30] + "..."}
# Full pipeline
profile_id = create_gologin_profile()
driver = start_gologin_profile(profile_id)
try:
result = solve_and_submit(driver, "https://target-site.com/register")
print(result)
finally:
driver.quit()
stop_gologin_profile(profile_id)
دولفين انتي + CaptchaAI
import requests
import time
from selenium import webdriver
DOLPHIN_API = "http://localhost:3001/v1.0"
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def start_dolphin_profile(profile_id):
"""Start a Dolphin Anty profile."""
resp = requests.get(
f"{DOLPHIN_API}/browser_profiles/{profile_id}/start"
f"?automation=1"
)
data = resp.json()
port = data["automation"]["port"]
options = webdriver.ChromeOptions()
options.debugger_address = f"127.0.0.1:{port}"
return webdriver.Chrome(options=options)
def stop_dolphin_profile(profile_id):
requests.get(f"{DOLPHIN_API}/browser_profiles/{profile_id}/stop")
def captcha_workflow(driver, url, captchaai_key):
driver.get(url)
time.sleep(3)
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
if not sitekey:
return None
# Submit to CaptchaAI
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": captchaai_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": url,
"json": 1,
})
task_id = resp.json()["request"]
# Poll
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": captchaai_key, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
break
token = data["request"]
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
""")
return token
تنفيذ سيناريوهات QA متعددة في الوقت نفسه
from concurrent.futures import ThreadPoolExecutor, as_completed
def process_profile(profile_config):
"""Run a task on one privacy-focused browser profile."""
browser = profile_config["browser"] # "multilogin", "gologin", "dolphin"
profile_id = profile_config["profile_id"]
url = profile_config["url"]
driver = None
try:
if browser == "multilogin":
driver = start_multilogin_profile(profile_id)
elif browser == "gologin":
driver = start_gologin_profile(profile_id)
elif browser == "dolphin":
driver = start_dolphin_profile(profile_id)
result = solve_and_submit(driver, url)
return {"profile": profile_id, **result}
except Exception as e:
return {"profile": profile_id, "status": "error", "error": str(e)}
finally:
if driver:
driver.quit()
if browser == "gologin":
stop_gologin_profile(profile_id)
elif browser == "dolphin":
stop_dolphin_profile(profile_id)
# Run 3 QA profiles in parallel
profiles = [
{"browser": "gologin", "profile_id": f"profile-{i}", "url": "https://target.com/form"}
for i in range(3)
]
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(process_profile, p): p for p in profiles}
for future in as_completed(futures):
result = future.result()
print(f"[{result['status']}] Profile: {result['profile']}")
أفضل الممارسات
| ممارسة | لماذا |
|---|---|
| ملف تعريف واحد لكل سيناريو QA | يمنع تداخل جلسات الاختبار |
| فصل الشبكة حسب السيناريو عند الحاجة | يحافظ على اتساق السجلات بين البيئات |
| تحميل صفحات المساعدة أو الصحة المملوكة أولًا | يثبت أن التطبيق يستجيب قبل اختبار النموذج |
| مهلة تهيئة قصيرة قبل الإرسال | تمنع تفسير أعطال التحميل كفشل CAPTCHA |
| ملفات تعريف الارتباط النظيفة بين عمليات التشغيل الاختبارية | تساعد على إعادة إنتاج المشكلة بدقة |
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
| لن يبدأ الملف الشخصي | صراع الميناء | تحقق من عدم وجود ملف تعريف آخر باستخدام نفس المنفذ |
| يتعذر على WebDriver الاتصال | منفذ تصحيح خاطئ | التحقق من استجابة API للمنفذ الصحيح |
| لا يزال يتم تشغيل اختبار CAPTCHA | عدم تنسق بيئة التشغيل | طابق بين إعدادات الجلسة واللغة والمنطقة الزمنية الخاصة ببيئة الاختبار |
| تم رفض الرمز المميز | لم يكتمل تحميل عناصر الصفحة أو انتهت الجلسة | راجع زمن التحميل وسلامة الجلسة قبل الإرسال |
| بطء إنشاء الملف الشخصي | حد معدل API | أضف تأخيرات بين مكالمات إنشاء الملف الشخصي |
الأسئلة الشائعة
ما هو المتصفح الذي يركز على الخصوصية والذي يعمل بشكل أفضل مع CaptchaAI؟
تعمل البرامج الثلاثة (Multilogin، وGoLogin، وDolphin Anty) بشكل جيد. CaptchaAI لا يعتمد على المتصفح، فهو يحتاج فقط إلى مفتاح الموقع وعنوان URL للصفحة.
هل أحتاج إلى فصل شبكي مع هذه المتصفحات؟
يعتمد ذلك على بنية بيئة الاختبار لديك. إذا كانت السيناريوهات المختلفة تمر عبر شبكات أو مناطق منفصلة في التطبيق المملوك، فاحرص على إبقاء هذا الفصل واضحًا في سجلاتك.
كم عدد الملفات الشخصية التي يمكنني تشغيلها في وقت واحد؟
يعتمد ذلك على موارد النظام وعلى عدد سيناريوهات QA التي تحتاج إلى تشغيلها في اللحظة نفسها. ابدأ بعدد صغير، ثم زد الحمل تدريجيًا مع مراقبة الذاكرة وزمن الاستجابة.
هل يمكنني إعادة استخدام الملفات الشخصية عبر الجلسات؟
نعم، إذا كان هدفك هو إعادة إنتاج حالة جلسة معروفة داخل تطبيق تملكه. احتفظ بسجل واضح يحدد متى أُنشئ الملف الشخصي ومتى أُعيد استخدامه حتى يسهل تفسير النتائج.
أدلة ذات صلة
- امتداد المتصفح مقابل واجهة برمجة التطبيقات: ما هو نهج حل CAPTCHA الأفضل؟
- فشل اختبار CAPTCHA لأتمتة المتصفح ولكن واجهة برمجة التطبيقات تعمل: دليل التصحيح
إذا كنت تختبر ملفات تعريف متصفح معزولة داخل بيئة تملكها، فابدأ بتثبيت إعدادات الجلسة وسجلات المتصفح، ثم أدخل CaptchaAI في نفس المسار وضمن نفس السيناريو.