رفتن به محتوای اصلی
آریا گستران

راه‌اندازی ربات تلگرام روی هاست: پایتون، Supervisor و وبهوک

مدیر سایت۸ دقیقه مطالعه
a8 cover

ربات تلگرامی که روی لپ‌تاپ شما کار می‌کند، با بسته شدن لپ‌تاپ هم خاموش می‌شود. برای این‌که ربات شبانه‌روز به کاربران جواب بدهد، باید روی سروری اجرا شود که همیشه روشن است و به سرورهای تلگرام دسترسی دارد. در این راهنما راه‌اندازی ربات تلگرام روی هاست را قدم‌به‌قدم توضیح می‌دهیم: چرا سرور باید خارج از ایران باشد، کدام کتابخانه‌ی پایتون را انتخاب کنید، ربات را چطور با Supervisor همیشه روشن نگه دارید و چه زمانی وبهوک بهتر از Polling است.

چرا ربات تلگرام به سرور خارج از ایران نیاز دارد؟

ربات تلگرام یک برنامه‌ی معمولی است که با سرورهای تلگرام از طریق Bot API حرف می‌زند: پیام‌های جدید را از آن‌ها می‌گیرد و پاسخ را به آن‌ها می‌فرستد. پس سروری که ربات روی آن اجرا می‌شود، باید بتواند مستقیم و پایدار به سرورهای تلگرام وصل شود.

طبق گزارش سازمان Article 19، قوه‌ی قضائیه‌ی ایران در ۱۰ اردیبهشت ۱۳۹۷ (۳۰ آوریل ۲۰۱۸) دستور مسدودسازی تلگرام را صادر کرد و از ارائه‌دهندگان اینترنت خواست دسترسی به آن را حتی با ابزارهای عبور از فیلتر هم ناممکن کنند. وقتی دسترسی به سرورهای تلگرام از شبکه‌ی داخلی بسته است، ربات روی سرور یا هاست ایرانی نمی‌تواند با Bot API ارتباط بگیرد؛ استفاده از پروکسی هم روی سرور، ناپایدار و دردسرساز است.

راه‌حل ساده است: ربات را روی هاست یا سروری در خارج از ایران، مثلاً آلمان، اجرا کنید. کاربران ایرانی همچنان از طریق اپلیکیشن تلگرام خودشان با ربات کار می‌کنند و محل سرور ربات برایشان فرقی ندارد. برعکس، برای ربات پیام‌رسان‌های داخلی مثل بله، سرور داخل ایران انتخاب مناسب‌تری است.

پیش‌نیازهای راه‌اندازی

  • توکن ربات: در تلگرام به ربات رسمی BotFather پیام دهید، دستور /newbot را بفرستید، نام و نام کاربری ربات را تعیین کنید و توکنی را که می‌دهد جایی امن نگه دارید.

  • هاست یا سرور خارج از ایران با پشتیبانی از پایتون و امکان اجرای فرایند دائمی. یک هاست ربات تلگرام یا سرور مجازی اروپا هر دو مناسب‌اند.

  • پایتون ۳ و دسترسی SSH یا ترمینال برای نصب کتابخانه‌ها.

  • برای حالت وبهوک: دامنه یا زیردامنه و گواهی SSL. اگر با انواع دامنه آشنا نیستید، معرفی انواع دامنه را ببینید.

انتخاب کتابخانه: python-telegram-bot یا aiogram؟

دو کتابخانه‌ی پرکاربرد پایتون برای ساخت ربات تلگرام این‌ها هستند:

  • python-telegram-bot: کتابخانه‌ای قدیمی و جاافتاده که از نسخه‌ی ۲۰ به بعد کاملاً ناهمگام (asyncio) شده است. کلاس Application نقطه‌ی شروع آن است و هر دو روش Polling و وبهوک را پشتیبانی می‌کند. ویکی رسمی این پروژه راهنمای مفصلی برای راه‌اندازی وبهوک دارد.

  • aiogram: طبق مستندات رسمی، فریم‌ورکی مدرن و کاملاً ناهمگام بر پایه‌ی asyncio و aiohttp است که روتر، ماشین حالت متناهی (FSM) برای گفتگوهای چندمرحله‌ای و میان‌افزار دارد.

معیار

python-telegram-bot

aiogram

مدل برنامه‌نویسی

ناهمگام (از نسخه‌ی ۲۰)

کاملاً ناهمگام

مناسب برای

شروع سریع و ربات‌های ساده تا متوسط

ربات‌های بزرگ با گفتگوهای چندمرحله‌ای

سازمان‌دهی کد

Handlerها روی Application

روترها و فیلترها

وبهوک

سرور داخلی آماده با run_webhook

از طریق aiohttp

منابع آموزشی

بسیار زیاد

زیاد، به‌ویژه برای پروژه‌های بزرگ

اگر اولین ربات‌تان را می‌سازید، python-telegram-bot شروع ساده‌تری است. اگر ربات فروشگاهی یا پشتیبانی با فرم‌های چندمرحله‌ای در برنامه دارید، aiogram ساختار تمیزتری می‌دهد.

Polling یا وبهوک؟

طبق مستندات رسمی Bot API، دو روش متقابلاً انحصاری برای دریافت پیام‌ها وجود دارد: متد getUpdates (Polling) و وبهوک. پیام‌های ورودی تا زمان دریافت توسط ربات روی سرور تلگرام نگه داشته می‌شوند، اما نه بیشتر از ۲۴ ساعت.

  • Polling: ربات مدام از تلگرام می‌پرسد «پیام جدید داری؟». به دامنه و SSL نیاز ندارد و راه‌اندازی‌اش ساده‌ترین است.

  • وبهوک: تلگرام هر پیام جدید را با یک درخواست HTTPS به آدرس ربات شما می‌فرستد. به دامنه، SSL و یکی از پورت‌های مجاز نیاز دارد؛ طبق مستندات Bot API پورت‌های پشتیبانی‌شده ۴۴۳، ۸۰، ۸۸ و ۸۴۴۳ هستند.

معیار

Polling

وبهوک

پیچیدگی راه‌اندازی

کم

متوسط (دامنه، SSL، وب‌سرور)

مصرف منابع در زمان بیکاری

درخواست‌های مداوم به تلگرام

فقط هنگام رسیدن پیام

مناسب برای

شروع، تست و ربات‌های کم‌ترافیک

ربات‌های پرترافیک و تولیدی

نیاز به پورت باز

ندارد

دارد

مقایسه‌ی Polling و وبهوک در ربات تلگرام و نقش Supervisor

مراحل راه‌اندازی ربات تلگرام روی هاست

مراحل زیر برای هاست یا سرور لینوکسی با دسترسی SSH نوشته شده است. اگر هاست شما کنترل پنل دارد، ممکن است بخشی از کارها (مثل ساخت محیط مجازی پایتون) از طریق رابط گرافیکی هم انجام شود، اما منطق کار همین است: کد ربات، محیط جدا برای کتابخانه‌ها، توکن امن و یک مدیر فرایند که ربات را روشن نگه دارد.

۱. ساخت محیط مجازی و نصب کتابخانه

پس از ورود به سرور از طریق SSH، یک پوشه برای ربات بسازید، محیط مجازی پایتون ایجاد کنید و کتابخانه را نصب کنید:

mkdir -p ~/mybot/logs && cd ~/mybot
python3 -m venv venv
source venv/bin/activate
pip install python-telegram-bot

۲. نوشتن کد ربات

یک فایل bot.py بسازید. نمونه‌ی ساده با python-telegram-bot:

import os
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("سلام! ربات روشن است.")

def main():
    app = Application.builder().token(os.environ["BOT_TOKEN"]).build()
    app.add_handler(CommandHandler("start", start))
    app.run_polling()

if __name__ == "__main__":
    main()

همین ربات با aiogram (نسخه‌ی ۳) این شکل را دارد:

import asyncio, os
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message

dp = Dispatcher()

@dp.message(CommandStart())
async def start(message: Message):
    await message.answer("سلام! ربات روشن است.")

async def main():
    bot = Bot(token=os.environ["BOT_TOKEN"])
    await dp.start_polling(bot)

asyncio.run(main())

۳. نگه‌داشتن توکن بیرون از کد

