Как создать 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.

  1. Отправьте /newbot
  2. Введите отображаемое имя — например, My First Bot
  3. Введите username, оканчивающийся на bot — например, myfirst_demo_bot
  4. 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 позже.

CimpleO telegram
Как создать Telegram-бота на Python (2026)
JUN 25 2026 · 4 MIN
Table of Contents