تفاوت Webhook و Polling در ربات تلگرام
اگه ربات تلگرام ساخته باشی، احتمالا به این موضوع برخوردی که بین webhook و polling کدوم رو انتخاب کنی. هر دو روش پیام های کاربر رو به ربات میرسونن، ولی از نظر سرعت، مصرف منابع و پیش نیازها تفاوت جدی دارن.
Webhook و Polling چیه؟
Polling: ربات به صورت دوره ای از تلگرام میپرسه «پیام جدید داری؟» و پیامها رو دریافت میکنه (متد getUpdates).
Webhook: تلگرام به محض دریافت پیام، اون رو مستقیم به آدرس سرور شما میفرسته (متد setWebhook).
Polling چیه و چطور کار میکنه؟
تو روش polling، ربات هر چند ثانیه (مثلا هر ۱ تا ۲ ثانیه) یه بار از تلگرام میپرسه «پیام جدیدی هست؟». تلگرام یه صف از پیام ها نگه میداره و ربات اون ها رو برمیداره.
کد polling با telebot
import telebot BOT_TOKEN = "YOUR_BOT_TOKEN" bot = telebot.TeleBot(BOT_TOKEN) @bot.message_handler(commands=['start']) def send_welcome(message): bot.reply_to(message, "ربات با polling اجرا شد.") bot.infinity_polling()
نکته: infinity_polling() نسبت به polling() مقاوم تره و خطاها رو خودش مدیریت میکنه.
کد polling با PHP
$lastUpdateId = 0;
while (true) {
$response = file_get_contents(
"https://api.telegram.org/bot" . BOT_TOKEN . "/getUpdates?offset=" . ($lastUpdateId + 1)
);
$data = json_decode($response, true);
foreach ($data['result'] as $update) {
$lastUpdateId = $update['update_id'];
}
sleep(2);
}
Webhook چیه و چطور کار میکنه؟
تو روش webhook، شما یه آدرس HTTPS به تلگرام معرفی میکنید. تلگرام هر پیام جدید رو مستقیم به همون آدرس میفرسته و ربات نیازی به درخواست دوره ای نداره.
پیش نیازهای webhook
دامنه معتبر
گواهی SSL (HTTPS اجباریه)
پورت مجاز: 443، 80، 88 یا 8443
کد webhook با telebot + Flask
کتابخانه telebot وبسرور داخلی نداره؛ برای webhook باید از Flask یا FastAPI کنارش استفاده کنید:
import telebot
from flask import Flask, request
BOT_TOKEN = "YOUR_BOT_TOKEN"
bot = telebot.TeleBot(BOT_TOKEN)
app = Flask(__name__)
@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.reply_to(message, "ربات با webhook اجرا شد.")
@app.route('/' + BOT_TOKEN, methods=['POST'])
def get_message():
json_string = request.get_data().decode('utf-8')
update = telebot.types.Update.de_json(json_string)
bot.process_new_updates([update])
return "OK", 200
@app.route("/")
def webhook():
bot.remove_webhook()
bot.set_webhook(url="https://yourdomain.com/" + BOT_TOKEN)
return "Webhook set!", 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8443)
تنظیم webhook با API
curl -F "url=https://yourdomain.com/YOUR_BOT_TOKEN" \ https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook
حذف webhook
curl https://api.telegram.org/botYOUR_BOT_TOKEN/deleteWebhook
نکته: اگه webhook فعال باشه و polling اجرا کنید، خطای 409 Conflict میگیرید. اول deleteWebhook رو اجرا کنید.
کدوم روش رو انتخاب کنیم؟
Polling مناسبته اگه:
در حال تست یا توسعه روی سیستم محلی هستید
دامنه و SSL ندارید
ترافیک ربات پایینه
Webhook مناسبته اگه:
پروژه واقعی و عملیاتی دارید
ترافیک بالا و نیاز به پاسخ آنی دارید
دامنه و SSL دارید
روی VPS یا سرور با پورت باز کار میکنید