Найти - Пользователи
Полная версия: Сохранение состояний после нажатия кнопок в ТМ
Начало » Python для новичков » Сохранение состояний после нажатия кнопок в ТМ
1
Hidsan
Коллеги, добрый день!

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

Прошу помочь в проблеме.
DamMercul
Сделай словарь по user/chat_id и там храни сессионные данные, типо как тут:
https://stackoverflow.com/a/60728911

Либо используй асинх БД по типу aiosqlite
Hidsan
DamMercul
aiosqlite
Я думал насчет БД. Но не будет ли конфликта, когда два разных пользователя ищут одновременно?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB