Telegram Bot API
🌐 Türkçe

Telegram Bot API ile mesaj gönderme (send message): curl, Python ve JavaScript

· 7 dk okuma

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:

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 &lt;, &gt;, &amp; olarak yazın.

{
  "chat_id": 123456789,
  "parse_mode": "HTML",
  "text": "<b>Sipariş #1042</b>\nDurum: <i>kargoda</i>\nStok &lt; 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

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

KodAçıklamaÇözüm
400Bad Request: chat not foundID yanlış, eksi veya -100 silinmiş, bot sohbette değil ya da kullanıcı bota hiç yazmamış.
400Bad Request: can't parse entitiesBiçimlendirme hatalı; MarkdownV2 karakterlerini kaçışlayın veya HTML'e geçin.
403Forbidden: bot was blocked by the userKullanıcı botu engellemiş; bu kullanıcıya göndermeyi bırakın.
429Too Many Requests: retry after Nparameters.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.

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.