Как извлечь необходимый ответ из JSON файла?

Я работаю электриком в небольшом автосервисе и разрабатываю чат-бота на Python для упрощения работы коллег. Хочу, чтобы пользователи могли выбирать код ошибки из списка, и чтобы им отображалось описание этой ошибки вместе с рекомендациями по действиям. 

Я уже реализовал основную часть, но столкнулся с проблемой. Чтобы избежать загромождения основного кода сообщениями об ошибках, я вынес их в отдельный файл error.json. 

Однако я не знаю, как правильно организовать так, чтобы при нажатии на кнопку с номером ошибки в чате отображалось её описание. 

В текущем коде есть следующий фрагмент:

```python
markup = types.InlineKeyboardMarkup(row_width=2)
button1 = types.InlineKeyboardButton("501", callback_data='501')
button2 = types.InlineKeyboardButton("502", callback_data='502')
markup.add(button1,button2)
bot.send_message(message.chat.id, "Выберите ошибку:", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            if call.data == "501":
                bot.send_message(call.message.chat.id, "Ошибка 501")
                photo = open('501.jpg', 'rb')
                bot.send_photo(call.message.chat.id, photo, caption='текст')
            if call.data == "502":
                bot.send_message(call.message.chat.id, "Ошибка 502")
    except Exception as e:
        print(repr(e))
```

А вот содержимое файла error.json:

```json
{
    "501": "Сбросить ошибку и повторить тест",
    "502": "Снять клемму с аккумулятора",
    "503": "Выполнить прошивку модуля",
    "505": "Заменить предохранитель"
}
```

Как мне организовать код так, чтобы при нажатии на номер ошибки выводилось её описание из файла error.json?
  • 23 апреля 2025 г. 8:55
Ответы на вопрос 2
Чтобы извлечь описание ошибки из файла `error.json` при нажатии на кнопку с номером ошибки, вам нужно сделать следующее:

1. Прочитайте файл `error.json` и загрузите его содержимое в виде словаря.
2. Используйте этот словарь в вашей функции-обработчике `callback_inline` для получения описания ошибки по номеру, нажатому пользователем.

Вот пример, как можно реализовать это:

```python
import json
from telebot import types, TeleBot

bot = TeleBot('YOUR_API_KEY')

# Прочитайте ваш JSON файл и загрузите данные в словарь
with open('error.json', 'r', encoding='utf-8') as f:
    errors = json.load(f)

# Создание клавиатуры с кнопками ошибок
markup = types.InlineKeyboardMarkup(row_width=2)
for error_code in errors.keys():
    button = types.InlineKeyboardButton(error_code, callback_data=error_code)
    markup.add(button)

bot.send_message(message.chat.id, "Выберите ошибку:", reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    try:
        if call.message:
            error_code = call.data  # Получаем код ошибки из нажатой кнопки
            if error_code in errors:
                error_description = errors[error_code]  # Извлекаем описание ошибки из словаря
                bot.send_message(call.message.chat.id, f"Ошибка {error_code}: {error_description}")

                # Пример отправки фотографии при ошибке 501
                if error_code == "501":
                    photo = open('501.jpg', 'rb')
                    bot.send_photo(call.message.chat.id, photo, caption='текст')
            else:
                bot.send_message(call.message.chat.id, "Неизвестный код ошибки.")
    except Exception as e:
        print(repr(e))

# Убедитесь, что бот работает
bot.polling(none_stop=True)
```

### Пояснения:
- Мы загружаем содержимое файла `error.json` в переменную `errors`, которая становится словарем, где ключами являются коды ошибок, а значениями — их описания.
- При нажатии на кнопку, вызов `call.data` даст нам код ошибки, который мы можем использовать для поиска описания в нашем словаре.
- Мы проверяем, есть ли этот код в словаре `errors`, и отправляем пользователю соответствующее сообщение с описанием ошибки.

Этот подход позволяет вам легко добавлять новые коды ошибок и их описания в JSON файл без необходимости изменять основной код бота.
Как вариант (добавить проверок и исключений): 
ERRORS_FILE = 'error.json'
IMAGES = 'error_images'

error_data = {}

with open(ERRORS_FILE, 'r', encoding='utf-8') as f:
    error_data = json.load(f)

# Код бота:

error_code = call.data
error_description = error_data.get(error_code)

# bot.send_message(call.message.chat.id, "Ошибка 501")
bot.send_message(call.message.chat.id, f"Ошибка {error_code}: {error_description}")

# photo = open('501.jpg', 'rb')
image_path = os.path.join(IMAGES, f"{error_code}.jpg")
with open(image_path, 'rb') as photo:
    bot.send_photo(call.message.chat.id, photo, caption=error_code)

Так же, я бы подключал json файл 1 раз при запуске бота, а не каждый раз при нажатие его кнопок.
Похожие вопросы