Боты
Бот для автопостинга в Telegram-канал: как настроить отложенные посты
Коротко
Бот для автопостинга в Telegram-канал — это программа, которая добавлена в администраторы канала с правом публикации и сама отправляет посты в нужное время. Отложенной отправки в Bot API нет, поэтому расписание живёт в коде бота: в библиотеке вроде APScheduler или node-cron либо в простом цикле, который раз в минуту проверяет очередь постов. Очередь стоит хранить в файле или базе SQLite, а время задавать с явным часовым поясом, потому что серверы обычно работают по UTC. Чтобы посты выходили без пропусков, бот должен работать круглосуточно — например, на хостинге вроде Netrun с тарифом Pro.
- В Telegram Bot API нет отложенной отправки, поэтому бот публикует пост в момент вызова sendMessage, а расписание задаётся в коде.
- Чтобы бот мог публиковать в канал, его добавляют в администраторы канала с правом публикации сообщений.
- Публичный канал в коде бота указывается как @имя_канала, а приватный — числовым идентификатором, который начинается с -100.
- Серверы обычно работают по UTC, поэтому пост, назначенный на 9:00 без часового пояса, в Москве выйдет в 12:00.
- Очередь постов, которая хранится только в памяти программы, пропадает при каждом перезапуске бота.
Вести канал и каждый день публиковать посты вручную утомительно, поэтому рано или поздно появляется мысль: пусть бот выкладывает посты сам по расписанию. Идея правильная, но есть нюанс, о который спотыкаются почти все. У Telegram-ботов нет кнопки «отправить позже», как в приложении: бот отправляет сообщение ровно тогда, когда его код вызывает метод отправки. Значит, расписание должно жить внутри самого бота, а бот — работать постоянно.
Ниже — как подключить бота к каналу, где хранить очередь постов, какой способ расписания выбрать и почему пост, назначенный на девять утра, иногда выходит в полдень. Если бот уже написан и вопрос только в том, где его держать, начните с инструкции о круглосуточной работе бота.
| Способ | Когда подходит | Что учесть |
|---|---|---|
| Отложенные сообщения в приложении Telegram | Несколько постов в неделю, которые вы и так пишете руками | Это функция приложения для людей, бот так не умеет |
| Цикл с паузой в коде | Один пост в день в одно и то же время | После перезапуска отсчёт начинается заново, легко промахнуться со временем |
| APScheduler (Python) | Несколько расписаний, выражения в духе cron, бот на aiogram или другом фреймворке | Явно укажите timezone; по умолчанию задачи живут в памяти |
| JobQueue в python-telegram-bot | Бот уже написан на python-telegram-bot | Ставится как дополнение job-queue к библиотеке |
| node-cron (Node.js) | Бот на Telegraf, grammY или другой библиотеке для Node.js | У расписания есть опция timezone — используйте её |
| Очередь в SQLite и проверка раз в минуту | Контент-план на недели вперёд, который правят без перепубликации кода | Храните базу в постоянной папке и помечайте отправленные посты |
Создайте бота и сделайте его администратором канала#
Создайте бота у BotFather и сохраните его токен. Затем откройте настройки канала, добавьте бота в администраторы и оставьте ему право публикации сообщений, остальные права можно выключить. Без этого права Telegram отвечает ошибкой о том, что боту нужны права администратора в канале, и пост не выходит.
Укажите канал в настройках бота#
Публичный канал указывается коротким именем вида @имя_канала. У приватного канала имени нет, поэтому нужен числовой идентификатор, который начинается с -100: его можно узнать, например, переслав пост из канала одному из ботов, которые показывают идентификаторы. Имя канала и токен держите в переменных окружения, а не в коде, тогда бота легко переключить на тестовый канал.
Сложите посты в очередь#
Очередь — это список постов с текстом, картинкой, временем публикации и отметкой, отправлен ли пост. Для начала хватит файла JSON, а для контент-плана на недели вперёд удобнее база SQLite. Главное — хранить очередь на диске, а не в памяти программы, и ставить отметку об отправке сразу после успешной публикации: тогда после перезапуска бот не продублирует уже вышедший пост.
Выберите способ расписания#
Самый простой вариант — цикл, который раз в минуту проверяет очередь и публикует всё, чему пришло время. Если расписаний несколько, удобнее библиотека: APScheduler для Python, JobQueue в python-telegram-bot или node-cron для Node.js. Заранее решите, что делать с постами, время которых прошло, пока бот был выключен: опубликовать их при старте или пропустить. В APScheduler за это отвечает настройка misfire_grace_time.
Укажите часовой пояс явно#
Серверы обычно работают по UTC, и время без часового пояса бот понимает именно так: девять утра по UTC — это полдень по Москве. Указывайте пояс прямо в коде: параметр timezone в APScheduler и node-cron, ZoneInfo с поясом Europe/Moscow в Python. Если Python сообщает, что не знает такого пояса, добавьте в requirements.txt пакет tzdata.
Опубликуйте бота и проверьте на тестовом канале#
Заведите закрытый тестовый канал, добавьте туда бота и поставьте пару постов через несколько минут, чтобы увидеть результат сразу. В Netrun нет отдельного планировщика задач вроде cron, и он не нужен: расписание работает внутри бота, а бот работает как постоянная программа. Код загружается архивом, папкой или из GitHub, токен указывается в «Секретах», а очередь в SQLite кладётся в постоянную папку /data, которая переживает обновление кода.
Автопостинг в Telegram-канал собирается из трёх частей: бот с правом публикации, очередь постов на диске и расписание с явным часовым поясом. Самое ненадёжное звено обычно не код, а место, где бот работает: если ноутбук уснул, пост на семь утра не выйдет. В Netrun бот публикуется из кода без настройки сервера, очередь в /data не теряется при обновлениях, а логи показывают каждую публикацию. На бесплатном тарифе бот работает ограниченное время — этого хватит, чтобы проверить расписание, а для ежедневных постов без пропусков нужен Pro. Попробовать Netrun.
Частые вопросы
Почему пост вышел на три часа позже, чем я поставил?
Почти наверняка расписание работает по UTC, а вы указывали московское время. Сервер понимает девять утра как девять по UTC, а это полдень в Москве. Укажите часовой пояс прямо в коде расписания, и посты начнут выходить вовремя.
Почему бот не может отправить пост в канал?
Чаще всего бот не добавлен в администраторы канала или у него выключено право публикации сообщений. Вторая частая причина — неверный идентификатор канала: у приватного канала нужен числовой идентификатор с -100 в начале, а не ссылка-приглашение. Точная причина видна в логах бота в тексте ответа Telegram.
Можно ли запланировать посты в Telegram без постоянно работающего бота?
Вручную — да: в приложении Telegram есть отложенные сообщения, и для пары постов в неделю этого достаточно. Бот так не умеет, в Bot API отложенной отправки нет, поэтому автоматический постинг требует программы, которая работает в момент публикации. Если программа выключена, пост не выйдет.
Куда пропала очередь постов после обновления бота?
Скорее всего, она хранилась в памяти программы или в файле рядом с кодом, а такие данные пересоздаются при каждой публикации. Держите очередь в постоянной папке: в Netrun это /data, которая переживает обновление кода и перезапуски. Записи об отправленных постах храните там же.
Можно ли одним ботом вести несколько каналов?
Да. Добавьте бота в администраторы каждого канала и храните в очереди, в какой канал идёт каждый пост. Для разных каналов можно задать разные расписания, а часовой пояс указывать у каждого отдельно, если аудитория живёт в разных странах.
Есть ли запуск по расписанию?
Отдельной настройки расписания в кабинете нет. Расписание делают частью самого приложения: скрипт работает постоянно и сам решает, когда сработать — циклом с паузой или библиотекой расписания. Такой проект считается фоновым скриптом: он не засыпает, поэтому на бесплатном тарифе работает 3 часа, а для постоянной работы нужен тариф Pro.
Сохранятся ли данные при обновлении кода?
Да, если данные лежат в постоянном хранилище. У обычного проекта это папка /data: всё, что приложение туда сохранило, остаётся при обновлении кода и перезапуске, а посмотреть и скачать файлы можно на вкладке «Данные». Если вы описали сервисы сами в docker-compose, постоянное хранилище — это именованные тома из вашего файла, и папки /data у такого проекта нет. Файлы, записанные мимо хранилища, при следующей публикации создаются заново. Ссылка проекта в любом случае остаётся прежней.
Что будет с ботом через 3 часа на бесплатном тарифе?
Бот выключится, но код, настройки и секреты останутся на месте — мы ничего не удаляем. Незадолго до выключения мы пришлём предупреждение. Три часа считаются только по работе бота: пока он остановлен, не собрался или упал с ошибкой, время не идёт — можно спокойно чинить код и запускать заново. Подключите тариф Pro, и бот запустится с того же места и будет работать круглосуточно. Новый бот, загруженный после этого, тоже соберётся, но работать не начнёт: бесплатное время считается на аккаунт, а не на каждый проект.