Чат-бот в Telegram на python и aiogram. Создание первого Telegram бота на Python. Част. Выбираем библиотеку и пишем первого бота.
Разбираемся, как написать чат-бота с помощью библиотеки aiogram. Весь код — внутри статьи.
Компании используют чат-ботов в Telegram для разных задач: рассылают новости о новых акциях, принимают платежи или даже организуют службу технической поддержки. Обычные пользователи тоже используют их для своих бытовых нужд — ведут учёт личных финансов или оформляют посты в социальных сетях.
В этой статье мы научимся с нуля создавать чат-ботов с помощью Python: выберем лучшую библиотеку и напишем на ней эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по чат-ботам в Telegram — во второй части мы добавим новые фичи.
Библиотеки для создания бота
Для создания Telegram-ботов на Python существует несколько десятков библиотек. Они различаются популярностью, размером комьюнити и функциональностью. Рассмотрим самые популярные.
Современная библиотека, набирающая популярность. Работает с асинхронным подходом к выполнению кода. Это позволяет не останавливать работу бота в ожидании ответа пользователя. У aiogram подробная документация и большое русскоязычное комьюнити. В этой и последующих статьях цикла мы будем работать как раз с этой библиотекой.
Одна из первых библиотек для создания ботов. Отличается от aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать в документации .
Переходим к созданию Telegram-бота. Потренируемся на простом примере — создадим эхо-бота, который отвечает на сообщения пользователя его же словами.
Для этого нам необходимо:
Устанавливаем Python и создаём виртуальное окружение
На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:
Если у вас не установлен Python:
Переходите на официальный сайт, скачиваете актуальную версию и устанавливаете её.
Не забудьте поставить галочку add PATH во время установки
После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv.
Это специальный инструмент, который позволяет изолировать друг от друга проекты в разработке, независимо устанавливая для них библиотеки и пакеты. Удобно, когда вы работаете над разными приложениями одновременно.
virtualenv устанавливается через терминал:
sudo pip3 install virtualenv
После этого необходимо создать директорию для проекта, внутри которой будет работать виртуальное окружение:
Команда mkdir создаст папку cd переведёт нас в неё. Теперь в этой директории будут храниться файлы проекта, связанные с нашим ботом.
Развернём виртуальное окружение внутри папки
virtualenv venv -p python3
Теперь его активируем. Если этого не сделать, то оно не будет работать.
Шаг 2
Создаём бота
Открываем его, жмём кнопку «Запустить» и вводим команду /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?
Современные чат-боты не полагаются исключительно на текст, и часто показывают полезные карточки, изображения, ссылки и формы, предоставляя опыт, подобный приложению.
В зависимости от того, как запрограммированы боты, мы можем разделить их на два варианта: они основаны на правилах (немые боты) и самообучаются (умные боты).
- Чат-боты на основе правил Это множество ботов отвечают на вопросы, основываясь на некоторых простых правилах, по которым они обучаются.
- Самообучающиеся чат-боты : На это разнообразие ботов полагаются Искусственный интеллект (AI) https://lajfhak.ru-land.com/stati/chat-bot-v-telegram-na-python-i-aiogram-sozdanie-pervogo-telegram-bota-na-python-chast» target=»_blank»]lajfhak.ru-land.com[/mask_link]
✔Питоном по телеграму! Пишем пять простых Telegram-ботов на Python — «Новости»
При создании следующих ботов мы будем использовать несколько текстовых файлов с контентом. Скачать их можно с моего сайта.
Бот с двумя виртуальными кнопками
Во многих Telegram-ботах для выбора каких‑то действий используются так называемые виртуальные кнопки. Давай попробуем сделать себе такие же!
Предположим, что у нас есть два файла facts. txt и thinks. txt , которые содержат список интересных фактов и поговорки. На каждой строке файлов находится по одному факту или поговорке.
Сделаем бота, в котором будут две кнопки: «Факты» и «Поговорки». Если нажать любую, бот отправит пользователю соответствующее сообщение.
info
Если ты будешь использовать для этого бота тот же токен, что и для предыдущего, то, чтобы увидеть кнопки, перезапусти бота командой / start .
Пример работы бота, знающего факты и поговорки
Бот, ведущий Telegram-канал с анекдотами
Предыдущие боты посылали юзеру сообщения тогда, когда получали от него команды или фразы. Но что, если нам нужен бот, который будет периодически и в автоматическом режиме постить что‑то в наш канал?
Давай сделаем бота, который получает список анекдотов из файла и каждый час постит в канал один из этих анекдотов. Для этого нам нужно создать свой канал в Telegram, добавить в подписчики канала нашего бота и назначить его администратором канала с правом публиковать сообщения.
Файл с анекдотами должен лежать в папке data рядом со скриптом бота.
Пример работы бота, ведущего канал с анекдотами
Чат-бот «Маша»
Теперь давай сделаем простейшего чат‑бота, который будет болтать с пользователем. Для этого мы подготовим файл boltun. txt , содержащий строки с вопросами (в начале таких строк поставим метку u: ) и ответами на них в следующей строке.
u : как зовут
Маша меня зовут !
u : сколько тебе лет
Мне уже 18 , честно — честно !Файл boltun. txt поместим в папку data рядом со скриптом бота. Для поиска похожих вопросов используем модуль fuzzywuzzy, который позволяет сравнивать, насколько похожи между собой две строки. Естественно, сперва этот модуль нужно установить:
pip install fuzzywuzzy
pip install python — LevenshteinНиже приведен исходный код бота. После его запуска напиши боту «Привет» и попробуй с ним пообщаться. Естественно, это не искусственный интеллект и набор его ответов ограничен фразами из файла boltun. txt .
Пример работы чат‑бота
Выводы
Создание бота с помощью Python и Telegram
Некоторые мессенджеры, такие как Telegram, иногда предоставляют API, который можно использовать для создания бота. Боты — это полезная в хозяйстве вещь. Например — хороший способ взаимодействия с приложениями, работающими на вашем домашнем сервере, без заморочек (в плане безопасности) с открытием директорий, проброса и подобной нездоровой фигни. Данный тип ботов легко написать, и они очень универсальны. В этой статье я покажу, как создать бота с помощью Python и Telegram.
Создание бота с помощью Python и Telegram
Недавно мне пришлось подавать документы на визу, а чтобы записаться на прием, нужно зайти на правительственный сайт и постоянно мониторить появление свободных мест. В этом деле надо быть шустрым, чтобы успеть, так как квоты разлетаются, как горячие бабушкины пирожки.
Поэтому я решил написать бота, который перемещается по формам каждые 10 минут и в случае появления изменений отправляет мне сообщение в Telegram.
Бот состоит из двух частей:
- Код для взаимодействия с Selenium WebDriver.
- Оповещения об изменениях через Telegram.
Для начала нужно скачать с сайта Selenium WebDriver один драйвер для браузера:
Затем используем библиотеку Splinter, которая абстрагирует взаимодействие с драйвером.
from splinter import Browser
with Browser ( ) as browser :
browser . visit ( «http://www.google.com» )
# Find and fill out the search form.
browser . find_by_name ( ‘q’ ) . fill ( ‘splinter’ )
# Find and click the ‘search’ button.
button = browser . find_by_name ( ‘btnK’ ) . click ( )
# Check for result on the page.
if browser . is_text_present ( ‘splinter.readthedocs.io’ ) :
print ( «Yes, the official website was found!» )
print ( «No, it wasn’t found. » )Чтобы запустить код, сначала запустите ранее загруженный драйвер, а затем запустите приложение Python.
Теперь, когда у нас есть скрипт, который мониторит изменения на сайте, нам нужен способ получения уведомлений. Чтобы создать бота Telegram, нам понадобится токен. Для получения токена воспользуемся ботом BotFather.
После отправления команды / newbot , BotFather предложит придумать имя бота, а затем предоставит токен.
Здесь я обернул библиотеку python-telegram-bot в класс только для того, чтобы при необходимости было проще перейти на другое решение, но вы можете пропустить это и использовать библиотеку напрямую.
import telegram
class Telegram :
def __init__ ( self , token : str ) :
self . bot = telegram . Bot ( token = token )
self . offset = 0
def send ( self , chat_id , message ) :
self . bot . send_message ( chat_id = chat_id , text = message )Добавьте бота в группу.
Ссылка для получения обновлений бота:
https : //api.telegram.org/bot/getUpdates
https : //api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdatesНайдите объект chat :
«update_id» : 8393 ,
«message_id» : 3 ,
«first_name» : «AAA»
«date» : 25497 ,
«new_chat_participant» : <
«first_name» : «NAME» ,
«username» : «YOUR_BOT_NAME»