Как изменить код, чтобы переменная message.text отображала только что введенный текст, вместо старого текста?

Как можно предотвратить боту считывание старых сообщений и запрашивание подтверждения перед каждым действием? Приложу фото поведения бота для наглядности.
Изображение к вопросу
Изображение к вопросу
  • 13 ноября 2023 г. 20:49
Ответы на вопрос 2
Чтобы переменная message.text отображала только что введенный текст, вы можете использовать метод `clear_text` перед чтением нового сообщения. Пример:

```
from aiogram import Bot, types

# Создание бота
bot = Bot(token="ТОКЕН_БОТА")

# Обработка входящих сообщений
@bot.message_handler(content_types=types.ContentTypes.TEXT)
async def handle_message(message: types.Message):
    # Очистка текста от старого сообщения
    message.text = message.text.clear_text()
    
    # Ваш код обработки нового сообщения
    ...
```

Чтобы предотвратить боту считывание старых сообщений и запрашивание подтверждения перед каждым действием, вам необходимо хранить состояние пользователя (например, используя FSM, Finite State Machine). FSM позволит вам отслеживать текущее состояние пользователя и выполнять только соответствующие действия. Например:

```
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher, FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

# Создание бота и диспетчера
bot = Bot(token="ТОКЕН_БОТА")
dp = Dispatcher(bot)

# Класс состояний
class MyStates(StatesGroup):
    STATE_ONE = State()
    STATE_TWO = State()

# Обработка команды /start
@dp.message_handler(commands=['start'])
async def handle_start(message: types.Message):
    await message.reply("Привет! Введите текст:")
    await MyStates.STATE_ONE.set()

# Обработка текста в состоянии STATE_ONE
@dp.message_handler(state=MyStates.STATE_ONE, content_types=types.ContentTypes.TEXT)
async def handle_message_state_one(message: types.Message, state: FSMContext):
    # Ваш код обработки текста в состоянии STATE_ONE
    # ...

    # Переводим состояние в STATE_TWO
    await MyStates.STATE_TWO.set()
    
    await message.reply("Введите следующий текст:")
    await state.update_data(old_text=message.text)
    
# Обработка текста в состоянии STATE_TWO
@dp.message_handler(state=MyStates.STATE_TWO, content_types=types.ContentTypes.TEXT)
async def handle_message_state_two(message: types.Message, state: FSMContext):
    # Ваш код обработки текста в состоянии STATE_TWO
    # ...
    
    data = await state.get_data()
    old_text = data.get("old_text")
    
    await message.reply(f"Старый текст: {old_text}\n"
                        f"Новый текст: {message.text}")

    await state.finish()

# Запуск бота
if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)
```

Таким образом, бот будет запрашивать новый текст только после завершения предыдущего действия, а переменная `message.text` будет содержать только что введенный текст.
Объект `message` всегда берется из аргументов функции и нигде не меняется. Из-за этого, при проверке `if message.text == 'Подтвердить'` всегда будет возвращаться одно и то же значение. Если вам нужно ожидать от пользователя новый ввод, то лучше передать управление в другую функцию. В вашем конкретном случае, лучше воспользоваться функцией `register_next_step_handler` и передавать в нее оставшиеся элементы из списка `cells_products_data`. Не уверен, что `register_next_step_handler` работает в асинхронном режиме, так как не использовал `telebot` в асинхронном стиле. Рекомендую изучить этот инструмент подробнее.
Похожие вопросы