الدروس التطبيقية

استخدام Fiddler لفحص حركة مرور CaptchaAI API

يعمل Fiddler كخادم وسيط محلي يلتقط كل طلب واستجابة يمرّان بين الكود الخاص بك وواجهة CaptchaAI API، فتقرأ الحمولة الصافية والعناوين ورمز الحالة والتوقيت الدقيق كما تصل إلى الخادم تماماً. حين يتوقف حل الكابتشا دون سبب واضح في السجلات، يكفي تفعيل فك تشفير HTTPS وتوجيه طلباتك عبر البروكسي لترى أين ينكسر المسار: قبل الإرسال، أثناء الاستطلاع، أو عند حقن الرمز في الموقع المستهدف.

لماذا يكشف Fiddler ما تخفيه السجلات

حين تكون رسائل الخطأ مقتضبة أو غامضة، يمنحك اعتراض الحركة الفعلية الصورة الكاملة التي لا يظهرها سجلّ التطبيق:

السيناريو ما يظهره Fiddler
تُرجع واجهة API أخطاءً لكن سجلاتك مقتضبة نص الطلب الكامل والعناوين والاستجابة
تبدو طلبات الحل معلّقة بلا نتيجة هل وصل الطلب إلى الخادم أم انتهت مهلته
يبدو الرمز غير صالح عند حقنه المحتوى الفعلي للرمز وأي مشكلات في الترميز
أعطال مرتبطة بالخادم الوسيط هل تُوجَّه الطلبات عبر البروكسي المتوقع
مشكلات تحديد معدل الطلبات توقيت الطلبات وأنماط استجابة 429

تهيئة Fiddler لاعتراض حركة HTTPS

يعترض Fiddler حركة HTTPS بصفته خادماً وسيطاً محلياً؛ لرؤية حمولات CaptchaAI API فعّل فك التشفير أولاً ثم وجّه الكود إلى البروكسي.

الخطوة 1: فعّل فك تشفير HTTPS وثبّت الشهادة

Fiddler Everywhere:

  1. افتح الإعدادات ثم HTTPS
  2. فعّل خيار "Capture HTTPS traffic"
  3. ثبّت شهادة الجذر الخاصة بـ Fiddler عند طلبها
  4. امنح الشهادة الثقة في مخزن شهادات نظام التشغيل لديك

Fiddler Classic (على Windows):

  1. Tools ثم Options ثم HTTPS
  2. فعّل "Decrypt HTTPS traffic"
  3. انقر "Actions" ثم "Trust Root Certificate"

الخطوة 2: وجّه الكود عبر بروكسي Fiddler

يستمع Fiddler على 127.0.0.1:8866 في Fiddler Everywhere، وعلى 127.0.0.1:8888 في Fiddler Classic. اضبط طلباتك على البروكسي المناسب:

Python (مكتبة requests):

import requests

proxies = {
    "http": "http://127.0.0.1:8866",
    "https": "http://127.0.0.1:8866",
}

# Submit CAPTCHA task through Fiddler
response = requests.post(
    "https://ocr.captchaai.com/in.php",
    data={
        "key": "YOUR_API_KEY",
        "method": "userrecaptcha",
        "googlekey": "SITE_KEY",
        "pageurl": "https://example.com",
        "json": 1,
    },
    proxies=proxies,
    verify=False,  # Required for Fiddler's self-signed cert
)
print(response.json())

JavaScript (Node.js مع Axios):

const axios = require("axios");
const HttpsProxyAgent = require("https-proxy-agent");

const agent = new HttpsProxyAgent("http://127.0.0.1:8866");

async function submitTask() {
  const response = await axios.post(
    "https://ocr.captchaai.com/in.php",
    new URLSearchParams({
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: "SITE_KEY",
      pageurl: "https://example.com",
      json: 1,
    }),
    {
      httpsAgent: agent,
      proxy: false, // Disable axios default proxy handling
    }
  );
  console.log(response.data);
}

submitTask();

ملاحظة: يعطّل verify=False في Python التحقق من شهادة الاعتراض التي يستخدمها Fiddler. استخدمه أثناء التشخيص فقط، واحذفه في بيئة الإنتاج.

قراءة الطلب والاستجابة

إرسال المهمة (in.php)

عند التقاط إرسال مهمة، افحص هذه الحقول في Fiddler:

اللوحة ما يجب التحقق منه
العناوين يجب أن يكون Content-Type بقيمة application/x-www-form-urlencoded
نص الطلب تأكد من صحة key وmethod وgooglekey/sitekey وpageurl
نص الاستجابة يجب أن يعيد {"status":1,"request":"TASK_ID"} عند النجاح
رمز الحالة 200 موافق، 403 مشكلة في المفتاح، 429 تجاوز حدّ المعدل

