Перейти к содержанию

В каждом отдельном примере этой документации сниппеты кода полностью рабочие

Боты

Работа с ботами организуется с помощью класса vkbottle.bot.Bot. В самом классе предусмотрена встроенная обработка событий, роутинг в хендлеры, обработка ошибок

Создание бота

Импортируйте нужные компоненты из vkbottle.bot, а именно Bot и датакласс Message:

from vkbottle.bot import Bot, Message  

bot = Bot("token", debug="DEBUG") # Рассматриваем эту часть
bot.run_polling(skip_updates=True) # О запуске будет написано ниже

Для кастомизации доступны аргументы:

Параметр Описание
tokens список токенов / токен
group_id group_id будет и так получен сам, но если токен не имеет такого права можно его указать самостоятельно
debug bool / str, уровень логов, по умолчанию INFO
throw_errors Стандартный режим для API, указывает на выбрасывание разрешение выброса исключений
log_to_path bool / str, указывает путь к папке для логов
patcher VBML Patcher (документация здесь)
mobile bool, True если пользуетесь мобильными компиляторами
secret str, секретный код для callback проверяемый при каждом событии
extension AbstractExtension, нужно для получения random_id, API в датаклассах

Атрибуты бота

Атрибут Описание
Bot.group_id int, ID группы, полученное или указанное при инициализации
Bot.loop asyncio.AbstractEventLoop
Bot.api vkbottle.api.Api, для работы с API вконтакте
Bot.branch Для создания и контроля состояний пользователей (документация здесь)
Bot.middleware Для создания мидлварей, документация далее
Bot.on vkbottle.framework.handler.Handler Для добавления хендлеров, документация далее
Bot.error_handler Для создания хендлеров ошибок, документация скоро
Bot.status -

Создание хендлеров

Для создания хендлеров воспользуйтесь атрибутом бота on
Типы хендлеров: message, chat_message и основной message_handler

Хендлеры для message и chat_message просто добавляют добавляют дополнительные правила: vkbottle.framework.rule.PrivateMessage или vkbottle.framework.rule.ChatMessage

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

Хендлеры принимают любое кол-во правил (vkbottle.framework.rule) и column rules:

col rule Описание
text vbml pattern схема
sticker id стикера
commands прибавл
lev / levenstein расстояние левенштейна (1)

Хендлеры через декораторы

Для добавления хендлеров через декораторы используется следующий интерфейс:

from vkbottle.bot import Bot, Message  

bot = Bot("token", debug="DEBUG")

@bot.on.message_handler(text="я не <denied> а <accepted>", lower=True)
async def wrapper(ans: Message, denied: str, accepted: str):
    await ans.reply(f"Ты не {denied}, а {accepted}")

bot.run_polling()

В любой хендлер всегда возвращается объект события, то есть Message в данном случае. Так же вернулись аргументы, возвращаемые из правил, а именно denied и accepted из VBMLRule, представленное в col rule text

Кроме rules* и col_rules существуют еще доп аргументы (которые возможно будут перенесены или удалены в следующем релизе)
А именно:
- command: bool - для добавления префиксов к text из Handler.(message_handler).prefix - lower: bool - для того чтобы игнорировать кейс в text (re.IGNORECASE)

Добавление хендлера через функцию

from vkbottle.bot import Bot, Message  

bot = Bot("token", debug="DEBUG")

async def wrapper(ans: Message, denied: str, accepted: str):
    await ans.reply(f"Ты не {denied}, а {accepted}")

bot.on.message_handler.add_handler(wrapper, text="я не <denied> а <accepted>", lower=True)
bot.run_polling()

Кроме выше описанных аргументов, Handler.(message_handler).add_handler принимает func

Хендлеры других ивентов

Кроме ивента сообщения в longpoll насчитывается еще 40 событий, все они обрабатываются похожим образом:

from vkbottle.bot import Bot, Message  
from vkbottle.types import GroupJoin # Ваше IDE даст вам подсказку по

bot = Bot("token", debug="DEBUG", throw_errors=False)

@bot.on.event.group_join()  
async def wrapper(event: GroupJoin):  
    # Даже если пользователь не разрешил присылать ему сообщения,
    # исключения не будет потому что throw_errors=False
    await bot.api.messages.send(
        peer_id=event.user_id, 
        message="Спасибо за пополнение наших рядов!",
        random_id=bot.extension.random_id()
    )

bot.run_polling()

Хендлеры специальных событий

Примеры всех хендлеров вы можете найти здесь

Юзеры

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

from vkbottle.user import User, Message
user = User("token") # Вы можете авторизоваться с помощью токена(ов)
user = User(login="+71234567890", password="123456") # Или с помощью логина и пароля

@user.on.message_handler(text="привет", lower=True)
async def wrapper(ans: Message):
    await ans("че надо")

user.run_polling()

Для того чтобы хендлить ивенты:

from vkbottle.user import User
from vkbottle.types.user_longpoll.events import FriendOnline
user = User("token")

@user.on.event.friend_online()
async def friend_online(event: FriendOnline):
    await user.api.messages.send(peer_id=event.user_id, message="ого ты онлайн!", random_id=0)

user.run_polling()

Blueprint

Вы можете использовать Blueprint для создания архитектуры вашего бота/юзербота

Создайте папку routes, в ней создавайте файлы с Blueprintами:

routes/events.py

from vkbottle.bot import Blueprint
from vkbottle.types import GroupJoin

bp = Blueprint(name="Работа с ивентами")

@bp.on.event.group_join()
async def group_join(event: GroupJoin):
    # stuff
    print("Ура, новый участник", event.user_id)

# ...

routes/messages.py

from vkbottle.bot import Blueprint, Message

bp = Blueprint(name="Работа с сообщениями")

@bp.on.message_handler(text="Привет")
async def hello(ans: Message):
    user = (await bp.api.users.get(user_ids=ans.from_id))[0]
    await ans("Здравствуйте, " + user.first_name)

# ...

bot.py

from vkbottle import Bot
from routes import events, messages

bot = Bot("token")
bot.set_blueprints(events.bp, messages.bp)

bot.run_polling()

Готово!