Как сделать telegram бота на python

Как сделать telegram бота на python

Telegram предоставляет мощный API, позволяющий создавать интерактивных ботов, которые обрабатывают сообщения, реагируют на команды, отправляют медиафайлы и взаимодействуют с внешними сервисами. Для начала потребуется зарегистрировать бота через BotFather и получить уникальный токен – это единственный способ авторизовать взаимодействие с Telegram Bot API.

Python идеально подходит для разработки ботов благодаря библиотеке python-telegram-bot, которая инкапсулирует низкоуровневые HTTP-запросы и предоставляет удобный синтаксис для обработки сообщений, команд и коллбеков. Установка выполняется через pip install python-telegram-bot. Рекомендуется использовать виртуальное окружение, чтобы изолировать зависимости проекта.

Первый минимально работающий бот должен подключаться к API с использованием токена, запускать цикл прослушивания обновлений (Polling или Webhook) и иметь хотя бы одну команду, например /start. Необходимо убедиться, что токен не хранится в открытом виде – используйте переменные окружения или конфигурационные файлы, исключённые из репозитория.

Проект стоит сразу структурировать: выделить отдельные модули для логики обработки команд, подключения к API, логирования и тестирования. Это облегчает масштабирование, особенно если планируется работа с БД, очередями задач или внешними API.

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

Откройте Telegram и найдите пользователя @BotFather. Это официальный бот Telegram для управления другими ботами.

Отправьте команду /newbot. BotFather запросит имя – оно отображается в заголовке чата. Введите любое понятное пользователю название, например Заметки Бот.

Следующий шаг – задать уникальное имя пользователя (username), оканчивающееся на bot. Пример: notebot2025_bot. Если имя занято, пробуйте другое. После успешного создания BotFather сразу отправит HTTP API токен.

Токен выглядит как строка из символов, например: 123456789:AAHdPzvJpYkV3pXyEzN7c1EFQGmV2_6n5XQ. Это ключ для авторизации вашего бота через Telegram API. Никогда не публикуйте его в открытом доступе.

Скопируйте токен и сохраните в переменной окружения или отдельном файле .env для безопасного использования в коде. Пример записи: BOT_TOKEN=123456789:AAHdPz....

Проверьте бот, найдя его в Telegram по username. Нажмите «Start» – если он отвечает, токен работает.

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

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

pip install python-telegram-bot==20.7

Рекомендуется использовать виртуальное окружение для изоляции зависимостей:

  1. Создайте окружение:
    python -m venv venv
  2. Активируйте его:
    • Linux/macOS:
      source venv/bin/activate
    • Windows:
      venv\Scripts\activate
  3. Установите библиотеку внутри окружения.

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

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

Для корректной работы используйте асинхронную структуру, начиная с версии 20.0. Старые синхронные подходы более не поддерживаются.

Создайте базовую структуру проекта:

  • bot/ – папка с исходным кодом
  • bot/main.py – точка входа
  • requirements.txt – список зависимостей

Пример содержимого requirements.txt:

python-telegram-bot==20.7

Для обновлений следите за официальной документацией: https://docs.python-telegram-bot.org

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

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

Перед началом необходимо создать чёткую структуру проекта, которая обеспечит удобство разработки и масштабируемость.

  • Создайте рабочую директорию, например: telegram_bot/
  • Внутри неё создайте следующие файлы и папки:
    • bot/ – директория с исходным кодом бота
    • bot/__init__.py – делает директорию модулем
    • bot/config.py – конфигурация (токен и прочее)
    • bot/main.py – точка входа
    • requirements.txt – зависимости проекта

Установите минимально необходимые библиотеки:

pip install python-telegram-bot==20.6
pip freeze > requirements.txt

В файле config.py укажите токен бота:

BOT_TOKEN = "ваш_токен_от_BotFather"

В файле main.py добавьте минимальный код запуска бота:

from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
from bot import config
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Бот запущен!")
app = ApplicationBuilder().token(config.BOT_TOKEN).build()
app.add_handler(CommandHandler("start", start))
if __name__ == "__main__":
app.run_polling()

Для запуска используйте:

python bot/main.py

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

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

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

Для обработки текстовых сообщений используется хэндлер MessageHandler из библиотеки python-telegram-bot. Необходимо фильтровать сообщения по типу filters.TEXT и регистрировать функцию-обработчик в диспетчере.

Пример настройки:

