Как отправить сообщение через Telegram API с помощью curl
Как отправить сообщение в Телеграм через API одним запросом curl: метод sendMessage, chat_id, text, parse_mode, кнопки, как узнать chat_id и что значат ошибки 400, 403 и 429.
Сообщение через Telegram API отправляет метод sendMessage Bot API: нужны токен бота, chat_id получателя и text. Из командной строки это один запрос: curl "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "text=Привет". В ответ придёт JSON с "ok": true и отправленным сообщением в поле result. Токен выдаёт @BotFather — как его получить и сберечь.
В примерах ниже вместо <ТОКЕН> стоит заглушка. Подставьте свой токен, но никому его не показывайте. Примеры написаны для оболочек bash и zsh.
Что нужно для sendMessage
Адрес запроса: https://api.telegram.org/bot<ТОКЕН>/sendMessage. Параметры метода:
chat_id— обязательный. Идентификатор чата или имя канала в формате@channelusername.text— обязательный. Текст сообщения, от 1 до 4096 символов после разбора разметки.parse_mode— необязательный. Режим разметки:HTML,MarkdownV2илиMarkdown.reply_markup— необязательный. Кнопки под сообщением или своя клавиатура.reply_parameters— ответ на конкретное сообщение.disable_notification— отправить без звука.link_preview_options— управление превью ссылок.
Метод принимает и GET, и POST. Для текста с пробелами и русскими буквами удобнее --data-urlencode: curl сам закодирует значение.
Как узнать chat_id
Как правило, бот не может начать переписку первым: человек должен сначала написать ему или добавить его в группу. Поэтому порядок такой.
- Откройте своего бота в Telegram и отправьте ему любое сообщение, например
/start. - Запросите обновления:
curl "https://api.telegram.org/bot<ТОКЕН>/getUpdates". - В ответе найдите
message, в нёмchatи полеid— это нужныйchat_id. Для канала вместо числа можно указать его@имя.
getUpdates работает, только если у бота не задан webhook — подробно в статье getUpdates и webhook. Идентификатор чата — целое число, оно может не помещаться в 32 бита, поэтому в программах храните его в 64-битном типе.
Примеры запросов
Простое сообщение: curl -s "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "text=Заказ готов"
С разметкой HTML: curl -s "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=123456789" --data-urlencode "parse_mode=HTML" --data-urlencode "text=<b>Заказ</b> готов"
В режиме HTML символы <, > и & в обычном тексте нужно заменять на <, > и &. В режиме MarkdownV2 служебные символы экранируют обратной косой чертой.
Сообщение с кнопкой-ссылкой через JSON: curl -s -X POST "https://api.telegram.org/bot<ТОКЕН>/sendMessage" -H "Content-Type: application/json" -d '{"chat_id": 123456789, "text": "Открыть сайт", "reply_markup": {"inline_keyboard": [ [{"text": "Перейти", "url": "https://example.com"}] ]}}'
JSON-тело поддерживается для всех методов, кроме загрузки файлов. У кнопки под сообщением есть text и либо url, либо callback_data (от 1 до 64 байт): по нажатию на вторую бот получает событие.
Ошибки
Ответ с ошибкой содержит "ok": false, error_code и description. Чаще всего встречаются такие:
- 401 Unauthorized. Обычно это значит, что токен неверный или заменён. Проверьте его методом
getMe— как это сделать. - 400 Bad Request: chat not found. Такого чата нет или бот его не знает: пользователь ещё ничего не писал боту, либо в
chat_idопечатка. - 403 Forbidden: bot was blocked by the user. Человек заблокировал бота и сообщения ему не доставить.
- 400 про разметку. Telegram не смог разобрать текст: в HTML не закрыт тег или не экранированы
<,>,&. - 429 Too Many Requests. Слишком частые запросы. В ответе есть поле
retry_after— через сколько секунд повторить.
Лимиты из документации Telegram: в один чат не стоит отправлять больше одного сообщения в секунду, в группу бот может отправить не больше 20 сообщений в минуту, а массовая рассылка ограничена примерно 30 сообщениями в секунду.
Не вписывайте токен прямо в скрипты, которые попадают в репозиторий: храните его в переменной окружения или в файле настроек вне репозитория.
Что дальше
Чтобы бот отвечал на сообщения, а не только отправлял их, подключите приём событий: getUpdates и webhook. Если вам нужно отправлять пользователям звёзды или Premium из своей программы, у бота Shiba Bank есть API — смотрите документацию.
Частые вопросы
Как отправить сообщение в Telegram через API?
Выполните запрос к методу sendMessage с токеном бота, chat_id и text: curl "https://api.telegram.org/bot<ТОКЕН>/sendMessage" --data-urlencode "chat_id=<ID>" --data-urlencode "text=Привет".
Как узнать chat_id для sendMessage?
Напишите боту любое сообщение и вызовите getUpdates: нужное число лежит в message.chat.id. Для публичного канала можно использовать @имя канала.
Что значит ошибка chat not found в Telegram?
Бот не знает такой чат: либо в chat_id ошибка, либо человек ещё не писал боту. Бот не может начать диалог первым.
Что значит bot was blocked by the user?
Ошибка 403: пользователь заблокировал бота, поэтому написать ему нельзя.
Можно ли отправить сообщение от имени своего аккаунта, а не бота?
Через токен — нет: запросы с токеном бота выполняет сам бот, и сообщения уходят от его имени.
Как отправить сообщение в канал через бота?
Добавьте бота в канал администратором, а в chat_id укажите @имя_канала публичного канала.


