python telegram bot верно оформить callback_data для Inline Keyboard
Есть список моделей авто:
name_car = ['ГАЗ ГАЗель NEXT (2013 - )', 'УАЗ Patriot, I Рестайлинг 3, 2.7 АКПП (150 л.с.) 4WD 2.7 (2019 - )', 'CHERY Tiggo 4, I Рестайлинг, 2.0 CVT (122 л.с.) 2.0 (2018 - )', 'CHERY TIGGO 8 (2020 - )', 'CHERY Tiggo 7, I, 1.5 AMT (152 л.с.) (2016 - )', 'ISUZU D-Max, II, 3.0d AT (177 л.с.) 4WD (2011 - )', 'ГАЗ СОБОЛЬ (1995 - )', 'JEEP Cherokee, V (KL) Рестайлинг, 2.4 AT (177 л.с.) 4WD (2018 - )', 'JEEP Renegade, I, Trailhawk 2.4 AT (175 л.с.) 4WD (2017 - )', 'JEEP Grand Cherokee, IV (WK2) Рестайлинг, 3.0 AT (238 л.с.) 4WD (2014 - )', 'JEEP Wrangler, IV (JL), 2.0 AT (272 л.с.) 4WD (2017 - )', 'FAW Besturn X40, I, 1.6 AT (108 л.с.) (2019 - )', 'ISUZU D-Max, II Рестайлинг, 3.0d AT (177 л.с.) 4WD (2019 - )', 'FAW Besturn X80, I Рестайлинг, 2.0 AT (142 л.с.) (2018 - )', 'JEEP Compass, II, 2.4 AT (150 л.с.) 4WD (2018 - )', 'УАЗ Patriot, I Рестайлинг 3, 2.7 MT (150 л.с.) 4WD (2018 - )', 'УАЗ ПРОФИ (2017 - )', 'FIAT DOBLO (2018 - )']
Хочу поместить список в кнопки:
if message.text == '? Запись на тест-драйв':
keyboard = types.InlineKeyboardMarkup()
for i in name_car:
button1 = types.InlineKeyboardButton(text=i, callback_data=i)
keyboard.add(button1)
bot.send_message(message.chat.id, "Выберите автомобиль из списка:", reply_markup=keyboard)
После этого получаю ошибку:
ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400 Description: Bad Request: BUTTON_DATA_INVALID"
Но, если я чуть изменяю код, то всё работает как надо:
if message.text == '? Запись на тест-драйв':
keyboard = types.InlineKeyboardMarkup()
for i in name_car:
button1 = types.InlineKeyboardButton(text=i, callback_data=i[0])
keyboard.add(button1)
bot.send_message(message.chat.id, "Выберите автомобиль из списка:", reply_markup=keyboard)
Когда я начинаю проверять, что сохраняется в i, то модели не совпадают с тем, что я нажала в боте:
@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
for i in name_car:
if call.data == i[0]:
bot.edit_message_text(chat_id=call.message.chat.id,
message_id=call.message.message_id, text=i)
Подскажите, как оформить более правильно код, чтобы i совпадало абсолютно точно с тем, что нажимает пользователь?
Ответы (1 шт):
Автор решения: Violet
→ Ссылка
ticket_list = {'power_supply': 'Электроснабжение', 'water_supply': 'Водоснабжение'}
# Создать клавиатуру из словаря
ticket_kb = types.InlineKeyboardMarkup()
if where_call == 'ticket':
for k, v in ticket_list.items():
ticket_kb.add(types.InlineKeyboardButton(text=v, callback_data=k))
return ticket_kb
# Если call.data имеется в словаре (ключ) изменить сообщение подставив значение
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
if call.data in ticket_list:
bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id,
text='{}\nвыберите объект'.format(ticket_list[call.data]))