تفاوت Webhook و Polling در ربات تلگرام

تفاوت 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 یا سرور با پورت باز کار میکنید

 amir

amir

برنامه نویس python, php طراح سایت