ساخت ربات تلگرام با استفاده از Node.js – راهنمای کاربردی


در این مقاله به بررسی روش ساخت یک ربات تلگرام با استفاده از Node.js و Ngrok در توزیع محلی میپردازیم. شاید از خود بپرسید که چرا باید یک ربات در تلگرام بسازیم. پاسخ این است که باتها بسیار مفید هستند و میتوانند در کاربردهای مختلفی از جمله موارد زیر مورد استفاده قرار گیرند:
- نظارت اجتماعی
- ارائه سرویس به مشتریان
- وظایف خودکارسازی/تسریع شده
- مدیریت تراکنشهای پرداخت
تلگرام یکی از برترین اپلیکیشنها و پلتفرمهای موبایل است که امنیت را به همراه رمزنگاری و در یک سیستم کاملاً رایگان، سریع و توزیع یافته ارائه میکند. تلگرام همچنین API کاملاً مستندسازی شده ساده و مناسبی دارد.
دریافت مجوز از BotFather
اگر به مستندات ربات تلگرام نگاه کنیم، متوجه خواهیم شد که تنها یک الزام برای ایجاد بات وجود دارد و آن داشتن یک حساب تلگرام است.
تنها راه برای ثبت نام از طریق استفاده از شماره تلفن معتبر است.

زمانی که عمل ثبت نام انجام شد، میتوانید از نسخه وب برای ورود به حساب خود استفاده کنید:

زمانی که وارد حساب خود شدید، باید به دنبال حساب کاربری BotFather گشته و گفتگویی را با آن آغاز کنید:



ما اکنون فرایند ایجاد یک ربات جدید را با وارد کردن دستور زیر آغاز میکنیم:
/newbot
سپس باید نام و نام کاربری بات را تعیین کنیم:

زمانی که این فرایند کامل شد، باید یک توکن API برای استفاده بگیرید. این توکن را جایی کپی کنید، چون در ادامه برای ایجاد درخواستهای HTTP از آن استفاده خواهیم کرد.

استفاده از Postman برای پیکربندی ربات
اکنون که بات خود را در اختیار داریم، میتوانیم از اپلیکیشن Postman برای چند چیز استفاده کنیم. ما با استفاده از مستندات API ربات تلگرام، قصد داریم وضعیت بات را دریافت کنیم.
# HTTP request format # https://api.telegram.org/bot<token>/METHOD_NAME # our first method /getMe https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

ما همچنین میتوانیم تعامل خود با ربات جدید را بررسی کنیم و نتایج تعاملهای اخیر خود را ببینیم:


استفاده از Ngrok برای تونل/فوروارد کردن اتصال
در اغلب اپلیکیشنهای شخص ثالث که دارای API هستند میبایست یک URL عمومی وجود داشته باشد که پلتفرم بتواند دادهها را به آن جا ارسال کند. ما میتوانیم یک نام دامنه جدید ثبت کنیم، گواهی SSL برای ایجاد امکان اتصال HTTPS راهاندازی کنیم و کد خود را روی این راهحل میزبانی شده توزیع کنیم؛ اما ما قصد داریم اپلیکیشن خود را در توزیع محلی تست کنیم. این همان جایی است که میتوانیم از Ngrok استفاده کنیم.

این نرمافزار کاملاً ساده است؛ اما باید آن را دانلود کرده و url را راهاندازی کنید.

برای آغاز Ngrok باید دستور زیر را اجرا کنید:
./ngrok http 80

ما از فوروارد کردن https که از سوی Ngrok ایجاد شده است، استفاده میکنیم. در این مورد URL به صورت زیر است:
https://da6d9f1d.ngrok.io
و این آدرس را به صورت نقطه انتهایی اصلی خود برای پذیرش درخواستها در مورد وبهوکهای تلگرام تنظیم میکنیم. بدین منظور به این URL نیاز داریم و باید آن را چنان که به وسیله API بات تلگرام اشاره شده است، از طریق Postman به عنوان URL اصلی خود تنظیم کنیم.

یکی از ویژگیهای جالب Ngrok این است که میتوان درخواستهای ورودی را روی پورت 4040 مشاهده کرد.

