FastVK
Async VK bot framework with FastAPI-style decorators and aiogram-style FSM.
Source Code: https://github.com/ndugram/fastvk
FastVK — это современный асинхронный фреймворк для VK-ботов на Python. Вдохновлён FastAPI и aiogram — декораторы для хэндлеров, DI через аннотации типов, FSM, middleware и typed VK API методы.
Ключевые особенности:
- Декораторный API —
@bot.message(),@bot.callback(),@bot.on("event"). - Фильтры —
Command,Text,F.text == "...",StateFilter,regexp. - FSM — состояния через
StatesGroup,FSMContext, хранилищаMemoryStorage/RedisStorage. - DI — параметры хэндлера (
message: Message,state: FSMContext,user: User) подставляются автоматически. - Typed методы —
MessagesSend,MessagesEdit,WallPostи другие с полной поддержкой IDE. - Роутеры —
Routerдля разбивки бота по файлам, как в FastAPI. - Middleware — перехват любого события до хэндлера.
- Dashboard — встроенный веб-дашборд со статистикой.
Требования¶
Python 3.10+
FastVK использует:
Установка¶
Для Redis FSM хранилища:
Пример¶
from fastvk import FastVK, CommandStart, Command
from fastvk.types import Message
from fastvk.fsm import FSMContext, State, StatesGroup
from fastvk.filters import StateFilter, Text
bot = FastVK(token="vk1.a....", group_id=123456)
class Form(StatesGroup):
waiting_name = State()
@bot.message(CommandStart())
async def start(message: Message, state: FSMContext) -> None:
await state.set_state(Form.waiting_name)
await message.answer("Привет! Как тебя зовут?")
@bot.message(StateFilter(Form.waiting_name))
async def got_name(message: Message, state: FSMContext) -> None:
await state.update_data(name=message.text)
await state.clear()
await message.answer(f"Отлично, {message.text}! 👋")
@bot.message(Command("help"))
async def help_cmd(message: Message) -> None:
await message.answer("Доступные команды: /start, /help")
bot.run_polling()
Пример с клавиатурой и callback
from fastvk import FastVK, F
from fastvk.keyboard import Button, Keyboard
from fastvk.types import Message, CallbackQuery
bot = FastVK(token="vk1.a....", group_id=123456)
vote_kb = (
Keyboard(inline=True)
.row(
Button.callback("👍 Нравится", payload={"vote": "like"}),
Button.callback("👎 Не нравится", payload={"vote": "dislike"}),
)
)
@bot.message(F.text == "голосовать")
async def send_vote(message: Message) -> None:
await message.answer("Оцени:", keyboard=vote_kb)
@bot.callback(F.payload == {"vote": "like"})
async def on_like(callback: CallbackQuery) -> None:
await callback.answer("Спасибо за лайк! ❤️")
@bot.callback(F.payload == {"vote": "dislike"})
async def on_dislike(callback: CallbackQuery) -> None:
await callback.answer("Жаль... Мы станем лучше!")
bot.run_polling()