всем ку, пж помогите, уже 5 часов трахаюсь короче. заказчик захотел чтобы тг-бот динамически грузил данные из гугл таблицы и отображал их в виде многоуровневого меню с использованием инлайн кнопок, сами данные таблицы состоят из трёх столбцов: ТИП (CATEGORY, SUB, ANSWER), НАЗВАНИЕ (название категории или подкатегории) и ТЕКСТ (ответ или ссылка) основные категории (CATEGORY) бот видит и отображает, но когда пользователь выбирает категорию, подкатегории (SUB) не появляются — вместо них выводится только кнопка "Назад", **** показывают, что кеш данных для подкатегорий остаётся пустым (dict_keys([])), как будто бот вообще их не видит..я уже перепробовал разные способы чтения данных, но ни один из них не дал результата мб гугл отдаёт строки, где ячейка ТЕКСТ пустая? @dp.message_handler(lambda message: message.text == "FAQ", state="*") async def show_faq_main_menu(message: types.Message): keyboard = InlineKeyboardMarkup() for category in faq_cache: keyboard.add(InlineKeyboardButton(text=category, callback_data=f"faq:{faq_category_hashes[category]}")) keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="back_to_main")) await message.answer("Выберите категорию FAQ:", reply_markup=keyboard) @dp.callback_query_handler(lambda c: c.data.startswith("faq:")) async def show_faq_subcategories(call: CallbackQuery): category_hash = call.data.split(":")[1] category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None) if not category or category not in faq_cache: await call.answer("Категория не найдена.", show_alert=True) return keyboard = InlineKeyboardMarkup() logger.info(f"Подкатегории для {category}: {faq_cache[category].keys()}") for subcategory in faq_cache[category]: # итератор ключ суькатегорий if subcategory != "Ответ": keyboard.add(InlineKeyboardButton(text=subcategory, callback_data=f"faq_sub:{category_hash}:{subcategory}")) keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="faq_main_menu")) await call.message.edit_text(f"Категория: {category}\n\nВыберите подкатегорию:", reply_markup=keyboard) @dp.callback_query_handler(lambda c: c.data.startswith("faq_sub:")) async def show_faq_answer(call: CallbackQuery): _, category_hash, subcategory = call.data.split(":") category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None) if not category or subcategory not in faq_cache[category]: await call.answer("Ответ не найден.", show_alert=True) return answer = faq_cache[category][subcategory] keyboard = InlineKeyboardMarkup().add(InlineKeyboardButton("⬅ Назад", callback_data=f"faq:{category_hash}")) await call.message.edit_text(f"{subcategory}:\n\n{answer}", reply_markup=keyboard) Python @dp.message_handler(lambda message: message.text == "FAQ", state="*") async def show_faq_main_menu(message: types.Message): keyboard = InlineKeyboardMarkup() for category in faq_cache: keyboard.add(InlineKeyboardButton(text=category, callback_data=f"faq:{faq_category_hashes[category]}")) keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="back_to_main")) await message.answer("Выберите категорию FAQ:", reply_markup=keyboard) @dp.callback_query_handler(lambda c: c.data.startswith("faq:")) async def show_faq_subcategories(call: CallbackQuery): category_hash = call.data.split(":")[1] category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None) if not category or category not in faq_cache: await call.answer("Категория не найдена.", show_alert=True) return keyboard = InlineKeyboardMarkup() logger.info(f"Подкатегории для {category}: {faq_cache[category].keys()}") for subcategory in faq_cache[category]: # итератор ключ суькатегорий if subcategory != "Ответ": keyboard.add(InlineKeyboardButton(text=subcategory, callback_data=f"faq_sub:{category_hash}:{subcategory}")) keyboard.add(InlineKeyboardButton(text="⬅ Назад", callback_data="faq_main_menu")) await call.message.edit_text(f"Категория: {category}\n\nВыберите подкатегорию:", reply_markup=keyboard) @dp.callback_query_handler(lambda c: c.data.startswith("faq_sub:")) async def show_faq_answer(call: CallbackQuery): _, category_hash, subcategory = call.data.split(":") category = next((cat for cat, hash_ in faq_category_hashes.items() if hash_ == category_hash), None) if not category or subcategory not in faq_cache[category]: await call.answer("Ответ не найден.", show_alert=True) return answer = faq_cache[category][subcategory] keyboard = InlineKeyboardMarkup().add(InlineKeyboardButton("⬅ Назад", callback_data=f"faq:{category_hash}")) await call.message.edit_text(f"{subcategory}:\n\n{answer}", reply_markup=keyboard) закинул код в нейронки, они хуйню какую-то делают с моим кодом. как в этой функции сделать так чтобы суб-категория подгружалась после нажатия на категорию? сама функция подгрузки async def fetch_faq(): global faq_cache, faq_category_hashes logger.info("Обновление FAQ из Google Sheets...") data = google_sheets.get_google_sheet_data(GOOGLE_SHEET_URL) if data: faq_cache = {} # чищу словарь перед некст запуском current_category = None current_subcategory = None logger.info(f"Данные из Google Sheets: {data}") # лог всего for row in data: category_name = row.get("название") or row.get("НАЗВАНИЕ") text = row.get("текст") or row.get("ТЕКСТ") row_type = row.get("тип") or row.get("ТИП") logger.info(f"Обрабатываю строку FAQ: ТИП={row_type}, НАЗВАНИЕ={category_name}, ТЕКСТ={text}") if row_type == "CATEGORY": faq_cache[category_name] = {} faq_category_hashes[category_name] = hashlib.md5(category_name.encode()).hexdigest()[:10] current_category = category_name current_subcategory = None logger.info(f" [CATEGORY] Добавлена категория: {category_name}") elif row_type == "SUB" and current_category: faq_cache[current_category][category_name] = {} current_subcategory = category_name logger.info(f" [SUB] Добавлен подраздел: {category_name} в категории {current_category}") elif row_type == "ANSWER" and current_category: if current_subcategory: faq_cache[current_category][current_subcategory]["Ответ"] = text # сейвлю текстовый ответ logger.info(f" [ANSWER] Добавлен ответ к подразделу: {current_subcategory} - {text}") else: faq_cache[current_category]["Ответ"] = text # сейв ответа в категории logger.info(f" [ANSWER] Добавлен ответ к категории: {current_category} - {text}") logger.info("FAQ успешно обновлен") logger.info(f"Структура faq_cache после обновления: {faq_cache}") logger.info(f"Ключи faq_cache (категории): {faq_cache.keys()}") # логирую кей faq_cache для проверки кетагории else: logger.warning("Не удалось обновить данные FAQ из Google Sheets.") Python async def fetch_faq(): global faq_cache, faq_category_hashes logger.info("Обновление FAQ из Google Sheets...") data = google_sheets.get_google_sheet_data(GOOGLE_SHEET_URL) if data: faq_cache = {} # чищу словарь перед некст запуском current_category = None current_subcategory = None logger.info(f"Данные из Google Sheets: {data}") # лог всего for row in data: category_name = row.get("название") or row.get("НАЗВАНИЕ") text = row.get("текст") or row.get("ТЕКСТ") row_type = row.get("тип") or row.get("ТИП") logger.info(f"Обрабатываю строку FAQ: ТИП={row_type}, НАЗВАНИЕ={category_name}, ТЕКСТ={text}") if row_type == "CATEGORY": faq_cache[category_name] = {} faq_category_hashes[category_name] = hashlib.md5(category_name.encode()).hexdigest()[:10] current_category = category_name current_subcategory = None logger.info(f" [CATEGORY] Добавлена категория: {category_name}") elif row_type == "SUB" and current_category: faq_cache[current_category][category_name] = {} current_subcategory = category_name logger.info(f" [SUB] Добавлен подраздел: {category_name} в категории {current_category}") elif row_type == "ANSWER" and current_category: if current_subcategory: faq_cache[current_category][current_subcategory]["Ответ"] = text # сейвлю текстовый ответ logger.info(f" [ANSWER] Добавлен ответ к подразделу: {current_subcategory} - {text}") else: faq_cache[current_category]["Ответ"] = text # сейв ответа в категории logger.info(f" [ANSWER] Добавлен ответ к категории: {current_category} - {text}") logger.info("FAQ успешно обновлен") logger.info(f"Структура faq_cache после обновления: {faq_cache}") logger.info(f"Ключи faq_cache (категории): {faq_cache.keys()}") # логирую кей faq_cache для проверки кетагории else: logger.warning("Не удалось обновить данные FAQ из Google Sheets.")
Дак а ты посмотри что тебе из таблицы то приходит --- Сообщение объединено с предыдущим 1 мар 2025 В функции show_faq_subcategories попробуй вывести faq_cache
Y4sperMaglot, сделал лог, faq_cache пустой, потому что бот не добавляет в него подкатегории (SUB). Какие-то траблы в логике обработки SUB и ANSWER. show_faq_subcategories 2025-03-01 23:18:04,000 - INFO - --- show_faq_subcategories --- 2025-03-01 23:18:04,000 - INFO - Запрошена категория: Адаптация новых менеджеров по показам, hash: 5faddecc7d 2025-03-01 23:18:04,000 - INFO - Содержимое faq_cache для категории 'Адаптация новых менеджеров по показам': {} 2025-03-01 23:18:04,000 - INFO - Полный faq_cache: {'Адаптация новых менеджеров по показам': {}, 'Адаптация новых менеджеров БО': {}} 2025-03-01 23:18:04,000 - INFO - Подкатегории для Адаптация новых менеджеров по показам: dict_keys(dict_keys([])) если категория есть в cache