Хардкорная разработка под телеграм. бот-модератор своими руками. часть 1

Создание плагинов

В папке plugins есть пример плагина в файле example.py, отвечающий на команду .
В нём подробно расписана структура плагина. Для примера работы plugin.data или plugin.temp_data
вы можете посмотреть memo.py, weather.py. Для примера цикличных задач friends.py.
Там есть и другие плагины, код которых можно просмотреть для понимания того, что можно сделать с помощью бота.

Каждый плагин должен иметь экземпляр класса Plugin (из plugin_system) под именем (обязательно) plugin.
Все команды, на которые подписывается плагин, должны быть в нижнем регистре.

Вот пример простого плагина:

# Импортируем класс Plugin
from plugin_system import Plugin
# Создаём объект класса, через него мы будем "подписываться" на команды
plugin = Plugin('Плагин для еды')

# Использование async и await обязательно, т.к. бот асинхронный
@plugin.on_command('еда')
async def test(msg, args):
    # Отвечаем пользователю
    await msg.answer('Где еда?!')

Вы можете использовать db, который является экземпляром peewee_async.Manager.
В database.py хранятся основные модели бд.
Каждый плагин может создавать свои модели после импорта database с помощью, например, такого объявления:

Помле этого можно рассматривать как обычную модель.

Плагины размещаются в папке . Если два плагина имеют одинаковые команды — они обрабатываются в обоих плагинах.
Плагины могут работать со всеми методами API ВКонтакте.

Структура проекта

Основные компоненты и файлы для создания чат-бота на Rasa:

  1. Rasa NLU или Natural language understanding. Встроенные в Rasa алгоритмы NLU отвечают за определение намерения и извлечение сущностей. Как правило, для того, чтобы прописать интенты и все относящиеся к ним примеры, создается файл с названием “nlu.yml” (при инициализации бота такой файл создается автоматически и уже содержит примеры для обучения).
    Пример “nlu.yml”:

    А что, бот понимает текст на русском? Не совсем. Вот что примерно происходит под капотом:

    • Встроенный в Rasa алгоритм преобразует примеры для интентов в вектора через bag of words, они подаются на вход нейросетям:
      Таким образом, после обучения каждому намерению будет поставлен в соответствие некий вектор.
    • При получении пользовательского ввода предложение точно также векторизируется и прогоняется через обученную модель. После чего рассчитывается расстояние от полученного вектора до всех векторов наших намерений. В результате мы получаем ранжированный список наиболее вероятных намерений, а интенты, вектора которых находятся совсем далеко от пользовательского, то есть совсем далекие по смыслу, отсекаются. Из введенных данных также вычленяются сущности, список которых прописывается разработчиком, далее сущности хранятся в памяти бота, в своего рода ячейках или слотах.
  2. Rasa stories: истории диалогов чат-бота с пользователями в виде интент — действие.
    Истории диалогов обычно фиксируются следующим образом:

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

    То, как именно должен ответить ассистент можно прописать в файле “domain.yml” или (что чуть-чуть сложнее) с помощью функции на python (actions.py). Рассмотрим первый вариант, определение реакции в DOMAIN с ключевым словом “utter”:

    Еще один пример типичной истории диалога с примерами выделенных ботом сущностей :

  3. Rasa actions: набор действий, которые может предпринимать бот, например, вызов API, отправка изображения или текстовый ответ. Есть ряд дефолтных действий для чат-бота, например, вернуться в начальную точку диалога, на каком шаге не находился бы бот или ожидать пользовательского сообщения. Действие также можно кастомизировать в виде функций на python (подробнее о действиях).
  4. Rasa rules: это небольшие кусочки диалогов, описывающие как бот должен действовать в определенной ситуации, причем эти правила строго выполняются ботом.

Подробнее с документацией Rasa можно ознакомиться на официальном сайте.

Обычные кнопки¶

Кнопки как шаблоны

Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений
(за исключением нескольких особых случаев, но о них позже). Принцип простой: что написано на кнопке, то и будет отправлено
в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.

Напишем хэндлер, который будет при нажатии на команду отправлять сообщение с двумя кнопками:

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

Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько
же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный
параметр .
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это
кнопок, а если говорить проще, массив строк. Метод при каждом вызове создаёт новую строку (ряд) и принимает
произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:

