Создаем телеграм-бота на Python: пошаговая инструкция для новичков
Для кого эта статья:
- Начинающие программисты, интересующиеся разработкой ботов на Python
- Люди, желающие улучшить свои навыки программирования и получить практический опыт
Учащиеся, рассматривающие курсы по Python-разработке и созданию веб-приложений
Создание телеграм-бота на Python — идеальный первый проект для программиста, желающего применить знания на практике и получить реальный результат. За несколько часов вы пройдете путь от идеи до функционирующего бота, который сможет отвечать на сообщения, отправлять контент и даже интегрироваться с внешними сервисами. Не важно, создаете ли вы бота для автоматизации рабочих процессов или для развлечения друзей — этот навык откроет вам двери в мир практического программирования. 🚀
Хотите создавать не только ботов, но и полноценные веб-приложения на Python? Курс Обучение Python-разработке от Skypro превратит вас из начинающего программиста в уверенного разработчика за 9 месяцев. Программа включает фреймворки Django и FastAPI, работу с базами данных и реальные проекты с наставниками из индустрии. Вы получите не только теоретические знания, но и создадите портфолио проектов для будущего трудоустройства.
Настройка окружения для создания телеграм-бота на Python
Перед погружением в код необходимо подготовить рабочее окружение. Правильная настройка среды разработки сэкономит время и избавит от потенциальных проблем в будущем. 🛠️
Для начала вам понадобится Python версии 3.6 или выше. Проверить текущую версию можно командой:
python --version
Если Python не установлен или версия устарела, скачайте последнюю версию с официального сайта python.org.
Александр Воронов, Python-разработчик и тренер
Когда я только начинал создавать ботов для автоматизации рассылок, я совершил классическую ошибку новичка — использовал глобальное окружение Python. В результате зависимости разных проектов конфликтовали между собой, и приходилось тратить часы на отладку. Научившись работать с виртуальными окружениями, я забыл о подобных проблемах. Теперь первое, что я делаю при старте нового проекта — создаю изолированную среду, где могу контролировать версии всех пакетов.
Для создания виртуального окружения используйте следующие команды:
# Для Windows
python -m venv venv
# Для macOS/Linux
python3 -m venv venv
Активация виртуального окружения:
# Для Windows
venv\Scripts\activate
# Для macOS/Linux
source venv/bin/activate
После активации установите необходимые библиотеки:
pip install pyTelegramBotAPI python-dotenv
Библиотека pyTelegramBotAPI (также известная как telebot) предоставляет удобный интерфейс для работы с Telegram Bot API, а python-dotenv поможет безопасно хранить токен бота в файле окружения.
Для организации кода рекомендую создать следующую структуру проекта:
- bot/ — корневая директория проекта
- bot/main.py — основной файл с кодом бота
- bot/.env — файл для хранения конфиденциальной информации (токен)
- bot/requirements.txt — список зависимостей
Создайте файл requirements.txt со следующим содержимым:
pyTelegramBotAPI==4.12.0
python-dotenv==1.0.0
Сравнение популярных библиотек для работы с Telegram Bot API:
| Библиотека | Простота использования | Документация | Сообщество | Асинхронность |
|---|---|---|---|---|
| pyTelegramBotAPI | Высокая | Хорошая | Активное | Ограниченная поддержка |
| python-telegram-bot | Средняя | Отличная | Очень активное | Полная поддержка |
| aiogram | Средняя | Хорошая | Растущее | Только асинхронный |
| Telethon | Низкая | Средняя | Активное | Полная поддержка |
Для новичков я рекомендую начать с pyTelegramBotAPI (telebot) из-за простоты использования и низкого порога вхождения.

Регистрация и получение токена для Telegram Bot API
Для взаимодействия с API Telegram каждому боту нужен уникальный токен — цифровой ключ, который служит идентификатором и паролем одновременно. Получить его можно у специального бота BotFather — официального "создателя ботов" в Telegram. 🤖
Шаги для регистрации нового бота и получения токена:
- Откройте Telegram и найдите BotFather (@BotFather)
- Отправьте команду /newbot
- Введите имя бота (может содержать любые символы)
- Введите username бота (должен заканчиваться на "bot" и быть уникальным)
- После успешной регистрации вы получите токен вида
123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ
Важно: никогда не публикуйте и не делитесь своим токеном публично! Человек, получивший доступ к токену, сможет управлять вашим ботом.
Марина Сергеева, технический писатель
Разрабатывая корпоративного бота для команды, я столкнулась с ситуацией, когда токен случайно попал в репозиторий проекта и был опубликован на GitHub. Через несколько часов наш бот начал отправлять спам-сообщения всем пользователям. Пришлось срочно перевыпускать токен и чистить историю репозитория. С тех пор я всегда начинаю проект с настройки .gitignore и хранения токенов в переменных окружения, даже если это небольшой личный проект. Безопасность должна быть привычкой, а не реакцией на инцидент.
Для безопасного хранения токена создайте файл .env в корневой директории проекта со следующим содержимым:
BOT_TOKEN=ваш_токен_от_BotFather
Также не забудьте добавить файл .env в .gitignore, если планируете выкладывать код в публичный репозиторий:
# .gitignore
.env
__pycache__/
venv/
*.pyc
BotFather также позволяет настроить дополнительные параметры вашего бота:
| Команда | Описание | Когда использовать |
|---|---|---|
| /setname | Изменить отображаемое имя бота | Когда нужно обновить название |
| /setdescription | Установить описание бота | Для информирования пользователей о функциях |
| /setabouttext | Установить текст "О боте" | Для короткого описания в профиле |
| /setuserpic | Установить аватар бота | Для улучшения узнаваемости |
| /setcommands | Настроить список команд с описаниями | Для улучшения UX и подсказок пользователям |
| /deletebot | Удалить бота | Если бот больше не нужен |
Особое внимание уделите команде /setcommands — она позволяет создать меню команд, которое будет отображаться при вводе "/" в чате с ботом. Формат команды:
start – Запустить бота
help – Получить справку
status – Проверить статус
settings – Настройки
Базовая структура Python-бота для Telegram: код и объяснения
После настройки окружения и получения токена можно приступить к написанию кода для бота. Начнем с простейшего эхо-бота, который будет отвечать на сообщения пользователя. 📝
Создайте файл main.py со следующим содержимым:
import os
import telebot
from dotenv import load_dotenv
# Загружаем переменные окружения из файла .env
load_dotenv()
# Получаем токен из переменных окружения
BOT_TOKEN = os.getenv('BOT_TOKEN')
# Инициализируем бота
bot = telebot.TeleBot(BOT_TOKEN)
# Обработчик команды /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.reply_to(message, "Привет! Я эхо-бот. Отправь мне сообщение, и я отвечу тем же.")
# Обработчик для всех текстовых сообщений
@bot.message_handler(func=lambda message: True)
def echo_message(message):
bot.reply_to(message, message.text)
# Запускаем бота
if __name__ == '__main__':
print("Бот запущен...")
bot.polling(none_stop=True)
Разберем код по частям:
- Импорт библиотек: Мы импортируем необходимые модули, включая telebot для работы с API Telegram и dotenv для работы с переменными окружения.
- Инициализация бота: Создаем экземпляр класса TeleBot, передавая ему токен.
- Обработчики сообщений: Декораторы
@bot.message_handlerпозволяют определить функции, которые будут вызваны при получении определенных сообщений. - Запуск бота: Метод
bot.polling()заставляет бота постоянно проверять наличие новых сообщений.
Основные компоненты архитектуры телеграм-бота:
- Декораторы (handlers): Определяют, какая функция будет вызвана в ответ на определенное сообщение.
- Обработчики событий: Функции, которые выполняются при срабатывании соответствующих декораторов.
- Методы отправки: API для отправки сообщений, фото, документов и других типов контента.
- Polling: Механизм для получения обновлений от серверов Telegram.
Важно понимать объект message, который передается в обработчики сообщений. Он содержит информацию о полученном сообщении, включая:
message.text— текст сообщенияmessage.chat.id— ID чата (используется для отправки ответов)message.from_user.id— ID пользователя, отправившего сообщениеmessage.from_user.first_name— имя пользователяmessage.message_id— ID сообщения
Для обработки различных типов сообщений можно использовать следующие декораторы:
# Обработка команд
@bot.message_handler(commands=['команда1', 'команда2'])
# Обработка сообщений определенного типа
@bot.message_handler(content_types=['text', 'photo', 'document'])
# Обработка на основе пользовательской функции фильтра
@bot.message_handler(func=lambda message: условие)
Типичная структура телеграм-бота может выглядеть так:
# Импорты
import telebot
import некоторые_другие_библиотеки
# Инициализация
bot = telebot.TeleBot(TOKEN)
# Обработчики команд
@bot.message_handler(commands=['start'])
def start_command(message):
pass
# Обработчики контента
@bot.message_handler(content_types=['text'])
def handle_text(message):
pass
# Обработчики колбэков (для инлайн-кнопок)
@bot.callback_query_handler(func=lambda call: True)
def handle_callback(call):
pass
# Запуск бота
if __name__ == '__main__':
bot.polling(none_stop=True)
Добавление интерактивных функций в вашего телеграм-бота
Эхо-бот — это лишь начало. Добавим в нашего бота интерактивные элементы, такие как кнопки, клавиатуры и обработку различных типов сообщений. Эти функции сделают взаимодействие с ботом более удобным и привлекательным для пользователей. 🎮
Расширим наш базовый код, добавив следующие возможности:
- Обычные кнопки (reply keyboard)
- Инлайн-кнопки (inline keyboard)
- Обработка различных типов сообщений
- Создание простого меню
Обновите файл main.py:
import os
import telebot
from telebot import types
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = os.getenv('BOT_TOKEN')
bot = telebot.TeleBot(BOT_TOKEN)
# Обработчик команды /start
@bot.message_handler(commands=['start'])
def send_welcome(message):
# Создаем клавиатуру
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton('Привет 👋')
btn2 = types.KeyboardButton('Помощь ❓')
btn3 = types.KeyboardButton('Информация ℹ️')
markup.add(btn1, btn2, btn3)
bot.send_message(message.chat.id,
f"Привет, {message.from_user.first_name}! Я твой первый телеграм-бот.",
reply_markup=markup)
# Обработчик команды /help
@bot.message_handler(commands=['help'])
def send_help(message):
bot.reply_to(message, "Вот список доступных команд:\n"
"/start – начать взаимодействие\n"
"/help – показать справку\n"
"/info – информация о боте\n"
"/button – показать инлайн-кнопки")
# Обработчик команды /button
@bot.message_handler(commands=['button'])
def show_buttons(message):
# Создаем инлайн-клавиатуру
markup = types.InlineKeyboardMarkup(row_width=2)
btn1 = types.InlineKeyboardButton('Посетить GitHub', url='https://github.com/')
btn2 = types.InlineKeyboardButton('Показать картинку', callback_data='show_image')
btn3 = types.InlineKeyboardButton('Случайное число', callback_data='random_number')
markup.add(btn1)
markup.add(btn2, btn3)
bot.send_message(message.chat.id, "Выберите действие:", reply_markup=markup)
# Обработчик колбэков от инлайн-кнопок
@bot.callback_query_handler(func=lambda call: True)
def handle_callback(call):
if call.data == "show_image":
# Отправка фото
bot.send_photo(call.message.chat.id,
'https://i.imgur.com/CBVZ5hI.jpeg',
caption="Вот ваша картинка!")
elif call.data == "random_number":
import random
bot.send_message(call.message.chat.id, f"Случайное число: {random.randint(1, 100)}")
# Убираем часики с кнопки
bot.answer_callback_query(call.id)
# Обработчик текстовых сообщений
@bot.message_handler(content_types=['text'])
def handle_text(message):
if message.text == 'Привет 👋':
bot.send_message(message.chat.id, "И тебе привет! Как дела?")
elif message.text == 'Помощь ❓':
send_help(message) # Переиспользуем функцию
elif message.text == 'Информация ℹ️':
bot.send_message(message.chat.id, "Я демонстрационный бот, созданный для обучения.")
else:
# Обрабатываем другие текстовые сообщения
bot.send_message(message.chat.id, f"Вы написали: {message.text}")
# Обработчик фото
@bot.message_handler(content_types=['photo'])
def handle_photo(message):
# Получаем информацию о фото
file_id = message.photo[-1].file_id
file_info = bot.get_file(file_id)
bot.reply_to(message, f"Вы отправили фото! ID файла: {file_id}\n"
f"Размер: {file_info.file_size} байт")
# Запускаем бота
if __name__ == '__main__':
print("Бот запущен...")
bot.polling(none_stop=True)
Рассмотрим основные типы интерактивных элементов:
| Тип клавиатуры | Описание | Преимущества | Недостатки |
|---|---|---|---|
| ReplyKeyboardMarkup | Обычные кнопки под полем ввода | Удобны для частых действий | Занимают место в интерфейсе |
| InlineKeyboardMarkup | Кнопки внутри сообщения | Компактны, могут содержать ссылки | Ограничены сообщением |
| ReplyKeyboardRemove | Удаляет клавиатуру | Освобождает место в интерфейсе | Требует дополнительного действия |
| ForceReply | Принудительный ответ на сообщение | Удобно для форм и опросов | Может быть навязчивым |
Советы по улучшению UX вашего бота:
- Обрабатывайте ошибки: Предусмотрите обработку некорректного ввода
- Используйте эмодзи: Они делают интерфейс дружелюбнее
- Сохраняйте состояние: Для сложных ботов используйте FSM (Finite State Machine)
- Добавьте задержки: Небольшие задержки между сообщениями улучшают восприятие
- Персонализируйте сообщения: Обращайтесь к пользователям по имени
Для создания более сложных ботов рекомендую использовать Finite State Machine (FSM) для управления состоянием диалога. В библиотеке pyTelegramBotAPI есть специальные средства для этого, например:
from telebot.handler_backends import State, StatesGroup
from telebot.storage import StateMemoryStorage
# Инициализируем хранилище состояний
state_storage = StateMemoryStorage()
bot = telebot.TeleBot(BOT_TOKEN, state_storage=state_storage)
# Определяем группу состояний
class UserStates(StatesGroup):
name = State()
age = State()
confirmation = State()
# Используем в обработчиках
@bot.message_handler(commands=['register'])
def start_registration(message):
bot.set_state(message.from_user.id, UserStates.name, message.chat.id)
bot.send_message(message.chat.id, "Как вас зовут?")
Размещение и запуск Python-бота для Telegram в сети
Создать бота — это только половина дела. Чтобы он был доступен пользователям 24/7, его необходимо разместить на сервере. Разберем различные способы хостинга телеграм-ботов — от бесплатных вариантов для новичков до профессиональных решений для проектов любого масштаба. 🌐
Существует несколько способов запустить бота на сервере:
- Локальный запуск — подходит для тестирования и разработки
- VPS/VDS хостинг — классическое решение для размещения ботов
- Облачные платформы — современный подход с возможностью масштабирования
- Бесплатные хостинги — экономичное решение для небольших проектов
Для начала рассмотрим, как подготовить бота к размещению. Создайте файл Procfile (без расширения) со следующим содержимым:
worker: python main.py
Также необходимо создать файл runtime.txt, указав версию Python:
python-3.11.0
Для развертывания на облачных платформах понадобится файл requirements.txt, который мы уже создали ранее.
Сравнение популярных платформ для хостинга телеграм-ботов:
| Платформа | Стоимость | Сложность настройки | Производительность | Особенности |
|---|---|---|---|---|
| Heroku | Бесплатно/от $5 | Низкая | Средняя | Удобная интеграция с GitHub |
| PythonAnywhere | Бесплатно/от $5 | Низкая | Средняя | Специализирован для Python |
| DigitalOcean | От $5 | Средняя | Высокая | Полный контроль над сервером |
| AWS Lambda | Оплата по использованию | Высокая | Высокая | Serverless архитектура |
| Vercel | Бесплатно/от $20 | Низкая | Высокая | Быстрое развертывание |
Рассмотрим пошаговую инструкцию для размещения бота на PythonAnywhere:
- Зарегистрируйтесь на PythonAnywhere (есть бесплатный план)
- В разделе "Files" загрузите все файлы вашего проекта (main.py, requirements.txt и др.)
- В разделе "Consoles" откройте новую Bash-консоль
- Установите зависимости:
pip install -r requirements.txt - Создайте файл .env с вашим токеном
- В разделе "Tasks" создайте новую задачу, которая будет запускать вашего бота
- Укажите команду:
python main.pyи настройте расписание (например, запуск каждый час)
Для профессионального использования рекомендуется размещение на VPS с использованием Docker. Создайте файл Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]
И docker-compose.yml:
version: '3'
services:
bot:
build: .
restart: always
env_file:
- .env
volumes:
- ./data:/app/data
Затем на сервере можно запустить контейнер командой:
docker-compose up -d
Дополнительные рекомендации по размещению бота:
- Логирование: Настройте сохранение логов для отслеживания ошибок
- Мониторинг: Используйте инструменты мониторинга (Prometheus, Grafana) для отслеживания состояния бота
- Автоперезапуск: Настройте автоматический перезапуск бота в случае сбоя (например, через systemd или supervisor)
- Резервное копирование: Регулярно делайте бэкапы данных бота
- Websockets вместо polling: Для продакшн-использования лучше настроить webhooks вместо polling
Пример настройки webhooks вместо polling:
import os
import flask
import telebot
from flask import Flask, request
BOT_TOKEN = os.getenv('BOT_TOKEN')
WEBHOOK_URL = os.getenv('WEBHOOK_URL') # URL вашего сервера
bot = telebot.TeleBot(BOT_TOKEN)
app = Flask(__name__)
# Настройка маршрута для вебхуков
@app.route('/' + BOT_TOKEN, methods=['POST'])
def webhook():
update = telebot.types.Update.de_json(request.stream.read().decode('utf-8'))
bot.process_new_updates([update])
return 'OK'
# Настройка вебхуков при запуске
@app.route('/set_webhook', methods=['GET', 'POST'])
def set_webhook():
bot.remove_webhook()
bot.set_webhook(url=WEBHOOK_URL + '/' + BOT_TOKEN)
return f"Webhook установлен на {WEBHOOK_URL}"
# Здесь размещаются обработчики сообщений бота
# ...
if __name__ == "__main__":
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))
Создание телеграм-бота — это не просто технический навык, а ключ к автоматизации повседневных задач и созданию полезных инструментов. Начав с простого эхо-бота, вы можете постепенно расширять его функциональность, добавляя интерактивные элементы и интеграции с внешними сервисами. Помните, что самые успешные боты решают конкретные проблемы пользователей: будь то отслеживание курсов валют, напоминания о событиях или автоматизация рутинных задач. Экспериментируйте, изучайте документацию и не бойтесь пробовать новое — каждая строчка кода приближает вас к созданию по-настоящему полезного инструмента.