Пишу чат-бот для телеграмма и столкнулся с такой проблемой.
В чем суть бота:
Пользователь нажимает кнопку. Его спрашивают “введите имя”. Он вводит текст. Этот текст далее ищется в файле эксель. Если уникальных значений больше 1, то пользователю выдаются кнопки с вариантами выбора. После того, как он выбрал выполняется повторный поиск с точным значением, создаётся датафрейм и передаётся в след. функцию. Во второй функции идет проверка по уникальным значениям из другого столбца (без участия пользователя). Если во втором столбце уникальных больше 1, то так же спрашивает пользователя и просит выбрать. Вот тут и загвоздка. Когда пользователь выбирает нужное значение, состояние не передаётся в обработчик нажатия кнопки и, соответственно, я не могу использовать сохраненный ранее датафрейм чтобы сделать фильтр во втором столбце и сохранить второй вариант датафрейма. Вот пример кода второй фильтрации.
async def process_callback_fp_1(message: types.Message, state: FSMContext): data = await state.get_data() filtered_df_state_1 = data.get('filtered_df_state_1') print(f'Данные в filtered_df_state_1 у функ. process_callback_fp_1 {filtered_df_state_1}.') if not filtered_df_state_1.empty: unique_values = filtered_df_state_1.iloc[:, 14].unique() poisk_term = filtered_df_state_1.iloc[:, 18].unique() filtered_df_state_1.to_excel('filtered_df_state_1.xlsx', index=False) await state.update_data(filtered_df_state_2=filtered_df_state_1) data2 = await state.get_data() print(f'Проверка дата2: {data2}.') # Проверка на единственное значение if len(unique_values) == 1: print(f'Одно уникальное значение "Куда доставить" у process_callback_fp_1.') await process_callback_fp_2(filtered_df_state_1, state) # Отправляем датафрейм в функцию # Если больше одного уникального значения elif len(unique_values) > 1: print(f'Уникальные значения у process_callback_fp_1 больше 1: {unique_values}') buttons = [InlineKeyboardButton(text=str(value), callback_data=f'select2_{value}') for value in unique_values] # Создаем инлайн клавиатуру с кнопками inline_kb = InlineKeyboardMarkup(inline_keyboard=[buttons]) # print(f'Type of message: {type(message)}') await message.answer("Выберите одно из уникальных значений:", reply_markup=inline_kb) else: print("Поиск ничего не дал, попробуйте другой запрос.") #await callback_query.message.answer("Поиск ничего не дал, попробуйте другой запрос.") # Обработка выбора пользователя если при втором поиске > 1 варианта @router.callback_query(lambda callback_query: callback_query.data.startswith('select2_')) async def process_callback_button_for_2(callback_query: types.CallbackQuery, state: FSMContext): selected_value = callback_query.data.split('select2_')[1] # Извлекаем значение после 'select_' data = await state.get_data() print(f'Данные в process_callback_button_for_2 {data}.') print(f'Данные в callback_query {callback_query.data}.') await callback_query.answer() # Подтверждение нажатия print(f'Отправляем в process_selected_value_2: {selected_value}') await process_selected_value_2(selected_value, state) # # Обработка выбора пользователя если при втором поиске > 1 варианта async def process_selected_value_2(selected_value: str, state: FSMContext): # Логика обработки для выбранного значения data = await state.get_data() print(f'Данные в data функц process_selected_value_2: {data}.')
Прошу помочь в проблеме.