Разработка чат-бота для Telegram с использованием Python: шаг за шагом
В этой статье мы создадим простого чат-бота для Telegram с использованием Python. Мы пройдем все этапы: от установки зависимостей и настройки окружения до написания и запуска самого бота. В конце статьи будет приведен весь код, чтобы вы могли сразу начать работу.
Установка виртуального окружения
Python имеет встроенный модуль для работы с виртуальными окружениями — venv
. Для начала установим его (если он еще не установлен):
- Проверьте наличие Python на компьютере:
В терминале выполните команду:
python3 --version
или
python --version
- Убедитесь, что установлена версия Python 3.6 или выше.
- Убедитесь, что установлен
venv
:
Обычноvenv
включен в стандартную библиотеку Python. Но если он недоступен, установите его через менеджер пакетов вашей ОС. Например:
sudo apt install python3-venv # Для Debian/Ubuntu
Создание виртуального окружения
Перейдите в директорию, где будет находиться ваш проект:
cd /path/to/your/project
Создайте виртуальное окружение:
python3 -m venv venv
- Эта команда создаст папку
venv
, которая будет содержать изолированную копию Python и менеджер пакетовpip
.
Активация виртуального окружения
Для активации виртуального окружения выполните следующую команду:
- На Linux/MacOS:
source venv/bin/activate
На Windows:
venv\Scripts\activate
После активации вы заметите, что в командной строке появится префикс (venv)
, указывающий на активное окружение.
Установка зависимостей
Когда виртуальное окружение активировано, установите зависимости для вашего проекта:
pip install python-telegram-bot
Вы также можете создать файл requirements.txt
для управления зависимостями. Чтобы сохранить текущие зависимости в файл, выполните:
pip freeze > requirements.txt
Позже, чтобы установить все зависимости из файла, используйте:
pip install -r requirements.txt
Деактивация виртуального окружения
Когда вы закончите работу над проектом, деактивируйте виртуальное окружение, чтобы выйти из него:
deactivate
Чтобы взаимодействовать с API Telegram, нам нужен токен для бота. Для этого:
- Откройте Telegram и найдите бота BotFather.
- Напишите команду
/start
, а затем используйте команду/newbot
, чтобы создать нового бота. - Следуйте инструкциям для создания бота и получения токена.
Токен будет выглядеть как длинная строка, например: 1234567890:ABCDEFghijklmNOPQRSTUVWXYZ1234567890
.
Создание бота
Теперь, когда все зависимостях установлены и у нас есть токен, давайте создадим самого бота.
Создайте новый Python файл, например my_telegram_bot.py
.
from telegram import Update from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext # Указываем токен, который получили от BotFather TOKEN = 'YOUR_TOKEN_HERE' # Функция для команды /start def start(update: Update, context: CallbackContext) -> None: update.message.reply_text('Привет! Я твой Telegram-бот.') # Функция для обработки текстовых сообщений def echo(update: Update, context: CallbackContext) -> None: # Бот будет отвечать на все сообщения тем же текстом update.message.reply_text(update.message.text) # Основная функция, которая запускает бота def main(): # Создаем объект Updater, который управляет взаимодействием с Telegram API updater = Updater(TOKEN) # Получаем диспетчер для регистрации обработчиков dispatcher = updater.dispatcher # Регистрация обработчиков команд dispatcher.add_handler(CommandHandler("start", start)) # Регистрация обработчика для текстовых сообщений dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, echo)) # Запуск бота updater.start_polling() # Бот будет работать до того момента, пока не нажмем Ctrl+C updater.idle() if __name__ == '__main__': main()
Подробное объяснение кода
- Импорт библиотек:
- Мы импортируем
Update
иCallbackContext
из библиотекиtelegram
, а такжеUpdater
,CommandHandler
,MessageHandler
иFilters
изtelegram.ext
. - Эти классы позволяют нам работать с Telegram API и обрабатывать различные события (например, команды и текстовые сообщения).
- Мы импортируем
- Получение токена:
- В строке
TOKEN = 'YOUR_TOKEN_HERE'
указываем токен, который мы получили от BotFather.
- В строке
- Обработчик команды
/start
:- Функция
start
вызывается, когда пользователь отправляет команду/start
. - Эта функция отвечает приветственным сообщением.
- Функция
- Обработчик текстовых сообщений:
- Функция
echo
вызывается, когда бот получает любое текстовое сообщение. - В ответ на любое сообщение бот будет отправлять обратно тот же текст (так называемый эхо-бот).
- Функция
- Основная функция:
- Мы создаем объект
Updater
с нашим токеном, который управляет всеми запросами к API Telegram. - Затем создаем диспетчер и добавляем обработчики для команд и текстовых сообщений.
- Метод
start_polling()
запускает бота в фоновом режиме. - Метод
idle()
позволяет боту работать до тех пор, пока вы не завершите его вручную (например, нажатием Ctrl+C).
- Мы создаем объект
Запуск бота
- Сохраните файл и откройте терминал.
- Перейдите в директорию, где находится ваш файл.
- Запустите бота командой:
python my_telegram_bot.py
Если все сделано правильно, бот будет запущен и начнет слушать сообщения. Вы можете найти его в Telegram, начав диалог и отправив команду /start
. Бот должен ответить вам приветственным сообщением.
Итоги
Поздравляю, вы создали простого Telegram-бота на Python! Этот бот отвечает на команду /start
и эхо-ответами на текстовые сообщения.
Вы можете расширить функциональность бота, добавив больше команд или обработчиков для разных типов сообщений. Например, вы можете интегрировать API для получения данных, создавать inline-кнопки, а также использовать базы данных для хранения информации.
Расширение функционала
Давайте развернем функциональность нашего Telegram-бота и сделаем его более сложным. Мы добавим следующие функции:
- Обработку команд: добавим несколько команд для работы с пользователями (например,
/help
,/about
). - Инлайн кнопки: добавим кнопки, которые можно использовать прямо в чате.
- База данных: добавим возможность сохранять информацию о пользователях в базу данных (например, SQLite).
- Обработка изображений: добавим возможность отправки и получения изображений.
Создание базы данных
Для хранения информации о пользователях и их предпочтениях создадим небольшую базу данных с использованием SQLite.
import sqlite3 # Функция для создания таблицы пользователей в базе данных def create_db(): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT)''') conn.commit() conn.close() # Функция для добавления пользователя в базу данных def add_user(user_id, first_name, last_name): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute('''INSERT OR REPLACE INTO users (user_id, first_name, last_name) VALUES (?, ?, ?)''', (user_id, first_name, last_name)) conn.commit() conn.close()
Обработчик команд
Теперь давайте добавим несколько команд:
/start
— приветственное сообщение./help
— описание доступных команд./about
— информация о боте.
Добавим эти команды в код бота.
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext # Указываем токен TOKEN = 'YOUR_TOKEN_HERE' # Функция для команды /start def start(update: Update, context: CallbackContext) -> None: user = update.message.from_user add_user(user.id, user.first_name, user.last_name) # Сохраняем пользователя в базе данных update.message.reply_text(f'Привет, {user.first_name}! Я твой Telegram-бот.') # Функция для команды /help def help_command(update: Update, context: CallbackContext) -> None: help_text = ( "Доступные команды:\n" "/start - Приветствие\n" "/help - Список команд\n" "/about - О боте" ) update.message.reply_text(help_text) # Функция для команды /about def about(update: Update, context: CallbackContext) -> None: about_text = ( "Этот бот был создан для демонстрации функционала Telegram API с использованием Python.\n" "Вы можете использовать различные команды для взаимодействия с ботом." ) update.message.reply_text(about_text) # Функция для инлайн кнопок def inline_buttons(update: Update, context: CallbackContext) -> None: keyboard = [ [InlineKeyboardButton("Нажми меня", callback_data='1')], [InlineKeyboardButton("Показать информацию", callback_data='2')] ] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text('Выберите действие:', reply_markup=reply_markup) # Функция для обработки нажатий на кнопки def button(update: Update, context: CallbackContext) -> None: query = update.callback_query query.answer() # Ответ на запрос, чтобы Telegram знал, что кнопка была нажата if query.data == '1': query.edit_message_text(text="Вы нажали кнопку 1!") elif query.data == '2': query.edit_message_text(text="Вы выбрали показать информацию!") # Основная функция def main(): create_db() # Создаем базу данных # Создаем объект Updater updater = Updater(TOKEN) # Получаем диспетчер dispatcher = updater.dispatcher # Регистрируем обработчики команд dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("help", help_command)) dispatcher.add_handler(CommandHandler("about", about)) # Регистрируем обработчик для инлайн кнопок dispatcher.add_handler(CommandHandler("inline", inline_buttons)) # Регистрируем обработчик для кнопок dispatcher.add_handler(CallbackQueryHandler(button)) # Запуск бота updater.start_polling() # Бот будет работать до тех пор, пока не нажмем Ctrl+C updater.idle() if __name__ == '__main__': main()
Подробное объяснение кода
- Создание базы данных:
- Мы создали таблицу
users
в базе данных SQLite, чтобы хранитьuser_id
, имя и фамилию пользователя. - Функция
add_user
добавляет пользователя в базу данных или обновляет данные, если пользователь уже существует.
- Мы создали таблицу
- Обработчики команд:
/start
: Приветствие и добавление пользователя в базу данных./help
: Показывает список доступных команд./about
: Отображает информацию о боте.
- Инлайн кнопки:
- При отправке команды
/inline
пользователю показывается кнопка с текстом. Когда пользователь нажимает на кнопку, срабатывает обработчикbutton
, который обрабатывает нажатие. - В примере есть две кнопки: одна выводит текст “Вы нажали кнопку 1!”, а другая — “Вы выбрали показать информацию!”.
- При отправке команды
Расширение функционала (обработка изображений)
Добавим возможность отправлять и получать изображения.
# Функция для обработки изображений def handle_photo(update: Update, context: CallbackContext) -> None: # Получаем фото, которое отправил пользователь photo_file = update.message.photo[-1].get_file() # Сохраняем фото на сервере photo_file.download('user_photo.jpg') update.message.reply_text('Фото сохранено!') # Регистрируем обработчик для фото dispatcher.add_handler(MessageHandler(Filters.photo, handle_photo))
Теперь, если пользователь отправит фото, бот сохранит его и ответит сообщением.
Заключение
Теперь наш бот стал гораздо более функциональным! Мы добавили несколько команд, поддержку инлайн кнопок, а также возможность сохранять информацию о пользователях в базу данных и обрабатывать изображения. Весь код можно использовать как основу для создания более сложных ботов, добавляя новые команды и функциональные возможности.
Вот итоговый код, который включает все изменения:
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, CallbackQueryHandler import sqlite3 # Указываем токен TOKEN = 'YOUR_TOKEN_HERE' # Создание базы данных def create_db(): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT)''') conn.commit() conn.close() def add_user(user_id, first_name, last_name): conn = sqlite3.connect('users.db') c = conn.cursor() c.execute('''INSERT OR REPLACE INTO users (user_id, first_name, last_name) VALUES (?, ?, ?)''', (user_id, first_name, last_name)) conn.commit() conn.close() # Функции команд def start(update: Update, context: CallbackContext) -> None: user = update.message.from_user add_user(user.id, user.first_name, user.last_name) update.message.reply_text(f'Привет, {user.first_name}! Я твой Telegram-бот.') def help_command(update: Update, context: CallbackContext) -> None: help_text = "Доступные команды:\n/start - Приветствие\n/help - Список команд\n/about - О боте" update.message.reply_text(help_text) def about(update: Update, context: CallbackContext) -> None: about_text = "Этот бот был создан для демонстрации функционала Telegram API с использованием Python." update.message.reply_text(about_text) # Инлайн кнопки def inline_buttons(update: Update, context: CallbackContext) -> None: keyboard = [ [InlineKeyboardButton("Нажми меня", callback_data='1')], [InlineKeyboardButton("Показать информацию", callback_data='2')] ] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text('Выберите действие:', reply_markup=reply_markup) def button(update: Update, context: CallbackContext) -> None: query = update.callback_query query.answer() if query.data == '1': query.edit_message_text(text="Вы нажали кнопку 1!") elif query.data == '2': query.edit_message_text(text="Вы выбрали показать информацию!") # Обработка изображений def handle_photo(update: Update, context: CallbackContext) -> None: photo_file = update.message.photo[-1].get_file() photo_file.download('user_photo.jpg') update.message.reply_text('Фото сохранено!') # Основная функция def main(): create_db() # Создаем объект Updater updater = Updater(TOKEN) # Получаем диспетчер dispatcher = updater.dispatcher # Регистрируем обработчики команд dispatcher.add_handler(CommandHandler("start", start)) dispatcher.add_handler(CommandHandler("help", help_command)) dispatcher.add_handler(CommandHandler("about", about)) dispatcher.add_handler(CommandHandler("inline", inline_buttons)) # Регистрируем обработчик для кнопок dispatcher.add_handler(CallbackQueryHandler(button)) # Регистрируем обработчик для фото dispatcher.add_handler(MessageHandler(Filters.photo, handle_photo)) # Запуск бота updater.start_polling() # Бот будет работать до тех пор, пока не нажмем Ctrl+C updater.idle() if __name__ == '__main__': main()
Теперь у вас есть более сложный и функциональный Telegram-бот!