Обратите внимание на конструкцию. Здесь вам не C++ и звёздочка используется для распаковки списка

Подробнее об операторах и можно прочитать
здесь.

Смотрим — действительно красиво:

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

Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа
. Например:

У есть ещё две полезных опции:
для скрытия кнопок после нажатия и для показа клавиатуры лишь некоторым участникам группы.
Их использование остаётся для самостоятельного изучения.

Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром .
При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N —
значение , например, . Попробуйте!

Специальные обычные кнопки

По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами:
для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух
типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип
и, по желанию, указать тип создаваемого объекта.

Впрочем, проще один раз увидеть код:

Telegram API

В своей статье «Всё, о чём должен знать разработчик Телеграм-ботов» я объяснял, чем отличается Telegram API от Telegram Bot API.

Bot API более ограниченный: например, с его помощью боты не могут получать список участников группы или старые сообщения. И хотя для этого туториала эти возможности не понадобятся, я предпочитаю в любом случае использовать именно Telegram API. А то представьте, как обидно: вот пишете вы бота, развиваете его, и вдруг вам становится нужна какая-то фича, из-за которой всего бота придётся переписывать на другом API. И сразу грустненько становится.

Итак, для работы с Telegram API мы будем использовать библиотеку Telethon:

Так как Telegram API изначально был предназначен для создания клиентов мессенджера, для его использования вам нужно будет зарегистрировать своё приложение на my.telegram.org. Да, даже если вы используете API только для запуска ботов.

Форму вы можете заполнить любым способом. Вы получите api_id и api_hash вашего «приложения». Они нам понадобятся.

Шаг 8: реализация обработчика кнопки обновления

Напишем код для обработки действий с кнопкой Update и дополним его часть iq_callback_method. Когда пункты программы начинаются с параметра get‒, необходимо прописать get_ex_callback. В других ситуациях разбираем JSON и пытаемся получить ключ t.

@bot.callback_query_handler(func=lambda call: True) 

def iq_callback(query): 

    data = query.data 

    if data.startswith('get-'): 

        get_ex_callback(query) 

    else: 

        try: 

            if json.loads(data) == 'u': 

                edit_message_callback(query) 

        except ValueError: 

            pass

Если t равняется u, потребуется создать программу для метода edit_message_callback. Разберем эту процедуру по шагам:

  1. Загрузка актуальной информации о состоянии валютного рынка (exchange_now = pb.get_exchange(data).
  1. Написание нового сообщения через сериализатор с diff.
  2. Добавление подписи (get_edited_signature).

Если начальное сообщение не меняется, вызовем метод edit_message_text.

def edit_message_callback(query):  
    data = json.loads(query.data)  
    exchange_now = pb.get_exchange(data)  
    text = serialize_ex(  
        exchange_now,  
	get_exchange_diff(  
            get_ex_from_iq_data(data),  
	    exchange_now  
        )  
    ) + '\n' + get_edited_signature()  
    if query.message:  
        bot.edit_message_text(  
            text,  
	    query.message.chat.id,  
	    query.message.message_id,  
	    reply_markup=get_update_keyboard(exchange_now),  
	    parse_mode='HTML'  
	)  
    elif query.inline_message_id:  
        bot.edit_message_text(  
            text,  
	    inline_message_id=query.inline_message_id,  
	    reply_markup=get_update_keyboard(exchange_now),  
	    parse_mode='HTML'  
	)

Пропишем метод get_ex_from_iq_data, чтобы разобрать JSON:

def get_ex_from_iq_data(exc_json):  
    return {  
        'buy': exc_json,  
	'sale': exc_json  
    }

Понадобится еще несколько методов: например, get_exchange_diff, который считывает старую и новую информацию о стоимости валют и выводит разницу.

def get_exchange_diff(last, now):  
    return {  
        'sale_diff': float("%.6f" % (float(now) - float(last))),  
	'buy_diff': float("%.6f" % (float(now) - float(last)))  
    }

Последний – get_edited_signature – показывает время последнего обновления курса.

def get_edited_signature():  
    return '<i>Updated ' + \  
           str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + \  
           ' (' + TIMEZONE_COMMON_NAME + ')</i>'

В результате обновленное сообщение от бота при стабильном курсе выглядит так:

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

Функционал для логирования

Согласно тексту справки, бот должен уметь делать две вещи:

  1. Если вы отправляете сообщение боту, он должен где-то его сохранить.
  2. При отправке боту команды он должен отправить вам последнее сообщение.

Для этого мы будем использовать встроенную в Replit базу данных ключ-значение. Начнем с импорта API:

from replit import db

Модуль db — это объект, который ведет себя как словарь, но сохраняет свое содержимое между запусками. Он также сериализует свои ключи в виде строк.

Мы хотим хранить зарегистрированные сообщения в определенном порядке, но объект по своей сути не упорядочен (будучи словарем). Поэтому мы создадим вспомогательную функцию, которая может получать самый большой ключ (при условии, что мы будем использовать только числовые индексы). Добавим эту функцию перед определением функции :

def latest_key():
    ks = db.keys()
    if len(ks):
        return max(map(int, ks))
    else:
        return -1 

Функция получает все ключи из нашей базы данных (модуль ). Если в ней есть ключи, они преобразуются в целые числа и возвращается максимальное из них. Если ключей нет, то возвращается .

Теперь мы можем создать обработчик, который записывает сообщения пользователей в базу данных. Добавим эту функцию после задания функции :

def log(update: Update, context: CallbackContext) -> None:
    db = update.message.text 

Этот обработчик получает последний ключ из базы данных, увеличивает его на единицу и создает новую пару ключ — сообщение.

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

dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, log))

