Привет, Хабр!


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


VKWave


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


Минимальная требуемая версия Python — 3.7


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


Также у нас есть чат в Telegram


Установка


Установка очень проста и содержит в себе всего одну команду:


pip install vkwave

А теперь предлагаю перейти к примерам!


Echo-бот


Самая простая задача. Бот который отвечает нам тем же самым текстом, который мы ему написали.


# Импортируем нужные классы.
# SimpleLongPollBot: обёртка для более удобной работы с фреймворком
# SimpleBotEvent: тип события, который предоставляет SimpleLongPollBot
from vkwave.bots import SimpleLongPollBot, SimpleBotEvent

# инициализируем бота (можно ввести список токенов, тогда vkwave сможет обходить лимиты ВКонтакте)
bot = SimpleLongPollBot(tokens=TOKEN, group_id=GROUP_ID)

# декоратор для создания обработчиков.
# можно передавать свои фильтры, но в данном случае мы хотим принимать все сообщения
@bot.message_handler()
def echo(event: SimpleBotEvent) -> str:
    # мы можем сразу возвращать текст, т.к vkwave понимает, что если вы возвращаете строку, то вы хотите ответить на сообщение этим текстом. пользователь может задать свои типы данных, которые он сможет возвращать из хендлеров (а также написать нужную логику для их преобразования в нужные действия)
    return event.object.object.message.text

# запускаем бота с игнорированием ошибок (не останавливаться даже при них)
bot.run_forever()

Код содержит буквально пару строк и выглядит очень легко.


Предлагаю написать что-нибудь поинтереснее. Давайте напишем такого же бота, но он будет печатать в ответ только тот текст, который идёт как аргументы команды /echo. Например — /echo мой текст.


Вторая версия Echo-бота


# мы используем фильтр для команд. он фильтрует все сообщения которые не выглядит как `/<наша команда>`. можно задать свои префиксы, а также передать список команд
@bot.message_handler(bot.command_filter("echo"))
def echo(event: SimpleBotEvent) -> str:
    # получаем все аргуметы команды
    args = event.object.object.message.text.split()
    # проверяем, что есть хотя бы один аргумент
    # в противном случае - пишем, что пользователь должен ввести какой-нибудь текст
    if len(args) < 2:
        return "Напиши какой-нибудь текст!"
    # возвращаем итоговый текст (соединяем все аргументы через пробел)
    return " ".join(args[1:])

Уже интереснее. Как мы видим, VKWave предоставляет нам фильтр для команд. Скажу сразу: стандартных фильтров в VKWave много, а также вы можете написать свои.


Итоговая версия Echo-бота


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


# Импортируем нужные классы для разработки своих фильтров
from vkwave.bots.core.dispatching.filters.base import BaseFilter, BaseEvent, FilterResult

# объявляем свой фильтр, который наследуется от базового
class EchoFilter(BaseFilter):
    # мы можем определить `__init__` для дополнительной настройки фильтра

    # объявляем асинхронный метод `check`, который принимает событие и возвращает результат фильтра
    async def check(self, event: BaseEvent) -> FilterResult:
        # делаем алиас для текста сообщения
        text = event.object.object.message.text
        # разбиваем сообщение по пробелам
        all_args = text.split()
        # если частей меньше двух - фильтр не прошёл
        if len(all_args) < 2:
            # возвращаем False.
            # так же можем, например, что-то написать пользователю
            # у нас есть `event.api_ctx`, который предоставляет лёгкий доступ ко всем методам
            return FilterResult(False)
        # если нулевой аргумент (сама команда) не "/echo" возвращаем False
        if all_args[0] != "/echo":
            return FilterResult(False)
        # передаём обработчику уже готовый ответ на сообщение
        event["echo_answer"] = " ".join(all_args[1:])
        return FilterResult(True)

# используем фильтр
@bot.message_handler(EchoFilter())
def echo(event: SimpleBotEvent) -> str:
    # возвращаем текст, который мы уже "собрали" в фильтре
    return event["echo_answer"]

Заключение


Конечно, я показал вам не все, вообще не все, возможности VKWave. Они очень широки, начиная от возможности своих фильтров и middlewares, типов обработчиков, способов получения событий, заканчивая мультиботом, собственным HTTP клиентом и многое другое!


Этой статьёй я хочу мотивировать вас попробовать создать своего бота ВКонтакте, не используя не удобные vk_api и vk.


Репозиторий на GitHub
Наш чат в Telegram