Как написать бот для telegram на python

Как написать бот для telegram на python

Боты в Telegram – это полноценные интерфейсы, работающие через API, и их создание не требует запуска веб-сервера. Достаточно Python и токена от BotFather. Telegram предоставляет RESTful API, через который бот отправляет и получает сообщения. Основной обмен происходит через методы sendMessage, getUpdates, setWebhook и другие, с поддержкой JSON-формата.

Для разработки потребуется библиотека python-telegram-bot или aiogram. Первая удобна для начинающих благодаря высокой абстракции, вторая – для асинхронных приложений. Установка осуществляется через pip install, и уже после пары строк кода можно получить первую реакцию бота на команды.

Важно сразу определить структуру проекта: создать отдельные модули для обработки команд, сообщений и ошибок. Хранение токена – только через переменные окружения или .env-файл. Пренебрежение этим ведёт к утечкам доступа, особенно при публикации кода в открытые репозитории.

Создание простого эхо-бота займёт не больше 10 минут, но дальнейшее развитие требует понимания ограничений Telegram API, таких как лимиты на количество запросов в секунду и правила обработки обновлений. Правильное использование long polling или webhook влияет на стабильность и скорость отклика бота.

Установка и настройка библиотеки python-telegram-bot

Установка и настройка библиотеки python-telegram-bot

Для работы с Telegram API потребуется библиотека python-telegram-bot. Она предоставляет удобный интерфейс для взаимодействия с Bot API Telegram. Установите последнюю стабильную версию с помощью pip:

pip install python-telegram-bot --upgrade

Убедитесь, что используете Python 3.7 или выше – более старые версии не поддерживаются. Для изоляции окружения рекомендуется использовать venv:

python -m venv venv
source venv/bin/activate # для Linux/macOS
venv\Scripts\activate # для Windows

После установки проверьте доступность библиотеки:

python -c "import telegram; print(telegram.__version__)"

Создайте файл bot.py и добавьте базовый каркас бота:


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

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("Бот запущен!")

app = ApplicationBuilder().token("ВАШ_ТОКЕН").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()

Токен необходимо получить у BotFather в Telegram. Он представляет собой строку формата 123456789:ABCDefGhIJKlmNoPQRstuVWXyz. Храните токен в переменных окружения или используйте файл .env с библиотекой python-dotenv:

pip install python-dotenv

Создайте .env:

TOKEN=123456789:ABCDefGhIJKlmNoPQRstuVWXyz

И загрузите его в коде:


from dotenv import load_dotenv
import os

load_dotenv()
TOKEN = os.getenv("TOKEN")

Теперь бот готов к запуску. Команда python bot.py запустит бота, который ответит на команду /start. Убедитесь, что интернет-соединение стабильно – библиотека использует long polling по умолчанию.

Получение токена бота через BotFather

Получение токена бота через BotFather

Для регистрации нового бота в Telegram используется официальный бот BotFather. Он выдаёт уникальный токен, необходимый для взаимодействия с API Telegram.

  1. Откройте Telegram и найдите @BotFather.
  2. Нажмите «Start» или введите команду /start.
  3. Для создания нового бота используйте команду /newbot.
  4. Укажите имя бота – оно будет отображаться в чате (можно изменить позже).
  5. Задайте уникальное имя пользователя, оканчивающееся на bot, например: mycustombot.
  6. BotFather вернёт токен в формате 123456789:ABCdefGhIjkLmNopQRsTUVwxyZ. Скопируйте его – он понадобится для подключения к API.

Токен – ключевой элемент аутентификации. Не публикуйте его в открытом доступе. Если он скомпрометирован, используйте команду /revoke в BotFather, чтобы создать новый.

  • Команда /mybots позволяет управлять всеми вашими ботами.
  • Через Edit Bot можно изменить имя, описание, командный список и другие параметры.

После получения токена переходите к написанию кода – именно он обеспечит связь между ботом и Telegram API.

Создание базовой структуры проекта бота

Создание базовой структуры проекта бота

Создайте отдельную директорию для проекта, например telegram_bot. Внутри неё разместите следующие ключевые элементы:

bot.py – основной исполняемый файл, в котором инициализируется бот и настраиваются обработчики. Используйте python-telegram-bot версии 20 и выше для асинхронной архитектуры. Инициализируйте Application через ApplicationBuilder.

