Telegram Bot API
🌐 فارسی

وب هوک ربات تلگرام: راه‌اندازی setWebhook، بررسی و رفع خطا

· 7 دقیقه مطالعه

وب هوک تلگرام یعنی به جای اینکه ربات مدام با getUpdates از تلگرام آپدیت بخواهد، تلگرام هر آپدیت را با یک درخواست HTTPS POST به آدرس سرور شما می‌فرستد. برای ست کردن وب هوک کافی است متد setWebhook را با یک آدرس HTTPS عمومی صدا بزنید. در این راهنما پیش‌نیازها، پارامترهای مهم، بررسی وضعیت با getWebhookInfo، کد دریافت آپدیت و رفع خطاهای رایج را می‌بینید.

وب هوک یا getUpdates؟

getUpdates (long polling)وب هوک
روش کارربات از تلگرام آپدیت می‌خواهدتلگرام آپدیت را به سرور شما می‌فرستد
نیازمندیفقط دسترسی به اینترنتآدرس HTTPS عمومی و گواهی معتبر
مناسب برایتوسعه، تست و اسکریپت‌های سادهربات‌های پرکاربرد و سرورهای production

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

پیش‌نیازهای وب هوک ربات تلگرام

ست وب هوک تلگرام با setWebhook

curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/telegram/webhook",
    "secret_token": "my_secret_123",
    "allowed_updates": ["message", "callback_query"],
    "drop_pending_updates": true,
    "max_connections": 40
  }'

پاسخ موفق:

{"ok": true, "result": true, "description": "Webhook was set"}
پارامترتوضیح
urlآدرس HTTPS برای دریافت آپدیت‌ها؛ رشته خالی وب هوک را حذف می‌کند.
secret_token1 تا 256 کاراکتر از A-Z، a-z، 0-9، زیرخط و خط تیره؛ در هدر X-Telegram-Bot-Api-Secret-Token برمی‌گردد.
allowed_updatesلیست نوع آپدیت‌ها؛ اگر ارسال نشود، تنظیم قبلی باقی می‌ماند.
drop_pending_updatesبا true آپدیت‌های در صف دور ریخته می‌شوند.
max_connectionsحداکثر اتصال هم‌زمان، از 1 تا 100 (پیش‌فرض 40).
certificateفایل کلید عمومی برای گواهی خودامضا (فقط به صورت فایل).
ip_addressIP ثابت به جای IP حاصل از DNS.

با گواهی خودامضا، درخواست باید multipart/form-data باشد:

curl -F "url=https://203.0.113.10:8443/telegram/webhook" \
  -F "certificate=@public.pem" \
  -F "secret_token=my_secret_123" \
  "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook"

همین کار را بدون ترمینال در Bot API Tester روی متد setWebhook انجام دهید.

بررسی وضعیت با getWebhookInfo

curl https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getWebhookInfo
{"ok": true, "result": {
  "url": "https://example.com/telegram/webhook",
  "has_custom_certificate": false,
  "pending_update_count": 12,
  "last_error_date": 1793266200,
  "last_error_message": "Connection timed out",
  "max_connections": 40,
  "allowed_updates": ["message", "callback_query"]
}}

اگر pending_update_count مدام بالا می‌رود و last_error_message پر است، تلگرام نمی‌تواند آپدیت را تحویل دهد؛ متن خطا معمولاً مشکل را نشان می‌دهد (گواهی، پورت بسته، timeout یا پاسخ غیر 2xx). اگر url خالی باشد، وب هوکی تنظیم نشده است.

دریافت آپدیت و بررسی secret token

در سرور، مقدار هدر X-Telegram-Bot-Api-Secret-Token را با توکن مخفی خود مقایسه کنید و درخواست‌های دیگر را رد کنید. نمونه با Flask:

import hmac
import os
from flask import Flask, abort, request

SECRET = os.environ["WEBHOOK_SECRET"]
app = Flask(__name__)

def handle_update(update):
    print(update["update_id"])

