Коллеги, добрый день!
Пишу чат-бот для телеграмма и столкнулся с такой проблемой.
В чем суть бота:
Пользователь нажимает кнопку. Его спрашивают “введите имя”. Он вводит текст. Этот текст далее ищется в файле эксель. Если уникальных значений больше 1, то пользователю выдаются кнопки с вариантами выбора. После того, как он выбрал выполняется повторный поиск с точным значением, создаётся датафрейм и передаётся в след. функцию. Во второй функции идет проверка по уникальным значениям из другого столбца (без участия пользователя). Если во втором столбце уникальных больше 1, то так же спрашивает пользователя и просит выбрать. Вот тут и загвоздка. Когда пользователь выбирает нужное значение, состояние не передаётся в обработчик нажатия кнопки и, соответственно, я не могу использовать сохраненный ранее датафрейм чтобы сделать фильтр во втором столбце и сохранить второй вариант датафрейма. Вот пример кода второй фильтрации.
Пишу чат-бот для телеграмма и столкнулся с такой проблемой.
В чем суть бота:
Пользователь нажимает кнопку. Его спрашивают “введите имя”. Он вводит текст. Этот текст далее ищется в файле эксель. Если уникальных значений больше 1, то пользователю выдаются кнопки с вариантами выбора. После того, как он выбрал выполняется повторный поиск с точным значением, создаётся датафрейм и передаётся в след. функцию. Во второй функции идет проверка по уникальным значениям из другого столбца (без участия пользователя). Если во втором столбце уникальных больше 1, то так же спрашивает пользователя и просит выбрать. Вот тут и загвоздка. Когда пользователь выбирает нужное значение, состояние не передаётся в обработчик нажатия кнопки и, соответственно, я не могу использовать сохраненный ранее датафрейм чтобы сделать фильтр во втором столбце и сохранить второй вариант датафрейма. Вот пример кода второй фильтрации.
Python:
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}.')