Вязальный кружок собирается в субботу. В канале нужно объявить время, место и какие взять спицы. Текст готов. Бот тоже вроде при деле: получил имя, аватарку и сидит с видом нового сотрудника. Только объявление по-прежнему лежит у вас. Сотрудник пока даже не знает, в какое здание его наняли.
Чтобы бот отправил пост в Telegram-канал, его нужно зарегистрировать через BotFather, добавить администратором с правом публикации и дать ему готовый текст для отправки. Между готовым текстом и отправкой оставим ваше подтверждение. Сначала проверим всё на отдельном канале без подписчиков.
Нитобэ в эпиграфе описывает молодого японского студента: замыслов у того уже на целую вселенную. У будущего бота тоже быстро вырастает воздушный замок. Он будет сочинять посты, встречать новичков, вести запись на мастер-классы, а вы наконец спокойно свяжете второй рукав. Начнём с маленькой работающей двери в этот замок — отправим утверждённый анонс.
Как создать бота для Telegram-канала с одним готовым постом
У этой маленькой редакции три роли. Вы решаете, что сказать людям. Текстовый файл хранит принятую версию. Бот получает разрешение отнести её в канал. Нейросеть в отдельном разговоре поможет вам разобраться с настройками и текстом. Но право придумать заголовок ещё не означает права объявить людям, куда приходить в субботу.
Путь здесь ручной: вы видите текст у себя, проверяете адрес канала и сами запускаете отправку. Бот выступает отправителем. Автоматической кнопки «Подтвердить» в Telegram мы пока не создаём: подтверждением будет ваше решение выполнить последнюю команду.
Если команды пока выглядят чужим языком, откройте бесплатный чат DeepSeek. Вставьте запрос, затем отправьте эту инструкцию. В ChatGPT или Claude можно работать так же, если уже ими пользуетесь.
Помоги отправить один готовый анонс через бота в мой пустой тестовый
Telegram-канал. Сначала спроси систему компьютера, что уже создано
и чем открываю терминал. В статье команды для Bash: проверь,
подходит ли он мне. Давай по одному действию с местом ввода,
ожидаемым ответом и проверкой. Жди моего результата.
Токен и пароли останутся у меня; используй имена переменных.
Сначала проверим бота и права. Перед sendMessage напомни прочитать
post.txt и адрес канала: эту команду запускаю только я после проверки.
Ошибки пришлю без секретов и личных данных; разбери причину
и предложи одну проверку. При неизвестном исходе отправки сначала
проверяем канал. Спорные команды сверяй с официальной документацией.
Если не уверен, скажи; без поиска попроси нужный фрагмент справки.
Начать можно с одного маленького результата — найти своего бота в списке администраторов тестового канала. Дальше помощник разберёт с вами ответ каждого запроса. Команды выполняете у себя; чат ИИ получает только описание результата без токена.
Для примера нужны свой бот, собственный публичный тестовый канал с адресом @username и компьютер с Bash и curl. Команды ниже рассчитаны на macOS или Linux. В macOS откройте «Терминал» и введите bash; затем выполняйте блоки по одному в этом окне. Для закрытого канала понадобится числовой chat_id — это отдельный способ адресации, здесь начинаем с публичного тестового.
API — способ передать Telegram команду, а curl — программа, которая отправит наш запрос. В примере используются три разных значения:
| Что | Пример без действующих данных | Для чего нужно |
|---|---|---|
| Username бота | @knit_notice_example_bot |
Найти и добавить именно своего бота |
| Username канала | @knit_notice_example |
Указать, куда отправлять пост |
| Токен | Секретная строка из BotFather | Разрешить запрос от имени бота |
Имена в таблице — только обозначения. В командах ниже подставляйте адрес своего канала. Токен в публикацию, пост или переписку с ИИ не вставляйте.
Зарегистрируйте бота и дайте ему одно право
Откройте официального BotFather, отправьте /newbot и пройдите его вопросы: название и доступный username. Полученный токен сохраните в своём защищённом хранилище. Если бот уже зарегистрирован, второй ради этого примера не нужен. Подробности регистрации есть в отдельной инструкции о BotFather.
Сам факт регистрации не создаёт программу, которая будет читать сообщения и принимать решения. В этой инструкции запросы к Telegram будете отправлять вы. Отвечать на /start бот от этого автоматически не начнёт. Зарегистрированный профиль можно сравнить с сотрудником, которого внесли в список, но ещё не дали ему задания и рабочего места. Разницу между регистрацией и работающим кодом объясняет вводный урок Telegram.
Откройте управление своим тестовым каналом, затем список администраторов. Добавьте бота по его точному username. Для нашего действия оставьте право публиковать сообщения. В API это can_post_messages. Названия экранов в клиентах могут различаться; ориентир — список администраторов канала и разрешение на отправку постов.
Управлять другими администраторами, менять сведения канала и удалять чужие публикации для отправки анонса ему не нужно. Курьер принёс листок про варежки; назначать его заодно директором мастерской, кадровиком и хранителем всех ключей причин пока нет. Сохраните права и вернитесь к списку: бот должен присутствовать именно среди администраторов вашего канала. Одноимённая группа обсуждений — другое место.
Проверьте, что токен относится к вашему боту
В открытом Bash введите команду, затем вставьте токен и нажмите Enter:
read -r -s -p 'Токен бота: ' BOT_TOKEN
При вводе символы не показываются. Токен сохранится в переменной этого окна; в сам текст следующей команды его вписывать не требуется.
printf 'url = "https://api.telegram.org/bot%s/getMe"\n' "$BOT_TOKEN" |
curl -q --config - --silent --show-error --max-time 20
getMe запрашивает сведения о боте. В успешном ответе ищите ok: true, а внутри result — его username и числовой id. Сравните username со своим. Значение id понадобится дальше. Здесь мы не приводим якобы полученный ответ: смотрите результат своего запроса.
Если ответ содержит ok: false, к отправке пока не переходите. Проверьте токен и принадлежность бота. Если токен случайно попал в общий чат или на снимок экрана, замените его через BotFather; затем введите новый в переменную. На это назначение токена указывает официальное руководство Telegram.
Убедитесь, что бот может публиковать в нужном канале
Задайте адрес своего тестового канала и id бота из getMe. Вторая строка содержит условное число: замените его своим.
CHANNEL='@ваш_тестовый_канал'
BOT_ID='123456789'
В реальном username канала используются разрешённые Telegram символы; русская надпись выше — понятное место для замены. Затем спросите Telegram о правах этого бота:
printf 'url = "https://api.telegram.org/bot%s/getChatMember"\n' "$BOT_TOKEN" |
curl -q --config - --silent --show-error --max-time 20 \
--data-urlencode "chat_id=$CHANNEL" \
--data-urlencode "user_id=$BOT_ID"
Для нашей ветки нужны успешный ответ, status: "administrator" и can_post_messages: true. Это сведения об указанном боте в указанном канале. Поля и назначение метода описаны в Bot API.
Если разрешения нет, вернитесь к настройкам администратора. Исправляйте конкретное право. Не нужно включать все переключатели, чтобы посмотреть, какой сработает. Если перепутан адрес канала или id бота, разрешения, выданные в другом месте, делу не помогут.
Пока пост не выходит. getMe отвечает на вопрос «кто этот бот», getChatMember — «что ему разрешено здесь». Отправка будет отдельной операцией. Заодно мы отделили две частые причины тишины: неверный токен и отсутствие права в канале. Даже идеально составленный анонс ни одну из них не исправит.
Подготовьте пост, который пока увидите только вы
Создайте обычный текстовый файл post.txt в UTF-8. В нём будет только содержание публикации, без токена и команд. Пример для нашей встречи:
В субботу, 24 октября, в 11:00 встречаемся в мастерской на пробное занятие по вязанию варежек.
Возьмите спицы № 4 и светлую пряжу: на ней удобнее разбирать петли. Если материалов нет, напишите организатору заранее.
Место: мастерская, кабинет 2. Занятие продлится полтора часа.
Замените факты своими. Затем перейдите в Bash в папку с файлом: наберите cd с пробелом, перетащите папку в окно терминала и нажмите Enter. Прочитайте файл перед отправкой:
cat post.txt
printf '\nКанал назначения: %s\n' "$CHANNEL"
Этот просмотр происходит локально, в вашем окне. Ни подписчики, ни случайный посетитель бота не получают доступа к нему. Полномочие запустить отправку остаётся у человека, который управляет этим компьютером и токеном. Общий компьютер или трансляция экрана такого личного пространства не дают.
Проверьте дату, время, адрес и последний абзац. На афише может быть прекрасная варежка, но если встреча перенеслась с субботы на воскресенье только в одном из ваших черновиков, люди будут вязать у закрытой двери. Красота картинки этого обстоятельства не исправит.
Для первого раза выберите короткое сообщение, которое легко сверить целиком. У обычного sendMessage текст ограничен 4096 знаками после разбора оформления; здесь отправляем простой текст и с большим запасом укладываемся в предел. Переносы строк, подпись организатора и инструкция для новичка важны так же, как заголовок. Если в файле всё ещё написано «место уточним», бот послушно сообщит это всем. Кабинет 2 он по собственной инициативе не придумает: в нашей схеме текст вообще не переписывается.
Если хотите доработать анонс в DeepSeek, дайте ему текст без секретов и обычную просьбу: «Сделай короче, сохрани все даты, время, место и список вещей. Если факт непонятен, спроси меня». Если уже работаете в ChatGPT или Claude, подойдёт привычный помощник.
После правки сохраните post.txt и перечитайте его заново. Даже если минуту назад уже одобряли прежнюю версию. Ваше подтверждение относится к конкретному тексту: поменялось время или исчезла просьба принести пряжу — перед вами новая публикация. Пока её удерживает последняя прищепка, всё ещё можно спокойно поправить.
Подтвердите отправку и посмотрите на результат
Следующая команда публикует текст в канале. Запускайте её только после просмотра файла и адреса. В нашей первой пробе это канал без подписчиков.
printf 'url = "https://api.telegram.org/bot%s/sendMessage"\n' "$BOT_TOKEN" |
curl -q --config - --silent --show-error --max-time 20 \
--data-urlencode "chat_id=$CHANNEL" \
--data-urlencode 'text@post.txt'
Здесь curl читает текст из файла, а sendMessage отправляет его от имени бота. Форматирование Markdown или HTML мы не задаём: для первой пробы достаточно обычного текста. Звёздочки и другие знаки в файле не следует считать оформленным жирным шрифтом. Откройте свой канал и сравните пост с файлом.
При успешной отправке Telegram возвращает объект сообщения; в нём есть message_id и сведения о чате. Сохраните id вместе с адресом канала, чтобы различать эту публикацию и следующую. Сам пост должен быть виден в нужном канале, содержать весь текст и появиться один раз. Описание sendMessage поможет сверить назначение параметров.
У успешной публикации три признака: сообщение в нужном канале, совпадающий текст и один экземпляр. Ответ с ok: true относится к выполненному запросу, но адрес и содержание вы всё равно сверяете с задуманными. Особенно когда рядом открыты тестовый канал и рабочий.
Если соединение оборвалось, не отправляйте команду повторно вслепую. Запрос мог уже дойти. Сначала откройте канал и проверьте, появился ли текст. Если результат остаётся неизвестным, остановитесь и выясните его перед следующим запросом. Повтор sendMessage может создать второй пост.
Если всё-таки дважды запустили команду и получили два анонса, оставьте в канале один экземпляр. Лишний удалите штатно как администратор. Настойчивость — хорошее качество организатора, но два одинаковых приглашения подряд могут создать впечатление, что варежки закончились и вас берут штурмом.
Создать бота для Telegram-канала удалось, когда утверждённый пост появился по нужному адресу и его текст совпал с подготовленным файлом.
Что делать при отказе
| Что произошло | Что проверить | Следующее действие |
|---|---|---|
getMe не подтверждает бота |
Токен и ответ Telegram | Исправить токен, повторить проверку личности |
getChatMember не находит нужное |
Адрес канала, id бота, список администраторов | Сверить все три значения |
Нет can_post_messages: true |
Разрешения бота в этом канале | Выдать право публикации и проверить снова |
curl не нашёл post.txt |
Текущую папку и имя файла | Перейти в папку с сохранённым текстом |
| Telegram вернул отказ на отправку | description и права |
Исправить указанную причину; при непонятном ответе сохранить его без токена |
| Ответ не дошёл | Сам канал | Проверить публикацию до повторного запроса |
Когда закончите, удалите секрет из переменной командой unset BOT_TOKEN и закройте окно Bash. Сам токен от этого не отзывается: его можно будет снова взять из вашего защищённого хранилища.
Частые вопросы
Бот должен быть подписчиком или администратором канала?
Для нашего действия он добавлен администратором с правом публикации. Простая подписка не даёт разрешения отправлять посты от его имени в канал. Проверяйте именно can_post_messages.
Нужен ли сервер, чтобы отправить этот пост?
В показанном пути запрос отправляется с вашего компьютера, пока вы выполняете команду. Пост после отправки остаётся в Telegram. Отдельный работающий обработчик потребуется, если вы хотите принимать команды и публиковать без ручного запуска. Его доступность и размещение — следующий вопрос, когда первый путь уже пройден.
Как перейти с тестового канала на рабочий?
Добавьте бота администратором в рабочий канал с нужным правом, замените CHANNEL на его адрес и заново выполните getChatMember. Перед каждым выпуском посмотрите на адрес назначения. У Telegram нет возможности догадаться, что вы оставили вчерашнее значение переменной случайно.
Как проверить, что отправка без права публикации запрещена?
На своём пустом тестовом канале отключите у бота право публикации, сохраните и повторите проверку getChatMember. Продолжать к отправке теперь нельзя. Для проверки самого отказа допустимо один раз отправить безобидный тестовый текст в этот пустой канал: успешной публикации быть не должно. Затем верните право и проверьте его заново. На рабочем канале такую пробу устраивать незачем.
Как сделать кнопку «Опубликовать» в личном чате?
Это следующий слой программы: обработчик должен проверить пользователя, показать ему конкретный черновик и связать подтверждение с этой версией. Сами кнопки и callback-запросы разобраны в статье о кнопках Telegram-бота. Переходите к ней, когда ручная отправка уже получилась и хочется подтверждать черновики прямо в личном чате. Видимая кнопка сама по себе проверку владельца не заменяет.
Бот сможет автоматически принимать заявки на вступление?
Для этого потребуется отдельный сценарий и соответствующие разрешения. Публикация текста не включает обработку заявок. Сначала завершите один показанный путь: ваш текст, ваш канал, одна проверенная публикация.
Прищепку сняли — анонс в канале. Вы знаете, какой файл ушёл, кому разрешено публиковать и где остановиться перед следующей отправкой. Можно вернуться к субботней встрече. Спицы № 4, светлая пряжа, второй рукав. Сотрудник с новой аватаркой его всё-таки не довяжет.