simplevk
Простая библиотека для разработки ботов ВКонтакте.
Архитектура построена на базе dataclasses и современных возможностях Python 3.10+, предлагая удобный интерфейс декораторов и строгую типизацию аргументов.
Особенности
- Type-Safe Parsing: Аргументы команд парсятся и валидируются согласно аннотациям типов (
int,bool,Enum,Literal). - Гибкая маршрутизация: Поддержка команд, регулярных выражений, Payload и событий кнопок.
- Middleware: Полноценная поддержка промежуточного ПО для разных типов событий.
- No Bloat: Минимум зависимостей, фокус на скорости и чистоте API.
Установка
pip install simplevk
Или через uv:
uv add simplevk
Быстрый старт
from simplevk import Bot, Message
# group_id указывать желательно, чтобы избежать лишнего запроса к API при старте
bot = Bot("YOUR_TOKEN", group_id=123456789)
# Принимать event необязательно, если он не используется
# Команды (on.command) поддерживают return строки для быстрой отправки ответа
@bot.on.command(name="ping")
def ping():
return "Pong!"
if __name__ == "__main__":
# Запуск LongPoll
bot.start_listen()
Система команд
Система команд в simplevk автоматически преобразует текст сообщения в аргументы функции.
Базовые типы
Поддерживаются специальные типы из simplevk:
Integer/Float/PositiveInteger...Word: Одно слово или фраза в кавычках (например,"аргумент с пробелом").Text: Весь оставшийся текст сообщения (Greedy).Boolean:True(да, +, 1, on) /False(нет, -, 0, off).UserID,GroupID,PeerID: Разрешают упоминания, ссылки, ID, ответ или пересланное сообщение.
from simplevk import Integer, Word, Text, Boolean, UserID
# Пример: /ban "нарушение правил" 7 да [ответом на сообщение]
@bot.on.command(name="ban")
def ban_handler(
user: UserID, # Спарсит ID из ответа
reason: Word, # Возьмет текст в кавычках как одну строку
days: Integer, # Спарсит int
is_silent: Boolean = False, # Флаг
):
# Логика бана...
if not is_silent:
return f"Пользователь {user} забанен на {days} дней. Причина: {reason}"
Strict Mode и Param
По умолчанию strict=False. Это означает, что парсер обрабатывает только известные ему типы (Integer, Word и т.д.), а остальные аргументы игнорирует (ожидая, что их передадут через Middleware).
Чтобы использовать стандартные типы Python (int, str), Literal или Enum, есть два пути:
- Включить
strict=True(все аргументы функции считаются аргументами команды). - Использовать
Param(явное указание парсеру).
from typing import Literal
from simplevk.labeler.command.args import Param
# Способ 1: Strict Mode
@bot.on.command(name="calc", strict=True)
def calc(a: int, op: Literal["+", "-", "*"], b: int):
if op == "+": return str(a + b)
# ...
# Способ 2: Param (работает при strict=False)
# Удобно, если в функцию также передаются данные из Middleware (например, user_db)
@bot.on.command(name="set status")
def set_status(
status: Literal["online", "offline"] = Param(),
user_db: dict, # Этот аргумент пропустится парсером команд
):
return f"Статус обновлен: {status}"
Catch-All команды (name=...)
Если передать ... (Ellipsis) вместо имени, хендлер будет перехватывать все команды, которые прошли проверку префикса и всех аргументов, но не подошли под другие хендлеры.
@bot.on.command(name=..., strict=True)
def wrapper(integer: int):
# Обработка любого текста, являющегося целым числом
return f"Integer: {integer}"
Важно про Regex: Имя команды преобразуется в регулярное выражение. Если имя содержит спецсимволы (
.,?,*), их необходимо экранировать вручную, иначе они будут интерпретированы как часть regex.
Обработка ошибок валидации
По умолчанию при ошибке ввода аргументов бот отправляет сообщение с описанием ошибки. Это поведение можно переопределить.
from simplevk.labeler.command.errors import ValidationError
def my_error_handler(message, error: ValidationError, handler, param):
message.answer(
f"Ой! Ошибка в аргументе '{param.name}': {error.reason}\n"
f"Вы ввели: {error.value}"
)
bot.on.command.validation_error_handler = my_error_handler
Настройка префиксов
Префиксы определяются через фабрику. Вы также можете использовать стандартный regex для упоминания бота, доступный в bot.on.command.bot_mention.
def my_prefixes(message, middlewares_data):
# Команды работают без префикса в ЛС, но требуют /, ! или упоминание в беседах
if not message.from_chat:
return [""]
return ["/", "!", bot.on.command.bot_mention]
bot.on.command.prefixes_factory = my_prefixes
Клавиатуры и Кнопки
Генерация JSON клавиатур и обработка нажатий (MessageEvent).
from simplevk import Keyboard, ButtonColor, MessageEvent
# Генерация клавиатуры
kb = (
Keyboard(inline=True)
.add_callback("Лайк", payload={"cmd": "like"}, color=ButtonColor.POSITIVE)
.row()
.add_openlink("https://vk.com", "ВК")
)
# Обратите внимание: on.message и on.message_event хендлеры НЕ поддерживают return строки
@bot.on.command(name="menu")
def show_menu(event: Message):
event.answer("Меню:", keyboard=kb)
# Обработка Callback-кнопки
@bot.on.message_event(payload={"cmd": "like"})
def like_handler(event: MessageEvent):
event.show_snackbar("Вы поставили лайк!")
# event.edit(...) / event.open_link(...)
Middleware
Middleware позволяет выполнять код до (pre) и после (post) выполнения хендлера.
Важно: Списки middleware разделены для сообщений, команд и событий.
bot.on.message— для простого текста/regex/payload.bot.on.command— для обработчиков команд.bot.on.message_event— для кнопок.
from simplevk.middlewares import BaseMiddleware
@bot.on.message.register_middleware
@bot.on.command.register_middleware
class AdminMiddleware(BaseMiddleware):
# Метод pre может возвращать dict, который попадет в аргументы хендлера
# Если pre вернет False, выполнение прекратится
def pre(self, event):
if event.from_id not in [1, 2, 3]:
event.answer("Доступ запрещен")
return False
return {"is_admin": True}
# Метод post обязателен к реализации
def post(self, event):
pass
@bot.on.command(name="admin_panel")
def admin_panel(event: Message, is_admin: bool):
return "Добро пожаловать, админ."
События (Events)
Помимо сообщений, библиотека поддерживает обработку других событий через simplevk.events:
GroupJoin/GroupLeaveUserBlock/UserUnblock
from simplevk import GroupJoin
@bot.on.group_join()
def on_join(event: GroupJoin):
print(f"Пользователь {event.user_id} вступил в группу")
Планы
- FSM: Машина состояний для реализации сценарных диалогов.
- Command-like Payload: Внедрение парсера аргументов (как в командах) для Payload-событий.
- Переход на асинхронный движок (asyncio).
License
MIT
Metadata
Release files for simplevk 1.0.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simplevk-1.0.3.tar.gz | 28.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| simplevk-1.0.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 71.6 kB
Release files / simplevk-1.0.3.tar.gz
| Download URL | simplevk-1.0.3.tar.gz |
|---|---|
| Size | 28.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8429fec00b78057a19b48ae0df19779190a5c7abd0eaa173a13377823c2ec3e7
|
|
BLAKE2b-256 checksum How to use checksums |
2143afd98e3d24faeefbb7c6c48d70dd309ad2d6f50f5cb117df25d2f2b55b22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.0
|
Release files / simplevk-1.0.3-py3-none-any.whl
| Download URL | simplevk-1.0.3-py3-none-any.whl |
|---|---|
| Size | 43.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1ebc0f345937a419deff5f551e089b0ba9208266de54cd43532fe9628888e835
|
|
BLAKE2b-256 checksum How to use checksums |
2ebeb93c03d04afaa7a3df8703f7bd24ea5a7cd837866fcbfe595fa45f51102f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.0
|