প্রকল্প সম্পর্কে
ClassSniper হলো একটি ব্যক্তিগত অটোমেশন প্রজেক্ট যা রিজার্ভেশন উইন্ডো খোলার সাথে সাথে জিম ক্লাস বুক করার জন্য তৈরি। এটি অস্ট্রেলিয়ার একটি নির্দিষ্ট জিম চেইন (One Playground)-কে লক্ষ্য করে তৈরি করা হয়েছে, যাদের ক্লাস শুরু হওয়ার ঠিক ৭২ ঘণ্টা আগে বুকিং খোলা হয়—এমন একটি সময় যখন জনপ্রিয় স্লট এবং ইন্সট্রাক্টরদের বুকিং মুহূর্তের মধ্যে শেষ হয়ে যায়। এই রিপোজিটরিটি একটি টেমপ্লেট যা আপনি আপনার নিজস্ব অ্যাকাউন্ট এবং ভেনুর জন্য খাপ খাইয়ে নিতে পারেন।
এটি যেভাবে কাজ করে
- একটি এক্সটার্নাল ক্রন (cron) সার্ভিস প্রতি ৬০ সেকেন্ড অন্তর রিপো'র workflow_dispatch এন্ডপয়েন্টকে কল করে। প্রতিটি রান চেক করে দেখে যে কিউতে থাকা কোনো বুকিংয়ের ৭২ ঘণ্টার উইন্ডো খুলেছে কি না।
- উইন্ডো খোলার সাথে সাথে বটটি ক্লাস বুক করে: প্রথমে একটি দ্রুত ডাইরেক্ট API পাথের মাধ্যমে, এবং যদি দ্রুত পথটি অস্পষ্ট হয় তবে পূর্ণ Playwright ব্রাউজার অটোমেশনে ফিরে যায়।
- একটি সহযোগী স্ক্র্যাপার একই গতিতে প্রতিটি স্টুডিও লোকেশনের লাইভ ক্লাস শিডিউল সংগ্রহ করে, যাতে ওয়েব ড্যাশবোর্ডে কেবল তারিখ/সময় নয়, বরং প্রকৃত আসন্ন ক্লাস (নাম, ইন্সট্রাক্টর, অবশিষ্ট স্থান) প্রদর্শিত হয়।
- একটি কঠোর নিরাপত্তা নিয়ম অনুযায়ী, ৩০ ঘণ্টার কম সময়ের মধ্যে শুরু হতে যাওয়া কোনো ক্লাস বুক করা নিষিদ্ধ, কারণ ২৪ ঘণ্টার মধ্যে বাতিল করলে ফি দিতে হয়।
আর্কিটেকচার
রিপোটি তিনটি কমিটেড JSON ফাইলের (pending_booking.json, status.json, class_list.json) মাধ্যমে তথ্যের উৎস হিসেবে কাজ করে। একটি GitHub Pages ড্যাশবোর্ড সরাসরি এই ফাইলগুলো পড়ে—যা পাবলিক এবং দেখার জন্য কোনো অথেনটিকেশনের প্রয়োজন নেই—এবং রিপোজিটরির জন্য নির্দিষ্ট একটি fine-grained PAT-এর মাধ্যমে GitHub Contents API ব্যবহার করে পরিবর্তনগুলো লিখে দেয়। GitHub Actions শিডিউলারটি পরিচালনা করে; bot/scraper.py শিডিউল রিফ্রেশ করে এবং bot/striker.py বুকিং সম্পন্ন করে। লাইভ Playwright কনটেক্সট থেকে স্ক্রিনশট এবং ফলাফলের অবস্থা ক্যাপচার করা হয় যাতে ব্যর্থতাগুলো রেকর্ড করা থাকে।
উল্লেখযোগ্য ইঞ্জিনিয়ারিং ডিটেইলস
- ক্লাস ডিসঅ্যামবিগুয়েশন: একই লোকেশনে একই সময়ে প্রায়ই ভিন্ন ভিন্ন ক্লাস থাকে, তাই কেবল তারিখ এবং সময়ের মিল খোঁজা অস্পষ্ট হতে পারে। প্রতিটি ক্লাসের একটি অনন্য booking_id থাকে যা ভেনুর নিজস্ব সেশন API থেকে নেওয়া হয় এবং সেটির সাথে নিখুঁতভাবে মেলানো হয়।
- ফাস্ট পাথ: ভেনুর জাভাস্ক্রিপ্ট বান্ডিল বিশ্লেষণ করে দেখা গেছে যে UI-এর "Book ক্লিক করুন $
ightarrow$ সাইন ইন $
ightarrow$ নিশ্চিত করুন" ফ্লো-টি আসলে দুটি HTTP কল। এই পাবলিক এন্ডপয়েন্টগুলোকে সরাসরি কল করা হয়, এবং ব্রাউজার ফ্লো-টিকে একটি পরীক্ষিত ফলব্যাক হিসেবে রাখা হয়েছে।
- টাইমিং: বুকিংয়ের মুহূর্তটি নিখুঁতভাবে গণনা করা হয়, প্রসেসটি ঠিক তার আগ পর্যন্ত স্লিপ করে, প্রায় পাঁচ সেকেন্ড আগে HTTP কানেকশন ওয়ার্ম-আপ করে এবং তারপর রিকোয়েস্ট পাঠায়।
- শিডিউলার পছন্দ: GitHub Actions-এর শিডিউল ট্রিগারগুলো 'বেস্ট-এফোর্ট' এবং লোডের সময় অনেক ব্যবধানে ল্যান্ড করতে দেখা গেছে, তাই প্রতি মিনিটে workflow_dispatch-এ হিট করার জন্য একটি এক্সটার্নাল ক্রন ব্যবহার করা হয়েছে; একটি কনকারেন্সি গ্রুপ এবং fetch-rebase রিট্রাই লুপ গিট পুশ-এর ওভারল্যাপিং রানগুলো পরিচালনা করে।
- ক্রেডেনশিয়াল হাইজিন: Playwright টাইমআউট এররগুলোতে লগইন ইমেলের মতো DOM ভ্যালু থাকতে পারে, তাই লগইন-টাইমআউট হ্যান্ডলার একটি পরিষ্কার মেসেজ দেয়, ডিবাগ স্ক্রিনশটগুলোতে দৃশ্যমান ইমেল/পাসওয়ার্ড ফিল্ড মাস্ক করা হয় এবং পাবলিক status.json-এ লেখার আগে ক্রেডেনশিয়াল ম্যাচগুলো মুছে ফেলা হয়।
- রেট লিমিট: ফাস্ট পাথ প্রতি প্রচেষ্টায় সর্বোচ্চ তিনটি রিকোয়েস্ট পাঠায় এবং রিট্রাই করে না, যাতে ফলব্যাক লগইনের জন্য বাজেট থাকে।
স্ট্যাক এবং সেটআপ
Python, Playwright, GitHub Actions এবং GitHub Pages-এ ফ্রেমওয়ার্ক-মুক্ত HTML/CSS/JS। এটি ব্যবহার করতে রিপোটি ফর্ক করা, GYM_EMAIL এবং GYM_PASSWORD সিক্রেট যোগ করা, Pages এবং Actions চালু করা, ড্যাশবোর্ডের জন্য একটি fine-grained টোকেন প্রদান করা এবং—গুরুত্বপূর্ণভাবে—Actions-এর জন্য নির্দিষ্ট দ্বিতীয় একটি টোকেনের মাধ্যমে এক্সটার্নাল ট্রিগার কনফিগার করা প্রয়োজন, কারণ বিল্ট-ইন ক্রন সঠিক সময়ে বুকিংয়ের জন্য খুব একটা নির্ভরযোগ্য নয়।
পরিধি (Scope)
এই প্রজেক্টটি একজন ব্যবহারকারীর নিজস্ব ব্যক্তিগত অ্যাকাউন্টের বুকিং অটোমেট করে এমন একটি সার্ভিসে যার জন্য অপারেটর অর্থ প্রদান করেন এবং এটি সেই একই পাবলিক ইন্টারফেস ব্যবহার করে যা সার্ভিসের নিজস্ব ওয়েবসাইট ব্যবহার করে। এটি উল্লেখ করে যে এটি অথেনটিকেশন বাইপাস করে না, অন্য সদস্যদের ডেটা অ্যাক্সেস করে না বা ডকুমেন্ট করা রেট লিমিট অতিক্রম করে না। এটি MIT লাইসেন্সের অধীনে প্রকাশিত।
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.