Telegram bot webhook kurulumu: URL, secret token, getWebhookInfo ve sorun giderme
Telegram bot webhook'u kurmak için setWebhook metoduna herkese açık bir HTTPS URL vermeniz yeterli: Telegram her yeni güncellemeyi bu adrese JSON olarak POST eder. Bu rehberde webhook URL'sini ayarlamayı, secret token ile istekleri doğrulamayı, getWebhookInfo ile hata ayıklamayı ve n8n gibi araçlarda sık görülen sorunları anlatıyoruz.
Webhook mi, getUpdates mi?
| getUpdates (long polling) | Webhook | |
|---|---|---|
| Bağlantıyı kuran | Sizin kodunuz Telegram'a sorar | Telegram sizin sunucunuza POST eder |
| Gereksinim | İnternet erişimi yeterli | Herkese açık HTTPS adresi |
| Uygun olduğu yer | Geliştirme, basit botlar | Üretim, serverless, otomasyon araçları |
İki yöntem birbirini dışlar. Hangisini seçerseniz seçin, alınmayan güncellemeler en fazla 24 saat saklanır.
Webhook gereksinimleri
- İnternetten erişilebilen bir alan adı (kendinden imzalı sertifikada IP de olur). Webhook'lar IPv4 üzerinden çalışır; IPv6 desteklenmez.
- TLS 1.2 veya üstü ile HTTPS. Düz HTTP webhook mümkün değildir.
- Port: 443, 80, 88 veya 8443; başka port çalışmaz.
- Güvenilir bir sertifika (ör. Let's Encrypt). CN veya SAN alan adıyla birebir eşleşmeli, ara sertifikalar (zincir) eksiksiz sunulmalı. Kendinden imzalı sertifikayı
certificateparametresiyle yükleyin. - Yönlendirmeler (redirect) desteklenmez; URL doğrudan bot uygulamanıza ulaşmalı.
setWebhook ile Telegram bot webhook URL ayarlama
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook" \
-H "Content-Type: application/json" \
-d '{
"url": "https://bot.ornek.com/telegram/webhook",
"secret_token": "uzun-ve-rastgele_bir-deger_42",
"allowed_updates": ["message", "callback_query"],
"drop_pending_updates": true,
"max_connections": 40
}'
Başarılı yanıt: {"ok":true,"result":true,"description":"Webhook was set"}. Parametreler:
url— HTTPS adresi. Boş metin gönderirseniz webhook kaldırılır.secret_token— 1–256 karakter, yalnızcaA-Z a-z 0-9 _ -. Her istekteX-Telegram-Bot-Api-Secret-Tokenbaşlığında gelir.allowed_updates— almak istediğiniz güncelleme türleri. Hiç göndermezseniz önceki ayar korunur.drop_pending_updates—trueise bekleyen güncellemeler silinir.max_connections— eşzamanlı bağlantı sayısı, 1–100 (varsayılan 40).certificateveip_address— kendinden imzalı sertifika ve DNS yerine kullanılacak sabit IP.
Kendinden imzalı sertifikayla kurulum dosya yüklemesi gerektirir:
curl -F "url=https://203.0.113.10:8443/webhook" \
-F "certificate=@public.pem" \
"https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/setWebhook"
Parametreleri form üzerinden denemek için Bot API Tester'da setWebhook metodunu açın.
getWebhookInfo ile durumu kontrol etme
curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getWebhookInfo"
{
"ok": true,
"result": {
"url": "https://bot.ornek.com/telegram/webhook",
"has_custom_certificate": false,
"pending_update_count": 7,
"last_error_date": 1793264400,
"last_error_message": "Wrong response from the webhook: 500 Internal Server Error",
"max_connections": 40,
"allowed_updates": ["message", "callback_query"]
}
}
pending_update_count sürekli artıyorsa Telegram güncellemeleri teslim edemiyordur; nedeni last_error_message alanında yazar (sertifika hatası, zaman aşımı, 2xx olmayan yanıt vb.). last_error_date Unix zamanıdır. url boşsa webhook kurulu değildir.
Webhook secret token'ı handler'da doğrulama
Başlığı kontrol etmeyen bir uç nokta, adresi bilen herkesten sahte güncelleme kabul eder. Python ve Flask ile örnek:
import hmac
import os
from flask import Flask, abort, request
app = Flask(__name__)
SECRET = os.environ["WEBHOOK_SECRET"]
@app.post("/telegram/webhook")
def telegram_webhook():
received = request.headers.get("X-Telegram-Bot-Api-Secret-Token", "")
if not hmac.compare_digest(received.encode(), SECRET.encode()):
abort(403)
update = request.get_json(silent=True) or {}
queue_update(update) # kendi kuyruk fonksiyonunuz; ağır işi arka planda yapın
return "", 200
Hızlıca 2xx yanıt verin
Telegram, 2xx dışındaki her yanıtı başarısız sayar ve isteği bir süre tekrar dener. Handler'ınız yavaşsa veya hata veriyorsa güncellemeler birikir ve aynı güncelleme tekrar gelebilir. Bu yüzden önce 200 döndürün, işi kuyrukta yapın ve tekrarları update_id ile ayıklayın.
deleteWebhook ile polling'e dönme
curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/deleteWebhook?drop_pending_updates=true"
drop_pending_updates isteğe bağlıdır; bekleyen güncellemeleri korumak istiyorsanız eklemeyin. Webhook silindikten sonra getUpdates yeniden çalışır.
Sorun giderme
Bad Request: bad webhook: An HTTPS URL must be provided for webhook
url parametresine http:// ile başlayan bir adres verdiniz. Geçerli sertifikalı bir https:// adresi kullanın.
409 Conflict
Webhook kuruluyken getUpdates çağrılırsa şu yanıt gelir: Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first. Ya webhook'u silin ya da polling yapan kodu durdurun. Aynı token'ı iki farklı araca vermek de bu çakışmanın sık bir nedenidir.
Telegram bot webhook ve n8n: localhost sorunu
n8n'in Telegram tetikleyicisi güncellemeleri webhook ile alır. n8n yalnızca bilgisayarınızda http://localhost üzerinde çalışıyorsa Telegram ona ulaşamaz ve HTTPS koşulu sağlanmaz. n8n'i geçerli sertifikalı bir alan adında yayınlayın ya da yerel geliştirme için bir HTTPS tüneli kullanın. Aynı bot için ayrıca getUpdates çalıştırmayın; n8n'e ayrı bir bot ayırmak en temizidir (bkz. bot token rehberi).
setWebhook başarılı ama güncelleme gelmiyor
getWebhookInfo çıktısındaki last_error_message alanına bakın; eksik sertifika zinciri, güvenlik duvarı, yönlendirme veya yalnızca IPv6 destekleyen sunucu en sık nedenlerdir. Botu ilk kez kuruyorsanız Telegram bot yapma rehberindeki getUpdates adımlarıyla başlamak daha kolaydır.
Sık sorulan sorular
Webhook ile getUpdates aynı anda kullanılabilir mi?
Hayır, ikisi birbirini dışlar. Webhook kuruluyken getUpdates 409 Conflict döndürür; polling'e dönmek için deleteWebhook çağırın.
Telegram webhook için hangi portlar destekleniyor?
Yalnızca 443, 80, 88 ve 8443. 443 dışında bir port kullanacaksanız portu URL'ye yazın, ör. https://bot.ornek.com:8443/webhook. Bağlantı her durumda HTTPS olmalıdır.
Webhook secret_token ne işe yarar?
setWebhook'ta verdiğiniz değer (1–256 karakter; A-Z, a-z, 0-9, _ ve -) her istekte X-Telegram-Bot-Api-Secret-Token başlığında gelir. Başlık eşleşmeyen istekleri reddederek sahte güncellemeleri engellersiniz.
Kendinden imzalı sertifika kullanabilir miyim?
Evet. Açık anahtar sertifikanızı (PEM) setWebhook'un certificate parametresiyle dosya olarak (multipart/form-data) yükleyin; metin olarak göndermek çalışmaz.
n8n Telegram tetikleyicisi localhost'ta neden çalışmıyor?
Telegram güncellemeleri yalnızca internetten erişilebilen bir HTTPS adresine gönderir; http://localhost adresine ulaşamaz. n8n'i HTTPS'li bir alan adında yayınlayın veya bir tünel kullanın.
İlgili rehberler
Telegram bot nasıl yapılır? BotFather ile adım adım bot oluşturma
Telegram bot yapma rehberi: BotFather'da /newbot ile bot oluşturun, token'ı getMe ile test edin, chat ID'yi bulun ve Python ile ilk mesajı gönderin.
Telegram Bot API ile mesaj gönderme (send message): curl, Python ve JavaScript
Telegram Bot API send message rehberi: curl, Python ve JavaScript ile sendMessage, HTML ve MarkdownV2 biçimlendirme, inline butonlar ve sık hatalar.
Telegram bot token nasıl alınır, nerede bulunur ve nasıl iptal edilir?
Telegram bot token nedir, BotFather'dan nasıl alınır, mevcut botun token'ı nerede bulunur? getMe ile test, 401 hatası ve sızan token'ı iptal etme.
Telegram chat ID nasıl bulunur: kullanıcı, grup, kanal ve konu için adım adım
Telegram chat ID nasıl bulunur? getUpdates ile kullanıcı, grup, süper grup ve kanal ID'sini öğrenin; -100 ön eki, konu ID'si ve boş result sorunu.