Почему мой Telegram-бот не функционирует?

Можете, пожалуйста, разъяснить, почему бот не обрабатывает сообщения после выделенной строки кода? <br/> <br/> <pre><code>import logging
from aiogram import Bot, Dispatcher, executor, types
import markups as nav

TOKEN = '7045632215:AAEpLBAa8uKfпWuJkTITq3CNlltErHRsXloE'

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)



@dp.message_handler(commands=['start'])
async def command_start(message: types.Message):
    await bot.send_message(message.from_user.id, 'Привет, {0.first_name}! Что будем считать?'.format(message.from_user), reply_markup=nav.mainMenu)

@dp.message_handler()
async def bot_message(message: types.Message):
    # await bot.send_message(message.from_user.id, message.text)
    if message.text == 'Погрешность счетчика':
       &lt;i&gt; &lt;b&gt;await message.reply("Какой класс точности счетчика? Пока я умею считать только счетчики с классом точности 0.5 и 1.")&lt;/i&gt;&lt;/b&gt;
# Список для хранения значений
values = []
@dp.message_handler(lambda message: len(values) &lt; 5)
async def process_input(message: types.Message):
    try:
        value = float(message.text)
        values.append(value)
        if len(values) == 1:
            await message.reply("Какое фактическое напряжение? (В).")
        elif len(values) == 2:
            await message.reply("Какая средняя сила тока? (А)")
        elif len(values) == 3:
            await message.reply("Какой коэффициент мощности? (cos)")
        elif len(values) == 4:
            await message.reply("Какая температура воздуха?")
        elif len(values) == 5:
            clas = values[0]
            voltage = values[1]
            amperage = values[2]
            cos = values[3]
            temp = values[4]

            # Вычисляем погрешность
  • 7 сентября 2024 г. 20:03
Ответы на вопрос 2
Ваш Telegram-бот имеет некоторые проблемы с синтаксисом и логикой, которые могут приводить к тому, что он не обрабатывает сообщения как ожидается. Я укажу на них и предложу исправления.

1. **Некорректный синтаксис**: Ваша строка `&lt;i&gt; &lt;b&gt;await message.reply(...)&lt;/i&gt;&lt;/b&gt;` содержит HTML-коды вместо правильного синтаксиса Python. Правильный вариант должен выглядеть так:

   ```python
   await message.reply("Какой класс точности счетчика? Пока я умею считать только счетчики с классом точности 0.5 и 1.")
   ```

2. **Проблема с обработчиками**: У вас есть два обработчика сообщений:
   - Один не имеет условий и будет вызываться на все текстовые сообщения.
   - Второй использует ограничение по количеству значений, хранящихся в списке `values`. Если `values` меньше 5, обработчик будет работать. Возможно, вам нужно оптимизировать структуру или добавить более строгие условия для обработки сообщений, чтобы избежать конфликтов.

3. **Глобальная переменная**: Убедитесь, что `values` объявлена на глобальном уровне, если вы хотите использовать ее в разных функциях.

Чтобы ваш бот работал, вот предложенная структурированная версия вашего кода с исправлениями:

```python
import logging
from aiogram import Bot, Dispatcher, executor, types
import markups as nav

TOKEN = '7045632215:AAEpLBAa8uKfпWuJkTITq3CNlltErHRsXloE'

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

# Список для хранения значений
values = []

@dp.message_handler(commands=['start'])
async def command_start(message: types.Message):
    await bot.send_message(message.from_user.id, 'Привет, {0.first_name}! Что будем считать?'.format(message.from_user), reply_markup=nav.mainMenu)

@dp.message_handler(lambda message: message.text == 'Погрешность счетчика')
async def request_accuracy_class(message: types.Message):
    await message.reply("Какой класс точности счетчика? Пока я умею считать только счетчики с классом точности 0.5 и 1.")

@dp.message_handler(lambda message: len(values) < 5)
async def process_input(message: types.Message):
    try:
        value = float(message.text)
        values.append(value)
        if len(values) == 1:
            await message.reply("Какое фактическое напряжение? (В).")
        elif len(values) == 2:
            await message.reply("Какая средняя сила тока? (А)")
        elif len(values) == 3:
            await message.reply("Какой коэффициент мощности? (cos)")
        elif len(values) == 4:
            await message.reply("Какая температура воздуха?")
        elif len(values) == 5:
            clas = values[0]
            voltage = values[1]
            amperage = values[2]
            cos = values[3]
            temp = values[4]

            # Здесь должна быть логика для вычисления погрешности
            # пример: precision = ...
            await message.reply("Результаты расчета: ...")

    except ValueError:
        await message.reply("Пожалуйста, введите числовое значение.")

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    executor.start_polling(dp, skip_updates=True)
```

### Общие рекомендации:
- Убедитесь, что вы обрабатываете все возможные исключения (например, если пользователь введет некорректное значение).
- Логируйте ошибки, чтобы легче было отследить проблемы в работе бота.
- Следите за тем, чтобы настройки вашего `markups` были правильно импортированы и настроены.
@dp.message_handler()
async def bot_message(message: types.Message):
    ...

# Список для хранения значений
values = []

@dp.message_handler(lambda message: len(values) < 5)
async def process_input(message: types.Message):
    ...


У тебя первый же обработчик заявляет, что готов обрабатывать ВСЕ входящие сообщения. Соответственно, бот дальше и не ищет ничего. Зачем, если первый же обработчик на всё согласен?
Освой нормальный конечный автомат (finite state machine, FSM), что ли? Есть же официальная документация , официальные примеры , только найди и прочитай...
Похожие вопросы