config.py – файл для хранения конфигурационных данных: токена, настроек логирования, путей к ресурсам. Избегайте хардкода в основном коде.

handlers/ – пакет с модулями, в каждом из которых размещаются логически связанные функции-обработчики команд и сообщений. Например: start_handler.py, help_handler.py.

services/ – вспомогательные модули для работы с внешними API, базами данных, файловой системой. Исключите бизнес-логику из обработчиков, размещая её здесь.

utils/ – утилиты: форматирование сообщений, валидация данных, конвертация типов. Собирайте повторно используемые функции в этом каталоге.

requirements.txt – список зависимостей. Укажите точные версии библиотек: python-telegram-bot==20.6, aiohttp, pydantic (при необходимости).

.env – файл с переменными окружения. Храните токены и секретные данные. Используйте python-dotenv для загрузки конфигурации.

Инициализируйте виртуальное окружение внутри проекта: python -m venv venv. Добавьте venv/ в .gitignore, чтобы не загружать его в репозиторий.

Используйте __init__.py в папках handlers, services и utils, чтобы Python распознавал их как пакеты. Это обеспечит корректный импорт между модулями.

Обработка команд с помощью декораторов

Обработка команд с помощью декораторов

Для обработки команд в Telegram-боте на Python используется библиотека python-telegram-bot. Основной способ – использование декораторов из модуля telegram.ext. Это позволяет чётко связывать команды с функциями-обработчиками, обеспечивая читаемость и модульность кода.

Подключение необходимых компонентов:

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

Создание обработчика команды с помощью декоратора:

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Бот запущен. Введите команду.")

Регистрация обработчика в приложении:

app = ApplicationBuilder().token("ВАШ_ТОКЕН").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()

Рекомендация: избегайте дублирования логики в разных обработчиках. Выносите общие части в отдельные функции.

Совет по безопасности: проверяйте права пользователя внутри обработчиков, особенно если бот предоставляет административные команды.

Проверка аргументов: если команда должна принимать аргументы, используйте context.args. Пример:

async def echo_arg(update: Update, context: ContextTypes.DEFAULT_TYPE):
if context.args:
await update.message.reply_text(f"Вы ввели: {' '.join(context.args)}")
else:
await update.message.reply_text("Нет аргументов.")

Убедитесь, что каждый обработчик выполняет только одну логическую задачу. Это упрощает отладку и тестирование.

Ответы на текстовые сообщения пользователей

Подключите обработчик: application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text)). Он перехватывает каждое текстовое сообщение, исключая команды, и избавляет от лишних if‑проверок внутри функции.

Создавайте лаконичные функции‑обработчики. Минимальный сигнатурный набор для python‑telegram‑bot v21+ – async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE). Используйте await update.message.reply_text() и избегайте синхронных вызовов, чтобы не блокировать цикл событий.

Фильтруйте содержимое через регулярные выражения: filters.Regex(r»^\d{4}$») быстро отличит год от произвольного текста, не требуя внешних библиотек. Для русского языка дополните emoji‑фильтром (filters.Regex(r»[😀-🙏]»)), чтобы реагировать на смайлы.

Храните кратковременное состояние в context.user_data. Например, поле context.user_data[«awaiting_email»] = True позволяет после запроса адреса электронной почты фильтровать следующее сообщение пользователя и очищать флаг сразу после валидации.

Добавляйте пользовательские клавиатуры с ReplyKeyboardMarkup для типичных ответов («Да», «Нет»). Это снижает количество опечаток и ускоряет коммуникацию. Для возврата к обычному вводу отправьте пустую клавиатуру: ReplyKeyboardRemove().

Чтобы обработчик не «падал» на неожиданных символах, оборачивайте критичные операции в try‑except и логируйте исключения через logger.exception(). При ошибке отвечайте универсальным сообщением («Произошла ошибка, попробуйте еще раз»), но не сообщайте подробностей стека пользователю.

Сохраняйте контекст ответа: await update.message.reply_text(text, reply_to_message_id=update.message.message_id). Это делает диалог в группах визуально структурированным и снижает вероятность путаницы при одновременных обсуждениях.