شما میتوانید برخی درخواستهای ورودی POST را ببینید که با خطای 502 Bad Gateway مواجه شدهاند. دلیل این امر آن است که ما همچنان درخواستهایی را که قبل از تنظیم ربات ارسال شدهاند، دریافت میکنیم. در ادامه یک درخواست ساده ارائه میکنیم تا ببینیم که موفق است یا نه.


اکنون که یک اتصال ایجاد کردهایم، میتوانیم نقطه انتهایی اولیه خود را که یک پیام را پذیرفته و به آن پاسخ میدهد ایجاد کنیم.
ساخت API برای NodeJs
برای ایجاد API در Node.js باید نخستین اپلیکیشن خود را در این زبان برنامهنویسی ایجاد کنیم.
در یک دایرکتوری جدید پروژه Node.JS را آغاز کنید:
# configure as needed npm init; # install dependencies npm i express axios body-parser --save; # create main file touch index.js;
در فایل مربوطه یک خروجی ساده برای بازگشت دادن دادهها و نمایش payload در کنسول ترمینال پیکربندی کنید:
فایل index.js به صورت زیر خواهد بود:
// Dependencies const express = require('express'); const app = express(); const axios = require('axios'); const bodyParser = require('body-parser'); const port = 80; const url = 'https://api.telegram.org/bot'; const apiToken = '{api-token-given-by-BotFather}'; // Configurations app.use(bodyParser.json()); // Endpoints app.post('/', (req, res) => { console.log(req.body); res.send(req.body); }); // Listening app.listen(port, () => { console.log(`Listening on port ${port}`); });
فایل را ذخیره و آن را اجرا کنید:
node index.js; # [Expected Output] # Listening on port 80
ممکن است ببینید که درخواستهای قبلی اینک میرسند و نتیجهای مشابه JSON ارائه میکنند؛ اما در صورتی که چنین پیامی وجود نداشته باشد، میتوانید پیام دیگری را از طریق بات به تلگرام ارسال کنید:

نکته اصلی که باید مطلع باشیم این است که chat.id درخواست payload در POST چه مقداری دارد؟

سپس به اصلاح اسکریپت خود میپردازیم تا متن را فیلتر کنیم و ببینیم آیا کلمه «hello» در آن وجود دارد یا نه و در صورت وجود با پیام «hello back» پاسخ دهیم. جهت اجرای این کار باید یک درخواست HTTP ارسال کنیم تا پیامی به API ربات تلگرام جهت پاسخ داده به کاربر ارسال شود.
در این مرحله، فایل index.js به صورت زیر خواهد بود:
// Dependencies const express = require('express'); const app = express(); const axios = require('axios'); const bodyParser = require('body-parser'); const port = 80; const url = 'https://api.telegram.org/bot'; const apiToken = '{api-token-given-by-BotFather}'; // Configurations app.use(bodyParser.json()); // Endpoints app.post('/', (req, res) => { // console.log(req.body); const chatId = req.body.message.chat.id; const sentMessage = req.body.message.text; // Regex for hello if (sentMessage.match(/hello/gi)) { axios.post(`${url}${apiToken}/sendMessage`, { chat_id: chatId, text: 'hello back ?' }) .then((response) => { res.status(200).send(response); }).catch((error) => { res.send(error); }); } else { // if no hello present, just respond with 200 res.status(200).send({}); } }); // Listening app.listen(port, () => { console.log(`Listening on port ${port}`); });
فایل را ذخیره کرده و اپلیکیشن NodeJS را مجدداً اجرا کنید و به تلگرام بازگردید.

بدین ترتیب بات ما کامل شده است. ما در این مقاله با موفقیت یک ربات برای توزیع محلی راهاندازی کردهایم که پیامها را فیلتر میکند و بر همین مبنا پاسخ میدهد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای طراحی و توسعه وب
- Node.js و ابزارها و تکنیکها برای ساخت سرورهای قدرتمند و سریع
- مجموعه آموزشهای برنامهنویسی
- Node.js چیست و چه نقشی در توسعه وب دارد؟ — به زبان ساده
- رویدادها (Events) در Node.js — راهنمای استفاده صحیح
==