Лайфхаки

Маленькие, полезные хитрости

Чат-бот в Telegram на python и aiogram. Создание первого Telegram бота на Python. Част. Выбираем библиотеку и пишем первого бота.

05.07.2023 в 09:11

Чат-бот в Telegram на python и aiogram. Создание первого Telegram бота на Python. Част. Выбираем библиотеку и пишем первого бота.

Разбираемся, как написать чат-бота с помощью библиотеки aiogram. Весь код — внутри статьи.

Компании используют чат-ботов в Telegram для разных задач: рассылают новости о новых акциях, принимают платежи или даже организуют службу технической поддержки. Обычные пользователи тоже используют их для своих бытовых нужд — ведут учёт личных финансов или оформляют посты в социальных сетях.

В этой статье мы научимся с нуля создавать чат-ботов с помощью Python: выберем лучшую библиотеку и напишем на ней эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по чат-ботам в Telegram — во второй части мы добавим новые фичи.

Библиотеки для создания бота

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

1. aiogram

Современная библиотека, набирающая популярность. Работает с асинхронным подходом к выполнению кода. Это позволяет не останавливать работу бота в ожидании ответа пользователя. У aiogram  подробная документация  и большое русскоязычное комьюнити. В этой и последующих статьях цикла мы будем работать как раз с этой библиотекой.

Одна из первых библиотек для создания ботов. Отличается от aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.

3. TeleBot

Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать  в документации .

Переходим к созданию Telegram-бота. Потренируемся на простом примере — создадим эхо-бота, который отвечает на сообщения пользователя его же словами.

Для этого нам необходимо:

  • установить Python и настроить виртуальное окружение;
  • зарегистрировать бота в специальном Telegram-канале @BotFather;
  • установить библиотеку aiogram;
  • написать код эхо-бота, связав его по API с Telegram.

Устанавливаем Python и создаём виртуальное окружение

На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:

python --version

Если у вас не установлен Python:
Переходите на официальный сайт, скачиваете актуальную версию и устанавливаете её.

Не забудьте поставить галочку add PATH во время установки

После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv.

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

virtualenv устанавливается через терминал:

sudo pip3 install virtualenv

После этого необходимо создать директорию для проекта, внутри которой будет работать виртуальное окружение:

Команда mkdir создаст папку  cd переведёт нас в неё. Теперь в этой директории будут храниться файлы проекта, связанные с нашим ботом.

Развернём виртуальное окружение внутри папки 

virtualenv venv -p python3

Теперь его активируем. Если этого не сделать, то оно не будет работать.

source venv/bin/activate

Шаг 2
Создаём бота

Для создания бота необходимо воспользоваться Telegram и ботом @BotFather. Откройте мессенджер и введите название бота в поисковой строке:

Открываем его, жмём кнопку «Запустить» и вводим команду /newbot:

Теперь напишем название и юзернейм для нашего бота. Назовём его echo_skillbox_bot (теперь это имя занято, так что вам надо будет придумать своё). В ответ придёт наш токен, который мы будем использовать для подключения к API Telegram.

Этот токен мы сохраняем — он потребуется нам в будущем.

Python-telegram-bot примеры. Самый простой бот


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

# -*- coding: utf-8 -*- from telegram.ext import Updater # пакет называется python-telegram-bot, но Python- from telegram.ext import CommandHandler # модуль почему-то просто telegram ¯\_(ツ)_/¯ def start(bot, update): # подробнее об объекте update: https://core.telegram.org/bots/api#update bot.sendMessage(chat_id=update.message.chat_id, text="Здравствуйте.") updater = Updater(token='TOKEN') # тут токен, который выдал вам Ботский Отец! start_handler = CommandHandler('start', start) # этот обработчик реагирует # только на команду /start updater.dispatcher.add_handler(start_handler) # регистрируем в госреестре обработчиков updater.start_polling() # поехали!

создаёт бота, который сухо отвечает «Здравствуйте.» при нажатии на кнопку Start (или ручном вводе команды/start) и многозначительно молчит при любых последующих действиях с вашей стороны.Соответственно, если мы захотим повесить обработчики любых текстовых сообщений или любых команд, нам нужно будет написать