استطلاع النتيجة (res.php)

أثناء الاستطلاع الدوري للنتيجة:

اللوحة ما يجب التحقق منه
نص الطلب key وaction=get وid=TASK_ID وjson=1
نص الاستجابة CAPCHA_NOT_READY أثناء المعالجة، و{"status":1,"request":"TOKEN"} عند النجاح
التوقيت افحص الفواصل بين الاستطلاعات — يجب ألا تقل عن 5 ثوانٍ

أخطاء شائعة تظهر في Fiddler

ما تراه الدلالة
نص الطلب يحمل googlekey فارغاً فشل استخراج مفتاح الموقع في مرحلة سابقة
{"status":0,"request":"ERROR_WRONG_USER_KEY"} مفتاح الـ API غير صالح
{"status":0,"request":"ERROR_ZERO_BALANCE"} لا يوجد رصيد في الحساب
{"status":0,"request":"ERROR_NO_SLOT_AVAILABLE"} الخادم مشغول — أعد المحاولة
لا توجد استجابة (مهلة) الشبكة أو البروكسي يحجب الاتصال
رمز الحالة 429 طلبات كثيرة جداً — خفّف وتيرة الاستطلاع

عزل طلبات CaptchaAI بالمرشحات

بعدما تعرف ما تبحث عنه، وفي جلسة مزدحمة، أضف مرشحاً يعرض طلبات CaptchaAI وحدها:

مرشحات Fiddler Everywhere

  1. افتح تبويب Filters
  2. أضف قاعدة: Host ثم contains ثم ocr.captchaai.com
  3. طبّق المرشح

مرشحات Fiddler Classic

  1. افتح تبويب Filters
  2. فعّل "Use Filters"
  3. من قسم "Hosts" اختر "Show only the following Hosts"
  4. أدخل ocr.captchaai.com

بعد ذلك تظهر طلبات CaptchaAI API فقط في قائمة الجلسات.

سيناريو عملي: تشخيص عطل خلف بروكسي سكني

لنفترض أنك تدير سكربت أتمتة من خادم في الرياض يعتمد على وكيل سكني لجمع بيانات عامة. يعمل المثال محلياً لكنه يفشل في الإنتاج برسالة أن الرمز غير صالح. بدل التخمين، وجّه طلبات الإنتاج عبر Fiddler لجلسة واحدة: عند فحص إرسال المهمة تجد حقل googlekey يصل فارغاً، أي أن استخراج مفتاح الموقع فشل قبل وصول الطلب إلى CaptchaAI، فالعطل في مرحلة جمع الصفحة لا في الخدمة نفسها.

وفي حالة مختلفة قد تكتشف أن الطلب لا يمرّ عبر الوكيل المتوقع أصلاً، فتظهر سمعة عنوان IP الخاطئة سبباً وراء الرفض. هذا التمييز المبكر بين عطل المنبع وعطل الخدمة يوفّر ساعات من التخمين.

تحليل زمن الاستجابة

يعرض عرض Timeline مدة كل مرحلة من الطلب، فتحدد أين يضيع الوقت بالضبط:

المرحلة القيمة السليمة مؤشر المشكلة
بحث DNS < 50 مللي ثانية > 500 مللي ثانية = مشكلة DNS
اتصال TCP < 100 مللي ثانية > 1000 مللي ثانية = مشكلة شبكة
مصافحة TLS < 200 مللي ثانية > 1000 مللي ثانية = مشكلة شهادة
استجابة الخادم (in.php) < 500 مللي ثانية > 2000 مللي ثانية = ازدحام الخادم
استجابة الخادم (res.php) < 200 مللي ثانية > 1000 مللي ثانية = غير معتاد — تحقق من الحالة

بناء طلبات اختبار من Composer

استخدم أداة Composer داخل Fiddler لبناء طلبات CaptchaAI من الصفر دون كتابة كود:

إرسال المهمة:

POST https://ocr.captchaai.com/in.php
Content-Type: application/x-www-form-urlencoded

key=YOUR_API_KEY&method=userrecaptcha&googlekey=SITE_KEY&pageurl=https://example.com&json=1

استطلاع النتيجة:

GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1

وهي أسرع من كتابة كود كامل حين تريد فقط التأكد من أن الـ API يستجيب.

تعديل الطلبات عبر نقاط التوقف

توقف نقاط التوقف الطلب قبل إرساله، فتعدّل معلماته وتختبر القيم مباشرة دون لمس الكود:

ضبط نقطة توقف

