عن المشروع

ClassSniper هو مشروع أتمتة شخصي لحجز حصص النادي الرياضي في اللحظة التي تفتح فيها نافذة الحجز. يستهدف المشروع سلسلة نوادي رياضية محددة (One Playground في أستراليا)، حيث تفتح الحصص للحجز قبل 72 ساعة بالضبط من وقت البدء، وهي نافذة تمتلئ فيها المواعيد والمدربون المفضلون في غضون لحظات. هذا المستودع عبارة عن نموذج يمكنك تكييفه مع حسابك وموقعك الخاص. آلية العمل - تقوم خدمة cron خارجية باستدعاء نقطة نهاية workflow_dispatch الخاصة بالمستودع كل 60 ثانية. تتحقق كل عملية تشغيل مما إذا كانت نافذة الـ 72 ساعة لأي حجز في قائمة الانتظار قد فتحت بعد. - بمجرد فتح النافذة، يقوم البوت بحجز الحصة: أولاً عبر مسار API مباشر وسريع، مع العودة إلى أتمتة متصفح Playwright الكاملة إذا كان المسار السريع غير حاسم. - يقوم كاشط (scraper) مرافق بسحب جدول الحصص المباشر من جميع مواقع الاستوديوهات بنفس الوتيرة، بحيث تعرض لوحة التحكم على الويب الحصص القادمة الفعلية (الاسم، المدرب، المقاعد المتبقية) بدلاً من مجرد إدخال أعمى للتاريخ والوقت. - تمنع قاعدة سلامة صارمة تفعيل أو تنفيذ أي حجز لحصة تبدأ قبل أقل من 30 ساعة، لأن الإلغاء خلال 24 ساعة يترتب عليه رسوم. البنية التحتية يعمل المستودع كمصدر للحقيقة من خلال ثلاثة ملفات JSON (pending_booking.json، status.json، class_list.json). تقرأ لوحة تحكم GitHub Pages هذه الملفات مباشرة - وهي عامة ولا تتطلب مصادقة للعرض - وتكتب تغييرات التفعيل/الإزالة مرة أخرى عبر GitHub Contents API باستخدام PAT دقيق الصلاحيات ومخصص للمستودع. تقوم GitHub Actions بتشغيل المجدول؛ حيث يقوم bot/scraper.py بتحديث الجدول، ويقوم bot/striker.py بتنفيذ الحجز. يتم التقاط لقطات شاشة وحالة النتيجة من داخل سياق Playwright المباشر لضمان تسجيل الإخفاقات بدلاً من تجاهلها بصمت. تفاصيل هندسية بارزة - تمييز الحصص: غالباً ما تتشارك حصص مختلفة نفس الفتحة الزمنية في نفس الموقع، لذا فإن المطابقة بناءً على التاريخ والوقت وحدهما تكون غامضة. تحمل كل حصة معرف حجز (booking_id) فريداً مستمداً من API الجلسات الخاص بالموقع ويتم مطابقته بدقة. - المسار السريع: كشف تحليل حزمة JavaScript الخاصة بالموقع أن تدفق واجهة المستخدم "النقر على حجز ← تسجيل الدخول ← تأكيد" يتكون من استدعاءين HTTP في الخلفية. يتم استدعاء هذه النقاط العامة مباشرة، مع الاحتفاظ بتدفق المتصفح كبديل مختبر. - التوقيت: يتم حساب لحظة التنفيذ بدقة، وتدخل العملية في وضع السكون حتى ما قبل اللحظة مباشرة، ثم تقوم بتسخين اتصال HTTP الخاص بها قبل حوالي خمس ثوانٍ، ثم تنطلق. - اختيار المجدول: مشغلات GitHub Actions schedule هي "بذل قصارى الجهد" ولوحظ تباعد توقيتاتها تحت الضغط، لذا يتم استخدام cron خارجي يضرب workflow_dispatch كل دقيقة؛ وتتعامل مجموعة التزامن (concurrency group) وحلقة إعادة المحاولة fetch-rebase مع عمليات التشغيل المتداخلة التي تتنافس على git push. - نظافة الاعتمادات: يمكن أن تتضمن أخطاء مهلة Playwright قيم DOM مثل البريد الإلكتروني لتسجيل الدخول، لذا يقوم معالج مهلة تسجيل الدخول بإصدار رسالة نظيفة، وتقوم لقطات شاشة التصحيح بإخفاء حقول البريد الإلكتروني/كلمة المرور المرئية، وتقوم عملية تنقيح بمسح مطابقات الاعتمادات قبل كتابة أي شيء في ملف status.json العام. - حدود المعدل: يقوم المسار السريع بإجراء ثلاثة طلبات كحد أقصى لكل محاولة ولا يعيد المحاولة، مما يترك ميزانية لتسجيل الدخول البديل. التقنيات والإعداد Python، Playwright، GitHub Actions، وHTML/CSS/JS بدون إطارات عمل على GitHub Pages. يتطلب تكييف المشروع عمل fork للمستودع، إضافة أسرار GYM_EMAIL و GYM_PASSWORD، تفعيل Pages و Actions، وتوفير رمز (token) دقيق الصلاحيات للوحة التحكم، والأهم من ذلك، تكوين مشغل خارجي برمز ثانٍ مخصص لـ Actions، لأن cron المدمج وحده يوصف بأنه غير موثوق بما يكفي للتنفيذ في الوقت المحدد. النطاق يقوم المشروع بأتمتة الحجوزات الخاصة بحساب شخصي واحد مقابل خدمة يدفع المشغل رسومها، باستخدام نفس الواجهات العامة التي يستخدمها موقع الخدمة نفسه. وينص المشروع على أنه لا يتجاوز المصادقة، ولا يصل إلى بيانات الأعضاء الآخرين، ولا يتخطى حدود المعدل الموثقة. مرخص بموجب MIT.