Разработка чат-бота для 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-бот!



