Как создать Telegram-бота на Python (2026)
Reading time: 4 minutes
Last modified:
К концу этого туториала у вас будет рабочий Telegram-бот, который отвечает на /start и /help, повторяет сообщения пользователя, показывает inline-клавиатуру и работает на VPS через webhook. Весь код проверен на python-telegram-bot 20.7 и Telegram Bot API середины 2026 года.
Что вы построите
Бота, который обрабатывает /start, /help и текстовое эхо — плюс inline-клавиатуру с обработчиком callback. Один и тот же код работает в режиме polling на вашем ноутбуке для разработки и переключается в режим webhook для продакшена.
Что понадобится
- Python 3.10 или новее
- Аккаунт Telegram с доступом к @BotFather
- Базовые знания Python (функции, async/await)
- Linux VPS для шагов с вебхуком (Hetzner Cloud CX11 за $4/мес достаточно)
Шаг 1: создать бота через BotFather
Откройте Telegram и начните чат с @BotFather.
- Отправьте
/newbot - Введите отображаемое имя — например,
My First Bot - Введите username, оканчивающийся на
bot— например,myfirst_demo_bot - BotFather пришлёт токен:
7123456789:AAHdqTcvCH1vGWJxfSeofSoK31HTXv9NMTU
Храните токен в переменной окружения, а не в коде:
export TELEGRAM_TOKEN="7123456789:AAHdqTcvCH1vGWJxfSeofSoK31HTXv9NMTU"
Токен даёт полный контроль над ботом. Относитесь к нему как к API-ключу.
Шаг 2: установить python-telegram-bot v20
pip install "python-telegram-bot==20.7"
Версия 20 переписана вокруг asyncio. Паттерны версии 13 (Updater, синхронные обработчики) больше не работают. Каждый обработчик теперь async def-функция, а точка входа — Application вместо Updater.
Шаг 3: базовый бот с обработчиками команд
Создайте bot.py:
import os
import logging
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
MessageHandler,
filters,
ContextTypes,
)
logging.basicConfig(level=logging.INFO)
TOKEN = os.environ["TELEGRAM_TOKEN"]
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(
"Привет! Я твой бот. Отправь /help, чтобы узнать, что я умею."
)
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(
"/start — приветствие\n"
"/help — это сообщение\n"
"Любой другой текст — отвечу тем же текстом"
)
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(update.message.text)
def main() -> None:
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling()
if __name__ == "__main__":
main()
Запустите:
python bot.py
Откройте Telegram, найдите бота по username, отправьте /start. Приветствие придёт в течение секунды. Ctrl+C — остановка.
run_polling() годится для разработки — публичный URL не нужен. В продакшене polling сжигает CPU и добавляет 1–3 секунды задержки. Для продакшена используйте webhook (шаг 5).
Шаг 4: inline-клавиатура
Inline-клавиатура крепит кнопки прямо к сообщению. Каждая кнопка несёт строку callback_data, которую Telegram отправляет обратно, когда пользователь на неё нажимает.
Добавьте в bot.py:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import CallbackQueryHandler
async def menu(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
keyboard = [
[
InlineKeyboardButton("Вариант А", callback_data="option_a"),
InlineKeyboardButton("Вариант Б", callback_data="option_b"),
]
]
await update.message.reply_text(
"Выберите один:", reply_markup=InlineKeyboardMarkup(keyboard)
)
async def handle_button(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
query = update.callback_query
await query.answer() # убирает индикатор загрузки
await query.edit_message_text(f"Вы выбрали: {query.data}")
Зарегистрируйте оба обработчика в main():
app.add_handler(CommandHandler("menu", menu))
app.add_handler(CallbackQueryHandler(handle_button))
Отправьте боту /menu — появятся две кнопки. Нажатие на любую заменит текст сообщения на ваш выбор.
Шаг 5: переход на webhook для продакшена
Polling работает так: каждую секунду бот отправляет Telegram запрос getUpdates. Webhook меняет модель: Telegram сам вызывает ваш сервер в момент получения сообщения. Это снижает задержку до менее 100 мс и почти обнуляет нагрузку на CPU между сообщениями.
Настройка webhook вручную:
curl "https://api.telegram.org/bot${TELEGRAM_TOKEN}/setWebhook?url=https://yourdomain.com/webhook"
Telegram подтверждает: {"ok":true,"result":true}.
Или встроенный сервер python-telegram-bot:
Замените app.run_polling() на:
app.run_webhook(
listen="0.0.0.0",
port=8443,
url_path="/webhook",
webhook_url="https://yourdomain.com/webhook",
cert="cert.pem", # нужен только для самоподписанного TLS
)
Telegram требует HTTPS. Получите сертификат через Let’s Encrypt (certbot) или поставьте перед VPS прокси Cloudflare. Telegram принимает порты 443, 80, 88 и 8443.
Шаг 6: деплой на VPS
Подключитесь по SSH к серверу и настройте бота как systemd-сервис, чтобы он переживал перезагрузки и перезапускался после падения.
# На вашем VPS
mkdir -p /opt/mybot
scp bot.py user@yourserver:/opt/mybot/
ssh user@yourserver "pip3 install 'python-telegram-bot==20.7'"
Создайте /etc/systemd/system/mybot.service:
[Unit]
Description=My Telegram Bot
After=network.target
[Service]
User=ubuntu
WorkingDirectory=/opt/mybot
Environment="TELEGRAM_TOKEN=7123456789:AAHdqTcvCH1vGWJxfSeofSoK31HTXv9NMTU"
ExecStart=/usr/bin/python3 /opt/mybot/bot.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Включите и запустите:
sudo systemctl daemon-reload
sudo systemctl enable mybot
sudo systemctl start mybot
sudo systemctl status mybot
Проверьте, что webhook принимает трафик:
curl "https://api.telegram.org/bot${TELEGRAM_TOKEN}/getWebhookInfo"
В ответе смотрите pending_update_count — после обработки очереди сообщений он должен опуститься до 0.
Когда переходить на Mini App
Боты хорошо справляются с текстовыми командами, но быстро упираются в потолок: нет многошаговых форм, нет богатых карточек товаров, нет нативного UI для платежей без обходных путей.
Telegram Mini App — веб-страница (HTML/CSS/JS или любой фреймворк), которая открывается внутри Telegram по нажатию кнопки. Получает доступ к личности пользователя Telegram, Telegram Pay и Haptic Feedback API. Пользователь не выходит из приложения.
Типичный путь: запуск с ботом для команд и уведомлений, затем открытие Mini App для всего, что требует интерфейса — оформление заказа, запись на приём, личный кабинет. Бот остаётся точкой входа и каналом уведомлений; Mini App берёт на себя сложное взаимодействие.
Нужен продакшен-бот или Mini App для вашего бизнеса? Команда CimpleO по разработке Telegram закрывает весь стек — логику бота, фронтенд Mini App, бэкенд-API и интеграцию Telegram Pay. Расскажите, что строите.
Часто задаваемые вопросы
Нужен ли сервер, чтобы запустить Telegram-бота?
Для режима polling — нет, хватит локальной машины или дешёвого VPS. Для режима webhook (рекомендуется для продакшена) — да, нужен сервер с публичным HTTPS-адресом. VPS за $5/мес на Hetzner или DigitalOcean хватает для большинства ботов.
В чём разница между polling и webhook?
Polling: бот постоянно спрашивает у Telegram «есть новые сообщения?». Webhook: Telegram сам присылает новые сообщения на ваш сервер в момент получения. Webhook быстрее и экономнее по ресурсам — используйте его в продакшене.
Можно ли запустить несколько ботов на одном сервере?
Да. Каждому боту нужен свой токен от BotFather и свой путь вебхука. Можно запускать их в одном Python-процессе или в отдельных systemd-сервисах.
Как удержать бота запущенным после закрытия терминала?
Используйте systemd в Linux: создайте service-файл, который запускает скрипт бота при загрузке и перезапускает его при падении. Для быстрого деплоя подойдут screen или tmux, для контейнеризации — Docker.
В чём разница между Telegram-ботом и Mini App?
Бот работает через команды и сообщения в чате. Mini App — веб-приложение внутри Telegram с полноценным UI: кнопки, формы, платежи. Бота проще построить; Mini App даёт более богатый UX. Большинство продакшен-продуктов начинают с бота и добавляют Mini App позже.