Для сложных сценариев применяйте конечные автоматы из ConversationHandler, задавая шаги как константы (например, ASK_NAME, ASK_AGE). Это упрощает поддержку и гарантирует, что каждый ответ будет обработан в правильном состоянии.

Обновляйте обработчики при добавлении новых функций: перезапускать весь бот не нужно – достаточно вызвать application.stop(), внести изменения и снова application.run_polling(). В продакшене настройте webhook и автоматическую перезагрузку контейнера для безостановочной работы.

Работа с кнопками и встроенной клавиатурой

Работа с кнопками и встроенной клавиатурой

В Telegram-ботах кнопки – ключевой элемент взаимодействия с пользователем. Встроенная клавиатура (InlineKeyboard) позволяет создавать динамичные интерфейсы с возможностью обрабатывать нажатия без отправки отдельного сообщения.

Для создания встроенной клавиатуры используется класс InlineKeyboardMarkup, а для кнопок – InlineKeyboardButton. Каждая кнопка может содержать текст и callback-данные, которые бот получает при нажатии.

Пример создания клавиатуры с двумя кнопками:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup
keyboard = [
[InlineKeyboardButton("Да", callback_data='yes')],
[InlineKeyboardButton("Нет", callback_data='no')]
]
reply_markup = InlineKeyboardMarkup(keyboard)

Отправка сообщения с такой клавиатурой:

bot.send_message(chat_id=chat_id, text="Выберите вариант:", reply_markup=reply_markup)

Для обработки нажатий необходимо реализовать обработчик callback-запросов. Он получает объект CallbackQuery, из которого можно извлечь callback_data и идентификатор пользователя.

Важно всегда подтверждать обработку callback-запроса методом answer_callback_query(), чтобы у пользователя не оставалось «зависших» индикаторов загрузки.

Пример простого обработчика:

def callback_handler(update, context):
query = update.callback_query
data = query.data
if data == 'yes':
query.edit_message_text(text="Вы выбрали: Да")
elif data == 'no':
query.edit_message_text(text="Вы выбрали: Нет")
query.answer()

Использование edit_message_text вместо нового сообщения улучшает пользовательский опыт, обновляя интерфейс в рамках одного сообщения.

Для создания клавиатуры с кнопками, отправляющими URL, используйте параметр url:

InlineKeyboardButton("Перейти на сайт", url="https://example.com")

Также существует ReplyKeyboardMarkup – обычная клавиатура, заменяющая системную. Её применяют для быстрого ввода часто используемых команд. Она отправляется вместе с сообщением, но не поддерживает callback-обработку.

При использовании ReplyKeyboard важно контролировать размер и количество кнопок, чтобы не перегружать интерфейс пользователя. Максимум – 8 кнопок в 2 строки.

Развёртывание бота на сервере с использованием webhook

Развёртывание бота на сервере с использованием webhook

Для организации приёма обновлений от Telegram через webhook необходимо иметь сервер с публичным HTTPS-адресом и валидным SSL-сертификатом. Самый простой способ – использовать облачные VPS (например, DigitalOcean, AWS, Hetzner) или платформы с поддержкой HTTPS (Heroku, Render). Важно, чтобы сервер был всегда доступен и не блокировал входящие соединения на порт 443.

Настройка webhook начинается с вызова метода Telegram API setWebhook, куда передаётся URL сервера, на который Telegram будет отправлять обновления. URL должен использовать HTTPS и поддерживать POST-запросы. Пример запроса на Python:

requests.get("https://api.telegram.org/bot<TOKEN>/setWebhook?url=https://yourdomain.com/webhook")

Для обработки входящих запросов удобнее использовать веб-фреймворк, например, Flask или FastAPI. Сервер принимает JSON с обновлением, декодирует его и обрабатывает. Важно быстро возвращать ответ 200 OK, иначе Telegram будет считать, что webhook недоступен, и попытки доставки обновлений будут повторяться.

Рекомендуется реализовать логирование ошибок и запросов для отладки. Если бот выполняет долгие операции, их стоит выносить в отдельные потоки или очереди, чтобы не задерживать ответ на webhook.

Для обеспечения безопасности можно проверять поле secret_token при настройке webhook, которое Telegram будет отправлять в заголовках запросов. Это позволит убедиться, что запросы действительно от Telegram.