همان‌طور که در کد می‌بینید، توکن از متغیر محیطی BOT_TOKEN خوانده می‌شود. هرگز توکن را مستقیم در کد ننویسید و در مخزن گیت قرار ندهید؛ هر کسی توکن را داشته باشد، کنترل کامل ربات را دارد. اگر توکن لو رفت، از BotFather توکن جدید بگیرید.

برای تست، ربات را یک بار دستی اجرا کنید (BOT_TOKEN=... python bot.py) و در تلگرام دستور /start را بفرستید. اگر جواب داد، نوبت اجرای دائمی است.

۴. ذخیره‌ی اطلاعات کاربران

بیشتر ربات‌ها دیر یا زود باید چیزی را به خاطر بسپارند: فهرست کاربران، سفارش‌ها یا مرحله‌ی هر کاربر در یک فرم. برای ربات‌های کوچک، یک فایل SQLite کنار کد کافی است. وقتی تعداد کاربران زیاد شد یا چند فرایند همزمان به داده دسترسی داشتند، به پایگاه داده‌ای مثل PostgreSQL یا MySQL مهاجرت کنید. در هر حال، فایل پایگاه داده را بیرون از پوشه‌ای نگه دارید که با هر به‌روزرسانی کد جایگزین می‌شود و از آن نسخه‌ی پشتیبان منظم بگیرید.

اجرای دائمی ربات با Supervisor

اگر ربات را در ترمینال اجرا کنید، با بسته شدن ارتباط SSH یا بروز یک خطا متوقف می‌شود. طبق مستندات Supervisor، این ابزار یک سیستم کلاینت و سرور برای پایش و کنترل فرایندها در سیستم‌عامل‌های شبه‌یونیکس است که می‌تواند فرایندها را هنگام اجرای خودش راه بیندازد و پس از کرش، خودکار دوباره اجرا کند. یک فایل پیکربندی برای ربات بسازید:

[program:mybot]
command=/home/USER/mybot/venv/bin/python /home/USER/mybot/bot.py
directory=/home/USER/mybot
environment=BOT_TOKEN="YOUR_TOKEN"
autostart=true
autorestart=true
stdout_logfile=/home/USER/mybot/logs/out.log
stderr_logfile=/home/USER/mybot/logs/err.log

سپس Supervisor را از تغییرات باخبر کنید و وضعیت ربات را ببینید:

supervisorctl reread
supervisorctl update
supervisorctl status mybot

از این به بعد، ربات پس از ری‌استارت سرور یا کرش، خودکار دوباره اجرا می‌شود. هر وقت کد را تغییر دادید، با supervisorctl restart mybot آن را بارگذاری کنید. محل و نحوه‌ی ساخت فایل پیکربندی در هاست‌های مختلف متفاوت است؛ در هاست مدیریت‌شده، مسیر دقیق را از پشتیبانی بپرسید.

راه‌اندازی وبهوک با دامنه و SSL

وقتی ربات پرکاربرد شد، وبهوک را جایگزین Polling کنید. در python-telegram-bot کافی است به‌جای run_polling از run_webhook استفاده کنید:

app.run_webhook(
    listen="127.0.0.1",
    port=8443,
    url_path="hook",
    secret_token=os.environ["WEBHOOK_SECRET"],
    webhook_url="https://bot.example.com/hook",
)

در این چیدمان، ربات روی پورت محلی گوش می‌دهد و وب‌سرور (مثل Nginx) که گواهی SSL دامنه را دارد، درخواست‌های HTTPS را به آن می‌رساند. مقدار secret_token در هدر هر درخواست تلگرام فرستاده می‌شود تا ربات فقط درخواست‌های واقعی تلگرام را بپذیرد. یادتان باشد که با فعال بودن وبهوک، getUpdates کار نمی‌کند؛ برای برگشت به Polling باید وبهوک را حذف کنید.

