Разрешенный телеграммой размер callback_data меньше размера file_id - PullRequest
1 голос
/ 08 февраля 2020

Мне нужно повторно отправить идентификатор файла в данных обратного вызова следующим образом:

cd1 = 'publish {}'.format(new_file_id)
cd2 = 'delayed 1 {} *'.format(new_file_id)
...
markup = types.InlineKeyboardMarkup(1)
btn1 = types.InlineKeyboardButton(text='Publish',
                                      callback_data=cd1)
btn2 = types.InlineKeyboardButton(text='Delayed publication',
                                      callback_data=cd2)
markup.add(btn1, btn2)

bot.edit_message_reply_markup(message.chat.id, msg.message_id, reply_markup=markup)

Но размер file_id, который я получаю как

new_file_id = msg.video_note.file_id

(Стандартный метод https://github.com/eternnoir/pyTelegramBotAPI) больше допустимого размера callback_data (1-64 байта).

Фактический размер для строк callback_data составляет 128 байтов для cd1 и 132 байта для cd2.

file_id выглядит как DQACAgIAAxkDAAIHZ14-nxWa7ckt2ZG7UQMrq_PuxIxRAAK4BQACzfj4SdBn7Y70cYWSGAQ, а размер составляет 120 байтов.

Есть идеи? Очень надеюсь на вашу помощь.

1 Ответ

0 голосов
/ 10 апреля 2020

У меня была такая же проблема, и похоже, что нет способа отправить file_id в данных обратного вызова.

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

К сожалению, в Telegram API нет метода, который позволял бы вам восстанавливать прошлое сообщение с его идентификатором, но при получении сообщение, которое вы можете сохранить в сопоставлении message_id -> file_id (в памяти или в дБ) и передать ключ как callback_data.

Конечно, это не лучшая вещь в мире, но я думаю, что это лучшая вещь, которую мы можем до тех пор, пока они не увеличат размер callback_data.

...