Начало работы

Установка

Требования:

uv add maxo
poetry add maxo
pip install maxo

Дополнительные зависимости:

  • 'maxo[dishka]' - для поддержки DI через dishka

  • 'maxo[redis]' - для использования RedisStorage в качестве FSM-хранилища

  • 'maxo[magic_filter]' - для использования MagicFilter для условий срабатывания обработчиков

Примечание

Если вы используете FSM, мы рекомендуем использовать redis как хранилище состояний в production-среде.

Быстрый старт

Больше примеров в examples на GitHub.

 1import logging
 2import os
 3
 4from maxo import Bot, Dispatcher
 5from maxo.routing.updates import MessageCreated
 6from maxo.transport.long_polling import LongPolling
 7
 8bot = Bot(os.environ["TOKEN"])
 9dispatcher = Dispatcher()
10
11@dispatcher.message_created()
12async def echo_handler(update: MessageCreated) -> None:
13    text = update.message.body.text or "Текста нет"
14    await update.answer_text(text)
15
16logging.basicConfig(level=logging.INFO)
17LongPolling(dispatcher).run(bot)
 1import logging
 2import os
 3
 4from maxo import Bot, Dispatcher, Router
 5from maxo.routing.filters import CommandStart
 6from maxo.routing.updates import MessageCreated
 7from maxo.transport.long_polling import LongPolling
 8
 9bot = Bot(os.environ["TOKEN"])
10router = Router()
11
12@router.message_created(CommandStart())
13# или @router.message_created(Command("start"))
14async def start_handler(update: MessageCreated) -> None:
15    await update.answer_text("Привет! Я бот")
16
17def main():
18    logging.basicConfig(level=logging.INFO)
19    dispatcher = Dispatcher()
20    dispatcher.include(router)
21    LongPolling(dispatcher).run(bot)
22
23if __name__ == "__main__":
24    main()
 1import logging
 2import os
 3
 4from magic_filter import F
 5
 6from maxo import Bot, Dispatcher, Router
 7from maxo.integrations.magic_filter import MagicFilter
 8from maxo.routing.filters import CommandStart
 9from maxo.routing.updates import MessageCallback, MessageCreated
10from maxo.transport.long_polling import LongPolling
11from maxo.utils.builders import KeyboardBuilder
12
13bot = Bot(os.environ["TOKEN"])
14router = Router()
15
16@router.message_created(CommandStart())
17async def start_handler(message: MessageCreated) -> None:
18    keyboard = (
19        KeyboardBuilder()
20        .add_callback(
21            text="Нажми меня",
22            payload="my_callback",
23        )
24        .build()
25    )
26    await message.answer_text(
27        "Это сообщение с клавиатурой:",
28        keyboard=keyboard,
29    )
30
31@router.message_callback(MagicFilter(F.payload == "my_callback"))
32async def button_handler(
33    callback: MessageCallback,
34    bot: Bot,
35) -> None:
36    await callback.callback_answer("Вы нажали на кнопку!")
37    await bot.send_message(
38        user_id=callback.user.user_id,
39        text="Вы нажали на кнопку!",
40    )
41
42def main():
43    logging.basicConfig(level=logging.INFO)
44    dispatcher = Dispatcher()
45    dispatcher.include(router)
46    LongPolling(dispatcher).run(bot)
47
48if __name__ == "__main__":
49    main()