معظم أدوات استخبارات المصادر المفتوحة (OSINT) تتقادم بسرعة: تتغير صفحات الويب، تنتقل المواقع إلى نقاط نهاية جديدة، تظهر اختبارات Captcha أقوى، ثم تتعطل الأداة بعد عام أو عامين. يُعد Maigret استثناءً عمليًا: يعمل منذ سنوات، يدعم أكثر من 3000 موقع، ويوفر حزمة بايثون، وبوت تيليجرام، وواجهة ويب. الأهم للمهندسين أن بنيته الداخلية تقدم نموذجًا جيدًا لبناء ماسح لا ينهار عند تغير المواقع.
هذا الدليل موجه للمهندسين. سنفكك ما يفعله Maigret، متى يكون استخدامه مشروعًا، كيف تعمل قاعدة توقيعات المواقع، وكيف يمكن نقل الأنماط نفسها إلى اختبار واجهات برمجة التطبيقات باستخدام Apidog.
إذا لم تكن قد قرأته بعد، فإن منشورنا اختبار واجهات برمجة التطبيقات بدون Postman في عام 2026 يغطي أفكار مطابقة الأنماط واكتشاف الانحراف في سياق اختبار API.
خلاصة القول TL;DR
- يستخدم Maigret اسم مستخدم واحدًا للبحث عن حسابات عامة عبر أكثر من 3000 موقع.
- يعتمد على قاعدة بيانات توقيعات للمواقع، لا على منطق مبرمج يدويًا لكل حالة.
- يميز بين “الحساب موجود” و“الحساب غير موجود” باستخدام عدة إشارات: نصوص وجود، نصوص غياب، رؤوس، وأنماط URL.
- الاستخدام المشروع يشمل الصحافة الاستقصائية، استعادة الحسابات، البحث عن المفقودين بموافقة، مراقبة إساءة استخدام العلامة التجارية، واختبارات الاختراق المرخصة.
- استخدامه على أشخاص دون موافقة أو أساس قانوني قد يتحول إلى تحرش أو مطاردة رقمية.
- أنماطه المعمارية مفيدة جدًا لاختبار API: توقيعات، تأكيدات متعددة الإشارات، اختبارات انحدار، واكتشاف انحراف.
- يمكنك تطبيق الفكرة نفسها في Apidog عبر تعريف توقعات دقيقة لكل endpoint وتشغيلها دوريًا.
ما هو Maigret وما ليس هو
Maigret أداة بايثون مرخصة بموجب MIT ويصونها soxoj. يصفها README بأنها أداة “لجمع ملف كامل عن شخص ما باستخدام اسم المستخدم من أكثر من 3000 موقع”.
الاستخدام الأساسي:
pip install maigret
maigret username
يشغّل الأمر بحثًا عبر المواقع الموجودة في قاعدة البيانات، ثم ينتج تقريرًا بالحسابات العامة التي تم العثور عليها.
ثلاث نقاط مهمة:
Maigret يستخدم البيانات العامة فقط.
لا يحتاج إلى تسجيل دخول، ولا مفاتيح API، ولا بيانات اعتماد. إذا كان الملف الشخصي ظاهرًا للزوار المجهولين، يمكن للأداة قراءته.له استخدامات مشروعة.
يستخدمه صحفيون، متطوعو بحث عن مفقودين، فرق مكافحة احتيال، فرق حماية علامة تجارية، وفرق red-team ضمن نطاق مصرح به.يمكن إساءة استخدامه.
تشغيله على فرد خاص دون موافقة أو مبرر قانوني قد يخالف قوانين الملاحقة والتحرش في عدة ولايات قضائية.
سنركز هنا على الهندسة وأنماط الاختبار القابلة لإعادة الاستخدام، لا على استهداف الأشخاص.
التثبيت والتشغيل السريع
للتجربة محليًا:
python --version
pip install maigret
maigret example_user
لتشغيل فحص أوسع يشمل جميع المواقع المتاحة:
maigret example_user -a
لتحديث قاعدة بيانات المواقع قبل تشغيل جاد:
maigret --update
maigret example_user -a
لإخراج تقرير بصيغة HTML أو JSON:
maigret example_user --html
maigret example_user --json
الفكرة الهندسية هنا ليست الأمر نفسه، بل طريقة تصميم النظام: قاعدة توقيعات قابلة للتحديث، محرك فحص عام، ومخرجات قابلة للتحليل.
قاعدة بيانات توقيعات المواقع
أقوى فكرة في Maigret هي أنه لا يكتب منطقًا خاصًا لكل موقع داخل الكود. بدلًا من ذلك، يصف كل موقع داخل قاعدة بيانات JSON.
كل توقيع يجيب عن أسئلة مثل:
- ما رابط الملف الشخصي؟
- كيف يبدو الرد عندما يكون الحساب موجودًا؟
- كيف يبدو الرد عندما لا يكون الحساب موجودًا؟
- ما النصوص التي تؤكد الوجود؟
- ما النصوص التي تؤكد الغياب؟
- هل يحتاج الموقع إلى رؤوس HTTP خاصة؟
- هل يطبق الموقع Captcha أو rate limit؟
- ما البيانات العامة التي يمكن استخراجها من الصفحة؟
مثال مبسط لفكرة التوقيع:
{
"name": "ExampleSite",
"urlMain": "https://example.com",
"url": "https://example.com/{username}",
"presenseStrs": ["Profile", "@{username}"],
"absenceStrs": ["User not found", "This profile does not exist"],
"headers": {
"User-Agent": "Mozilla/5.0"
},
"tags": ["social", "global"]
}
ملاحظة: المثال للتوضيح وليس توقيعًا رسميًا من Maigret.
هذا النمط هو نفسه الذي تحتاجه في اختبار API. بدلًا من كتابة اختبارات مبعثرة داخل ملفات كثيرة، عرّف “توقيع” كل endpoint:
{
"endpoint": "GET /users/{id}",
"expectedStatus": 200,
"requiredFields": ["id", "email", "createdAt"],
"forbiddenFields": ["password", "token"],
"contentType": "application/json"
}
ثم شغّل محرك اختبار عام يقرأ هذه التوقيعات ويتحقق منها. هذا هو جوهر تطوير API المبني على العقد، وقد تناولناه أيضًا في تطوير API المبني على العقد أولاً ودليل اختبار خادم MCP.
كيف يميز Maigret بين وجود الحساب وعدم وجوده
الطريقة الساذجة هي:
GET https://example.com/user/<username>
إذا عاد 200 => الحساب موجود
إذا عاد 404 => الحساب غير موجود
لكن الويب الحقيقي لا يعمل بهذه البساطة. كثير من المواقع تعيد 200 OK حتى عندما لا يكون المستخدم موجودًا، وتعرض رسالة مثل:
User not found
أو تعيد صفحة عامة، أو Captcha، أو redirect.
لذلك يستخدم Maigret عدة إشارات:
- قالب URL.
- نصوص يجب أن تظهر عند وجود الحساب.
- نصوص يجب أن تظهر عند غياب الحساب.
- أحيانًا regex لاستخراج اسم المستخدم أو حقول إضافية.
- رؤوس HTTP مخصصة.
- تصنيف الموقع حسب الفئة أو البلد.
المنطق العملي يكون قريبًا من:
def classify_response(body, presence_strs, absence_strs):
has_presence = all(s in body for s in presence_strs)
has_absence = any(s in body for s in absence_strs)
if has_presence and not has_absence:
return "found"
if has_absence:
return "not_found"
return "unknown"
النقطة المهمة: رمز الحالة وحده لا يكفي.
في اختبار API، افعل الشيء نفسه. لا تكتفِ بـ 200 OK. تحقق من:
- status code
- content type
- الحقول المطلوبة
- الحقول الممنوعة
- شكل الخطأ
- headers المهمة
- قيم business-critical
مثال assertion منطقي:
pm.test("user response contract", function () {
pm.response.to.have.status(200);
const json = pm.response.json();
pm.expect(json).to.have.property("id");
pm.expect(json).to.have.property("email");
pm.expect(json).to.not.have.property("password");
});
في Apidog، يمكنك تطبيق الفكرة نفسها عبر تأكيدات status code، body، schema، والحقول المطلوبة في الطلب نفسه.
البحث المتكرر واستخراج المعلومات
بعد أن يجد Maigret حسابًا، لا يتوقف عند “تم العثور على الحساب”. يقوم بخطوتين إضافيتين:
استخراج معلومات عامة من صفحة الملف الشخصي
مثل اسم ظاهر، روابط، أسماء مستخدمين أخرى، أو معرفات عامة.إعادة استخدام المعرفات المكتشفة في جولة بحث جديدة
مثلًا: اسم مستخدم يؤدي إلى حساب، الحساب يعرض اسمًا آخر، الاسم الآخر يقود إلى خدمة أخرى.
هذا يسمى بحثًا متكررًا أو recursive enrichment.
تصور مبسط:
username
-> profile on Site A
-> linked username on Site B
-> profile on Site B
-> public email or alias
في سياق API، النمط نفسه مفيد:
GET /users/123
-> returns organizationId
-> GET /organizations/{organizationId}
-> returns planId
-> GET /plans/{planId}
عندما تكتشف حقلًا جديدًا في استجابة API، لا تتجاهله. اسأل:
- هل هو موثق؟
- هل يشير إلى endpoint آخر؟
- هل يحتاج إلى اختبار؟
- هل يجب إضافته إلى contract؟
- هل كسره سيؤثر على عميل آخر؟
التعامل مع Captcha وRate Limits
Maigret لا يحاول كسر دفاعات المواقع. يتعامل مع القيود بلطف، ويستخدم إشارات الاستجابة لاكتشاف:
- rate limit
- Captcha
- حظر Tor أو I2P
- الحاجة إلى User-Agent معين
- headers مثل
Retry-After
استراتيجياته تشمل:
- تدوير User-Agent.
- احترام رؤوس retry.
- استخدام نطاقات جوال أو صفحات مبسطة عندما تكون متاحة.
- تسجيل الحالة كـ Captcha detected بدلًا من محاولة تجاوز دفاع قوي.
هذا درس مهم لاختبار API.
لا تبنِ مشغّل اختبارات يضرب API بلا حدود. صممه ليحترم:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
مثال تعامل بسيط:
async function requestWithBackoff(fetchFn) {
const response = await fetchFn();
if (response.status === 429) {
const retryAfter = Number(response.headers.get("Retry-After") || 60);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
return fetchFn();
}
return response;
}
هذا يحمي اختباراتك من حظر IP الفريق، ويحافظ على سلوك متوافق مع شروط الخدمة.
مشكلة انحراف التوقيع
أي قاعدة تضم آلاف التوقيعات ستنحرف مع الوقت. المواقع تغير:
- بنية URL.
- نصوص صفحات الخطأ.
- شكل الملف الشخصي.
- سياسات Captcha.
- أسماء الحقول.
- العلامة التجارية بالكامل.
إذا لم تحدّث التوقيع، تحصل على:
- false positive: يظن أن الحساب موجود وهو غير موجود.
- false negative: يفشل في العثور على حساب موجود.
- unknown results كثيرة بلا فائدة.
يعالج Maigret ذلك عبر:
- تحديث تلقائي من مستودع GitHub المركزي كل 24 ساعة.
- مساهمات المجتمع عبر pull requests.
- خيار
--update. - اختبارات مدمجة تتحقق من صحة التوقيعات مقابل أسماء مستخدمين معروفة.
هذا الجزء هو الأهم لمهندسي API: كل contract يحتاج إلى اختبار انحدار دوري.
في API، احفظ استجابة معروفة وصحيحة:
{
"id": "usr_123",
"email": "dev@example.com",
"createdAt": "2026-01-01T00:00:00Z"
}
ثم شغّل اختبارًا دوريًا يتحقق من أن endpoint ما زال يعيد نفس الشكل:
const requiredFields = ["id", "email", "createdAt"];
for (const field of requiredFields) {
if (!(field in responseBody)) {
throw new Error(`Missing field: ${field}`);
}
}
يدعم Apidog هذا النمط عبر حفظ الطلبات، تعريف التأكيدات، تشغيلها دوريًا، ومقارنة النتائج لاكتشاف الانحراف. يغطي دليل DeepSeek V4 API مثالًا عمليًا على التعامل مع API لبائع محدد.
وضع الملخص بالذكاء الاصطناعي
توفر Maigret علامة:
maigret username --ai
تستخدم هذه العلامة نقطة نهاية LLM متوافقة مع OpenAI لتلخيص النتائج. أنت توفر مفتاح API، وMaigret يرسل النتائج الخام ليحصل على ملخص قابل للقراءة.
النمط الهندسي هنا مهم:
- القواعد الحتمية تقرر هل الحساب موجود أم لا.
- النموذج اللغوي لا يقرر الحقيقة.
- النموذج يلخص فقط نتائج تم حسابها مسبقًا.
هذا يقلل الهلوسة. النموذج يعمل كـ postprocessor، لا كـ judge.
في مراقبة API، يمكنك تطبيق البنية نفسها:
- شغّل تأكيدات حتمية في Apidog.
- اجمع نتائج التشغيل.
- أرسل الملخص إلى LLM لصياغة تقرير Slack أو بريد إلكتروني.
- لا تجعل LLM يقرر النجاح أو الفشل.
ناقشنا هذه الفكرة في استخدام الحاسوب مقابل واجهات برمجة التطبيقات المنظمة: الطبقة المنظمة يجب أن تأتي أولًا.
حالات الاستخدام المشروعة
استخدم Maigret فقط في سياقات واضحة ومصرح بها. أمثلة مقبولة:
1. استعادة حساباتك الشخصية
إذا استخدمت اسم مستخدم قديمًا منذ سنوات، يمكنك البحث عن الحسابات العامة المرتبطة به قبل إغلاقها أو تحديث إعدادات الخصوصية.
maigret old_username -a
2. مراقبة إساءة استخدام العلامة التجارية
يمكن للشركات البحث عن أسماء منتجاتها أو علاماتها لاكتشاف حسابات انتحال.
maigret brand_name -a
3. البحث عن المفقودين بموافقة
تستخدم بعض فرق البحث والإنقاذ أدوات OSINT بموافقة الأسرة وبالتنسيق مع جهات إنفاذ القانون.
4. اختبارات الاختراق المرخصة
ضمن عقد red-team أو pentest، يمكن استخدام Maigret لتحديد سطح التعرض العام للمؤسسة.
القاعدة هنا: النطاق مكتوب ومصرح به.
5. الصحافة الاستقصائية
يستخدم الصحفيون أدوات OSINT ضمن مراجعة تحريرية وقانونية، خصوصًا عند التحقيق في احتيال، جرائم منظمة، أو قضايا مصلحة عامة.
ما لا يدخل ضمن الاستخدام المشروع:
- البحث عن شخص بدافع الفضول.
- مراقبة شريك سابق.
- بناء قاعدة بيانات عن أشخاص لم يوافقوا.
- استهداف أفراد خاصين دون أساس قانوني.
أنماط من Maigret يمكنك تطبيقها على اختبار API
1. استخدم توقيعات كبيانات
بدلًا من كتابة اختبار مخصص لكل endpoint، عرّف السلوك المتوقع كبيانات.
{
"method": "GET",
"path": "/orders/{id}",
"expectedStatus": 200,
"requiredFields": ["id", "status", "total"],
"forbiddenFields": ["internalNotes"]
}
هذا يسهل إضافة endpoints جديدة دون إعادة بناء نظام الاختبار.
2. لا تثق في status code وحده
اختبر عدة إشارات:
status code + content-type + schema + required fields + forbidden fields
مثال:
expect(response.status).toBe(200);
expect(response.headers["content-type"]).toContain("application/json");
expect(body).toHaveProperty("id");
expect(body).not.toHaveProperty("password");
3. حدّث التوقيعات مركزيًا
كما يحدّث Maigret قاعدة المواقع من GitHub، يجب أن تمتلك مصدرًا مركزيًا لعقود API. مشاريع Apidog تدعم التعاون والمزامنة، وهذا يقلل تشتت العقود بين الفرق.
راجع أيضًا اختبار API بدون Postman.
4. شغّل اختبارات الانحراف دوريًا
لا تنتظر أن يكتشف المستخدمون تغيرًا في API. شغّل اختبارات مجدولة:
كل ساعة / كل يوم / قبل النشر / بعد النشر
وتحقق من:
- هل تغير schema؟
- هل اختفى حقل؟
- هل تغير نوع البيانات؟
- هل تغير شكل الخطأ؟
- هل زاد زمن الاستجابة؟
5. استخدم LLM للتلخيص فقط
اجعل القواعد الحتمية تقرر:
pass / fail
ثم استخدم LLM لصياغة تقرير مثل:
فشل اختبار GET /orders/{id} لأن الحقل total لم يعد موجودًا.
بدأ الفشل في تشغيل 02:10 UTC.
لا تجعل النموذج يقرر صحة العقد.
المزالق الشائعة عند تشغيل Maigret
افتراض أن التشغيل الافتراضي كامل
التشغيل الافتراضي لا يفحص كل شيء دائمًا. إذا كنت تحتاج إلى فحص أوسع، استخدم:
maigret username -a
لكن توقع وقت تشغيل أطول.
تجاهل tags
يمكن تضييق البحث حسب الفئة أو البلد باستخدام:
maigret username --tags social
هذا مفيد عندما يكون النطاق الجغرافي أو نوع المواقع مهمًا.
تخطي التحديث
قاعدة توقيعات قديمة تعني نتائج غير موثوقة. قبل أي فحص جاد:
maigret --update
تفسير حظر Tor كدليل
بعض المواقع تحظر Tor بالكامل. إذا فشل الوصول عبر Tor، لا تستنتج شيئًا عن وجود الحساب.
تصديق كل حقل مستخرج
Maigret يقرأ ما تعرضه الصفحة. الصفحات العامة يمكن تزويرها. اعتبر النتائج أدلة تحتاج تحققًا، لا إثباتًا نهائيًا.
حالات استخدام واقعية
شركة استشارات أمنية تستخدم Maigret في بداية كل عملية red-team مرخصة لتقديم صورة أولية عن سطح التعرض العام للعميل.
محقق احتيال مستقل يستخدم:
maigret target_username -a --ai
لتحويل نتائج آلاف المواقع إلى ملخص قصير لعميل غير تقني. البحث نفسه حتمي، والذكاء الاصطناعي فقط يصيغ التقرير.
فريق هندسي يستخدم الأنماط نفسها داخل اختبارات API الخاصة به: قاعدة توقيعات، تشغيل دوري، واكتشاف انحراف عبر 200 خدمة مصغرة. التنفيذ داخل Apidog، لكن المبادئ هي مبادئ Maigret نفسها.
الخاتمة
Maigret ليس مجرد أداة OSINT. هو مثال عملي على بناء نظام يتحمل تغير آلاف الأسطح الخارجية: توقيعات قابلة للتحديث، تأكيدات متعددة الإشارات، اكتشاف انحراف، ومعالجة LLM لاحقة لا تتحكم في القرار.
خمسة دروس قابلة للتطبيق:
- عرّف السلوك المتوقع كبيانات، لا ككود متشعب.
- استخدم عدة إشارات للحكم، لا status code فقط.
- شغّل اختبارات دورية ضد fixtures معروفة.
- تعامل مع الانحراف كحالة طبيعية، لا كاستثناء.
- استخدم LLM للتلخيص، وليس للحكم على صحة النتائج.
الخطوة التالية: اقرأ تنسيق قاعدة بيانات مواقع Maigret، ثم افتح Apidog وصمم endpoint واحدًا بالطريقة نفسها: توقيع واضح، تأكيدات متعددة، واستجابة محفوظة لاكتشاف الانحراف. هذا الانضباط يدفع ثمنه عندما يغير مزود خارجي اسم حقل في الثانية صباحًا وتلتقطه اختباراتك قبل المستخدمين.
الأسئلة الشائعة
هل استخدام Maigret قانوني؟
يعتمد ذلك على الولاية القضائية والهدف. تشغيله على نفسك، أو على حسابات تملكها، أو على شركة لديك إذن كتابي باختبارها، أو ضمن عمل صحفي خاضع لمراجعة قانونية، غالبًا يكون مقبولًا. تشغيله على فرد خاص دون موافقة قد يخالف قوانين الملاحقة والتحرش.
هل يعمل Maigret بدون بايثون؟
الحزمة الرسمية تتطلب Python 3.10+. يوجد أيضًا بوت تيليجرام وخيارات تشغيل سحابية لمن لا يريد تثبيتًا محليًا.
ما مدى دقة رقم 3000 موقع؟
قاعدة البيانات تسرد أكثر من 3000 إدخال، لكن ليس كل موقع يكون فعالًا في كل لحظة. التحديثات المجتمعية والتحديث التلقائي يحافظان على أكبر قدر ممكن من الدقة.
ماذا يضيف وضع الذكاء الاصطناعي؟
علامة --ai تلخص النتائج الحتمية باستخدام LLM متوافق مع OpenAI. لا تغير عملية البحث ولا تقرر صحة النتائج. تحتاج إلى مفتاح API خاص بك.
هل يمكن استخدام Maigret في CI؟
لتحقيقات OSINT، غالبًا لا؛ لأنها تفاعلية وتعتمد على سياق قانوني وأخلاقي. لكن أنماطه المعمارية مناسبة جدًا لـ CI في اختبار API: توقيعات، اكتشاف انحراف، وتشغيل مجدول. يدعم Apidog هذه الأنماط بشكل أصلي.
كيف يختلف Maigret عن Sherlock؟
Sherlock أقدم وأبسط. Maigret يضيف استخراج معلومات، بحثًا متكررًا، معالجة Captcha جزئية، وضع تلخيص بالذكاء الاصطناعي، وقاعدة مواقع أغنى. كلاهما مرخص بموجب MIT ويستحقان المعرفة.
أين أبلغ عن توقيع قديم؟
استخدم GitHub Issues أو Pull Requests في مستودع Maigret. عادةً الأفضل فتح طلب سحب صغير يحدّث توقيع موقع واحد بوضوح.


Top comments (0)