+7 (495) 107-75-45 Подключение
+7 (495) 107-75-47 Тех. поддержка 24/7
Пример
23.11.2024

Разработка чат-бота для Telegram с использованием Python: шаг за шагом

В этой статье мы создадим простого чат-бота для Telegram с использованием Python. Мы пройдем все этапы: от установки зависимостей и настройки окружения до написания и запуска самого бота. В конце статьи будет приведен весь код, чтобы вы могли сразу начать работу.

Установка виртуального окружения

Python имеет встроенный модуль для работы с виртуальными окружениями — venv. Для начала установим его (если он еще не установлен):

  1. Проверьте наличие 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
  1. Эта команда создаст папку 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, нам нужен токен для бота. Для этого:

  1. Откройте Telegram и найдите бота BotFather.
  2. Напишите команду /start, а затем используйте команду /newbot, чтобы создать нового бота.
  3. Следуйте инструкциям для создания бота и получения токена.

Токен будет выглядеть как длинная строка, например: 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).

Запуск бота

  1. Сохраните файл и откройте терминал.
  2. Перейдите в директорию, где находится ваш файл.
  3. Запустите бота командой:
python my_telegram_bot.py

Если все сделано правильно, бот будет запущен и начнет слушать сообщения. Вы можете найти его в Telegram, начав диалог и отправив команду /start. Бот должен ответить вам приветственным сообщением.

Итоги

Поздравляю, вы создали простого Telegram-бота на Python! Этот бот отвечает на команду /start и эхо-ответами на текстовые сообщения.

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

Расширение функционала

Давайте развернем функциональность нашего Telegram-бота и сделаем его более сложным. Мы добавим следующие функции:

  1. Обработку команд: добавим несколько команд для работы с пользователями (например, /help, /about).
  2. Инлайн кнопки: добавим кнопки, которые можно использовать прямо в чате.
  3. База данных: добавим возможность сохранять информацию о пользователях в базу данных (например, SQLite).
  4. Обработка изображений: добавим возможность отправки и получения изображений.

Создание базы данных

Для хранения информации о пользователях и их предпочтениях создадим небольшую базу данных с использованием 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

Подробное объяснение кода

  1. Создание базы данных:
    • Мы создали таблицу users в базе данных SQLite, чтобы хранить user_id, имя и фамилию пользователя.
    • Функция add_user добавляет пользователя в базу данных или обновляет данные, если пользователь уже существует.
  2. Обработчики команд:
    • /start: Приветствие и добавление пользователя в базу данных.
    • /help: Показывает список доступных команд.
    • /about: Отображает информацию о боте.
  3. Инлайн кнопки:
    • При отправке команды /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-бот!