from telegram.ext import Filters, MessageHandler def handle_text(bot, update): # … def handle_command(bot, update): # … # MessageHandler -- более универсальный обработчик, который берёт на вход фильтр text_handler = MessageHandler(Filters.text, self.handle_text) command_handler = MessageHandler(Filters.command, self.handle_command) # регистрируем свеженькие обработчики в диспетчере updater.dispatcher.add_handler(text_handler) # без регистрации будет работать, updater.dispatcher.add_handler(command_handler) # но не больше трёх месяцев (шутка)

(За дальнейшими подробностями с чистой совестью отсылаю к.)Нагруженные этим теоретическим минимумом, мы можем наконец подумать, как нам писать своего нетривиального бота. Для начала давайте вернёмся к постановке задачи. Под диалоговым ботом я подразумеваю бота, который главным образом ведёт обычный текстовый диалог с пользователем — с вопросами, ответами, нелинейным сюжетом, разочаровывающими концовками и всем в таком духе (играли в «»?) Напротив, не попадают в сферу наших текущих интересов боты, разным образом расширяющие функционал Telegram (вроде); соответственно, мы опустим добавление всяких плюшек вроде,,и всего такого прочего.Проблема сложных диалоговых ботов в том, что нетривиальный диалог требует хранения состояния. Работа асинхронных диалогов требует постоянных прерываний на ожидание сообщения от пользователя; состояние нужно сохранять, потом восстанавливать, прыгать к коду, ответственному за обработку очередного сообщения, и так далее; в общем, организация кода становится проблемой довольно угнетающей. Прервать, продолжить… ничего не напоминает? Что ж, посмотрим, как обозначенную проблему можно изящнейше обойти с помощью магииyield.

Чат-боты в Telegram на python. част. Callback-кнопки и редактирование сообщений

Прежде, чем мы перейдем к другим кнопкам, давайте познакомимся с функциями редактирования сообщений, коих тоже три:editMessageText(редактирование текста),editMessageCaption(редактирование подписи к медиа) иeditMessageReplyMarkup(редактирование инлайн-клавиатуры). В рамках этого урока рассмотрим только первую функцию, остальные работают аналогично и предлагаются для самостоятельного изучения.
Чтобы отредактировать сообщение, нам надо знать, про какое именно идёт речь. В случае, если оно было отправлено самим ботом, идентификаторами служит связкаchat_id+message_id. Но если сообщение было отправлено в инлайн-режиме, то ориентироваться надо по параметруinline_message_id.

И вот теперь вернемся к нашимбаранамкнопкам. На очереди – Callback . Это, на мой взгляд, самая крутая фича нового обновления. Колбэк-кнопки позволяют выполнять произвольные действия по их нажатию. Всё зависит от того, какие параметры каждая кнопка в себе несёт. Соответственно, все нажатия будут приводить к отправке боту объектаCallbackQuery, содержащему полеdata, в котором написана некоторая строка, заложенная в кнопку, а также либо объектMessage, если сообщение отправлено ботом в обычном режиме, либо полеinline_message_id, если сообщение отправлено в инлайн-режиме.

Приведу пример, после которого все вопросы должны отпасть: пусть, например, если сообщение отправлено ботом в обычном режиме, то нажатие на кнопку заменит текст сообщения на “Пыщь”, если в инлайн – то “Бдыщь”. При этом в обоих случаях значениеcallback_dataбудет равноtest. Что для этого нужно сделать: во-первых, написать простейший хэндлер для всех входящих сообщений, во-вторых, написать простейший хэндлер для инлайн-сообщений, в-третьих, написать простейший хэндлер для колбэка, который определит, из какого режима пришло сообщение.

Aiogram python. Установка ¶

Для начала давайте создадим каталог для бота, организуем там virtual environment (далее venv) и установим библиотеку aiogram .
Проверим, что установлен Python версии 3.9 (если вы знаете, что установлен 3.9 и выше, можете пропустить этот раздел):

$ python3.9 Python 3.9.9 (main, Jan 11 2022, 16:35:07) on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit() $

Теперь создадим файлrequirements.txt, в котором укажем используемую нами версию aiogram. Также нам понадобится библиотека python-dotenv для файлов конфигурации.

О версиях aiogram

В этой главе используется aiogram 3.x , перед началом работы рекомендую заглянуть в канал релизов библиотеки и проверить наличие более новой версии. Подойдёт любая более новая, начинающаяся с цифры 3, поскольку aiogram 2.x более рассматриваться не будет и считается устаревшим.

