Asynchronous framework for MAX.ru bots
Project description
maxo
Асинхронный фреймворк для разработки ботов в max.ru
Документация
Оригинальный репозиторий
maxo/dialogs сделано из aiogram_dialog
maxo/transport/webhook сделано из aiogram-webhook
Установка
Через pip:
pip install maxo==0.5.1
В pyproject.toml:
[project]
dependencies = [
"maxo==0.5.1",
]
Особенности
- Асинхронность на базе
aiohttpиunihttp(asyncio, PEP 492) - 100% покрытие типами,
adaptixдля валидации данных - Роутеры, фильтры, милдвари
- Встроенная машина состояний (FSM) и диалоги поверх них
- Поддержка лонг-поллинга и вебхуков через
aiohttpиfastapi - Интеграции с
dishkaиmagic_filter - Автогенерация методов, типов и апдейтов по официальной документации
Быстрый старт
Больше примеров в примерах
Эхо-бот
from maxo import Bot, Dispatcher
from maxo.routing.updates import MessageCreated
from maxo.transport.long_polling import LongPolling
from maxo.utils.facades import MessageCreatedFacade
bot = Bot("TOKEN")
dispatcher = Dispatcher()
@dispatcher.message_created()
async def echo_handler(update: MessageCreated, facade: MessageCreatedFacade) -> None:
text = update.message.body.text or "Текста нет"
await facade.answer_text(text)
LongPolling(dispatcher).run(bot)
Команды
from maxo import Bot, Dispatcher
from maxo.routing.filters import Command, CommandObject, CommandStart
from maxo.routing.updates import MessageCreated
from maxo.transport.long_polling import LongPolling
from maxo.utils.facades import MessageCreatedFacade
bot = Bot("TOKEN")
dispatcher = Dispatcher()
@dispatcher.message_created(CommandStart())
# или @dispatcher.message_created(Command("start"))
async def start_handler(
message: MessageCreated,
command: CommandObject,
facade: MessageCreatedFacade,
) -> None:
await facade.answer_text(f"Привет! Я бот. Диплинк: {command.args}")
LongPolling(dispatcher).run(bot)
Клавиатуры
from magic_filter import F
from maxo import Bot, Dispatcher
from maxo.integrations.magic_filter import MagicFilter
from maxo.routing.filters import CommandStart
from maxo.routing.updates import MessageCallback, MessageCreated
from maxo.transport.long_polling import LongPolling
from maxo.utils.builders import KeyboardBuilder
from maxo.utils.facades import MessageCallbackFacade, MessageCreatedFacade
bot = Bot("TOKEN")
dispatcher = Dispatcher()
@dispatcher.message_created(CommandStart())
async def start_handler(message: MessageCreated, facade: MessageCreatedFacade) -> None:
keyboard = (
KeyboardBuilder()
.add_callback(
text="Колбэк кнопка",
payload="callback_payload",
)
.add_message(text="Текстовая кнопка")
.add_link(
text="Maxo",
url="https://github.com/K1rL3s/maxo",
)
.adjust(1, repeat=True)
.build()
)
await facade.answer_text("Кнопочки:", keyboard=keyboard)
@dispatcher.message_callback(MagicFilter(F.payload == "callback_payload"))
async def button_handler(
callback: MessageCallback,
facade: MessageCallbackFacade,
) -> None:
await facade.callback_answer("Вы нажали на кнопку!")
LongPolling(dispatcher).run(bot)
Вебхук
import logging
import os
from aiohttp import web
from maxo import Bot, Dispatcher, Router
from maxo.enums import TextFormat
from maxo.routing.updates import BotStarted, MessageCreated
from maxo.routing.utils import collect_used_updates
from maxo.transport.webhook.adapters.aiohttp import AiohttpWebAdapter
from maxo.transport.webhook.engines import SimpleEngine, WebhookEngine
from maxo.transport.webhook.routing import StaticRouting
from maxo.transport.webhook.security import Security, StaticSecretToken
from maxo.utils.facades import BotStartedFacade, MessageCreatedFacade
bot = Bot(os.environ["TOKEN"])
router = Router()
@router.bot_started()
async def start_handler(bot_started: BotStarted, facade: BotStartedFacade) -> None:
await facade.send_message(text=f"Привет из вебхука, {bot_started.user.first_name}!")
@router.message_created()
async def echo_handler(message: MessageCreated, facade: MessageCreatedFacade) -> None:
await facade.answer_text(
text=message.message.body.html_text,
format=TextFormat.HTML,
)
@router.after_startup()
async def on_startup(dispatcher: Dispatcher, webhook_engine: WebhookEngine) -> None:
await webhook_engine.set_webhook(update_types=collect_used_updates(dispatcher))
def main() -> None:
dispatcher = Dispatcher()
dispatcher.include(router)
engine = SimpleEngine(
dispatcher,
bot,
web_adapter=AiohttpWebAdapter(),
routing=StaticRouting(url="https://example.com/webhook"),
security=Security(secret_token=StaticSecretToken("pepa_pig")),
)
app = web.Application()
engine.register(app)
web.run_app(app, host="127.0.0.1", port=8080)
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
main()
Связь
Если у вас есть вопросы, вы можете задать их в Телеграме @maxo_py или Максе
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
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
File details
Details for the file maxo-0.5.1.tar.gz.
File metadata
- Download URL: maxo-0.5.1.tar.gz
- Upload date:
- Size: 167.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e78ef9b3141c999ed39941d19958b387f23473ced86e0374d32443e33a081f5
|
|
| MD5 |
a5803a9a726f2a2789ac5e7a843ea14c
|
|
| BLAKE2b-256 |
9ffa03622b0553dcc5e962be21cbd892a44479128f1cfc436b4dc391542c3e88
|
File details
Details for the file maxo-0.5.1-py3-none-any.whl.
File metadata
- Download URL: maxo-0.5.1-py3-none-any.whl
- Upload date:
- Size: 333.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90a161c6e3d88b66042e49017e2c5ec644f6ef50e13eb0b4c03f8896c8347e26
|
|
| MD5 |
99bd88b51244bd4c4a79978b1eefa7f0
|
|
| BLAKE2b-256 |
cfa7fe66cd73f56b72f04c14f3c67ed317745902cfd8e7a65c6189a714347c7d
|