بات‌ها هم بله میگویند! : چگونه ربات بله خود را روی heroku میزبانی دهیم؟

مجموعه مطالب «بات‌ها هم بله میگویند!» مجموعه ایست برای آموزش توسعه بات (یا به زبان بله، بازو) بر مبنای پلتفرم بله.

پیامرسان بله
پیامرسان بله





فرض کنیم شما طبق داکیومنت بله باتی رو به زبان جاوااسکریپت (فریمورک node.js) نوشتید و حالا قصد دارید اون بات رو روی هروکو اجرا کنید. هروکو سیستم جالبی داره، تنظیم شده مخصوص وب سرور؛ بنابراین، اگر شما از پورتی که هروکو در اختیارتون میگذاره استفاده نکنید، هروکو میفهمه برنامه تون رو باید قطع کنه و اجازه اجرا شدن اون رو نده! در مورد بات‌های بله هم همین اتفاق میوفته، چرا؟ چون بات های بله بر مبنای سوکت نوشته شدن و کاری با پروتکل های http/s ندارن (البته api برای وب‌هوک هم ندارن) پس نیازی به پورت هم ندارن (اینجا هر بات نقش کلاینت رو برای سوکت بازی میکنه، پس ابدا ساخت سرور نیاز نیست!). قابلیت جالب دیگه ای که هروکو روی سرویس های مجانی خودش قرار داده (و شاید سرویس‌های پولی هم همینطور باشه)، اینه که برای صرفه جویی در استفاده از منابع و کم شدن هزینه‌ها، اگر به سرور در مدت زمانی معلوم (حدود ۳۰ دقیقه) درخواستی فرستاده نشه،‌سرور رو خاموش میکنه و اونو به حالت خوابیده میبره تا درخواست بعدی؛ یعنی، اگر تا سی دقیقه درخواست GET یا POST یا ... به سرور ارسال نشه سرور موقتا خاموش میشه تا وقتی که یک درخواست به سرور ارسال بشه. مشکلی که بات های بله با این قضیه دارن (باز هم چون بحث سوکت وسطه) اینه که هر اتفاقی که بین بات و سرور بله رخ بده، درخواست‌هایی از نوع‌های http/s شمرده نمیشن، بنابراین شما شلوغ ترین بات رو هم روی هروکو اجرا کنید، ۳۰ دقیقه بعد خاموش میشه و دیگه هیچوقت روشن نمیشه!‌ :))

برای رفع مشکلات بالا این ایده به ذهن من رسید که چون ما کلاینت سوکت داریم، میتونیم با هر بات بله یه سرور هم بسازیم و اون رو مامور کنیم که اجازه نده هروکو سرور رو قطع کنه! برای اینکه بعد از ۳۰ دقیقه سرور به خواب نره هم روی همون بات یه دستور میگذاریم که هر ۵ دقیقه درخواستی رو به سرور خودمون ارسال کنه. :))

کد راه حل بالا رو به صورت زیر نوشتم.

http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hi!');
}).listen(PORT, () => {
 console.log(`Server running at port: ` + PORT);
});
setInterval(() => {
    https.get(URL).on('error', (e) => {
 console.error(e)
 })
}, 300000)

که قسمت اول کد سرور رو میسازه و قسمت دوم وظیفه درخواست دادن های ۵ دقیقه ای رو داره! ثوابت PORT و URL هم [به ترتیب] حاوی پورت اختصاص داده شده توسط هروکو و آدرس سرور ما هستن.

شما میتونید این قطعه کد رو بعد از نوشتن بات خودتون در آخر بات یا اول بات یا وسط بات یا ... قرار بدید و بات خودتون رو روی هروکو اجرا کنید.

اگه راه حل بهتر و کم هزینه تری سراغ دارید، خیلی خوشحال میشم در نظرات بنویسید.