from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, filters
async def handle_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
user_message = update.message.text.strip()
if user_message.lower() == "привет":
await update.message.reply_text("Привет! Чем могу помочь?")
elif user_message.lower() == "помощь":
await update.message.reply_text("Список команд: /start, /help, /info")
else:
await update.message.reply_text("Не понял запрос. Попробуйте другую команду.")
app = ApplicationBuilder().token("ВАШ_ТОКЕН").build()
app.add_handler(MessageHandler(filters.TEXT & (~filters.COMMAND), handle_text))
app.run_polling()

Следует учитывать, что фильтр ~filters.COMMAND исключает команды, передаваемые через слэш. Это предотвращает дублирование логики обработки.

Рекомендуется предварительно очищать входной текст от пробелов и приводить к нижнему регистру, чтобы избежать ошибок при сравнении. Обработка должна быть максимально однозначной: избегайте вложенных условий, применяйте match-case (с Python 3.10) для упрощения структуры кода.

Если бот предполагает свободный ввод, интегрируйте обработку с ИИ-моделью или базой знаний, иначе ограничьте список допустимых команд, чтобы повысить предсказуемость и стабильность поведения.

Добавление кнопок и меню с использованием InlineKeyboard

Добавление кнопок и меню с использованием InlineKeyboard

Для создания интерактивных кнопок в сообщениях Telegram-бота используется InlineKeyboardMarkup из библиотеки aiogram или telebot. Эти кнопки отображаются внутри сообщения и не исчезают при выборе.

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

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
keyboard = InlineKeyboardMarkup(row_width=2)
keyboard.add(
InlineKeyboardButton("Кнопка 1", callback_data="btn1"),
InlineKeyboardButton("Кнопка 2", callback_data="btn2")
)

callback_data – обязательный параметр, передающий идентификатор выбранной кнопки в хендлер. Его длина не должна превышать 64 символов. Не следует дублировать значения, иначе возникнут конфликты при обработке событий.

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

@dp.message_handler(commands=["start"])
async def send_menu(message: types.Message):
await message.answer("Выберите действие:", reply_markup=keyboard)

Для обработки нажатий используется декоратор @dp.callback_query_handler. Пример:

@dp.callback_query_handler(lambda c: c.data == "btn1")
async def process_callback_btn1(callback_query: types.CallbackQuery):
await callback_query.answer("Вы выбрали первую кнопку")

Если нужно обновить сообщение после выбора, используйте edit_message_text вместо отправки нового сообщения:

await bot.edit_message_text("Обновлённый текст", chat_id=callback_query.message.chat.id, message_id=callback_query.message.message_id)

Для построения вложенных меню применяйте разные клавиатуры в зависимости от callback_data и обновляйте содержимое сообщений. Избегайте использования одинаковых текстов кнопок с разными действиями – это затрудняет сопровождение кода.

Inline-кнопки подходят для создания меню навигации, подтверждения действий, переключателей. Они не загромождают чат, так как не отправляют отдельные сообщения при нажатии.

Работа с командами и создание обработчиков

Работа с командами и создание обработчиков

Для реализации команд в Telegram-боте на Python используется библиотека aiogram или pyTelegramBotAPI. Основной принцип – связывать конкретную команду с функцией-обработчиком, которая будет вызвана при получении этой команды.

В aiogram создание обработчика команды выглядит так:

@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    await message.answer("Привет! Я бот.")

Важно указывать список команд в параметре commands. Можно регистрировать несколько команд для одного обработчика, например commands=['help', 'info'].

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

Обработка нестандартных сообщений (не команд) требует других хендлеров с фильтрами, например по тексту или регулярным выражениям. Но именно команды выделяются префиксом «/» и обрабатываются отдельно.

В pyTelegramBotAPI для регистрации команды используется метод @bot.message_handler(commands=['start']). Обработчик получает объект сообщения, с которым можно взаимодействовать, отвечая или изменяя состояние пользователя.

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

Использование параметров команд (например, /start arg1 arg2) требует парсинга текста сообщения внутри обработчика, что стоит делать через методы split() или регулярные выражения для точного выделения аргументов.

Чтение и запись данных с использованием JSON или SQLite

Для хранения данных Telegram-бота на Python чаще всего применяются JSON-файлы и база данных SQLite. Выбор зависит от объема данных и требований к производительности.

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

Чтение данных:

import json
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)

Запись данных:

with open('data.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)

Обязательно указывайте encoding='utf-8' для поддержки кириллицы, а indent=4 делает файл читаемым. Важно при работе с JSON избегать одновременного доступа к файлу из нескольких потоков без блокировок – это приведет к повреждению данных.

SQLite – встроенная СУБД, оптимальная для хранения структурированных и больших объемов информации. Для работы используйте модуль sqlite3:

Создание таблицы и подключение:

import sqlite3
conn = sqlite3.connect('bot_data.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
username TEXT,
points INTEGER DEFAULT 0
)
''')
conn.commit()

Добавление или обновление данных:

cursor.execute('''
INSERT INTO users (user_id, username, points) VALUES (?, ?, ?)
ON CONFLICT(user_id) DO UPDATE SET points=excluded.points
''', (user_id, username, points))
conn.commit()

Получение данных:

cursor.execute('SELECT username, points FROM users WHERE user_id = ?', (user_id,))
result = cursor.fetchone()

Используйте параметризованные запросы, чтобы избежать SQL-инъекций. Для повышения производительности держите соединение открытым в течение сессии бота, закрывайте только при завершении работы. SQLite обеспечивает надежность благодаря транзакциям, поэтому для групп операций применяйте conn.commit() после серии изменений.

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

Webhook – механизм, при котором Telegram отправляет запросы на ваш сервер при каждом новом сообщении, что значительно снижает нагрузку по сравнению с опросом (polling). Для настройки webhook необходимо выполнить несколько ключевых шагов.

Во-первых, сервер должен быть доступен по HTTPS с валидным SSL-сертификатом. Рекомендуется использовать бесплатные сертификаты Let’s Encrypt. Без SSL Telegram не примет адрес webhook.

Далее, реализуйте на сервере веб-сервер, способный принимать POST-запросы. Например, на Python с использованием Flask:

from flask import Flask, request
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
    update = request.json
    # обработка update
    return 'ok'

URL webhook должен иметь вид https://yourdomain.com/webhook. Его нужно зарегистрировать у Telegram с помощью метода setWebhook, отправив запрос:

https://api.telegram.org/bot/setWebhook?url=https://yourdomain.com/webhook

После успешной регистрации Telegram будет отправлять все обновления на этот адрес.

Принимаемые данные – JSON с описанием события (сообщение, команда, callback и др.). Важно обрабатывать их быстро, иначе Telegram может считать webhook недоступным и отключить его. Время ответа сервера должно быть менее 5 секунд.

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

Для постоянной работы бота на сервере запустите веб-сервер под контролем системы управления процессами, например, с помощью systemd или supervisor.

При изменениях в коде не забудьте перезапустить веб-сервер и проверить, что webhook корректно принимает обновления, отправив тестовое сообщение в бота.

Таким образом, развёртывание на webhook обеспечивает мгновенную реакцию бота и экономит ресурсы сервера, при этом требует надёжной инфраструктуры с поддержкой HTTPS и стабильной работы веб-сервера.

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

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

Для разработки Telegram-бота чаще всего используется библиотека python-telegram-bot, которая обеспечивает удобный интерфейс для работы с Telegram API. Также может понадобиться requests для отправки HTTP-запросов и json для обработки данных. В зависимости от задач, могут потребоваться дополнительные библиотеки, например, для работы с базами данных или обработки текста.

Как настроить взаимодействие бота с пользователем в Telegram?

Взаимодействие происходит через обработку входящих сообщений. В коде необходимо создать обработчики (handlers), которые реагируют на команды и текстовые сообщения. Например, команда /start обычно запускает приветствие. Обработчики регистрируются в объекте Dispatcher, который отвечает за распределение сообщений по нужным функциям. Таким образом можно построить диалог и реагировать на действия пользователя.

Можно ли запустить Telegram-бота на бесплатном хостинге?

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

Как бот обрабатывает различные типы сообщений, например, текст, фото или документы?

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

Какие основные шаги для защиты Telegram-бота от несанкционированного доступа?

Во-первых, нужно хранить токен бота в защищённом месте и не публиковать его открыто. Во-вторых, можно ограничить доступ к определённым функциям бота, проверяя ID пользователя. Также рекомендуется обрабатывать ошибки корректно, чтобы не раскрывать внутреннюю информацию. Наконец, при работе с базами данных и внешними сервисами важно использовать безопасные методы хранения и передачи данных.

Какие библиотеки на Python понадобятся для создания простого Telegram-бота?

Для создания базового Telegram-бота на Python чаще всего используют библиотеку `python-telegram-bot`. Она предоставляет удобный интерфейс для взаимодействия с API Telegram, позволяет обрабатывать сообщения и команды пользователей. Кроме неё может пригодиться `requests` для отправки HTTP-запросов, если бот взаимодействует с внешними сервисами. Установка производится через пакетный менеджер pip, например, команда `pip install python-telegram-bot`.

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

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

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