Задать вопрос
@GSimonX37

Как получить file_id без отправки сообщения пользователю?

Мне необходимо сразу после запуска бота (написан на pyTelegramBotAPI) получить все file_id фотографий, которые я планирую в дальнейшем отправлять пользователю. Следовательно, вариант отправки всех этих фотографий кому-либо и получение таким образом file_id не подходит. Может есть какой-то другой способ предварительно сохранить данные фотографии на сервера Telegram?
  • Вопрос задан
  • 1197 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Я решал эту задачу так: при первой отправке файла я его отправлял как файл, запоминая file_id в словаре и в таблице в базе, а при следующей уже имел готовый file_id. При этом я могу в любой момент добавлять файлы, не задумываясь о том, загружал ли я их уже в Telegram или нет.

files = {}
def load_files():
  global files
  res = db.execute("SELECT file_name,file_id FROM files")
  files = {}
  for row in res:
    file_name, file_id = row
    files[file_name] = file_id

def save_file(file_name, file_id):
  global files
  db.execute("INSERT INTO files (file_name,file_id) VALUES (?,?) ON CONFLICT(file_name) DO UPDATE SET file_id=excluded.file_id", (file_name, file_id))
  files[file_name] = file_id

load_files()

...
        if item["photo"] in files:
          file_id = files[item["photo"]]
          print (f" send photo file_name={item['photo']} file_id={file_id}")
          bot.send_photo(call.message.chat.id, file_id)
        else:
          with open(os.path.join("menu", item["photo"]), "rb") as f:
            bot.send_chat_action(call.message.chat.id, "upload_photo")
            r = bot.send_photo(call.message.chat.id, f)
            file_id = r.photo[0].file_id
            save_file(item["photo"], file_id)
            print (f" uploaded photo file_name={item['photo']} file_id={file_id}")
Ответ написан
Комментировать
remberq
@remberq
Пытаюсь понять, что такое это ваше IT
Я как раз сегодня сделал себе похожую вещь. Тоже благодаря помощи тут, так что я попробую и тебе помочь)
Без отправки хотя бы себе в личку способа не знаю, да и его нет наверное, так что вариант через отправку себе файлов.
Не знаю как тебе лучше будет хранить file_id, но я у себя сделал базу данных в sqlite(она встроена в питон).
Суть такова, настрой бота, что бы он из твоей директории отправлял фото в личку тебе, а после отправки сохранял file_id в базу данных.

from aiogram.types import InputFile
......
photos = InputFile(f'D:\\Code\\english\\photo\\{eng}\\{eng}.jpg') # это пример моей директории
id_photo = await bot.send_photo(chat_id=message.chat.id, photo=photos) # этот метод поможет получить file_id
id = id_photo['photo'][0]['file_id'] # это сам file_id

Я делал в aiogram у тебя должен быть похожий метод взять файл ботом из директории

Как настроить сохранение зависит уже от тебя, будешь ли ты добавлять этот id в базу данных или в переменную, да хоть в текстовый файл. Я лично настроил добавление в базу, и за 10 минут залил 600 фоток в тг с пометками что к чему относится, потом же удобнее будет их доставать
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы