Telegram Bot API ile mesaj gönderme (send message): curl, Python ve JavaScript
Telegram Bot API ile mesaj göndermek (send message) için https://api.telegram.org/bot<token>/sendMessage adresine chat_id ve text parametreleriyle bir GET veya POST isteği atmanız yeterli; başarılı olursa gönderilen mesaj result alanında döner. Kendi Telegram mesaj gönderme botunuz için gereken her şey aşağıda: curl, Python ve JavaScript örnekleri, HTML ve MarkdownV2 biçimlendirme, butonlar ve sık görülen hatalar.
sendMessage istek formatı
Parametreleri query string, application/x-www-form-urlencoded, application/json veya multipart/form-data olarak gönderebilirsiniz. En sık kullanılanlar:
chat_id(zorunlu) — sayısal ID veya@kanaladi. Nasıl bulunacağı chat ID rehberinde.text(zorunlu) — 1–4096 karakter.parse_mode—HTML,MarkdownV2veya eskiMarkdown.reply_markup,link_preview_options,disable_notification,protect_content,reply_parameters,message_thread_id.
curl ile mesaj gönderme
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": 123456789, "text": "Sunucu yedeği tamamlandı."}'
Python ile Telegram bot send message
import os
import requests
TOKEN = os.environ["BOT_TOKEN"]
API = f"https://api.telegram.org/bot{TOKEN}"
def send_message(chat_id, text, **extra):
payload = {"chat_id": chat_id, "text": text, **extra}
data = requests.post(f"{API}/sendMessage", json=payload, timeout=10).json()
if not data["ok"]:
raise RuntimeError(f'{data["error_code"]}: {data["description"]}')
return data["result"]
msg = send_message(123456789, "Siparişiniz kargoya verildi.")
print(msg["message_id"])
JavaScript (fetch) ile
// Node.js 18+ (ES modülü)
const TOKEN = process.env.BOT_TOKEN;
const res = await fetch(`https://api.telegram.org/bot${TOKEN}/sendMessage`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ chat_id: 123456789, text: "Yeni form gönderimi var." }),
});
const data = await res.json();
console.log(data.ok ? data.result.message_id : data.description);
Bu kodu tarayıcıda çalışan bir sayfaya koymayın: token'ı herkes görür. İstekleri sunucu tarafından yapın.
Biçimlendirme: parse_mode HTML ve MarkdownV2
HTML
Desteklenen etiketler: <b>/<strong>, <i>/<em>, <u>/<ins>, <s>/<strike>/<del>, <span class="tg-spoiler">/<tg-spoiler>, <a href="…">, <code>, <pre> (dil için <pre><code class="language-python">), <blockquote> ve <blockquote expandable>. Etiket dışındaki <, > ve & karakterlerini <, >, & olarak yazın.
{
"chat_id": 123456789,
"parse_mode": "HTML",
"text": "<b>Sipariş #1042</b>\nDurum: <i>kargoda</i>\nStok < 5 adet\n<a href=\"https://example.com/takip\">Kargo takibi</a>"
}
MarkdownV2
Şu karakterler metinde kaçışsız geçemez, önlerine \ konmalıdır: _ * [ ] ( ) ~ ` > # + - = | { } . !. Örnek metin: *Sipariş \#1042* hazır\!. Kullanıcıdan gelen metni eklerken şu yardımcıyı kullanın:
import re
def escape_md2(text: str) -> str:
return re.sub(r"([_*\[\]()~`>#+\-=|{}.!\\])", r"\\\1", text)
send_message(123456789, f"*Yeni üye:* {escape_md2('ali_k (İzmir).')}", parse_mode="MarkdownV2")
Dinamik içerikte HTML modu çoğu zaman daha güvenlidir: Python'da html.escape() yeterlidir.
Inline klavye: reply_markup ile butonlar
{
"chat_id": 123456789,
"text": "Siparişinizi onaylıyor musunuz?",
"reply_markup": {
"inline_keyboard": [
[{"text": "Siteyi aç", "url": "https://example.com"}],
[{"text": "Onayla", "callback_data": "order:1042:ok"}, {"text": "İptal", "callback_data": "order:1042:no"}]
]
}
}
url butonu bağlantıyı açar; callback_data butonu ise botunuza callback_query güncellemesi gönderir. callback_data 1–64 bayt olmalıdır (Türkçe harfler UTF-8'de 2 bayt tutar, kısa ASCII kodlar kullanın). Basışlara answerCallbackQuery ile yanıt verin. Form-urlencoded istekte reply_markup değerini JSON metni olarak gönderin.
Gruba ve kanala mesaj gönderme
- Grup: negatif chat ID; süper gruplarda
-1001234567890biçimi. Bot grubun üyesi olmalı. - Forum konusu:
chat_idile birliktemessage_thread_idgönderin. - Kanal:
@kanaladiveya-100…ID. Bot kanalda mesaj yayınlama yetkisine sahip yönetici olmalı.
Sessiz mesaj ve bağlantı önizlemesi
{
"chat_id": 123456789,
"text": "Gece bakımı 02:00'de başlıyor: https://example.com/durum",
"disable_notification": true,
"link_preview_options": {"is_disabled": true}
}
disable_notification bildirimi sessiz yapar. link_preview_options ile önizlemeyi kapatabilir ya da url, prefer_large_media ve show_above_text alanlarıyla özelleştirebilirsiniz. protect_content mesajın iletilmesini ve kaydedilmesini engeller.
Sık görülen hatalar
| Kod | Açıklama | Çözüm |
|---|---|---|
| 400 | Bad Request: chat not found | ID yanlış, eksi veya -100 silinmiş, bot sohbette değil ya da kullanıcı bota hiç yazmamış. |
| 400 | Bad Request: can't parse entities | Biçimlendirme hatalı; MarkdownV2 karakterlerini kaçışlayın veya HTML'e geçin. |
| 403 | Forbidden: bot was blocked by the user | Kullanıcı botu engellemiş; bu kullanıcıya göndermeyi bırakın. |
| 429 | Too Many Requests: retry after N | parameters.retry_after saniye bekleyip tekrar deneyin. |
Hız sınırları: aynı sohbete saniyede 1, gruba dakikada 20, toplu gönderimde saniyede yaklaşık 30 mesaj. Daha fazlası için allow_paid_broadcast saniyede 1000 mesaja kadar izin verir; mesaj başına 0,1 Telegram Stars ödenir.
import time
def send_with_retry(chat_id, text):
while True:
data = requests.post(f"{API}/sendMessage", json={"chat_id": chat_id, "text": text}, timeout=10).json()
if data.get("error_code") == 429:
time.sleep(data["parameters"]["retry_after"])
continue
return data
Tarayıcıda deneyin
Bot API Tester'da sendMessage metodunu açın: token'ı girin, chat_id ve text alanlarını doldurun, parse_mode ve reply_markup'ı deneyip yanıtı JSON görüntüleyicide inceleyin. Tüm parametrelerin İngilizce referansı sendMessage sayfasında. Botunuz henüz yoksa Telegram bot yapma rehberinden başlayın.
Sık sorulan sorular
Telegram bot mesajının uzunluk sınırı nedir?
text parametresi, biçimlendirme ayrıştırıldıktan sonra 1–4096 karakter olabilir. Daha uzun metinleri birkaç mesaja bölün.
MarkdownV2'de “can't parse entities” hatası neden çıkar?
MarkdownV2'de _ * [ ] ( ) ~ ` > # + - = | { } . ! karakterlerinin önüne \ konmalıdır. Kaçışsız tek bir nokta veya ünlem bile bu hataya yol açar; dinamik metinlerde HTML modu genellikle daha kolaydır.
Kanala bot ile nasıl mesaj gönderilir?
Botu kanala yönetici olarak ekleyin ve chat_id olarak @kanaladi (herkese açık kanal) veya -100 ile başlayan sayısal ID'yi kullanın.
Bildirim sesi olmadan mesaj gönderebilir miyim?
Evet, disable_notification parametresini true yapın; kullanıcı bildirimi sessiz olarak alır.
429 Too Many Requests hatasında ne yapmalıyım?
Yanıttaki parameters.retry_after kadar saniye bekleyip isteği tekrarlayın. Aynı sohbete saniyede 1'den, bir gruba dakikada 20'den fazla mesaj göndermeyin; toplu gönderimde sınır saniyede yaklaşık 30 mesajdır.
İ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 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 bot webhook kurulumu: URL, secret token, getWebhookInfo ve sorun giderme
Telegram bot webhook kurulumu: setWebhook ile HTTPS URL ve secret_token ayarlayın, getWebhookInfo ile hataları görün; 409 Conflict ve n8n localhost çözümü.
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.