kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn

Почему не создается больше одной кнопки с pyTelegramBotAPI?

Код отправки клавиатуры:
@bot.message_handler(content_types=['text'])
def send_text(message):
    query = api_query(message.text)
    if query is not None:
        keyboard = types.InlineKeyboardMarkup()
        for item in query:
            print(item)
            keyboard.add(types.InlineKeyboardButton(text=item, callback_data=item))
        bot.send_message(message.from_user.id, text='Вот, что я нашел:', reply_markup=keyboard)
    else:
        bot.send_message(message.from_user.id, 'Ой, мне ничего не удалось найти. Ты точно ввел(а) правильное название?')

В query хранится поисковая выдача, например:
['Чернобыль: Зона отчуждения (2014)', 'Чернобыльские джунгли. 20 лет без человека (2008)', 'Чернобыль (2019)']

При попытке выполнить код ошибка:
telebot.apihelper.ApiException: A request to the Telegram API was unsuccessful. The server returned HTTP 400 Bad Request. Response body:
[b'{"ok":false,"error_code":400,"description":"Bad Request: BUTTON_DATA_INVALID"}']

При чем если в query всего 1 элемент, то отправка кнопки происходит без проблем.
Как правильно в моем случае мне необходимо сформировать клавиатуру?
  • Вопрос задан
  • 8134 просмотра
Решения вопроса 1
kshnkvn
@kshnkvn Автор вопроса
yay ✌️ t.me/kshnkvn
Собственно, как всегда - дурачек невнимательно прочитал документацию и побежал на тостер:
callback_data String Optional. Data to be sent in a callback query to the bot when button is pressed, 1-64 bytes

Код рабочий, только в callback_data я превысил лимит API.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Exieros
Тоже недавно столкнулся с этой проблемой и нашел для себя вполне приемлемый выход из этой ситуации с ограничением в 64 байта. Можно сделать md5() строки и сохранить в кеш. Redis(предпочтительно так как позволяет из коробки еще и задать срок жизни), файловый или еще какой - это уже не важно. Потом при нажатии на кнопку, берем из cb_data md5 и по нему берем значение. Может кому пригодится.

Вот буквально только что пришлось на скору руку фиксить бота, в котором не учел максимально допустимую длину cb_data.

p.s. Стоит наверное уточнить, что можно словить коллизию, но если у вас не бот на миллиарды запросов в день, то вас это не коснется:)

p.s.s. Вместо md5 можно получать более стойкий к коллизии хэш, например hexdec(hash('crc32', $str) . hash('crc32b', $str)) (php) или crc64

p.s.s.s. Если вероятность коллизий вас все же смущает тогда стоит сделать инкрементный уникальный ключ и по нему хранить callback_data.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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