Как создать интерактивного бота Telegram на Python: пошаговое руководство

Вы хотите, чтобы ваш Telegram-бот отвечал на сообщения, отправлял кнопки, запоминал пользователей и даже работал с базой данных? Это не фантастика - это реально, и сделать это можно за пару часов, даже если вы новичок в программировании. Многие думают, что боты - это сложная штука для программистов, но на самом деле всё гораздо проще, чем кажется. Главное - начать с правильного инструмента. В этом руководстве вы создадите полноценного интерактивного бота на Python, который будет понимать команды, отвечать на вопросы и даже сохранять данные о пользователях.

Что вам понадобится

Для работы вам не нужны дорогие серверы или сложные системы. Всё, что нужно - это:

  • Python 3.8 или новее
  • Библиотека python-telegram-bot (версия 20+)
  • Токен бота от @BotFather
  • Простой текстовый редактор (VS Code, Sublime, или даже Notepad++)
  • Телеграм-аккаунт

Библиотека python-telegram-bot - это не просто обёртка. Она умеет обрабатывать кнопки, меню, inline-режим, файлы и даже вебхуки. Она поддерживает асинхронный код, что делает бота быстрым и отзывчивым. В 2025 году это самый стабильный и часто обновляемый инструмент для создания ботов в Telegram.

Как получить токен бота

Перед тем как писать код, нужно создать бота в Telegram. Откройте чат с @BotFather - это официальный аккаунт Telegram, который помогает создавать ботов. Напишите команду /newbot. BotFather спросит имя бота - придумайте что-то понятное, например, "Помощник по погоде". После этого он выдаст токен - длинная строка вроде 123456789:ABCdefGhIJKlmnoPqrStUvwxYz1234567. Никогда не делитесь этим токеном с другими. Он - ваш ключ к боту.

Скопируйте токен. Он понадобится в коде. Теперь вы можете отправлять команды боту через Telegram, и он будет отвечать. Но пока он просто молчит - нужно его научить.

Установка библиотеки

Откройте терминал (или командную строку) и введите:

pip install python-telegram-bot --upgrade

Это установит последнюю версию библиотеки. Если вы используете Python 3.12, убедитесь, что у вас нет конфликтов с другими пакетами. Библиотека работает на всех популярных ОС - Windows, macOS, Linux. После установки проверьте, что всё работает:

python -c "import telegram; print('Библиотека установлена')"

Если вы видите сообщение - всё в порядке. Если ошибка - перезагрузите терминал или переустановите Python.

Первый бот: отвечает на /start

Создайте файл bot.py и вставьте туда этот код:

from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("Привет! Я ваш новый бот. Напишите /help, чтобы узнать, что я умею.")

app = Application.builder().token("ВАШ_ТОКЕН_ЗДЕСЬ").build()

app.add_handler(CommandHandler("start", start))

print("Бот запущен...")
app.run_polling()

Замените ВАШ_ТОКЕН_ЗДЕСЬ на ваш токен от @BotFather. Сохраните файл и запустите его:

python bot.py

Откройте Telegram, найдите своего бота и напишите /start. Он ответит приветствием. Это ваш первый работающий бот. Он не делает ничего сложного, но это - основа. Теперь вы знаете, как бот подключается к Telegram и отвечает на команды.

Экран смартфона с чатом Telegram, бот показывает кнопки выбора действий и отвечает на команду.

Добавляем интерактивность: кнопки и меню

Бот, который просто пишет текст - это скучно. Интерактивный бот предлагает выбор. Добавим кнопки. Замените функцию start на этот код:

from telegram import ReplyKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    keyboard = [
        ["Погода", "Помощь"],
        ["Настройки", "Связаться с поддержкой"]
    ]
    reply_markup = ReplyKeyboardMarkup(keyboard, one_time_keyboard=True, resize_keyboard=True)
    await update.message.reply_text("Выберите действие:", reply_markup=reply_markup)

app = Application.builder().token("ВАШ_ТОКЕН_ЗДЕСЬ").build()
app.add_handler(CommandHandler("start", start))

print("Бот запущен...")
app.run_polling()