Fiddler Everywhere:

  1. Rules ثم Add Rule
  2. المطابقة: أن يحتوي عنوان URL على ocr.captchaai.com/in.php
  3. الإجراء: "Pause before sending"

Fiddler Classic:

  1. Rules ثم Automatic Breakpoints ثم Before Requests
  2. أو اكتب bpu ocr.captchaai.com في شريط QuickExec

ماذا تفعل عند التوقف

عند توقّف الطلب:

  1. افحص نص الطلب — تأكد من صحة كل المعلمات
  2. عدّل المعلمات — غيّر method أو googlekey أو pageurl لتجربة قيم مختلفة
  3. استأنف — انقر "Run to Completion" لإرسال الطلب المعدّل
  4. تحقق من الاستجابة — لتعرف إن أصلح تغييرك المشكلة

تفيد هذه الطريقة في معرفة ما إذا كانت قيمة معلمة بعينها سبب الفشل، دون تعديل الكود.

إعادة إرسال الطلبات الفاشلة

عند فشل طلب، أعِد إرساله من Fiddler مباشرة:

  1. انقر بزر الفأرة الأيمن على الجلسة الفاشلة
  2. اختر Replay ثم Reissue Requests
  3. يُرسَل الطلب نفسه برؤوس ونص متطابقين

وللإعادة مع التعديل:

  1. انقر بالزر الأيمن ثم Edit in Composer
  2. عدّل المعلمات
  3. انقر Execute

هكذا تختبر الإصلاحات دون إعادة تشغيل تطبيقك.

تصدير الجلسات لدعم CaptchaAI

إذا احتجت مشاركة بيانات التشخيص مع فريق دعم CaptchaAI:

  1. حدّد الجلسات المعنية في Fiddler
  2. File ثم Export Sessions ثم Selected Sessions
  3. اختر تنسيق HTTPArchive (.har)
  4. احذف مفتاح الـ API الخاص بك من الملف المُصدَّر قبل مشاركته
Find and replace your actual API key with "REDACTED" in the .har file

معالجة المشكلات الشائعة

المشكلة السبب الحل
Fiddler لا يعرض أي حركة الكود لا يمرّ عبر بروكسي Fiddler اضبط البروكسي على 127.0.0.1:8866 (Everywhere) أو 8888 (Classic)
أخطاء في شهادة SSL شهادة جذر Fiddler غير موثوقة أعد تثبيت شهادة Fiddler وأضفها إلى الجذور الموثوقة
نص الاستجابة يظهر مشوّهاً الاستجابة مضغوطة فعّل زر "Decode" في الشريط، أو Rules ثم Remove All Encodings
نقاط التوقف لا تعمل عدم تطابق المرشح أو القاعدة تأكد من أن نمط URL يطابق ocr.captchaai.com تماماً
تظهر الحركة لكن النص فارغ عدم تطابق Content-Length أو استجابة متدفقة انقر الجلسة وانتظر اكتمال تحميل الاستجابة

أسئلة شائعة

هل يبطئ Fiddler حل الكابتشا فعلياً؟

لا يُذكر. يضيف Fiddler نحو 1–5 مللي ثانية لكل طلب بسبب مروره عبر البروكسي، وهو فارق لا يُقارن بزمن حل الكابتشا الممتد عادة من 10 إلى 60 ثانية. انتبه فقط إلى أن الطوابع الزمنية في Fiddler تعكس لحظة استقباله البيانات، لا لحظة إرسال الكود لها.

هل يصلح Fiddler بديلاً عن أدوات مثل Charles أو mitmproxy؟

نعم في أغلب حالات تشخيص CaptchaAI API. الأدوات الثلاث تعترض حركة HTTPS وتعرض الحمولة، لكن Fiddler يتميّز بأدوات Composer ونقاط التوقف وإعادة الإرسال ضمن واجهة رسومية مريحة على Windows. وعلى macOS أو Linux يبقى Fiddler Everywhere أو mitmproxy خياراً عملياً.

لماذا يظهر نص الاستجابة مضغوطاً أو غير مقروء؟

لأن الخادم يعيد استجابة مضغوطة (gzip مثلاً). فعّل فك الترميز من زر Decode في شريط الأدوات، أو من Rules ثم Remove All Encodings، لتقرأ حقل request وبقية الحقول بوضوح.

كيف أتجنّب تسريب مفتاح الـ API عند مشاركة الجلسات؟

يظهر مفتاحك داخل نص الطلب في كل جلسة، لذا لا تشارك ملف .har أو لقطات Fiddler قبل استبدال المفتاح الفعلي بقيمة مثل REDACTED. ومن الأفضل تدوير المفاتيح دورياً حتى يبقى أي مفتاح مكشوف قصير العمر.


الخطوات التالية

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.