خطاهای رایج و نکات امنیتی

  • ربات جواب نمی‌دهد و خطای اتصال در لاگ است: سرور به سرورهای تلگرام دسترسی ندارد؛ لوکیشن سرور را بررسی کنید.

  • خطای Conflict: دو نسخه از ربات همزمان در حال Polling هستند، یا وبهوک فعال است و ربات با Polling اجرا شده.

  • ربات بعد از مدتی خاموش می‌شود: فرایند با Supervisor مدیریت نمی‌شود یا خطای کد باعث توقف شده است؛ فایل err.log را ببینید.

  • کندی در ساعات شلوغ: عملیات طولانی (مثل درخواست به سرویس بیرونی) را ناهمگام بنویسید تا بقیه‌ی پیام‌ها منتظر نمانند.

  • امنیت: توکن در متغیر محیطی، دسترسی SSH فقط با کلید، و برای ربات‌هایی که داده‌ی کاربر ذخیره می‌کنند، پشتیبان‌گیری منظم از پایگاه داده.

با رعایت همین چند نکته، راه‌اندازی ربات تلگرام روی هاست به کاری چنددقیقه‌ای تبدیل می‌شود و بیشتر وقت شما صرف توسعه‌ی خود ربات خواهد شد، نه رفع مشکلات زیرساخت.

برای تست اولیه‌ی ربات بدون خرید ماهانه، می‌توانید از هاست ساعتی آلمان استفاده کنید؛ مدل پرداخت آن را در مقاله‌ی هاست ساعتی چیست توضیح داده‌ایم. اگر هم با مفهوم سرور و تفاوت انواع آن آشنا نیستید، سرور چیست را بخوانید.

هاست ربات تلگرام آریا گستران روی سرور آلمان، با پایتون و امکان اجرای دائمی ربات آماده است؛ پلن‌ها را در صفحه‌ی هاست ربات تلگرام ببینید.

سؤالات متداول

آیا راه‌اندازی ربات تلگرام روی هاست ایران ممکن است؟

وقتی دسترسی به سرورهای تلگرام از داخل کشور مسدود است، ربات روی هاست ایرانی نمی‌تواند با Bot API ارتباط پایدار بگیرد. برای ربات تلگرام از سرور خارج از ایران استفاده کنید. برای برنامه‌های پایتونی که مخاطب داخلی دارند یا به پیام‌رسان‌های داخلی وصل می‌شوند، هاست پایتون ایران مناسب است.

برای ربات تلگرام هاست کافی است یا سرور مجازی لازم است؟

برای بیشتر ربات‌های کوچک و متوسط، هاستی که اجرای دائمی فرایند پایتون را پشتیبانی کند کافی است. اگر ربات به نرم‌افزار خاص، داکر یا منابع زیاد نیاز دارد، سرور مجازی انتخاب بهتری است.

Polling بهتر است یا وبهوک؟

برای شروع و ربات‌های کم‌ترافیک، Polling ساده‌تر است. برای ربات‌های پرترافیک، وبهوک کارآمدتر است، اما به دامنه، SSL و یکی از پورت‌های ۴۴۳، ۸۰، ۸۸ یا ۸۴۴۳ نیاز دارد.

اگر ربات چند ساعت خاموش باشد، پیام‌ها از دست می‌روند؟

طبق مستندات Bot API، پیام‌های دریافت‌نشده تا ۲۴ ساعت روی سرور تلگرام نگه داشته می‌شوند. اگر خاموشی بیشتر شود، پیام‌های قدیمی‌تر از دست می‌روند.

کدام نسخه‌ی پایتون لازم است؟

نسخه‌های جدید هر دو کتابخانه به پایتون ۳ نیاز دارند. پیش از نصب، حداقل نسخه‌ی پشتیبانی‌شده را در مستندات کتابخانه بررسی کنید و روی هاست همان نسخه یا جدیدتر را انتخاب کنید.

چطور ربات را بعد از تغییر کد به‌روز کنم؟

فایل‌های جدید را روی سرور قرار دهید، اگر کتابخانه‌ی تازه‌ای اضافه شده با pip نصب کنید و سپس با supervisorctl restart ربات را دوباره اجرا کنید.

مطالب مرتبط

هاست و سرور۶ دقیقه

سرور چیست؟ + معرفی انواع سرور

سرورها،کامپیوتر و سیستم های بسیار بزرگی هستند که به صورت 24 ساعته روشن بوده و دائما در حال تبادل اطلاعات هستند.سرور در همه مواقع در حال سرویس دادن به کلاینت ها یا خدمات گیرنده ها می باشد.در واقع…