Можно заметить, что вместо метода используется . Это более общий обработчик, который выбирает сообщения на основе предоставленных вами флагов. В данном случае он обрабатывает сообщения, содержащие только текст, но не команды.

Теперь мы можем регистрировать сообщения, но пока их не видим. Давайте добавим обработчик, который позволит пользователю получить последнее сообщение. Добавьте эту функцию после задания функции :

def fetch(update: Update, context: CallbackContext) -> None:
    update.message.reply_text(db.get(str(latest_key()), 'No Messages yet.'))

Мы можем зарегистрировать его вместе с обработчиками остальных команд. Добавьте данную строку после уже существующих строк :

dispatcher.add_handler(CommandHandler("fetch", fetch))

Резюме

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

Бесплатные вебинары по схожей тематике:

Как стать UI/UX дизайнером?

Игорь Резниченко

Джинн – сервис анонимного поиска работы для программистов

Макс Ищенко

Удаленная разработка программного обеспечения

Александ Нечай

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

Как работают Instagram боты

Как сценарий автоматизации поможет получить нам больше подписчиков и лайков? Прежде чем ответить на этот вопрос, подумайте о том, как реальные люди приобретают большее число своих подписчиков и лайков.

Они делают это, будучи постоянно активными на целевой платформе. Они часто публикуют посты, подписываются на обновления аккаунтов других людей, а также ставят лайки и оставляют комментарии к постам других людей. И боты работают точно так же: они подписываются, ставят лайки и самостоятельно добавляют комментарии в соответствии с установленными вами критериями.

Чем оптимальнее определены эти критерии, тем лучше будут результаты. Вы должны убедиться, что подписаны на нужные группы, так как в этом случае люди, с которыми ваш бот взаимодействует в Instagram, с большей вероятностью будут взаимодействовать с вашим контентом.

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

Как же это работает с технической точки зрения? Для этих целей нам совершенно не подходит Instagram Developer API, так как его возможности весьма ограничены.

И так приступим к непосредственно автоматизации работы браузера. Она будет осуществляться следующим образом:

  1. Вы предоставите ей все свои полномочия (логин и пароль аккаунта).
  2. Устанавливаете критерии поведения бота для случаев, на какие паблики подписываться, какие комментарии оставлять и каким типам постов ставить лайки.
  3. Затем ваш бот открывает браузер, вводит в адресной строке , входит в профиль с вашими учетными данными, и начинает делать то, что вы ему указали.

Далее мы создадим первоначальную версию своего Instagram бота, которая будет автоматически входить в ваш профиль

Обратите внимание, пока мы не будете использовать библиотеку InstaPy

Подготовка окружения

Проверьте версию Python, на котором будет запускаться бот:

root@box-10000:~# python3 --version
Python 3.8.5

Если вы будете размещать готового бота, версия Python должна соответствовать той, на которой бот был разработан.

Для создания нового бота подойдет любая версия.

Если у вас есть готовый бот, написанный на более старой версии языка, для него. 

Установите менеджер пакетов pip. Он пригодится в дальнейшем для загрузки библиотек.

В Ubuntu установка производится так:

root@box-10000:~# apt install python3-pip

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

Станьте пользователем bot и установите модуль virtualenv командой:

bot@box-10000:~$ pip3 install virtualenv --user

Ключ —user поставит его локально для пользователя bot.

После установки добавьте виртуальное окружение в системные пути пользователя:

bot@box-10000:~$ export PATH=$HOME/.local/bin:$PATH

Создайте новое окружение:

bot@box-10000:~$ virtualenv --system-site-packages python

python — произвольное имя нового виртуального окруженияКлюч —system-site-packages задействует внутри окружения модули, уже установленные в системе.

И активируйте его:

bot@box-10000:~$ source ~/python/bin/activate
(python) bot@box-10000:~$ 

Выйти из окружения можно с помощью команды deactivate:

(python) bot@box-10000:~$ deactivate 
bot@box-10000:~$ 

После создания и активации окружения можно устанавливать модули, которые нам потребуются для запуска бота. В первую очередь это pyTelegramBotAPI. Установим его:

(python) bot@box-10000:~$ pip3 install pyTelegramBotAPI

Сохраняем и предлагаем

В 11-м уроке я использовал библиотеку Vedis для сохранения состояний в файле, чтобы те не сбрасывались после перезагрузки бота. В этот раз мы будем сохранять всё в памяти, а выбор постоянного хранилища останется за читателем, чтобы не навязывать то или иное решение. Разумеется, данные в памяти сотрутся при остановке бота, но для примера так даже лучше.

Наше хранилище будет основано на стандартных питоновских словарях (dict), причём их будет два: первый словарь содержит пары (“id пользователя”, “массив сохранённых викторин”), а второй — пары (“id викторины”, “id автора викторины”). Зачем два словаря? В дальнейшем нам нужно будет по идентификатору викторины получать некоторую информацию о ней. Необходимые нам сведения лежат в первом словаре, но в виде значений, а не ключей. Поэтому нам пришлось бы проходиться по всем возможным парам ключ-значение, чтобы найти нужную викторину.

Для ускорения поиска мы заведём второй словарь, чтобы по идентификатору викторины сразу же найти идентификатор её автора, который, в свою очередь, является ключом в первом словаре. А дальше проход по небольшому массиву и вуаля! Наши данные получены. На словах звучит сложно, но на практике реализуется довольно быстро и с минимальной избыточностью. Если придумаете решение лучше — пишите, буду рад исправить текст.

Помимо определения викторины, нам нужно хранить некоторую дополнительную информацию

Поэтому давайте создадим файл , опишем наш класс Quiz со всеми нужными полями в конструкторе класса (обратите внимание, в конструктор передаются не все поля, т.к. часть из них будет заполнена позднее):

Если вы раньше не сталкивались с подсказками типов (type hints), код вида “chat_id: int = 0” может ввести в замешательство. Здесь — это имя переменной, далее через двоеточие — её тип (число), а дальше инициализация числом 0. Python по-прежнему является языком с динамической типизацией, отсюда и название “подсказка типа”. В реальности это влияет только на восприятие кода и предупреждения в полноценных IDE типа PyCharm. Никто не мешает вам написать , но зачем так делать?
Вернёмся в наш основной файл (я его далее буду называть ) и импортируем наш класс: . Также добавим в начале файла под определением бота два пустых словаря:

Теперь будем отлавливать викторины, приходящие в бота. Как только прилетает что-то, похожее на неё, извлекаем информацию и создаём две записи. В первом словаре храним параметры викторины, чтобы потом её воспроизвести, а во втором просто создаём пару викторина-создатель. Идентификаторы, составляющие ключ словаря, конвертируем в строки методом :

