Задать вопрос
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 элемент, то отправка кнопки происходит без проблем.
Как правильно в моем случае мне необходимо сформировать клавиатуру?
  • Вопрос задан
  • 8356 просмотров
Подписаться 1 Средний Комментировать
Ответ пользователя Exieros К ответам на вопрос (2)
@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.
Ответ написан
Комментировать