Я решал эту задачу так: при первой отправке файла я его отправлял как файл, запоминая 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}")