Раз уж мы сохраняем викторины, давайте теперь позволим пользователям их отправлять, причём через инлайн-режим. Есть одна загвоздка: в BotAPI через инлайн-режим нельзя напрямую отправлять опросы (нет объекта InlineQueryResultPoll), поэтому придётся доставать костыли. Будем возвращать обычное сообщение с URL-кнопкой вида https://t.me/нашбот?startgroup=id_викторины. Параметры startgroup и start — это т.н. “глубокие ссылки” (). Когда пользователь нажмёт на кнопку, он перейдёт по указанной выше ссылке, что, в свою очередь, благодаря параметру перекинет его к выбору группы, а затем, уже после подтверждения выбора, бот будет добавлен в группу с вызовом команды .

Начнём разбираться с инлайн-режимом (не забудьте включить его у @BotFather). Когда пользователь вызывает нашего бота через инлайн, показываем все созданные им викторины, плюс кнопку “Создать новую”. Если ничего нет, то только кнопку.

Очень важно выставить флаг равным True (ответ на запрос будет уникален для каждого Telegram ID) и указать небольшое значение параметра , чтобы кэш инлайн-ответов оперативно обновлялся по мере появления новых викторин.Теперь при вызове бота через инлайн мы увидим наши сохранённые викторины, а при выборе одной из них — сообщение с кнопкой, по нажатию на которую нам предложат выбрать группу для отправки сообщения. Как только группа будет выбрана, в неё будет автоматически добавлен бот с сообщением вида

Но ничего не происходит! Сейчас разберёмся.

Установка

Почти все, что мы делаем, будет достигнуто, используя только стандартные библиотеки Python, но мы также будем использовать стороннюю Модуль, который предоставляет ряд улучшений для Python’s И позволяет нам делать HTTP-запросы очень просто и кратко. Установите это через PIP, используя команду, аналогичную следующему (вам может потребоваться использовать вместо и/или добавить флаг flag, основанный на том, как вы обычно устанавливаете Python Библиотеки).

pip3 install requests

Если вы обычно используете виртуальную среду для новых проектов Python, затем сначала установите один из них и установите запросы внутри этого.

Создание бота телеграммы

Первый шаг – сказать телеграмму, которую вы хотите создать новый бот. Все сообщения, которые наш бот отправляет и получает, пройдет через инфраструктуру телеграммы. Наш код периодически сделает запрос на получение всех новых сообщений на наш бот из серверов Telegram и затем отправит ответы на каждое сообщение по мере необходимости. Для того, чтобы зарегистрировать бот с телеграммой, вам сначала нужно создать личную учетную запись телеграммы. Посетить web.telegram.org и введите свой номер телефона. Telegram отправит вам текстовое сообщение (SMS), и затем вы можете создать учетную запись, следуя инструкциям на экране. Если у вас уже есть учетная запись Telegram, вы можете просто использовать это, и вы также можете использовать любой из настольных компьютеров Telegram и мобильных приложений, доступных из Telegram.org, вместо веб-приложения мы будем использовать для всех примеров в Это руководство.

После того, как у вас есть учетная запись Telegram, вы можете зарегистрировать новую телеграмму BOT с помощью отца BOT. Посетить Telegram.me/botfather Начать разговор с ботом телеграммы, который создает другие боты. Телеграмма боты могут получить Сообщения или Команды Отказ Первые – это просто текст, который вы отправляете, как если бы вы отправили сообщение другому человеку, в то время как последние префиксированы с помощью персонаж. Чтобы создать новый бот, отправьте следующую команду для бота отца в чате (точно так же, как будто вы разговаривали с другим человеком на телеграмме).

/newbot.

Вы должны получить ответ мгновенно, который просит вас выбрать имя для своего бота. Мы позвоним нашему боту Потому что к концу этого учебника он будет функционировать как простой список «делать». Отправьте следующее сообщение для бота Отца, когда он предложит вам имя:

Сделать бот

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

<Ваш-бот-имя пользователя>

Теперь бот отец отправит вам сообщение «поздравления», которое будет включать токен. Токен должен выглядеть что-то подобное:

2483457814: aahrlcx234_vskzwejdwjtsdfuwejhyu5mi.

Для остальной части этого учебника мы укажем, где вам нужно поставить свой токен, используя Отказ

Обратите внимание на токен, так как нам понадобится в код, который мы собираемся написать

Как работает чат-бот?

Существует два типа ботов: работающие по правилам и самообучающиеся.

  • Бот первого типа отвечает на вопросы, основываясь на некоторых правилах, которым он обучен. Правила могут быть как простыми, так и очень сложными. Боты могут обрабатывать простые запросы, но не справлятся со сложными.
  • Самообучающиеся боты создаются с использованием основанных на машинном обучении методов и определенно более эффективны, чем боты первого типа. Самообучающиеся боты бывают двух типов: поисковые и генеративные.

В поисковых ботах используются эвристические методы для выбора ответа из библиотеки предопределенных реплик. Такие чат-боты используют текст сообщения и контекст диалога для выбора ответа из предопределенного списка. Контекст включает в себя текущее положение в древе диалога, все предыдущие сообщения и сохраненные ранее переменные (например, имя пользователя). Эвристика для выбора ответа может быть спроектирована по-разному: от условной логики «или-или» до машинных классификаторов.

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

В этой статье мы научимся писать код простых поисковых чат-ботов на основе библиотеки NLTK.

InLine клавиатура

На мой взгляд, наиболее интересной является InLine клавиатура. Она позволяет вместе с сообщением отправлять пользователю интерактивные кнопки, например с вариантами ответов, а после их нажатия обрабатывать результат.

Давайте добавим простой вопрос от бота на команду /test:

Переменная markup объявляет новую переменную с inline keyboard, а markup.add – создает отдельную кнопку. Основные параметры при создании кнопки – text и callback_data: первый отвечает за текст на кнопке, второй – данные, которые будут переданы боту при выборе пользователем определенного варианта ответа.

Запустим скрипт и напишем /test:

Отлично, бот прислал нам варианты ответов. Но при нажатии на кнопку ничего не произойдет, т.к. мы не описали обработку результатов. Исправим это:

bot.answer_callback_quer – это всплывающее окно, которое будет показано пользователю после нажатия кнопки. А в call.data будет передано значение, которое мы указывали при создании клавиатуры в параметре callback_data. Ответим боту, выбрав один из ответов:

Отлично, все работает. Но будет лучше, если после ответа, клавиатура будет исчезать из чата. Это можно сделать добавив в конец функции query_handler следующую строку:

Это функция редактирования клавиатуры, вызванная без указания объекта клавиатуры. Теперь после ответа пользователя клавиатура будет убрана ботом:

Келли Дизайн

В этом проекте важно отметить, что все данные и обработка обрабатываются в локальной системе. Несмотря на то, что мы используем IBM, он используется в качестве службы API, и никакие внутренние данные не отправляются в IBM

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


Келли Дизайн

Пользователи могут взаимодействовать с Келли через Slack. Когда пользователь отправляет вопрос, он передается в бэкэнд-систему для анализа.

Вся обработка естественного языка происходит на шаге 2. Это включает обработку IBM Watson, поиск сходства, рекомендации, основанные на совместной фильтрации. После завершения обработки НЛП у нас есть три выхода

  1. Намерения — Что пользователь пытается задать или запросить?
  2. Entities — Какое поле или столбец они ищут?
  3. Диалог / Взаимодействие — Предоставьте соответствующий запрос / ответ на вопрос пользователя.

В настоящее время данные хранятся в файле Excel. Тем не менее, вы можете добавить несколько баз данных / файлов Excel, если это необходимо, для доступа к различным источникам. На основании результатов, полученных на шаге 3, запрашивается соответствующий файл базы данных / excel и результаты возвращаются.

Результаты, полученные из бэкэнда, публикуются для пользователя через Slack

Взаимодействия между пользователями регистрируются и хранятся в текстовом файле. Кроме того, если бот не может определить пользовательские вопросы, он добавит эти вопросы в последующий файл.

Недостатки с нашим ботом

Самая очевидная проблема с нашим ботом в том, что мы должны запустить сценарий Python вручную каждый раз, когда мы хотим взаимодействовать с ним. Также, как уже упоминалось ранее, мы всегда загружаем всю историю сообщений, которую предлагает Telegram. Это как неэффективно, так и ненадежный, как мы не хотим, чтобы не заплачали все историю сообщений, если мы хотим только одно сообщение, и потому что Telegram поддерживает только этот список обновлений в течение 24 часов. Другой вопрос заключается в том, что мы передаем наше сообщение как строку, но потому что это преобразуется в URL перед отправкой в Telegram, вы заметите, что некоторые неожиданные вещи происходят, если вы отправляете сообщения на бот со специальными символами (например, + Символ исчезнет из всех эховых сообщений). Наконец, бот бросает ошибку индекса, если мы стараемся запустить его, когда нет новых сообщений для получения.

Теперь мы обновим наш бот:

  • Постоянно слушать новые сообщения и ответить на каждый.
  • Подтвердите каждое сообщение, поскольку он получает его и сообщает Telegram не отправлять нам это сообщение снова.
  • Используйте длительный опрос, чтобы мы не должны были сделать слишком много запросов.
  • Правильно кодируйте наши сообщения для учета форматирования URL.

Регистрация бота

Для начала нам нужно зарегистрировать нашего бота в Telegram, чтобы сгенерировать учетные данные, которые мы будем использовать для подключения к Telegram API. Каждый бот должен быть привязан к конкретной учетной записи пользователя. Это можно сделать с помощью официального управляющего бота Telegram под названием «BotFather».

Для этого сначала войдите в ваш аккаунт и в поиске наберите . Обязательно выберите подтвержденный аккаунт (у которого справа будет голубая галочка), в противном случае мы можем провести беседу с кем-то совсем другим.

BotFather

Для активации нажмите на кнопку :

Для начала рабочего процесса создания нового бота мы должны отправить в BotFather команду .

Бот у нас спросит следующие данные:

  • имя бота, которое будет отображаться в верхней части чата нового бота, например, «Replit Quick-start Tutorial».
  • имя пользователя, которое будет использоваться для уникальной ссылки на этого бота, например, «@replit_tutorialbot».

Замечание: полезно иметь короткое имя пользователя, чтобы людям было удобно его вводить. Особенно, если вы планируете добавить встроенный режим.

Токен

Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:

Обратите внимание, что вся строка (до двоеточия и после) является токеном

Что вы можете ожидать от этой серии?

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

Начинающий:Общая идея о том, как структура разработана и используется для этого конкретного проекта. Вы должны быть в состоянии загрузить коды с Github и успешно завершить настройку. Это включает в себя установку пакетов, создание и настройку Slack и учетной записи IBM Watson, запуск однократных файлов для генерации ссылок и рекомендаций к фильмам. Вы можете добавить дополнительные навыки в IBM Watson (например, небольшую беседу, генерирующую статические ответы) и увидеть результаты в слабой среде.

Промежуточное:Вы должны иметь возможность использовать эту платформу в качестве шаблона для разработки своего собственного чат-бота, который можно развернуть в другом домене. Кроме того, вы можете расширить базу знаний для чат-бота, добавив новые источники данных, которые включают в себя написание кодов для подключения к различным базам данных (эластичный поиск, базы данных SQL, Excel и т. Д.). Кроме того, вы можете добавить дополнительные функции НЛП для бота и увидеть результаты в спокойной среде.

Соединение

Чем больше я работал с библиотекой telebot, тем больше она мне нравилась. Хотелось бы, используя приложение на flask’e, не терять эту возможность. Но как это сделать? Во-первых, мы можем вместо нашей функции send_message использовать готовую из библиотеки. Это будет выглядеть так:

Но, если присмотреться, можно заметить, что мы потеряли часть функционала, а именно @bot.message_handler — декораторы, которые отслеживают тип введенного боту сообщения (картинка, документ, текст, команда и т. д.). Получается, что если мы используем в качестве сервера наше flask приложение, то мы теряем некоторый функционал библиотеки telebot. Если же мы используем bot.polling(), то мы не можем обращаться к серверу “со стороны”. Конечно, хотелось бы как-то все соединить без потерь. Для этого я нашел немного костыльный способ, однако рабочий:

Здесь мы пользуемся методом set_webhook, аналогично тому, как мы делали это ранее через postman, а на пустом роуте прописываем «немного магии», чтобы успешно получать обновления бота. Конечно, это не очень хороший способ, и в дальнейшем лучше самостоятельно прописывать функционал для обработки входящих сообщений. Но для начала, я считаю, это лучшее решение.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector