Привожу простой пример инфо-бота с практически неограниченной вложенностью. Вывод на экран текстового и медиа (картинка, видео, аудио, документ) сообщения. Многоуровневое меню включено.
Хотел привести пример как отобразить в Телеграм многоуровневое меню, но получился простой в создании информационный бот с вложенностью, ограниченной только возможной длинной значения в параметре callback_data inline-кнопки (1-64 bytes). Еще интересный момент это — в одном боте можно создать неограниченное количество сценариев, для этого достаточно просто стартовать бота по html-ссылке со специальными параметрами. При обычном старте бота — запускается первый сценарий. Об этом чуть ниже.
Настройки
В настройках бота нужно указать токен бота, id админа бота и заполнить массив с информацией о «шагах».
steps |__ |__ |__ |__ |__ |__ |__ |__ |__
Каждый шаг имеет простой набор параметров:
[ «name» => «», // string «line» => 0, // int «type» => «text|photo|video|audio|document», // string «text» => «», // string «media» => «» // string | null, «steps» => [] // array ]
name* — Название шага, будет отображено на кнопке
line* — уровень ряда в наборе кнопок
type*- тип сообщения (text|photo|video|audio|document)
text — текстовое сообщение, обязательно для type=»text»
media — ссылка или file_id медиа файла, при type=»text» должно быть значение null
steps — это массив вложенных шагов,
Для ускорения отрисовки экранов желательно в параметре media указывать file_id файла, он для каждого бота уникальный, поэтому из моего примера медиа у вас не будут подгружаться — их надо будет заменить.
Как сделать меню для Телеграм бота на aiogram Python
Чтобы вам получить file_id я добавил небольшой функционал (только если указана настройка bot_admin), нужно просто отправить в бот файл: документ, картинку, видео или аудио файлы.
В ответ бот пришлет строку — она же и будет file_id , просто скопируйте ее и подставьте в параметр media в нужном шаге (массива $steps).
Что из интересного?
Весь контент бота упакован в массив steps он же $content . Важным моментом является конечно же валидность массива.
При старте бота настроен выбор сценария под индексом 0 массива (можно указать любой).
/** 1 параметр это индекс элемента массива 2 параметр это индексы родительских элементов массива steps, разделены тире (-), если null то выводим из верхнего уровня вложенности 3 параметр это id чата пользователя */ $printUpdate(0, null, $chat_id);
Если старт по HTML-ссылке то сценарий будет выбран из параметров ссылки
tg://resolve?domain=iMakeBot // в раскрытом виде $content = [ ‘steps’ => [ [ ‘name’ => ‘Название элемента 0’, // . ‘steps’ => [ [ ‘name’ => ‘Название элемента 0-0’ // . ], [ ‘name’ => ‘Название элемента 0-1’, // . ‘steps’ => [ [ ‘name’ => ‘Название элемента 0-1-0’ // . ], [ ‘name’ => ‘Название элемента 0-1-1’ // . ], [ ‘name’ => ‘Название элемента 0-1-2’ // . ], [ ‘name’ => ‘Название элемента 0-1-3’ // . Вот этот элемент будет отработан для вывода на экран ], ] ] ] ] ] ]
Чтобы получить из массива нужный элемент, пропускаем запрос через рекурсивную (самовызывающуюся) функцию
Отрисовка экрана
Простой роутер для бота
/** * Простой роутер бота */ if (isset($data->message)) < // получим id чата $chat_id = $data->message->from->id; // если это текстовое сообщение if (isset($data->message->text)) < // проверим что это старт бота if ($data->message->text == «/start») < // выводим сообщение $printUpdate(0, null, $chat_id); >// если это старт по ссылке elseif (preg_match(«~/start s_([d]+)_?([d-]*)~», $data->message->text, $matches)) < // выведем сообщение по ссылке $printUpdate($matches[1], $matches[2], $chat_id); >> // другие типы сообщений else < // если это админ бота направляет сообщение if ($chat_id === $bot_admin) < // по умолчанию $file_id = null; // если это картинка if (isset($data->message->photo)) < // file_id последней картикни $file_id = end($data->message->photo)->file_id; > // если это видео-файл elseif (isset($data->message->video)) < // file_id видео-файла $file_id = $data->message->video->file_id; > // если это аудио-файл elseif (isset($data->message->audio)) < // file_id аудио-файла $file_id = $data->message->audio->file_id; > // если это документ elseif (isset($data->message->document)) < // file_id документа $file_id = $data->message->document->file_id; > // проверим необходимость отправки if (!is_null($file_id)) < // отправим file_id $query(«sendMessage», [ «chat_id» =>$chat_id, «text» => $file_id ]); > > > // если это нажатие по кнопке > elseif (isset($data->callback_query)) < // получим id чата $chat_id = $data->callback_query->from->id; // получим callBackQuery_id $cbq_id = $data->callback_query->id; // получим переданное значение в кнопке $c_data = $data->callback_query->data; // спарсим значения $params = explode(«_», $c_data); // если это переход по шагам if ($params[0] == «s») < // выводим сообщение $printUpdate( $params[1], ($params[2] !== «») ? $params[2] : null, $chat_id, $cbq_id, $data->callback_query->message->message_id ); > // если это другие кнопки else < // заглушим просто запрос $notice($cbq_id, «This is notice for bot»); >>
Исходный код бота
Бот настроен под работу с Webhook
Источник: imakebots.ru
Чат-бот в Telegram на python и aiogram. Создание первого Telegram бота на Python. Част. Выбираем библиотеку и пишем первого бота.
Чат-бот в 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]