Вязальный кружок собирается в субботу. В канале нужно объявить время, место и какие взять спицы. Текст готов. Бот тоже вроде при деле: получил имя, аватарку и сидит с видом нового сотрудника. Только объявление по-прежнему лежит у вас. Сотрудник пока даже не знает, в какое здание его наняли.

Чтобы бот отправил пост в 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, светлая пряжа, второй рукав. Сотрудник с новой аватаркой его всё-таки не довяжет.