Маршрутизатор#

Usage:

from aiogram import Router
from aiogram.types import Message

my_router = Router(name=__name__)

@my_router.message()
async def message_handler(message: Message) -> Any:
    await message.answer('Hello from my router!')
class aiogram.dispatcher.router.Router(*, name: str | None = None)[source]#

Базується на object

Маршрутизатор може маршрутизувати події, а також вкладені типи оновлень, такі як повідомлення, запит зворотного виклику, опитування та всі інші типи подій.

Обробники подій можуть бути зареєстровані в обсервері двома шляхами:

  • За допомогою методу обсервера - router.<event_type>.register(handler, <filters, ...>)

  • За допомогою декоратора - @router.<event_type>(<filters, ...>)

__init__(*, name: str | None = None) None[source]#
Параметри:

name – Додаткова назва маршрутизатора, може бути корисною для відлагодження

include_router(router: Router) Router[source]#

Підключення маршрутизатора.

Параметри:

router

Повертає:

include_routers(*routers: Router) None[source]#

Attach multiple routers.

Параметри:

routers

Повертає:

resolve_used_update_types(skip_events: Set[str] | None = None) List[str][source]#

Resolve registered event names

Is useful for getting updates only for registered event types.

Параметри:

skip_events – skip specified event names

Повертає:

set of registered names

Обсервери подій#

Попередження

Усі обробники завжди мають бути асинхронними. Ім’я функції обробки не має значення. Назва аргументу події також не важлива, але рекомендується не накладати назву на контекстні дані, оскільки функція не може прийняти два аргументи з однаковою назвою.

Ось список доступних обсерверів і приклади того, як зареєструвати обробники

У цих прикладах використовуються лише обробники реєстрації у стилі декоратора, але якщо вам не подобаються @decorators, просто використовуйте <event type>.register(...) method instead.

Повідомлення#

Увага

Будьте уважні при фільтруванні цієї події

Вам слід очікувати, що ця подія може мати різні набори атрибутів у різних випадках

(Наприклад, текст, стікер та документ завжди мають різні типи вмісту)

Рекомендований спосіб перевірити наявність полів перед використанням, наприклад за допомогою magic filter: F.text для обробки тексту, F.sticker для обробки лише стікерів і тощо.

@router.message()
async def message_handler(message: types.Message) -> Any: pass

Відредаговане повідомлення#

@router.edited_message()
async def edited_message_handler(edited_message: types.Message) -> Any: pass

Пост на каналі#

@router.channel_post()
async def channel_post_handler(channel_post: types.Message) -> Any: pass

Відредагований пост на каналі#

@router.edited_channel_post()
async def edited_channel_post_handler(edited_channel_post: types.Message) -> Any: pass

Inline запит#

@router.inline_query()
async def inline_query_handler(inline_query: types.InlineQuery) -> Any: pass

Вибраний результат inline запиту#

@router.chosen_inline_result()
async def chosen_inline_result_handler(chosen_inline_result: types.ChosenInlineResult) -> Any: pass

Запит зворотної відповіді#

@router.callback_query()
async def callback_query_handler(callback_query: types.CallbackQuery) -> Any: pass

Запит підтвердження доставки#

@router.shipping_query()
async def shipping_query_handler(shipping_query: types.ShippingQuery) -> Any: pass

Запит перед оформленням замовлення#

@router.pre_checkout_query()
async def pre_checkout_query_handler(pre_checkout_query: types.PreCheckoutQuery) -> Any: pass

Опитування#

@router.poll()
async def poll_handler(poll: types.Poll) -> Any: pass

Відповідь на опитування#

@router.poll_answer()
async def poll_answer_handler(poll_answer: types.PollAnswer) -> Any: pass

My chat member#

@router.my_chat_member()
async def my_chat_member_handler(my_chat_member: types.ChatMemberUpdated) -> Any: pass

Chat member#

@router.chat_member()
async def chat_member_handler(chat_member: types.ChatMemberUpdated) -> Any: pass

Chat join request#

@router.chat_join_request()
async def chat_join_request_handler(chat_join_request: types.ChatJoinRequest) -> Any: pass

Message reaction#

@router.message_reaction()
async def message_reaction_handler(message_reaction: types.MessageReactionUpdated) -> Any: pass

Message reaction count#

@router.message_reaction_count()
async def message_reaction_count_handler(message_reaction_count: types.MessageReactionCountUpdated) -> Any: pass

Chat boost#

@router.chat_boost()
async def chat_boost_handler(chat_boost: types.ChatBoostUpdated) -> Any: pass

Remove chat boost#

@router.removed_chat_boost()
async def removed_chat_boost_handler(removed_chat_boost: types.ChatBoostRemoved) -> Any: pass

Помилки#

@router.errors()
async def error_handler(exception: types.ErrorEvent) -> Any: pass

Is useful for handling errors from other handlers, error event described here

Вкладені маршрутизатори#

Попередження

До речі, маршрутизатори можуть бути вкладеними в інші маршрутизатори з деякими обмеженнями:

1. Router CAN NOT include itself 1. Routers CAN NOT be used for circular including (router 1 include router 2, router 2 include router 3, router 3 include router 1)

Приклад:

module_1.py#

name:

module_1

router2 = Router()

@router2.message() …

module_2.py#

name:

module_2

from module_2 import router2

router1 = Router() router1.include_router(router2)

Оновлення#

@dispatcher.update()
async def message_handler(update: types.Update) -> Any: pass

Попередження

The only root Router (Dispatcher) can handle this type of event.

Примітка

Dispatcher already has default handler for this event type, so you can use it for handling all updates that are not handled by any other handlers.

Як це працює?#

Наприклад, диспетчер має 2 маршрутизатори, останній маршрутизатор також має один вкладений маршрутизатор:

Приклад вкладених маршрутизаторів

У цьому випадку потік розповсюдження оновлення матиме вигляд:

Приклад вкладених маршрутизаторів