Vondic Botik SDK - Telegram Bot Framework for Vondic Platform
Project description
BotikSDK
Telegram Bot Framework для платформы Vondic.
Установка
pip install botiksdk
Быстрый старт
import asyncio
from botiksdk import Bot, Dispatcher, Command, InlineKeyboardBuilder, InlineKeyboardButton
dp = Dispatcher()
bot = Bot(token="your-bot-token", base_url="http://localhost:5050")
@dp.message(Command("start"))
async def cmd_start(message, bot, state):
builder = InlineKeyboardBuilder()
builder.add(InlineKeyboardButton(text="Нажми меня", callback_data="pressed"))
await bot.send_message(
str(message.chat.id),
"Привет!",
reply_markup=builder.as_markup(),
)
@dp.callback_query(lambda c: c.data == "pressed")
async def on_button_pressed(callback, bot, state):
await bot.send_message(
str(callback.message.chat.id),
"Кнопка нажата!",
)
await bot.answer_callback_query(callback.id)
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Возможности
- Dispatcher - диспетчер для обработки обновлений
- Router - маршрутизатор для группировки хендлеров
- FSM (Finite State Machine) - машина состояний для диалогов
- Filters - фильтры для сообщений и callback query
- Inline Keyboard - конструктор кнопок
- Async-first Bot API -
await bot.send_message(...)безto_thread - Error Handlers - единая обработка исключений через
@dp.errors() - Middlewares - pre/post обработка событий через
@dp.message_middleware() - Handler Priority - приоритетный роутинг и управление propagation
- RateLimit - встроенный anti-flood фильтр
Классы
Bot
Основной класс для взаимодействия с API:
bot = Bot(
bot_id="your-bot-id", # опционально
token="your-bot-token",
base_url="http://localhost:5050", # опционально
)
Методы:
send_message(chat_id, text, parse_mode, reply_markup)- отправка сообщенияanswer_callback_query(callback_query_id, text, show_alert)- ответ на callbackget_updates(offset, limit, timeout)- получение обновленийget_user_profile_photos(user_id, limit)- получение фото профиляget_file(file_id)- получение файла
Dispatcher
Диспетчер для обработки обновлений:
dp = Dispatcher()
@dp.message(Command("start"))
async def start_handler(message, bot, state):
...
@dp.callback_query(lambda c: c.data.startswith("buy_"))
async def buy_handler(callback, bot, state):
...
@dp.message(lambda m: m.text is not None, state="some_state")
async def state_handler(message, bot, state):
...
# higher priority + propagate дальше (не блокировать следующие хендлеры)
@dp.message(Command("debug"), priority=100, blocking=False)
async def debug_handler(message, bot):
...
FSMContext
Контекст машины состояний:
@dp.message(Command("email"))
async def ask_email(message, bot, state):
await state.set_state("waiting_email")
await bot.send_message(str(message.chat.id), "Введите email:")
@dp.message(lambda m: m.text is not None, state="waiting_email")
async def receive_email(message, bot, state):
await state.update_data(email=message.text)
await state.clear()
Filters
Встроенные фильтры:
Command("start", "help")- командыText(equals="hello")- точное совпадение текстаText(contains="world")- текст содержит подстрокуRegex(r"\d+")- регулярное выражениеF.message.text.contains("hello")- фильтр по полюlambda c: c.data.startswith("buy_")- lambda фильтрCommand("start") & Text(contains="promo")- композиция ANDCommand("start") | Command("help")- композиция OR~Regex(r"spam")- инверсия условияRateLimit(window_seconds=1.5, key="user")- anti-flood по юзеру
Middleware
@dp.message_middleware()
async def audit_middleware(event, bot, call_next):
# before handler
result = await call_next()
# after handler
return result
Обработка ошибок
@dp.errors()
async def on_error(exception, update, bot):
# например, отправить себе алерт или записать метрику
print(f"Ошибка в update={update.update_id}: {exception}")
InlineKeyboardBuilder
Конструктор кнопок:
builder = InlineKeyboardBuilder()
builder.row(
InlineKeyboardButton(text="Кнопка 1", callback_data="btn1"),
InlineKeyboardButton(text="Кнопка 2", callback_data="btn2"),
)
builder.add(InlineKeyboardButton(text="URL", url="https://example.com"))
markup = builder.as_markup()
Примеры
Регистрация пользователя
@dp.callback_query(lambda c: c.data == "register")
async def register(callback, bot, state):
user_id = str(callback.from_user.id)
# Ваша логика регистрации
await bot.send_message(
str(callback.message.chat.id),
f"Вы зарегистрированы! ID: {user_id}",
)
await bot.answer_callback_query(callback.id)
Покупка товаров
@dp.callback_query(lambda c: c.data.startswith("buy_item"))
async def buy_item(callback, bot, state):
_, item_id = callback.data.split(":")
# Логика покупки
builder = InlineKeyboardBuilder()
builder.add(InlineKeyboardButton(text="Оплатить", url="https://payment.url"))
await bot.send_message(
str(callback.message.chat.id),
f"Товар {item_id} добавлен в корзину",
reply_markup=builder.as_markup(),
)
await bot.answer_callback_query(callback.id)
Машина состояний
class States:
email = "email"
password = "password"
@dp.message(Command("login"))
async def login_start(message, bot, state):
await state.set_state(States.email)
await bot.send_message(str(message.chat.id), "Введите email:")
@dp.message(lambda m: m.text is not None, state=States.email)
async def login_email(message, bot, state):
await state.update_data(email=message.text)
await state.set_state(States.password)
await bot.send_message(str(message.chat.id), "Введите пароль:")
@dp.message(lambda m: m.text is not None, state=States.password)
async def login_password(message, bot, state):
data = await state.get_data()
email = data.get("email")
password = message.text
# Логика входа
await state.clear()
await bot.send_message(str(message.chat.id), "Вход выполнен!")
Лицензия
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
botiksdk-0.2.0.tar.gz
(13.9 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
botiksdk-0.2.0-py3-none-any.whl
(15.7 kB
view details)
File details
Details for the file botiksdk-0.2.0.tar.gz.
File metadata
- Download URL: botiksdk-0.2.0.tar.gz
- Upload date:
- Size: 13.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35518efc17ab5e4fdf9084d6058bb9ef3b3ae06d9e2f6725fb5f4f2bed7d8c4d
|
|
| MD5 |
f30b594ef6d8a3111b127fe93c91c1be
|
|
| BLAKE2b-256 |
1fc2a62e647459530730f111ee15bea9dea9373b5d96e8d125b484b6488bf9c4
|
File details
Details for the file botiksdk-0.2.0-py3-none-any.whl.
File metadata
- Download URL: botiksdk-0.2.0-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
524d82c622fdb2640bbc1661e36bf29c1f3625dfcdb21e567b40cff3067db835
|
|
| MD5 |
54ed27c1434934654c84b66bdacbde23
|
|
| BLAKE2b-256 |
bcd4508e499c0649f15916931c51a33b97fba4c3ce67a2016173d430e213c6ac
|