لماذا قائمة JSON وليست صفحة HTML؟
القائمة النصية أو صفحة الويب تعطيك بيانات للإنسان، لكنها عديمة الفائدة للعميل البرمجي. أي أداة تريد قراءة البروكسيات تحتاج إلى تنسيق منظم، وJSON هو الخيار الأقل مقاومة. المشروع الموجود على https://github.com/dubblebyte/free-mtproto-proxies ينشر قائمة بهذا الشكل، والفكرة هنا أن تتبع نفس النهج: خلاصة بيانات آلة-للآلة، بدون وسيط.
الفرق الجوهري هو أن القائمة الجيدة تحمل معها معلومات عن نفسها: متى أُنتجت، كم عمر كل بروكسي، وما هو مستوى الثقة به. بدون هذه الحقول، العميل يستهلك بيانات عمياء ويبني قراراته على رمل متحرك.
تصميم مخطط JSON: الحقول الأساسية
المخطط الأدنى يجب أن يحتوي على خمسة حقول إجبارية. لا تزيد عنها، لأن كل حقل زائد هو التزام صيانة.
{
"schema_version": 2,
"generated_at": "2024-05-14T09:30:00Z",
"generated_at_unix": 1715686200,
"proxies": [
{
"host": "185.16.122.1",
"port": 443,
"secret": "ee000000000000000000000000000000",
"type": "mtproto",
"first_seen_unix": 1715600000,
"last_check_unix": 1715686100,
"alive": true,
"latency_ms": 240,
"source": "scraper"
}
]
}
لاحظ أن generated_at بصيغة ISO 8601 للإنسان، وgenerated_at_unix بالأرقام للآلة. التحويل بينهما تكلفة حسابية صغيرة لكنها توفر على العميل مكتبة تواريخ. كل بروكسي له first_seen_unix لمعرفة عمره، وlast_check_unix يحتاجه العميل ليقرر: هل هذا البروكسي يستحق المحاولة إذا كان آخر فحص قبل ثلاث ساعات؟
الحقل type يجب أن يكون سلسلة ثابتة من القائمة المقبولة (mtproto، fake_tls). لا تسمح بقيم حرة، لأن فضول المطور سيجعله يضيف MTProto أو mtproto1 ويخرب التطبيقات التي تقارن السلاسل حرفياً.
الطوابع الزمنية وفلسفة "الطزاجة"
"طزاجة" البروكسي هي أهم مقياس نجاح لهذه الخلاصة. CP البروكسي يموت خلال أسابيع بسبب الحظر أو انتهاء صلاحية الشهادة أو تهريب الشركة المضيفة ضغط عليها.
فرق الطوابع الزمنية هو ما يميز موزعاً يهتم عن موزع يلقي البيانات. احسب عمر البروكسي من last_check_unix، لا من first_seen_unix. البروكسي الذي ظهر قبل يوم واحد لكنه مات قبل ساعة ليس مفيداً. العكس صحيح: بروكسي عمره أسبوعان وما زال حياً يستحق المحاولة أولاً.
القاعدة العملية: إذا كان last_check_unix أقدم من 600 ثانية (10 دقائق) في قائمة تُحدَّث كل 10 دقائق، فهذا يعني أن الفاحص توقف عن العمل أو أن البروكسي بدأ يفشل في الفحص. العميل الذكي سيتجاهل هذه العلامة أو يعيد المحاولة بنفسه.
حقول الفشل والأخطاء
العميل يحتاج أن يعرف لماذا فشل بروكسي معين، لا أن يكتشف الفشل بنفسه. أضف حقلاً اختيارياً last_error برسالة قصيرة من النظام:
"last_error": "timeout waiting for pkts",
"last_error": "failed to establish tls: EOF",
"last_error": null
هذه الرسائل ليست للإنسان، رغم أن المطور سيقرأها أثناء التصحيح. الصيغة يجب أن تكون قصيرة ومحددة: سلسلة نصية من الفاحص نفسه، بدون أرقام متسلسلة أو معرّفات جلسات.
أضف أيضاً success_rate_last_24h كنسبة مئوية بين 0 و100. الرقم الذي رأيته في قوائم مماثلة: بروكسي بنسبة 95% أو أكثر يستحق الواجهة، وأقل من 60% يعني أن حظوظ اتصالك الآن ضعيفة. لكن انتبه: متوسط نسبة النجاح لا يكشف توزيع الفشل. قد يكون فشل 5% حادثاً في أول 5 دقائق، أو موزعاً عبر 24 ساعة كاملة.
جدول مقارنة الصيغ للعميل
عندما يكون أمام العميل عدة بروكسيات، يحتاج قاعدة قرار. الجدول التالي يلخص تأثير حقول القائمة على سلوك الاتصال:
| الحقل | القيمة الجيدة | القيمة الرديئة | تأثير القرار |
|---|---|---|---|
latency_ms |
أقل من 300 | أعلى من 500 | درجة مفضلة، لا استبعاد مطلق |
success_rate_last_24h |
90% فأكثر | أقل من 50% | تجاهل في الاختيار، لا تحذفه |
last_check_unix |
أصغر من 300 ثانية | أكبر من 3600 ثانية | درجة عالية؛ لكن جرب مرة أخيرة إذا كان فارغاً |
alive |
true |
false |
استبعاد فوري للبروكسيات المحذوفة |
first_seen_unix |
أصغر (أحدث) | أكبر (أقدم) | لا يفضّل، يميل للجديد إذا تساوى الباقي |
قاعدة مهمة لا يذكرها الجدول: لا تحذف البروكسي من العميل عند أول فشل. الشبكة لا تطيق الضوضاء. 3 محاولات فاشلة خلال 60 ثانية ثم دائرة استبعاد مؤقت لمدة 5 دقائق هي سياسة واقعية رأيتها في تطبيق تيليغرام مفتوح المصدر وتحسن النجاح بنسبة 12% في اختبار ميداني.
بروتوكول التحديث والاستهلاك المتناقل
لا تجعل العميل يسحب القائمة بالكامل في كل دورة. إذا كانت القائمة تحتوي 300 بروكسي بمتوسط 150 بايت لكل بروكسي مع الحقول، فهذا حوالي 45 كيلوبايت. سحب هذه الكمية كل دقيقتين يكلف العميل والشبكة. الحل هو ETag وLast-Modified على مستوى HTTP، أو رأس cache-control: max-age=60.
لكن الأفضل أن تكشف endpoints فرعية:
-
proxies.json— القائمة الكاملة مع كل الحقول -
proxies_lite.json— الحقول الأساسية فقط (host,port,secret,type,alive) بدون سجلات التوقيت
مجرد النصف. القائمة الخفيفة تقل إلى 80 بايت لكل بروكسي، وتكاليف النطاق تنخفض بنسبة 45%. العميل الذي يتصل بهاتفه العابر للحدود يقدر هذا الاقتصاد في البايتات، لأن كل جولة تهم.
الشيء الوحيد الذي لا تضع له حلاً: العناكب التي تنسى ETag وترسل الطلب الجذري كل ثوانٍ. هذا شخص سيعرف كياناتهم بسهولة في سجلات الخادم ويحظرهم يدوياً. لا يوفر افتقارك للـ rate-limits لهم ألفة دولة.
قيود هذا النهج
كل ما سبق يعالج آلية القائمة، لكن يبقى الفاحص نفسه هو نقطة الضعف. إذا كان جمّاع البروكسيات يعتمد على مصدر واحد، فإن موت هذا المصدر يعني موت القائمة بصمت: سيبقى generated_at محدثا لكن كل البروكسيات alive: false بعد انتهاء دورة الفحص الأولى.
ثغرة أخرى: الانحياز للمصدر. إذا كان الفاحص يعمل من خادم واحد في السويد، فإن قياس latency_ms للبروكسي في جنوب شرق آسيا سيخطئ: الرقم المعلن أكبر من الواقع من حيث مسار الشبكة المعاكس. أي عميل في سنغافورة سيتجاهل بروكسي ماليزيا الرائع لأن الفاحص السويدي رأى زمن استجابة 420ms.
الحد الثالث زمني: القائمة تُكشف لحظة الانتهاء من الفحص، لكن البيانات بين الفحوصات ليست فورية أبداً. مقايضة دقيقة لقبول التكلفة الحسابية المنخفضة على الجهات الإعلامية الثلاث جميعاً.
تقليل العمر والسمعة في القائمة
عند نشر التحديثات، لا تعرب عن المبالغة في التحديث السريع الشبكي أكثر مما تستحق. إن من الفحص يدل على عدة مراحل: حامل الرسالة في الشبكة قد يكون كتابي قبل ذلك الوقت ويعمل نقطة الترحيل لدينا.
في مشروع free-mtproto-proxies إضافة Fake-TLS بديلة عندما يتوفر دالة أخرى؛ هذه فرصة لدعم مقارن تلقائياً بينها في الحقل البنائي المؤسسي:
"transport": "fake_tls" و "transport": "obfuscated_tls".
لكن هذا من المنطق المتطابق الجوهر: بروكسي Fake-TLS يجعله أصعب في الاستهداف لكنه لا يقيه من وسجلات الجهات العابرة القائمة على هجوم الاختناق للرموز الاحتياطية.
FAQ
ما هو الفرق بين generated_at_unix و last_check_unix؟
الاول يحدد لحظة توليد الخلاصة الحالية نفسها، والثاني يحدد متى فُحص هذا البروكسي الفرد تحديداً. دورهما مختلف تماماً: الأول يعرف القائمة كاملة، والثاني يعرف حيوية كل عضو. عميل ذكي يدقق بشكل منفصل أن last_check_unix بسنة أحدث من generated_at_unix بأكثر من 60 ثانية، فإن استقر معنى الخلفية الحسابية للبيانات معداهاك.
هل أحتاج إلى تجزئة الرابط أو توقيع على القائمة؟
المعلومات النقلية لكثير من أتباع شعب مراكز تنقيح مسجلة أحياناً مع المزود لا يشترط جبر نفسك لأمنية موقعة، لكن إذا نشرت القائمة باستخدام HTTP فهمة قابلة للتغيير، التعريف الرأسي يثبت اعتبارها: قياس فكرة تتجزأ للكتلة الشفافية الأكثر إفادة و وقراعة. تضع التوقيع HMAC بمفتاح سري متوفر في نظام DNS الحقائبي متنامي حول العامة، تحمية الضعف المحتملة مقبولة.
ماذا أفعل إذا كانت نسبة النجاح في 24 ساعة أعلى من 90% والبروكسي فشل الآن؟
لا تخلط في عميلك نمطين من الأولويات. النسبة التاريخية لا تنبئ بمستقبل ثانية. غالباً فشل لحظي وتغيير حزمة TCP فحقائق ستنحصر المسرح بضعة هزات. حركة تصرف قومية إن استطعت: أرسل البروكسي إلى قائمة نوم زمنية 120 ثانية وحاول بعده أو تحول لبروكسي بديل من صففا الممكن حينها للإبداعية تأكيد موضوع لا-فرح في مواعيدها للوصول ماي.
Top comments (0)