Чтобы запустить бота pyTelegramBotAPI (telebot) 24/7, держите его на машине, которая всегда включена, а не на своём ПК: на Linux VPS со службой systemd, которая запускает его снова после сбоя или перезагрузки, или на тарифе для ботов PlayNHost (от 1.99 US$ в месяц, см. хостинг Telegram-ботов), где вы загружаете код, вставляете токен и нажимаете «Запустить». В нашем тесте бот на pyTelegramBotAPI 4.37.1 занимал около 40 МБ памяти в покое; наш самый маленький тариф для ботов, STARTER, даёт 0.5 ГБ. Оба варианта используют long polling: bot.infinity_polling() запрашивает у Telegram новые сообщения, поэтому боту не нужен публичный адрес. Шаги на PlayNHost:
- В Telegram отправьте
/newbotпользователю @BotFather и скопируйте токен, который он выдаст. - На странице хостинга Telegram-ботов нажмите Создать сервер на нужном тарифе. В окне заказа на вопрос Для какой платформы ваш бот? ответьте Telegram и выберите Python.
- Откройте свой сервер в панели. Карточка Настройка бота на странице Обзор открывается на шаге Подключение к Telegram; его первый шаг, Что запускается, должен показывать Этот бот запускает Python Bot.
- На шаге Подключение к Telegram вставьте токен и нажмите Подключение. Проверьте показанное имя бота и нажмите Да, продолжить.
- На шаге Ваш код нажмите Загрузить файлы, чтобы открыть Files, и загрузите
bot.pyиrequirements.txt, либо нажмите Подключить Git. Вrequirements.txtпакет называетсяpyTelegramBotAPI, а неtelebot. - На странице Бот, во вкладке Код, проверьте, что Файл запуска указывает на файл, который вызывает
infinity_polling()(по умолчаниюbot.py), а Среда выполнения имеет версию Python 3.11 или новее. - Нажмите Запустить бота, откройте Console и дождитесь
Logged in as @your_bot. Метка на странице Обзор сменится на Онлайн в Telegram. Отправьте боту/start.
Первый запуск идёт дольше, пока pip устанавливает pyTelegramBotAPI. Дальше установка повторяется только при изменении файла зависимостей, дополнительных пакетов или версии Python, а также раз в сутки. Пошагово со скриншотами: Как запустить Telegram-бота на хостинге.
Что мы измерили
Мы запустили три библиотеки Python для Telegram на одном из наших серверов, в одноразовых контейнерах, настроенных так, как панель запускает бота на Python: Python 3.12 (Среда выполнения с пометкой «рекомендуется»), пакеты установлены той же командой pip, лимит памяти 1 ГБ и одно ядро процессора.
| Библиотека | Версия | Память в покое | От запуска до ответа Telegram | Размер после установки, с зависимостями |
|---|---|---|---|---|
| pyTelegramBotAPI (TeleBot) | 4.37.1 | 40 МБ | 0.7 с | 21.9 МБ |
| python-telegram-bot | 22.8 | 44 МБ | 0.9 с | 12.3 МБ |
| aiogram | 3.31.0 | 173 МБ | 4.3 с | 33.9 МБ |
| Только Python 3.12 | 9 МБ |
Каждый бот загружал библиотеку и спрашивал у Telegram, кто он, с поддельным токеном (pyTelegramBotAPI: bot.get_me() на обычном TeleBot). Память показывает, сколько занимали процессы бота через 15 секунд после отказа Telegram принять токен; время запуска отсчитывается от старта Python до момента, когда библиотека сообщает этот ответ, поэтому оно включает один обмен с Telegram. Оба значения взяты как медиана трёх запусков после прогревочного.
Эти цифры показывают нижнюю границу библиотеки: без чатов, без работающих обработчиков, без кэша. Ваш собственный код, данные, которые он держит в памяти, и число обслуживаемых чатов добавляются сверху, поэтому выбирайте тариф по тому, что делает ваш бот. В размер после установки входят обе HTTP-библиотеки, от которых зависит pyTelegramBotAPI, requests и aiohttp, даже если вы используете только обычный TeleBot.
Минимальный бот на pyTelegramBotAPI
Он отвечает на /start, читает токен, который ему выдаёт панель, и печатает строку готовности. Добавьте библиотеку в requirements.txt:
pyTelegramBotAPI>=4,<5
А код положите в bot.py:
import os
import telebot
bot = telebot.TeleBot(os.environ["TELEGRAM_BOT_TOKEN"])
@bot.message_handler(commands=["start"])
def start(message):
bot.reply_to(message, "Hello! I am running on PlayNHost.")
bot.delete_webhook()
print(f"Logged in as @{bot.user.username}")
bot.infinity_polling()
Два вызова перед polling важны на хостинге. delete_webhook() удаляет вебхук, оставшийся от другого хостинга, а bot.user спрашивает у Telegram, кто такой бот, поэтому Logged in as @your_bot появляется только с токеном, который Telegram принимает. Панель читает эту строку, чтобы показать Онлайн в Telegram. Оба вызова также сразу останавливают бота с понятной ошибкой, если токен неверный, вместо того чтобы polling повторял попытки в фоне. Панель передаёт токен вашему коду как TELEGRAM_BOT_TOKEN, а также как BOT_TOKEN, TOKEN и TELEGRAM_TOKEN.
Если токен неверный
В нашем тесте с токеном, который Telegram отклоняет, тестовый бот напечатал:
ApiTelegramException: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized
В полном traceback класс выглядит как telebot.apihelper.ApiTelegramException. С ботом выше первый вызов завершается ошибкой, и бот останавливается с кодом выхода 1; на PlayNHost панель показывает Telegram не принял токен вашего бота над консолью с кнопкой Заменить токен. Чтобы исправить, скопируйте токен заново: в @BotFather отправьте /mybots, выберите своего бота, затем API Token. Вставьте его на странице Бот, во вкладке Telegram, в поле Токен, и снова запустите бота.
Бот, который сразу вызывает infinity_polling(), как в большинстве примеров, ведёт себя иначе: он не останавливается. Polling сначала спрашивает у Telegram, кто такой бот; с отклонённым токеном это не удаётся, и бот пишет в лог Infinity polling exception: A request to the Telegram API was unsuccessful. Error code: 401. Description: Unauthorized и повторяет попытку каждые 3 секунды, пока работает процесс. Токен, отозванный, когда бот уже ведёт polling, даёт вместо этого Threaded polling exception: с тем же сообщением, повторяемым после паузы, которая каждый раз удваивается, до минуты. В обоих случаях бот выглядит работающим, хотя ничего не отвечает. Панель распознаёт обе строки и показывает один и тот же баннер.
Что хостингу нужно знать о pyTelegramBotAPI
- Имена пакета и импорта: вы устанавливаете
pyTelegramBotAPI, а импортируетеtelebot. Пакет PyPI с названиемtelebotявляется другим, небольшим проектом; впишитеpyTelegramBotAPIвrequirements.txt. - Версия Python: pyTelegramBotAPI 4.37.1 требует Python 3.11 или новее. На Python 3.10 pip не завершается ошибкой: он ставит 4.37.0, последний релиз, допускавший 3.10. Держите Среда выполнения во вкладке Код на 3.11 или новее (3.12 помечен как рекомендуемый), чтобы получить актуальный релиз.
infinity_polling()илиpolling(): используйтеinfinity_polling(). Обычныйpolling()останавливается на первой ошибке от Telegram, и его завершает также исключение в одном из ваших обработчиков, так что бот выходит. Сinfinity_polling()ошибки от Telegram повторяются, а любое другое исключение в обработчике пишется в лог какInfinity polling exception: ..., после чего polling запускается снова через 3 секунды.- Логирование: у pyTelegramBotAPI есть собственный логгер,
TeleBot, выставленный наERROR, поэтому при старте он ничего не печатает; поэтому бот выше печатает собственную строку готовности. Ошибки выводятся одной строкой без traceback. Чтобы увидеть, где упал обработчик, запустите сbot.infinity_polling(logger_level=logging.DEBUG)(иimport logging), что добавляет traceback. Эти строки скрывают секретную часть вашего токена. - Вебхук, оставшийся от другого хостинга: polling его не удаляет, а Telegram отказывает в polling, пока вебхук установлен. Оставьте
bot.delete_webhook(), как выше, или нажмите Удалить вебхук на странице Бот, во вкладке Telegram. - Потоки или asyncio:
TeleBotиспользует requests и по умолчанию запускает обработчики в двух рабочих потоках (num_threads=2); медленный обработчик занимает один из них.AsyncTeleBotизtelebot.async_telebotиспользует aiohttp и запускается черезasyncio.run(bot.polling()). Оба работают в панели одинаково. - Вторая копия: когда другая копия ведёт polling с тем же токеном, Telegram отвечает
409 Conflict, аinfinity_polling()повторяет попытки, пока работает. Панель показывает Ваш бот работает ещё и в другом месте. См. Как исправить ошибку 409 Conflict у Telegram-бота.
Свой хостинг на Linux VPS
В Debian или Ubuntu установите Python, создайте пользователя для бота и установите библиотеку в виртуальное окружение. Сначала проверьте python3 --version: ниже 3.11 pip ставит более старый pyTelegramBotAPI.
sudo apt update
sudo apt install -y python3 python3-venv
sudo useradd --system --create-home --home-dir /opt/tgbot --shell /usr/sbin/nologin tgbot
sudo cp bot.py requirements.txt /opt/tgbot/
sudo -u tgbot python3 -m venv /opt/tgbot/venv
sudo -u tgbot /opt/tgbot/venv/bin/pip install -r /opt/tgbot/requirements.txt
Положите токен в файл, который может читать только root. Откройте его командой sudo nano /etc/tgbot.env, запишите одну строку, сохраните, затем выполните sudo chmod 600 /etc/tgbot.env:
TELEGRAM_BOT_TOKEN=123456789:your-token-from-botfather
Создайте /etc/systemd/system/tgbot.service:
[Unit]
Description=Telegram bot (pyTelegramBotAPI)
Wants=network-online.target
After=network-online.target
[Service]
User=tgbot
WorkingDirectory=/opt/tgbot
EnvironmentFile=/etc/tgbot.env
Environment=PYTHONUNBUFFERED=1
ExecStart=/opt/tgbot/venv/bin/python /opt/tgbot/bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Запустите службу сейчас и при каждой загрузке, затем следите за её выводом:
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo journalctl -u tgbot -f
PYTHONUNBUFFERED=1 здесь важен: когда вывод Python идёт не в терминал, он буферизуется блоками, и без этой переменной Logged in as может остаться в буфере, не дойдя до журнала. Restart=always также запускает бота снова через 5 секунд после остановки из-за неверного токена, поэтому проверьте журнал, если он постоянно перезапускается. После изменения кода выполните sudo systemctl restart tgbot. Сначала остановите любую копию на своём ПК, иначе Telegram ответит 409 Conflict.
Свой сервер или тариф для ботов
- На VPS, которым вы управляете сами: обновления системы, версия Python, виртуальное окружение, переустановка пакетов, файл юнита, чтение журнала и заметить, что бот перестал отвечать. Взамен у вас есть root, и вы можете запустить вебхук, если добавите домен и HTTPS.
- На тарифе для ботов панель делает это сама: устанавливает
requirements.txt, когда он меняется, запускает бота снова после сбоя, проверяет токен в Telegram перед сохранением, передаёт его вашему коду под пятью именами, читает консоль и называет причину, когда бот перестал отвечать (отклонённый токен, вторая копия, вебхук), с кнопкой для токена и вебхука. В наших тарифах для ботов пока нет публичного HTTPS-адреса, поэтому боты там используют long polling, а именно это и делаетinfinity_polling().
Частые вопросы
Почему мой бот на telebot работает, но никогда не отвечает?
Потому что infinity_polling() повторяет каждую ошибку от Telegram, не останавливаясь: отклонённый токен, другая копия с тем же токеном, вебхук, оставшийся у бота. Ищите строки с Infinity polling exception (токен отклонён при старте) или Threaded polling exception (когда polling уже идёт) в Console; панель превращает каждую из трёх причин в баннер, который её называет.
Я получаю ModuleNotFoundError: No module named 'telebot'. Чего не хватает?
Пакета. Добавьте pyTelegramBotAPI в requirements.txt и снова запустите бота: файл зависимостей изменился, поэтому pip установит пакет при этом запуске. Импорт остаётся import telebot.
Нужен ли pyTelegramBotAPI вебхук, чтобы оставаться онлайн?
Нет. infinity_polling() продолжает запрашивать у Telegram новые сообщения, поэтому бот отвечает, пока работает процесс. О переносе бота, который использовал вебхук: Как перенести Telegram-бота на PlayNHost.
Что выбрать: TeleBot или AsyncTeleBot?
Оба работают на тарифе для ботов. Берите тот, который использует ваш код или руководство: в TeleBot обработчики это обычные функции, в AsyncTeleBot это функции async def, которые вызывают методы бота через await. Наше измерение выше относится к обычному TeleBot.
pyTelegramBotAPI работает на каждом тарифе для ботов PlayNHost, начиная с STARTER (0.5 ГБ). Сравните тарифы и нажмите Создать сервер на странице хостинга Telegram-ботов.