$ python3.9 -m venv venv $ echo "aiogram==3.0.0b7" > requirements.txt $ echo "python-dotenv==0.21.1" >> requirements.txt $ source venv/bin/activate (venv) $ pip install -r requirements.txt # …здесь куча строк про установку… Successfully installed …тут длинный список… $

Обратите внимание на префикс "venv" в терминале. Он указывает, что мы находимся в виртуальном окружении с именем "venv". Проверим, что внутри venv вызов командыpythonуказывает на всё тот же Python 3.9:

(venv) $ python Python 3.9.9 (main, Jan 11 2022, 16:35:07) on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit() (venv) $ deactivate $

Последней командойdeactivateмы вышли из venv, чтобы он нам не мешал.

Если для написания ботов вы используете PyCharm, рекомендую также установить сторонний плагин Pydantic для поддержки автодополнения кода в телеграмных объектах.

Самообучающийся чат-бот python. Что делают Chatbots?

Современные чат-боты не полагаются исключительно на текст, и часто показывают полезные карточки, изображения, ссылки и формы, предоставляя опыт, подобный приложению.

В зависимости от того, как запрограммированы боты, мы можем разделить их на два варианта: они основаны на правилах (немые боты) и самообучаются (умные боты).

  1. Чат-боты на основе правил Это множество ботов отвечают на вопросы, основываясь на некоторых простых правилах, по которым они обучаются.
  2. Самообучающиеся чат-боты : На это разнообразие ботов полагаются Искусственный интеллект (AI) & Машинное обучение (MI) технологии для общения с пользователями.

Самообучающиеся Chatbots далее делятся на Поисковая и генеративная.

На основе поиска
Роботы, основанные на поиске, работают по принципу направленных потоков или графиков. Бот обучен оценивать лучший ответ из конечного набора предопределенных ответов. Ответы здесь вводятся вручную или на основе базы знаний ранее существовавшей информации.

Например. Каковы сроки вашего магазина?
Ответ: С 9 до 17 часов

Эти системы могут быть расширены для интеграции с системами сторонних производителей.

Например. Где мой заказ?
Ответ: Он уже в пути и должен добраться до вас через 10 минут

Боты на основе поиска - это самые распространенные типы чат-ботов, которые вы видите сегодня. Они позволяют разработчикам ботов и UX контролировать опыт и сопоставлять его с ожиданиями наших клиентов. Они работают лучше всего для целенаправленный боты в поддержке клиентов, генерации лидов и обратной связи. Мы можем определить тон бота и спроектировать опыт, учитывая бренд и репутацию клиента.

порождающий
Еще один метод построения чат-ботов - использование генеративной модели. Эти чат-боты не созданы с предопределенными ответами. Вместо этого они обучаются, используя большое количество предыдущих разговоров, на основе которых генерируются ответы для пользователя. Они требуют очень большого количества разговорных данных для обучения.

Генеративные модели хороши для разговорных чат-ботов, с которыми пользователь просто хочет обменяться подшучиванием. Эти модели практически всегда будут готовы для вас. Однако во многих случаях ответы могут быть произвольными и не иметь для вас большого смысла. Чатбот также склонен генерировать ответы с неправильной грамматикой и синтаксисом.

Готовый чат-бот на python. Ша. Пишем основу бота


Создаём папку Bot, в которой потом создаём файл bot.py. Здесь будет код нашего бота.Открываем консоль и переходим в директорию с файлом, устанавливаем python-telegram-bot .

pip install python-telegram-bot --upgrade

После установки мы уже можем написать «основу», которая пока что будет просто отвечать однотипными сообщениями. Импортируем необходимые модули и прописываем наш токен API:

Код настроек и импорта

# Настройки from telegram.ext import Updater, CommandHandler, MessageHandler, Filters updater = Updater(token='ВАШ API КЛЮЧ') # Токен API к Telegram dispatcher = updater.dispatcher

Далее напишем 2 обработчика команд. Это callback-функции, которые будут вызываться тогда, когда будет получено обновление. Напишем две таких функции для команды /start и для обычного любого текстового сообщения. В качестве аргументов туда передаются два параметра: bot и update . Bot содержит необходимые методы для взаимодействия с API, а update содержит данные о пришедшем сообщении.