ارسال پیام با ربات تلگرام از طریق API تلگرام (sendMessage)
برای ارسال پیام با ربات تلگرام، متد sendMessage را در آدرس https://api.telegram.org/bot<token>/sendMessage با دو پارامتر اجباری chat_id (گیرنده) و text (1 تا 4096 کاراکتر) صدا بزنید. در این راهنما نمونههای آماده curl، Python و JavaScript، قالببندی HTML و MarkdownV2، دکمههای شیشهای، ارسال به گروه و کانال و خطاهای رایج را میبینید.
ساختار درخواست در API تلگرام
همه متدهای Bot API به شکل https://api.telegram.org/bot<token>/METHOD_NAME صدا زده میشوند؛ کلمه bot بدون اسلش به توکن میچسبد. هم GET و هم POST کار میکند و پارامترها را میتوانید به صورت query string، application/x-www-form-urlencoded، application/json یا multipart/form-data بفرستید. متن باید UTF-8 باشد، پس متن فارسی بدون مشکل ارسال میشود.
| پارامتر | کاربرد |
|---|---|
chat_id | اجباری؛ آیدی عددی چت یا @channelusername |
text | اجباری؛ 1 تا 4096 کاراکتر |
parse_mode | HTML، MarkdownV2 یا Markdown قدیمی |
reply_markup | دکمه شیشهای، کیبورد معمولی یا حذف کیبورد |
link_preview_options | تنظیم یا غیرفعال کردن پیشنمایش لینک |
disable_notification | ارسال بیصدا |
reply_parameters | ریپلای به یک پیام مشخص |
message_thread_id | ارسال در یک تاپیک |
پاسخ همیشه JSON است: در صورت موفقیت ok برابر true و پیام در result؛ در صورت خطا ok برابر false همراه error_code و description. توکن یا چت آیدی ندارید؟ راهنمای توکن ربات و راهنمای چت آیدی را ببینید. یادتان باشد کاربر باید اول ربات را استارت کرده باشد.
ارسال پیام با curl
curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage?chat_id=123456789&text=Hello"
برای پیامهای پیچیدهتر بدنه JSON بفرستید:
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": 123456789, "text": "Hello from curl"}'
ارسال پیام توسط ربات تلگرام با Python
import requests
TOKEN = "123456789:AAEexampleTokenReplaceWithYours"
API = f"https://api.telegram.org/bot{TOKEN}"
def send_message(chat_id, text, **params):
payload = {"chat_id": chat_id, "text": text, **params}
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, "سلام از پایتون!")
print("message_id:", msg["message_id"])
message_id را نگه دارید تا بعداً بتوانید پیام را ویرایش یا حذف کنید.
ارسال پیام با JavaScript
در Node.js نسخه 18 به بالا (به صورت ES module)، روی سرور اجرا شود:
const TOKEN = process.env.TELEGRAM_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: "سلام از جاوااسکریپت!" }),
});
const data = await res.json();
if (!data.ok) throw new Error(`${data.error_code}: ${data.description}`);
این کد را در مرورگر یا اپ سمت کاربر اجرا نکنید؛ هر کس توکن را ببیند کنترل ربات را دارد.
قالببندی با parse_mode HTML
با "parse_mode": "HTML" فقط این تگها پشتیبانی میشوند:
<b> <strong> <i> <em> <u> <ins> <s> <strike> <del>
<span class="tg-spoiler"> <tg-spoiler> <a href="..."> <code> <pre>
<pre><code class="language-python"> <blockquote> <blockquote expandable>
هر کاراکتر <، > و & که جزو تگ نیست باید به <، > و & تبدیل شود؛ متن کاربران را قبل از ارسال escape کنید:
import html
name = html.escape("Tom & Jerry <3", quote=False)
send_message(123456789, f"<b>سفارش 1024</b> برای {name} <i>ارسال شد</i>",
parse_mode="HTML")
قالببندی با MarkdownV2
در MarkdownV2 از *bold*، _italic_، __underline__، ~strike~، ||spoiler|| و [text](https://example.com) استفاده میشود. نکته اصلی: خارج از entityها این کاراکترها باید با بکاسلش escape شوند:
_ * [ ] ( ) ~ ` > # + - = | { } . !
خود بکاسلش هم باید escape شود. علائم فارسی مثل «،» و «؟» در این لیست نیستند، اما نقطه و علامت تعجب هستند. نقطه یا خط تیره escapeنشده رایجترین علت خطای 400 با متن can't parse entities است. تابع کمکی:
import re
def escape_md2(text):
return re.sub(r"([_*\[\]()~`>#+\-=|{}.!\\])", r"\\\1", text)
send_message(123456789, "*" + escape_md2("نسخه 2.1 منتشر شد!") + "*",
parse_mode="MarkdownV2")
دکمه شیشهای (inline keyboard) با reply_markup
دکمههای شیشهای زیر پیام نمایش داده میشوند. دکمه url لینک باز میکند و دکمه callback_data رشتهای 1 تا 64 بایتی را در آپدیت callback_query به ربات برمیگرداند. هر حرف فارسی در UTF-8 دو بایت است، پس در callback_data شناسههای کوتاه لاتین بگذارید.
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": 123456789,
"text": "Choose:",
"reply_markup": {"inline_keyboard": [[
{"text": "Open site", "url": "https://example.com"},
{"text": "Press", "callback_data": "pressed"}
]]}
}'
بعد از زدن دکمه callback، متد answerCallbackQuery را صدا بزنید تا حالت انتظار روی دکمه برداشته شود.
ارسال پیام در گروه، کانال و تاپیک
- گروه: ربات را عضو گروه کنید و از آیدی منفی گروه استفاده کنید؛ سوپرگروهها با
-100شروع میشوند. - کانال: ربات باید ادمین با اجازه ارسال پیام باشد. کانال عمومی
@channelusernameرا قبول میکند و کانال خصوصی آیدی عددی -100…را. - تاپیک: پارامتر
message_thread_idرا اضافه کنید.
پیام بیصدا و پیشنمایش لینک
{
"chat_id": 123456789,
"text": "تغییرات نسخه جدید: https://example.com/changelog",
"disable_notification": true,
"protect_content": true,
"link_preview_options": {"is_disabled": true}
}
disable_notification اعلان را بدون صدا میفرستد، protect_content جلوی فوروارد و ذخیره را میگیرد و link_preview_options با is_disabled پیشنمایش لینک را حذف میکند.
خطاهای رایج ارسال پیام
| خطا | علت و راهحل |
|---|---|
Bad Request: chat not found (400) | آیدی اشتباه است، کاربر ربات را استارت نکرده یا ربات عضو چت نیست. |
can't parse entities (400) | کاراکتر escapeنشده در MarkdownV2 یا HTML نامعتبر. |
Unauthorized (401) | توکن اشتباه یا باطل شده است. |
Forbidden: bot was blocked by the user (403) | کاربر ربات را بلاک کرده؛ ارسال به او را متوقف کنید. |
Too Many Requests: retry after N (429) | محدودیت ارسال؛ به اندازه parameters.retry_after ثانیه صبر کنید. |
import time
def send_with_retry(chat_id, text, **params):
while True:
payload = {"chat_id": chat_id, "text": text, **params}
r = requests.post(f"{API}/sendMessage", json=payload, timeout=10).json()
if r["ok"]:
return r["result"]
if r["error_code"] != 429:
raise RuntimeError(r["description"])
time.sleep(r.get("parameters", {}).get("retry_after", 1))
برای ارسال انبوه، حدود 1 پیام در ثانیه در هر چت، 20 پیام در دقیقه در هر گروه و حدود 30 پیام در ثانیه در مجموع را رعایت کنید.
تست sendMessage در مرورگر
- متد sendMessage را در Bot API Tester باز کنید و توکن را وارد کنید (در localStorage مرورگر خودتان میماند).
chat_idوtextو در صورت نیازparse_modeوreply_markupرا پر کنید.- دکمه اجرا یا Ctrl+Enter را بزنید و پاسخ JSON را ببینید.
فهرست کامل پارامترها در مرجع متد sendMessage (انگلیسی) آمده است. اگر ربات باید به پیامهای ورودی جواب بدهد، راهاندازی وبهوک ربات تلگرام را هم ببینید.
پرسشهای متداول
چطور با API تلگرام پیام بفرستم؟
آدرس https://api.telegram.org/bot<token>/sendMessage را با GET یا POST و دو پارامتر chat_id و text صدا بزنید. در صورت موفقیت، ok برابر true است و پیام ارسالشده در result برمیگردد.
آیا ربات میتواند به کاربری که استارتش نکرده پیام بدهد؟
خیر. رباتها نمیتوانند شروعکننده گفتگو باشند؛ کاربر باید اول به ربات پیام بدهد یا آن را به گروه اضافه کند. تا آن موقع ارسال پیام با خطا روبهرو میشود.
کدام کاراکترها در MarkdownV2 باید escape شوند؟
خارج از entityها این کاراکترها باید با \ escape شوند: _ * [ ] ( ) ~ ` > # + - = | { } . !. حروف و علائم فارسی مثل ، و ؟ نیازی به escape ندارند.
چطور با ربات در کانال پیام بفرستم؟
ربات را ادمین کانال با اجازه ارسال پیام کنید و در chat_id برای کانال عمومی @channelusername و برای کانال خصوصی آیدی عددی مثل -1001234567890 را بفرستید.
خطای 429 Too Many Requests یعنی چه؟
از محدودیت ارسال عبور کردهاید (حدود 1 پیام در ثانیه در هر چت، 20 پیام در دقیقه در گروه و حدود 30 پیام در ثانیه در ارسال انبوه). به اندازه retry_after ثانیه صبر کنید و دوباره بفرستید.
حداکثر طول پیام تلگرام چقدر است؟
پارامتر text بعد از پردازش entityها 1 تا 4096 کاراکتر است. متن طولانیتر را در چند پیام بفرستید.
آموزشهای مرتبط
ساخت ربات تلگرام: آموزش قدمبهقدم از BotFather تا اولین پیام با Python
ساخت ربات تلگرام قدمبهقدم: ساخت ربات در BotFather، گرفتن توکن، تست با getMe، پیدا کردن chat id و ارسال اولین پیام با curl و Python.
توکن ربات تلگرام: چیست، چطور بگیریم، بررسی و باطل کنیم
توکن ربات تلگرام چیست و از کجا بگیریم؟ گرفتن توکن از BotFather، پیدا کردن توکن ربات قبلی، تست با getMe، باطل کردن توکن لو رفته و نگهداری امن آن.
وب هوک ربات تلگرام: راهاندازی setWebhook، بررسی و رفع خطا
آموزش ست وب هوک تلگرام با setWebhook: پیشنیازهای HTTPS و پورتها، secret_token، بررسی با getWebhookInfo، حذف وب هوک و رفع خطاهای رایج مثل 409.
چت آیدی تلگرام: چیست، کجاست و چطور chat id کاربر، گروه و کانال را پیدا کنیم
چت آیدی تلگرام کجاست؟ پیدا کردن chat_id کاربر، گروه، سوپرگروه، کانال و تاپیک با getUpdates، معنی آیدیهای منفی و رفع مشکل نتیجه خالی و خطای 409.