@app.post("/telegram/webhook")
def telegram_webhook():
    got = request.headers.get("X-Telegram-Bot-Api-Secret-Token", "")
    if not hmac.compare_digest(got, SECRET):
        abort(403)
    handle_update(request.get_json())
    return "", 200

سریع پاسخ 2xx بدهید. اگر سرور پاسخ غیر 2xx برگرداند یا دیر جواب دهد، تلگرام همان آپدیت را دوباره می‌فرستد؛ پس کارهای سنگین را به صف یا پردازش پس‌زمینه بسپارید و تکراری بودن آپدیت را با update_id تشخیص دهید.

حذف وب هوک و بازگشت به getUpdates

curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/deleteWebhook?drop_pending_updates=true"

پاسخ Webhook was deleted یعنی وب هوک حذف شد و حالا getUpdates کار می‌کند. پارامتر drop_pending_updates اختیاری است؛ اگر آپدیت‌های در صف را لازم دارید، آن را نفرستید.

رفع خطاهای رایج وب هوک

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

پرسش‌های متداول

وب هوک تلگرام چیست؟

روشی برای دریافت آپدیت‌هاست که در آن تلگرام هر آپدیت را با یک درخواست HTTPS POST به آدرس شما می‌فرستد، به جای اینکه ربات مدام getUpdates را صدا بزند.

چطور وب هوک ربات تلگرام را ست کنم؟

متد setWebhook را با پارامتر url (آدرس HTTPS عمومی روی پورت 443، 80، 88 یا 8443) صدا بزنید و بهتر است secret_token هم بفرستید. نتیجه را با getWebhookInfo بررسی کنید.

چطور وب هوک را حذف کنم؟

متد deleteWebhook را صدا بزنید؛ با drop_pending_updates=true آپدیت‌های در صف هم پاک می‌شوند. بعد از آن دوباره می‌توانید از getUpdates استفاده کنید.

secret_token در وب هوک چیست؟

رشته‌ای 1 تا 256 کاراکتری (A-Z، a-z، 0-9، زیرخط و خط تیره) است که تلگرام در هدر X-Telegram-Bot-Api-Secret-Token هر درخواست می‌فرستد تا مطمئن شوید درخواست از وب هوکی است که خودتان تنظیم کرده‌اید.

آیا وب هوک روی localhost یا http کار می‌کند؟

با سرور ابری api.telegram.org خیر؛ آدرس باید HTTPS و از اینترنت در دسترس باشد. برای توسعه محلی از یک تونل HTTPS یا سرور با دامنه و گواهی معتبر استفاده کنید.

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

getWebhookInfo را صدا بزنید. اگر pending_update_count بالا می‌رود و last_error_message پر است، تلگرام نمی‌تواند به سرور شما برسد یا سرور پاسخ 2xx نمی‌دهد.

ساخت ربات تلگرام: آموزش قدم‌به‌قدم از BotFather تا اولین پیام با Python

ساخت ربات تلگرام قدم‌به‌قدم: ساخت ربات در BotFather، گرفتن توکن، تست با getMe، پیدا کردن chat id و ارسال اولین پیام با curl و Python.

ارسال پیام با ربات تلگرام از طریق API تلگرام (sendMessage)

آموزش ارسال پیام با ربات تلگرام از طریق API تلگرام: متد sendMessage با curl، Python و JavaScript، قالب‌بندی HTML و MarkdownV2، دکمه شیشه‌ای و رفع خطاها.

توکن ربات تلگرام: چیست، چطور بگیریم، بررسی و باطل کنیم

توکن ربات تلگرام چیست و از کجا بگیریم؟ گرفتن توکن از BotFather، پیدا کردن توکن ربات قبلی، تست با getMe، باطل کردن توکن لو رفته و نگهداری امن آن.

چت آیدی تلگرام: چیست، کجاست و چطور chat id کاربر، گروه و کانال را پیدا کنیم

چت آیدی تلگرام کجاست؟ پیدا کردن chat_id کاربر، گروه، سوپرگروه، کانال و تاپیک با getUpdates، معنی آیدی‌های منفی و رفع مشکل نتیجه خالی و خطای 409.