Теперь при запуске бот покажет четыре кнопки. Нажмите на "Погода" - ничего не произойдёт. Потому что мы ещё не научили бота реагировать на текстовые сообщения. Добавим обработчик:

from telegram.ext import MessageHandler, filters

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text
    if text == "Погода":
        await update.message.reply_text("Сейчас в вашем городе 18°C, облачно.")
    elif text == "Помощь":
        await update.message.reply_text("Я могу сообщить погоду, помочь с настройками или перенаправить в поддержку.")
    else:
        await update.message.reply_text("Я не понимаю эту команду. Используйте кнопки ниже.")

app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))

Теперь бот реагирует на нажатия кнопок. Он не использует интернет - просто отвечает заранее заданными фразами. Но это уже интерактивность. Пользователь не вводит команды - он выбирает.

Сохраняем данные: кто пользуется ботом

Чтобы бот был полезен, он должен запоминать пользователей. Например, кто уже пользовался ботом, сколько раз, какую погоду спрашивал. Для этого нужна база данных. Мы не будем устанавливать PostgreSQL или MySQL - для начала хватит простого JSON-файла.

Создайте файл users.json и вставьте туда:

{}

Теперь добавим в код функцию для записи данных:

import json

USER_DATA_FILE = "users.json"

def load_users():
    try:
        with open(USER_DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except FileNotFoundError:
        return {}

def save_users(users):
    with open(USER_DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(users, f, ensure_ascii=False, indent=2)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    username = update.effective_user.username or "Аноним"
    
    users = load_users()
    if str(user_id) not in users:
        users[str(user_id)] = {
            "username": username,
            "first_name": update.effective_user.first_name,
            "joined_at": "2026-01-05",
            "queries": 0
        }
        save_users(users)
    
    users[str(user_id)]["queries"] += 1
    save_users(users)
    
    keyboard = [["Погода", "Помощь"], ["Настройки", "Связаться с поддержкой"]]
    reply_markup = ReplyKeyboardMarkup(keyboard, one_time_keyboard=True, resize_keyboard=True)
    await update.message.reply_text(
        f"Привет, {update.effective_user.first_name}! Вы уже использовали бота {users[str(user_id)]['queries']} раз.",
        reply_markup=reply_markup
    )

Теперь каждый раз, когда пользователь пишет /start, бот записывает его ID, имя, дату первого обращения и количество запросов. Данные сохраняются в файле users.json. Если вы откроете его в текстовом редакторе - увидите структуру вроде:

{
  "123456789": {
    "username": "john_doe",
    "first_name": "Иван",
    "joined_at": "2026-01-05",
    "queries": 3
  }
}

Это позволяет делать персонализацию: "Привет, Иван! Вы уже спрашивали погоду три раза. Хотите получить прогноз на завтра?"

Расширяем функционал: погода через API

Пока бот выдаёт фиксированную погоду. Давайте сделаем его настоящим помощником. Подключим бесплатный API погоды - OpenWeatherMap.

Зарегистрируйтесь на сайте, получите API-ключ. Он будет выглядеть как abc123def456ghi789. Теперь установите библиотеку для HTTP-запросов:

pip install requests

Добавьте в код:

import requests

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text
    if text == "Погода":
        api_key = "ВАШ_API_КЛЮЧ"
        city = "Москва"
        url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&lang=ru&units=metric"
        
        try:
            response = requests.get(url)
            data = response.json()
            temp = data["main"]["temp"]
            description = data["weather"][0]["description"]
            await update.message.reply_text(f"Температура в {city}: {temp}°C, {description}.")
        except:
            await update.message.reply_text("Не удалось получить погоду. Попробуйте позже.")
    
    # остальной код обработки сообщений...

Теперь бот реагирует на кнопку "Погода" и показывает актуальную информацию. Вы можете расширить это: добавить выбор города, сделать кнопку "Сменить город", сохранить предпочтения пользователя в JSON-файле. Это уже полноценный сервис.

Голографический JSON-файл с данными пользователей и потоками API, соединённый с сервером.

Как запустить бота на постоянной основе

Пока вы запускаете бота через терминал - как только вы закроете окно, бот остановится. Чтобы он работал 24/7, нужно разместить его на сервере. Лучший вариант для начала - PythonAnywhere (бесплатный тариф) или Render.com.

На PythonAnywhere:

  1. Зарегистрируйтесь и создайте веб-приложение
  2. Загрузите файл bot.py и users.json
  3. В настройках приложения выберите Python 3.10
  4. В поле "Command to start server" введите: python bot.py
  5. Нажмите "Save" и "Restart"

Бот начнёт работать по адресу, который вам даст сервис. Он будет отвечать даже когда вы спите.

Что делать, если бот не отвечает

Частые ошибки новичков:

  • Неправильный токен - проверьте, что вы не скопировали лишние пробелы или символы.
  • Бот не запущен - убедитесь, что терминал не закрыт, а процесс работает.
  • Файл users.json не создаётся - проверьте права на запись в папке. В PythonAnywhere используйте путь /home/ваш_логин/users.json.
  • API погоды не работает - убедитесь, что ключ активен и вы не превысили лимит в 60 запросов в минуту.
  • Бот не видит кнопки - убедитесь, что вы не отправили команду вроде /start вручную после того, как кнопки уже появились. Текстовые сообщения и кнопки - разные типы событий.

Если ничего не помогает - добавьте в код логирование:

import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

Теперь в терминале вы увидите, что происходит: бот получил сообщение? Обработал? Отправил ответ? Это сэкономит часы поиска ошибок.

Что дальше?

Вы создали бота, который:

  • Отвечает на команды
  • Использует кнопки
  • Запоминает пользователей
  • Получает данные из интернета
  • Работает 24/7

Это база для множества идей. Можно добавить:

  • Голосовые ответы через TTS
  • Отправку файлов (PDF, изображений)
  • Интеграцию с Google Таблицами
  • Рассылку уведомлений по расписанию
  • Чат-бота с ИИ через OpenAI

Боты в Telegram - это не просто автоматизация. Это способ создать личный сервис для тысяч людей. И всё это начинается с одного файла bot.py.

Можно ли создать бота без знания Python?

Да, но с ограничениями. Есть сервисы вроде ManyChat или Chatfuel, где можно создать бота через графический интерфейс. Но они не дают контроля над данными, не позволяют подключать API и не работают с базами. Если вам нужно что-то простое - подойдут. Если вы хотите, чтобы бот запоминал пользователей, работал с погодой, базой данных или реагировал на сложные запросы - нужен Python. Он даёт полный контроль.

Сколько стоит запуск бота в Telegram?

Ничего. Telegram не взимает плату за ботов. Серверы - это уже другой вопрос. Бесплатные хостинги (PythonAnywhere, Render, Replit) хватит для бота до 1000 пользователей. Если пользователей больше - понадобится VPS, который стоит от 300 рублей в месяц. Домашний компьютер тоже можно использовать, но он должен быть всегда включён, а это неудобно и ненадёжно.

Безопасно ли хранить токен и API-ключ в файле?

Нет, не безопасно, если файл попадёт в публичный репозиторий. Всегда используйте переменные окружения. Установите библиотеку python-dotenv: pip install python-dotenv. Создайте файл .env с содержимым: TOKEN=ваш_токен и WEATHER_API_KEY=ваш_ключ. В коде добавьте: from dotenv import load_dotenv; load_dotenv(); token = os.getenv("TOKEN"). Теперь ключи не в коде - они в отдельном файле, который не коммитится в Git.

Почему бот не отвечает на сообщения, кроме команд?

Вы забыли добавить обработчик текстовых сообщений. Команды вроде /start обрабатываются через CommandHandler. А обычные сообщения - через MessageHandler. Если вы не добавили его, бот будет молчать. Проверьте, есть ли в коде строка: app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)).

Можно ли сделать бота, который отвечает на фото или голосовые сообщения?

Да. Библиотека python-telegram-bot поддерживает все типы медиа. Для фото используйте filters.PHOTO, для голосовых - filters.VOICE. Например, можно сделать бота, который распознаёт текст на изображении через Google Vision API или переводит голос в текст через Whisper. Это уже продвинутый уровень - но он доступен. Главное - начать с простого, а потом добавлять функции по одной.