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

تصحيح أخطاء استدعاءات CAPTCHA API عبر Charles Proxy

حين يرفض موقع مستهدف توكن reCAPTCHA أو يعلق الاستطلاع الدوري دون نتيجة، يكون السؤال الأول: ما الذي أرسله كودي فعلاً، وما الذي عاد إليه؟ يجيب Charles Proxy عن ذلك بوضعه بين تطبيقك وخوادم CaptchaAI، فيعرض كل طلب واستجابة ووقت تنفيذ بصورته الخام. في هذا الدليل تضبط Charles لاعتراض حركة CaptchaAI، ثم تقرأ استدعاءات in.php وres.php لتحدّد سبب الخطأ في دقائق بدل التخمين.


الإعداد والتهيئة

1. تثبيت Charles Proxy

نزّل الأداة من charlesproxy.com، وهي متوفرة على Windows وmacOS وLinux.

2. توجيه كودك عبر Charles

يعمل Charles على localhost:8888 افتراضياً، فوجّه مكتبة الطلبات إلى هذا المنفذ:

Python:

import requests

proxies = {
    "http": "http://localhost:8888",
    "https": "http://localhost:8888",
}

# Disable SSL verification for Charles (development only)
resp = requests.post(
    "https://ocr.captchaai.com/in.php",
    data={"key": "YOUR_API_KEY", "method": "userrecaptcha", "json": "1"},
    proxies=proxies,
    verify=False,
)

Node.js:

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

const agent = new HttpsProxyAgent('http://localhost:8888');

const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: { key: 'YOUR_API_KEY', method: 'userrecaptcha', json: 1 },
  httpsAgent: agent,
});

3. تفعيل فحص SSL

لفحص حركة HTTPS المشفّرة لدى CaptchaAI اتبع الآتي:

  1. ProxySSL Proxying SettingsAdd
  2. المضيف: ocr.captchaai.com، المنفذ: 443
  3. HelpSSL ProxyingInstall Charles Root Certificate
  4. امنح الشهادة الثقة داخل مخزن شهادات نظام التشغيل لديك

تشخيص الأخطاء الشائعة

الخطأ: ERROR_WRONG_GOOGLEKEY

في Charles، افتح جسم طلب الإرسال وابحث عن حقل googlekey:

# What Charles shows:
key=YOUR_API_KEY&method=userrecaptcha&googlekey=&pageurl=https://example.com&json=1
                                      ^^^^^^^^ empty!

الإصلاح: فشل استخراج مفتاح الموقع في مرحلة سابقة، فراجع منطق الاستخراج لديك.

مثال من الواقع: يؤتمت مهندس QA في متجر إلكتروني خليجي اختبار نموذج تسجيل محمي بـ reCAPTCHA v2، فتنجح الطلبات محلياً وتفشل على خادم الاختبار. بفتح Charles على الخادم يتّضح أن حقل googlekey يصل فارغاً — فالخلل ليس في CaptchaAI بل في سكربت الاستخراج الذي يقرأ المفتاح قبل اكتمال تحميل الصفحة في متصفح بلا واجهة.

الخطأ: انتهاء المهلة دون حل

استعن بعرض Sequence في Charles لقراءة التوقيت:

POST /in.php     → 234ms ✓
GET  /res.php    → 189ms (CAPCHA_NOT_READY)
GET  /res.php    → 201ms (CAPCHA_NOT_READY)
GET  /res.php    → 195ms (CAPCHA_NOT_READY)
... 23 more ...
GET  /res.php    → 188ms (CAPCHA_NOT_READY)  ← never resolves

إذا ظل الطلب دون حل مهما طال الاستطلاع، فتحقق من صحة مفتاح الموقع وعنوان URL المرسلين.

الخطأ: رفض الموقع المستهدف للتوكن

قارن ما أعاده CaptchaAI بما تحقنه فعلاً في الموقع:

  1. في Charles، ابحث عن استجابة /res.php التي تحمل status: 1
  2. انسخ التوكن الكامل من حقل request
  3. حدّد الطلب اللاحق الموجَّه إلى الموقع المستهدف
  4. تأكّد من وجود التوكن في جسم النموذج تحت الاسم g-recaptcha-response

مرجع سريع: ماذا تفحص في كل استدعاء

طلب الإرسال: POST /in.php

اضغط في Charles على الطلب الموجَّه إلى /in.php، وراجع علامات التبويب الأربع:

علامة التبويب ما الذي تتحقق منه
Request → Headers صحّة قيمة Content-Type
Request → Body وجود كل المعاملات المطلوبة
Response → Body ظهور {"status":1,"request":"TASK_ID"} عند النجاح
Timing مدة الطلب (يُفترض أن تقل عن ثانية واحدة)

وأكثر مشكلات الإرسال تكراراً تظهر هكذا:

ما يظهره Charles الدلالة
معامل method مفقود ERROR_BAD_PARAMETERS
قيمة Content-Type خاطئة لا تُحلَّل المعاملات
حقل googlekey فارغ ERROR_WRONG_GOOGLEKEY
جسم JSON مُشوَّه استخدم بيانات النموذج (form data) لا جسم JSON

طلب الاستطلاع: GET /res.php

وفي طلبات الاستطلاع الدوري تفحص ثلاثة عناصر:

العنصر القيمة المتوقعة
المعاملات key، action=get، id=TASK_ID
الاستجابة CAPCHA_NOT_READY (تابع الاستطلاع) أو {"status":1,"request":"TOKEN"}
التوقيت يلي كل استطلاع فترة انتظار (sleep) تحدّدها أنت

أدوات Charles التي تسرّع التصحيح

الاستبدال المحلي (Map Local)

استبدل استجابات الخدمة بملفات محلية أثناء الاختبار:

  1. ToolsMap LocalAdd
  2. وجّه https://ocr.captchaai.com/res.php إلى ملف JSON محلي
  3. أنشئ الملف mock_response.json:
{"status": 1, "request": "mock_token_for_testing"}

بهذا تختبر منطق الحقن دون إرسال طلبات فعلية أو إشغال Thread بحل حقيقي.

محاكاة الشبكات البطيئة (Throttle)

لاختبار سلوك كودك على اتصال ضعيف، فعّل Throttle من Proxy → Throttle Settings، واضبط الإعداد المسبق على سرعة 3G أو مستوى EDGE، وتحقق من تعامله مع الاستجابات البطيئة والمهل.

نقاط التوقف (Breakpoints)

عيّن نقطة توقف على /in.php لفحص الطلب وتعديله قبل إرساله:

  1. ProxyBreakpoint SettingsAdd
  2. المضيف: ocr.captchaai.com، المسار: /in.php
  3. فعّل خيار Request
  4. سيتوقف كودك قبل الإرسال لتعدّل المعاملات يدوياً

إعادة إرسال الطلب (Repeat)

انقر بالزر الأيمن على أي طلب واختر Repeat لإعادة إرساله، وهو مفيد لاختبار الاستطلاع دون إعادة تشغيل السكربت كاملاً.


حلول لمشكلات الإعداد الشائعة

المشكلة السبب الحل
أخطاء SSL في الكود شهادة Charles غير موثوقة ثبّت شهادة جذر Charles واستخدم verify=False أثناء التطوير
لا تظهر أي طلبات الكود لا يمر عبر الوكيل اضبط الوكيل في إعداد requests/axios
استجابة HTTPS مشوّشة فحص SSL غير مُفعّل أضف ocr.captchaai.com إلى إعدادات SSL Proxying
Charles يبطئ الطلبات نقاط التوقف مفعّلة عطّل نقاط التوقف عند عدم الحاجة إليها

بدائل Charles Proxy

الأداة المنصة HTTPS التكلفة
Charles Proxy Win/Mac/Linux يتطلب تثبيت شهادة مدفوعة (تجربة مجانية)
mitmproxy Win/Mac/Linux يتطلب تثبيت شهادة مجانية
Fiddler Windows فك تشفير HTTPS مدمج مجانية
Proxyman macOS إعداد HTTPS بنقرة واحدة فريميوم

إعداد mitmproxy السريع

# Install
pip install mitmproxy

# Run
mitmproxy --listen-port 8080

# Configure Python
proxies = {"https": "http://localhost:8080"}

الأسئلة الشائعة

كيف أعترض حركة HTTPS المشفّرة الخاصة بـ CaptchaAI؟

أضف ocr.captchaai.com:443 إلى إعدادات SSL Proxying وثبّت شهادة الجذر في نظامك، فتظهر أجسام الطلبات والاستجابات بنص واضح.

ما الفرق بين Charles وmitmproxy لهذه المهمة؟

كلاهما يعترض HTTPS بعد تثبيت شهادة. يتميّز Charles بواجهة رسومية غنية (نقاط التوقف وMap Local ومحاكاة السرعة) وهو مدفوع بتجربة مجانية، بينما mitmproxy مجاني ويعمل من الطرفية.

كيف أختبر كود حقن التوكن دون إرسال طلبات فعلية؟

استخدم ميزة Map Local لتوجيه res.php إلى ملف JSON محلي يحمل توكناً وهمياً، فتتحقق من منطق الحقن دون انتظار حل حقيقي.

هل يؤثر توجيه الطلبات عبر Charles في عملية الحل؟

لا. تمرّ طلباتك إلى CaptchaAI بشفافية وتتعامل الخدمة معها كأي طلب مباشر، فوجود Charles في المسار لا يغيّر نتيجة الحل.


صحّح تكاملك مع CaptchaAI وحسّنه

أنشئ مفتاح الـ API من captchaai.com وابدأ بمراقبة استدعاءاتك الحقيقية.


أدلة ذات صلة

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