Я работаю электриком в небольшом автосервисе и разрабатываю чат-бота на 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?
Чтобы извлечь описание ошибки из файла `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 раз при запуске бота, а не каждый раз при нажатие его кнопок.