Skip to main content

Lightweight VK API wrapper designed for fast and easy bot development.

Project description

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, есть два пути:

  1. Включить strict=True (все аргументы функции считаются аргументами команды).
  2. Использовать 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 / GroupLeave
  • UserBlock / 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simplevk-1.0.2.tar.gz (28.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

simplevk-1.0.2-py3-none-any.whl (42.9 kB view details)

Uploaded Python 3

File details

Details for the file simplevk-1.0.2.tar.gz.

File metadata

  • Download URL: simplevk-1.0.2.tar.gz
  • Upload date:
  • Size: 28.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for simplevk-1.0.2.tar.gz
Algorithm Hash digest
SHA256 8cb6ec975bce0313cd31f57ae60b34a1ce1c6000c5c079a562326cdff7977da2
MD5 86710d1360a077aad54f335090e9aa0c
BLAKE2b-256 c2b019b84c41a3dd4521003d4bac3d61ca8274b6cb5d3876137434a0373755bd

See more details on using hashes here.

File details

Details for the file simplevk-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: simplevk-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 42.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for simplevk-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b1e3372274a6646ac2996422fb1c1b2c494353b9421e855a1f4cb67e82ad67e4
MD5 fb08ccf7fc31577d866573eb9491d2d9
BLAKE2b-256 7b2916bd5c8658d663be91345decee8f9ff79617fa7f2e8cda8d456ef3461604

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page