Автоматический перезапуск сервера при сбоях обеспечивают инструменты вроде systemd, supervisord или Docker с restart policy. Для получения валидного сертификата удобно использовать бесплатный Let’s Encrypt с автоматическим обновлением через certbot.

Хранение пользовательских данных с использованием SQLite

SQLite – легковесная встраиваемая база данных, идеально подходящая для телеграм-ботов с небольшим и средним объемом данных. Ее ключевое преимущество – отсутствие необходимости в отдельном сервере, что упрощает развертывание и сопровождение.

Для начала работы создайте базу и таблицы командой:

import sqlite3
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
last_name TEXT,
last_interaction TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
conn.commit()

Рекомендации по структуре таблиц:

  • user_id – уникальный идентификатор пользователя из Telegram, основа для ссылок.
  • username, first_name, last_name – для персонализации сообщений.
  • last_interaction – позволяет отслеживать активность и очищать устаревшие данные.

Для вставки или обновления данных используйте запросы с параметризацией, чтобы избежать SQL-инъекций:

def upsert_user(user):
cursor.execute('''
INSERT INTO users (user_id, username, first_name, last_name)
VALUES (?, ?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET
username=excluded.username,
first_name=excluded.first_name,
last_name=excluded.last_name,
last_interaction=CURRENT_TIMESTAMP
''', (user.id, user.username, user.first_name, user.last_name))
conn.commit()

Рекомендуется использовать ON CONFLICT для обновления существующих записей, что предотвращает дублирование и сохраняет актуальность данных.

Для выборки информации применяйте запросы с индексами по user_id, чтобы обеспечить скорость и масштабируемость при росте базы.

Управление соединением:

  • Открывайте соединение один раз при старте бота и закрывайте при остановке.
  • Используйте параметр check_same_thread=False, если планируете доступ из нескольких потоков.
  • Обрабатывайте исключения с перезапуском транзакций, чтобы избежать потери данных.

SQLite хорошо интегрируется с библиотеками Python для Telegram, например, aiogram или pyTelegramBotAPI, через синхронные или асинхронные обертки.

Вопрос-ответ:

Какие библиотеки нужны для создания телеграм-бота на Python с нуля?

Для разработки телеграм-бота на Python обычно используют библиотеку python-telegram-bot или telebot (pyTelegramBotAPI). Они обеспечивают удобные инструменты для взаимодействия с API Телеграма. Также понадобится requests для работы с HTTP-запросами и, возможно, библиотека для работы с базами данных, например, sqlite3 или SQLAlchemy, если бот должен хранить данные.

Как настроить бота и получить токен для доступа к Telegram API?

Для начала нужно создать бота через официальный бот BotFather в Telegram. После запуска диалога с BotFather, с помощью команды /newbot задаётся имя и уникальный username бота. В ответ вы получите токен — уникальную строку, которая используется для авторизации запросов к Telegram API. Этот токен нужно хранить в безопасности и использовать в коде для подключения бота к платформе.

Как реализовать обработку команд пользователя в телеграм-боте на Python?

Обработка команд происходит через установку специальных обработчиков, которые реагируют на сообщения с определённым текстом, например, /start или /help. В библиотеке python-telegram-bot это делают с помощью класса CommandHandler, куда передаётся название команды и функция, которая будет вызвана при получении этой команды. Внутри функции можно отправлять сообщения, работать с данными пользователя и выполнять логику бота.

Можно ли сделать так, чтобы бот отвечал не только текстом, но и отправлял изображения или документы?

Да, телеграм-бот может отправлять разные типы сообщений, включая фотографии, документы, видео, аудио и стикеры. В python-telegram-bot для этого используются соответствующие методы, например, send_photo, send_document и другие. Для отправки файлов обычно требуется указать путь к файлу или URL, откуда бот может загрузить содержимое.

Как хранить данные пользователей и управлять сессиями в телеграм-боте?

Для хранения информации о пользователях и управлении состоянием сессии можно использовать базы данных — например, SQLite, PostgreSQL или даже простые JSON-файлы, если данных немного. В коде нужно реализовать логику сохранения и чтения этих данных, чтобы бот мог запоминать настройки, предпочтения или промежуточные результаты взаимодействия. Для удобства некоторые используют встроенные механизмы состояний в библиотеках, позволяющие отслеживать текущий шаг диалога с пользователем.

Ссылка на основную публикацию