Использование file_id

· nikoontelegram's blog


Сегодня мы продолжим говорить про file_id и посмотрим как можно его применить.

Код бота из последней заметки
 1import logging
 2
 3from aiogram import Bot, Dispatcher, F
 4from aiogram.filters import CommandStart
 5
 6TOKEN = "<TOKEN>"
 7
 8# включение логирования
 9logging.basicConfig(
10    level=logging.INFO,
11    format="%(asctime)s: "
12           "%(filename)s: "
13           "%(levelname)s: "
14           "%(funcName)s(): "
15           "%(lineno)d:\t"
16           "%(message)s",
17)
18
19dp = Dispatcher()
20bot = Bot(TOKEN)
21
22
23@dp.message(CommandStart())
24async def command_start_handler(message):
25    await message.answer(f"Hello, {message.from_user.full_name}!")
26
27
28@dp.message(F.text)
29async def echo_handler(message):
30    await message.answer(message.text)
31
32
33@dp.message(F.photo)
34async def photo_handler(message):
35    await message.answer(message.photo[0].file_id)
36
37
38logging.info("Application started")
39dp.run_polling(bot)

Итак, file_id - это уникальная в рамках бота строка, соответствующая отправленному файлу. Главное её свойство состоит в том, что её можно использовать для повторной отправки того, что бот уже видел. Давайте посмотрим, как это работает. Попросим бота трактовать текст, полученный в echo_handler как file_id, и отправлять нам обратно файл, который ему соответствует. Для этого нам нужно будет заменить всего одну строку в хэндлере текста:

1-    await message.answer(message.text)
2+    await messange.answer_photo(message.text)

Взаимодействие с ботом теперь может быть устроено следующим образом:

  1. Отправить боту картинку и получить в ответ её file_id.
  2. Отправить file_id и получить в ответ соответствующую ему картинку.

Таким образом телеграм-бота можно использовать как облачное хранилище, которое позволяет сохранить файл любого размера запомнив лишь небольшую строку-идентификтор. Также любой другой человек зайдя в этого же бота и отправив ему ту же строку, что и вы, получит в ответ тот же файл. Так что фактически такая строка является публичной ссылкой, доступной любому, кто её знает. Если говорить про более коммерчески применимые примеры, то этот механизм можно использовать для быстрой отправки любых файлов пользователям, что ускорит работу вашего бота. Ускорение произойдёт засчёт того, что при отправке файла по file_id боту не нужно загружать файл на сервера телеграма, он берётся сразу оттуда.

Код бота целиком:

 1import logging
 2
 3from aiogram import Bot, Dispatcher, F
 4from aiogram.filters import CommandStart
 5
 6TOKEN = "<TOKEN>"
 7
 8# включение логирования
 9logging.basicConfig(
10    level=logging.INFO,
11    format="%(asctime)s: "
12           "%(filename)s: "
13           "%(levelname)s: "
14           "%(funcName)s(): "
15           "%(lineno)d:\t"
16           "%(message)s",
17)
18
19dp = Dispatcher()
20bot = Bot(TOKEN)
21
22
23@dp.message(CommandStart())
24async def command_start_handler(message):
25    await message.answer(f"Hello, {message.from_user.full_name}!")
26
27
28@dp.message(F.text)
29async def echo_handler(message):
30    await message.answer_photo(message.text)
31
32
33@dp.message(F.photo)
34async def photo_handler(message):
35    await message.answer(message.photo[0].file_id)
36
37
38logging.info("Application started")
39dp.run_polling(bot)

Мой канал про разработку под телеграм: @NikoOnTelegram