لماذا يجب ألا تسلم حسابك على جوجل بالكامل لوكلاء المتصفح
يُعد وكلاء المتصفح مثل Cursor أو GrokBot خياراً جذاباً للمطورين الذين يعملون بمفردهم. فهي تتولى تلقائياً مهام فحص لوحات المعلومات الخارجية المزعجة أو مراقبة المنافسين.
تكمن المشكلة عندما يتم ربط هذه الأدوات مباشرة بجلسة المتصفح الخاصة بالجهاز المضيف. فعند التعرض لحقن غير مباشر للأوامر (Indirect Prompt Injection) أثناء كشط صفحة ويب غير موثوقة، ستتسرب ملفات تعريف الارتباط الخاصة بالجلسة (Session Cookies) ورموز المصادقة المتباينة في التخزين المحلي إلى الخوادم الخارجية بالكامل. وإذا بدأ الوكيل في تكرار نفس الطلب بلا نهاية لعدم عثوره على عناصر DOM، ستجد في صباح اليوم التالي فاتورة API بمئات الدولارات بانتظارك.
يجب التخلي عن توقع أن تقوم الأوامر النصية الطبيعية (Natural Language Prompts) بمعالجة الاستثناءات تلقائياً. من الأفضل بكثير عزل بيئة التشغيل (Runtime) فعلياً ووضع أدوات تحكم آمنة لمنع تسريب الأموال والوقت.
منع تلوث الجلسة و سرقة بيانات الاعتماد
يجب فصل ملف تعريف المتصفح الذي يستخدمه الوكيل تماماً عن البيئة التي تستخدمها لأغراض العمل. بدءاً من إصدار Chromium 136، أصبحت معايير العزل أكثر صارمة، مثل حظر الاتصالات عن بُعد للديبرغ بتوجيه إلى دليل بيانات المستخدم الأساسي (--user-data-dir).
يجب إيقاف تشغيل نظام بيانات الاعتماد الفرعي لنظام التشغيل، وتشغيل المتصفح في دليل مستقل:
`bash
google-chrome
--user-data-dir="/opt/grokbot/isolated_profiles/worker_01"
--profile-directory="AgentContext"
--disable-save-password-bubble
--disable-fill-on-account-select
--credentials_enable_service=false
--no-first-run
--no-default-browser-check
`
كما يجب مراجعة صلاحيات الحساب. انتقل في وحدة تحكم إدارة جوجل (admin.google.com) إلى الأمان > الأمان والوصول والتحكم في البيانات > عناصر تحكم جلسة جوجل (Security > Access and data control > Google session controls). أنشئ وحدة تنظيمية فرعية مخصصة للوكيل (Agent-Sandboxed-OU)، وقم بتقليص مدة جلسة الويب الافتراضية من 14 يوماً إلى 24 ساعة (1440 دقيقة) واحفظ الإعدادات.
حتى عند التحقق من لوحات معلومات الدفع، يُعتبر استخدام مفتاح سري ذو صلاحيات إدارة كاملة (sk_live_...) أمراً خطيرياً. يجب استخراج وتمرير مفتاح مقيد (rk_live_...) يحتوي فقط على صلاحيات Charges: Read وSubscriptions: Read.
| الخدمة المرتبطة |
الصلاحيات المسموحة |
الصلاحيات الممنوعة |
طريقة الحقن |
المخاطر التي يتم منعها |
| Stripe |
Charges: Read, Subscriptions: Read |
Charges: Write, Payouts: Read/Write |
rk_live_... (متغيرات البيئة) |
استرجاع الأموال غير المصرح به وتغيير حساب التسوية |
| Google Workspace |
gmail.readonly, drive.metadata.readonly |
gmail.send, gmail.modify |
Scoped OAuth 2.0 Access Token |
إرسال رسائل التصيد الاحتيالي وتعديل الملفات |
| Vercel / AWS |
Read-only Monitoring, Logs View |
Deployments, Secrets Edit |
Scoped Token / IAM Role |
الإنهاء العشوائي لحالات التشغيل |
بعد الانتهاء من الإعدادات، اطلب من الوكيل الانتقال إلى عنوان إدارة حساب تسوية Stripe ([https://dashboard.stripe.com/settings/payouts](https://dashboard.stripe.com/settings/payouts)). إذا ظهرت نافذة إعادة مصادقة على شاشة المتصفح أو ظهر خطأ HTTP 403، فهذا يعني أن عملية العزل تمت بشكل صحيح.
إيقاف الحلقات اللانهائية واستنزاف رصيد الـ API
إذا فشل وكيل المتصفح في العثور على زر واحد، فسيبدأ في تدوير الأوامر قليلاً والدخول في حلقة تبادل لا نهائية (Ping-pong loop). في اللحظة التي يستحوذ فيها على سياق رموز 128k ويكرر المحاولة عشرات المرات، ترتفع تكاليف الرموز بشكل مخيف. لا يكفي كتابة جملة "توقف إذا فشلت" في الأوامر، فغالباً ما يتجاهل النموذج هذا التوجيه.
يجب وضع قاطع دائرة (Circuit Breaker) يقوم بإنهاء العملية قسراً على مستوى الكود. أولاً، قم بتضمين حد أقصى للمحاولات في ملف تكوين التنسيق (.cursorrules أو إعدادات بيئة GrokBot).
`text
AGENT ORCHESTRATION CONSTRAINTS
Execution Thresholds:
MAX_RETRIES_PER_TASK = 2
PER_STEP_TIMEOUT_SECONDS = 300
DAILY_TOKEN_BUDGET_HARD_CAP_USD = 5.00
Deterministic Termination Rules:
إذا تم تسجيل فشل نفس محدد الـ DOM مرتين متتاليتين، يتم إنهاء العملية فوراً.
لا تقم بمحاولة إعادة المحاولة للمرة الثالثة بتغيير التعبير.
إذا وصلت تكلفة الجلسة الواحدة إلى 5.00 دولار، توقف عن جميع المهام فوراً وأرجع رمز إنهاء.
`
راقب حالات الفشل المتتالية باستخدام سكريبت بايثون، وعند الوصول إلى الحد الأقصى، أرسل السجلات عبر تيليگرام ثم قم بإنهاء العملية فوراً.
`python
import os
import sys
import logging
import requests
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
class AgentCircuitBreaker:
def init(self, max_consecutive_failures=2):
self.consecutive_failures = 0
self.max_failures = max_consecutive_failures
def record_failure(self, task_name: str, error_trace: str, current_url: str):
self.consecutive_failures += 1
logging.warning(f"Task '{task_name}' failed ({self.consecutive_failures}/{self.max_failures})")
if self.consecutive_failures >= self.max_failures:
self.trigger_kill_switch(task_name, error_trace, current_url)
def record_success(self):
self.consecutive_failures = 0
def trigger_kill_switch(self, task_name: str, error_trace: str, current_url: str):
message = (
f"[CIRCUIT BREAKER TRIGGERED]\n"
f"Task: {task_name}\n"
f"URL: {current_url}\n"
f"Cause: Consecutive Failures >= {self.max_failures}\n"
f"Trace: {error_trace[:400]}"
)
api_url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
payload = {"chat_id": TELEGRAM_CHAT_ID, "text": message}
try:
requests.post(api_url, json=payload, timeout=5.0)
except Exception as e:
logging.error(f"Failed to post webhook: {e}")
sys.exit(1)
`
قم بتقييد عدد العناصر المراد فحصها لكل مثيل وكيل بحد أقصى 50 عنصراً. عند الوصول إلى 50 عنصراً، يتم التخلص تماماً من سياق المتصفح (context.close()) وإعادة تشغيله. ترك فترة راحة لمدة 60 ثانية تقريباً بين المهام المجمعة يساعد أيضاً في تجنب تجاوز حد الطلبات في الثانية لـ Stripe (25 طلباً/ثانية) وبالتالي تجنب قفل الحساب.
للتحقق من السلوك، قم بإرسال مهمة اختبارية تطلب النقر على محدد DOM غير موجود (#phantom-settlement-modal). إذا توقف فوراً بعد محاولة واحدة (إجمالي محاولتين) ووصل إشعار تيليگرام، سيظل الإنفاق اليومي أقل من 5 دولارات.
التعامل مع تأخير عملية التميه (Hydration) في تطبيقات SPA
لوحات المعلومات المصنوعة بـ React أو Next.js تقوم بفك حزم الجافاسكريبت والقيام بعملية التميه (Hydration) حتى بعد تحميل ملفات HTML. إذا دخل الوكيل مباشرة بمجرد رؤية حدث window.onload، فإنه يخطئ في اعتبار أداة التحميل الهيكلية (Skeleton loader) بيانات حقيقية ويصدر أخطاء. ومع ذلك، فإن وضع time.sleep(5) بشكل عشوائي يعد إهداراً كبيراً للوقت.
يجب تحديد عناصر تثبيت صريحة (Explicit anchors) وتنفيذ دالة استطلاع (Polling function).
`python
import logging
from playwright.sync_api import Page, TimeoutError
def wait_for_dashboard_hydration(
page: Page,
anchor_selector: str,
max_attempts: int = 3,
interval_ms: int = 3000
) -> bool:
for attempt in range(1, max_attempts + 1):
try:
page.wait_for_selector(anchor_selector, state="visible", timeout=interval_ms)
if not page.locator(".dashboard-skeleton-loader").is_visible():
return True
except TimeoutError:
logging.info(f"Hydration waiting: Attempt {attempt}/{max_attempts}")
return False
`
قم بسحب نص عقدة الهدف عبر شجرة إمكانية الوصول (Total Volume: $12,450.00)، وقم بتمرير لقطة الشاشة الحالية للنموذج متعدد الوسائط لمقارنتها بالأرقام الموجودة في واجهة البطاقة. إذا كانت القيمتان مختلفتين، فاعتبر أن العرض لم ينته بعد وتحقق مرة أخرى بعد 3 ثوانٍ.
يمكنك إنشاء بيئة تأخير شبكي افتراضية باستخدام بروتوكول أدوات مطوري كروم (CDP) لاختبار هذه المنطقية.
`python
cdp_session = page.context.new_cdp_session(page)
cdp_session.send("Network.emulateNetworkConditions", {
"offline": False,
"latency": 500,
"downloadThroughput": 400 * 1024 / 8,
"uploadThroughput": 400 * 1024 / 8
})
`
يمكنك التحقق مما إذا كان الوكيل يستمر في الانتظار لمدة 3 مرات (إجمالي 9 ثوانٍ) وجمع البيانات بالكامل دون إطلاق خطأ مبكر حتى مع تأخير RTT بمقدار 500ms وتنزيل بـ 400kbps.
مراجعة سجلات الصباح في 3 دقائق
لا يوجد ما هو أكثر إرهاقاً من البحث بين آلاف الأسطر من السجلات النصية عندما يتوقف الوكيل عن العمل طوال الليل. إذا ضاعت ثلاث أو أربع ساعات كل أسبوع في معالجة أعمال المراقبة، فإن الأتمتة تفقد معناها.
قم بضبط جميع الوكلاء الفرعيين بحيث يرسلون ثلاثة أشياء فقط عند الانتهاء من أي إجراء: الطابع الزمني (timestamp)، الرابط (url)، والإجراء (action) في ملف JSONL أحادي السطر.
`json
{"timestamp": "2026-03-31T08:15:02Z", "url": "https://dashboard.stripe.com/payments", "action": "CLICK", "target": "button[data-testid='filter']", "status": "SUCCESS"}
{"timestamp": "2026-03-31T08:15:05Z", "url": "https://dashboard.stripe.com/payments", "action": "WAIT_FOR", "target": "div[data-testid='metrics-card']", "status": "RETRY_1", "error": "Timeout 3000ms"}
{"timestamp": "2026-03-31T08:15:08Z", "url": "https://dashboard.stripe.com/payments", "action": "EXTRACT_TEXT", "target": "div[data-testid='metrics-card']", "status": "FAIL", "screenshot_path": "artifacts/errors/metrics_fail.png"}
`
عند انتهاء العمل، يقوم الوكيل الرئيسي باختيار العناصر التي تحمل علامة FAIL فقط واستخراج ملخص بصيغة ماركداون (daily_failure_digest.md).
`markdown
Daily Agent Failure Digest (2026-03-31)
Summary Metrics
Total Jobs: 50 | Succeeded: 48 | Failed: 2 | Total Token Cost: $0.84
Critical Failure Cases
Case 1: Stripe Payout Audit
- Timestamp: 2026-03-31T08:22:11Z
- URL: https://dashboard.stripe.com/payouts
- Last Action: CLICK -> button#export-csv
- Error: DOM_ELEMENT_NOT_FOUND
- Artifact: artifacts/errors/payouts_20260331_fail.png
- Note: يبدو أن محدد الزر قد تغير إلى #export-csv-v2.
`
عند قدومك للعمل، تستغرق دقيقة واحدة لفتح الملخص والتحقق من عدد حالات الفشل، ودقيقة لفتح لقطة الشاشة للتحقق من المحدد المتغير، ودقيقة للنقر على مربع اختيار الموافقة على التعديل. لا داعي للمصارعة مع السجلات كل صباح.
ليس من الضروري استخدام وكلاء المتصفح لكل مهمة
وكلاء المتصفح هم في النهاية وسيلة للتعامل مع البيئات غير المنظمة. ليس هناك سبب لنشر وكيل متصفح في مكان تتوفر فيه واجهات برمجة تطبيقات رسمية (APIs) جاهزة بشكل جيد.
| التبويب |
متصفح سحابي مشترك |
حاوية معزولة عديمة الحالة (Stateless) |
واجهة برمجة تطبيقات رسمية REST API |
| الإعداد الأولي |
التشغيل المباشر بإدخال الأوامر |
يتطلب عزل صور دوكر (Docker) والشبكة |
يتطلب مصادقة نقطة النهاية والربط |
| مستوى العزل الأمني |
سياسات ملفات تعريف الارتباط والجلسة لـ Chromium ضرورية |
تدمير الحاوية عند اكتمال المهمة |
لا توجد مخاطر سرقة ملفات تعريف ارتباط المتصفح |
| تكلفة التنفيذ |
مرتفعة بسبب الاستدلال المرئي وتسلسل DOM |
تولد تكاليف استضافة وتكاليف استدلال LLM |
منخفضة جداً لأنها تقتصر على تحليل JSON |
| مرونة تغيير الواجهة |
قابلة للتجاوز بناءً على المعلومات المرئية |
يتطلب نشر كود تعديل المحدد |
لا تأثر نهائياً بتغييرات واجهة المستخدم |
| المهام المناسبة |
فحص اللوحات الخارجية التي لا تملك API |
الويب سكرابينغ واسع النطاق |
التحقق من دفعات Stripe، تغييرات قاعدة البيانات |
تعتبر مهام الدفع أو تغيير الحسابات التي تنطوي على أموال آمنة فقط عند استخدام واجهات برمجة التطبيقات الرسمية (APIs). من ناحية أخرى، فإن المجالات التي كانت تعتمد على اليد البشرية مثل التحقق من لوحات إدارة الشركاء التي لا توفر واجهات برمجة تطبيقات أو مراقبة الشاشات هي المكان الذي يثبت فيه وكيل المتصفح جدارته. من خلال تطبيق العزل المادي للمتصفح وقواطع الدائرة، يمكنك تشغيل الوكلاء طوال الليل وأنت مرتاح البال.