AI Notes
January 20

Кэширование bot.get_me()

Метод bot.me() в Aiogram используется для получения информации о самом боте, аналогично вызову bot.get_me(). Однако, главное отличие заключается в том, что bot.me() возвращает закешированное значение, если оно уже было загружено.


Как работает bot.me()?

  1. Первый вызов bot.get_me():
    • Когда вы вызываете bot.get_me(), Aiogram отправляет запрос в Telegram API на получение информации о боте. Этот запрос возвращает объект aiogram.types.User, содержащий данные о боте (например, id, username, first_name).
  2. Кеширование результата:
    • Aiogram автоматически сохраняет полученный объект в атрибуте bot._me. Это значение сохраняется в памяти до завершения работы приложения.
  3. Вызов bot.me():
    • Когда вы вызываете bot.me(), метод проверяет, было ли ранее закешировано значение в bot._me.
    • Если значение закешировано, метод возвращает его без нового запроса к Telegram API.
    • Если значение отсутствует, bot.me() вызывает bot.get_me() для получения данных, а затем сохраняет результат в bot._me.

Пример использования bot.me()

from aiogram import Bot
from aiogram.types import User

async def get_bot_info(bot: Bot) -> User:
    me = await bot.me()  # Использует закешированное значение или отправляет запрос к Telegram
    return me

При первом вызове await bot.me(), бот отправит запрос к Telegram, но последующие вызовы вернут закешированное значение, что экономит ресурсы.


Когда использовать bot.me() вместо bot.get_me()?

  • Используйте bot.me(), если вам нужно получить информацию о боте несколько раз за сессию.
    • Например, вы хотите использовать имя или ID бота в разных хендлерах, но эти данные не меняются на протяжении работы приложения.
  • Используйте bot.get_me(), если вы хотите быть уверены, что данные о боте актуальны.
    • Например, если бот мог быть переименован или поменял username, а вы хотите получить свежие данные (это редкий случай).

Как минимизировать количество запросов к Telegram?

Если вы хотите снизить количество запросов, то использование bot.me() — лучший вариант, поскольку:

  1. Первый запрос сохраняется в кеше.
  2. Повторные вызовы используют локальное значение.

Как кешировать данные о боте при старте?

Если вы уверены, что данные о боте не изменятся во время работы, вы можете вызвать await bot.me() один раз при старте приложения, чтобы данные оказались закешированными. Например:

async def main():
    bot = Bot(token=TOKEN)
    
    # Закешировать информацию о боте
    await bot.me()
    
    # Теперь любые вызовы bot.me() будут использовать кеш
    ...

Итог

Использование bot.me() позволяет эффективно кешировать информацию о боте и уменьшить количество запросов к Telegram API. Если вы хотите ещё больше контроля, можно вызвать await bot.me() один раз при инициализации и использовать этот кеш во всех хендлерах.