Удобно получать уведомления в Telegram, но как ботам написать в канал, если он закрытый? Пройдемся по процессу с самого начала.

Чтобы создать бота

Открываем Telegram и начинаем общение с ботом по имени @BotFather, этот бот порождает новых ботов, выдает токены, позволяет конфигурировать и удалять их.

Команда /start включает бота и обычно пишется сама.

С помощью команды /newbot создаем нового бота, и следующим сообщением передаем его имя, которое будет отображаться для него в чате. Я напишу просто Test.

Следующим сообщением надо отправить логин для бота, он должен оканчиваться на bot. Я напишу test0004bot, чтобы наверняка был свободен.

botfather telegram welcome

В итоге мы создали нового бота и получили его токен для доступа по API.

Чтобы написать в закрытый канал

Предположим, что закрытый канал уже создан (там пара кликов) и приступим к колдовству.

Добавляем бота в администраторы

Из определения закрытого канала, в поиске его не найти, и в него не может написать простой пользователь, только администраторы имеют такое право (в том и отличие от группы, где все более-менее равны и могут общаться). То есть нашего бота нужно добавить в администраторы.

Здесь есть один момент! В некоторых клиентах Telegram, при наборе логина бота в поле для добавления администратора, нужно продолжать набирать символы до конца, хотя подсказок нет и вообще кнопка неактивна, все в итоге будет в порядке!

Заполучаем необходимые данные

Исходя из документации Telegram Bot API, нам нужен chat_id, чтобы бот мог вообще написать в чат, но где его взять для закрытого канала? Заходим на WEB-версию Telegram и выбираем наш закрытый канал, обращаем внимание на ссылку в адресной строке, в моем случае это https://web.telegram.org/#/im?p=c1099761134_142.... Нас интересует часть между =c и _, в моем случае это 1099761134. Это почти chat_id, для работоспособности к этому числу надо приписать слева -100, то есть в моем случае -1001099761134. Готово.

Отправляем запрос к API

Далее нам остается отправить POST-запрос к https://api.telegram.org/bot<токен>/sendMessage, в тело которого я добавлю следующий JSON:

{
    "chat_id": -1001099761134,
    "text": "123"
}

и не забуду добавить соответствующий HTTP-заголовок (Content-Type: application/json), чтобы сервер корректно воспринял JSON.

Ответ:

{
  "ok": true,
  "result": {
    "message_id": 3,
    "chat": {
      "id": -1001099761134,
      "title": "Test Channel",
      "type": "channel"
    },
    "date": 1493376264,
    "text": "123"
  }
}

положительный. Вот и готово!

telegram chat result ok