Как закончить получать сообщения от юзера в aiogram?

Рейтинг: 0Ответов: 1Опубликовано: 02.07.2023
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
import re
import pygsheets
from states import Form

path='***'
gc = pygsheets.authorize(service_account_file=path)
sh = gc.open('pythontest')
wks = sh[0]
bot = Bot(token='###')
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

data = []

@dp.message_handler(Command('start'))
async def start(message: types.Message):
    data.clear()
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = types.KeyboardButton(text="Запустить")
    keyboard.add(button_1)
    await message.answer("Добро пожаловать на онлайн \n Я виртуальный помощник ### от ### \n Жми «запустить» и мы начнем", reply_markup=keyboard)
    await Form.name.set()

@dp.message_handler(lambda message: message.text == "Запустить", state=Form.name)
async def process_name(message: types.Message, state: FSMContext):
    await message.answer("Как я могу к тебе обращаться?")
    await Form.age.set()

@dp.message_handler(state=Form.age)
async def process_age(message: types.Message, state: FSMContext):  
    await state.update_data(name=message.text)
    data.append(message.text)
    await message.answer(f"Отлично, {message.text} подскажи пожалуйста, сколько тебе лет?")
    await Form.F.set()

@dp.message_handler(state=Form.F)
async def process_F(message: types.Message, state: FSMContext):
    data.append(message.text)
    await message.answer(f"Выбери свой тип Ф___ и напиши ответ цифрой (от 1-6)")
    await Form.Forma.set()

@dp.message_handler(state=Form.Forma)
async def process_Forma(message: types.Message, state: FSMContext):
    data.append(message.text)
    await message.answer(f"Превосходно! Давай перейдем к твоей ____ выбери свою форму___(от 1-12))")
    await Form.Position.set()


@dp.message_handler(state=Form.Position)
async def process_surname(message: types.Message, state: FSMContext):
    data.append(message.text)
    await message.answer(f"Выбери расположение……..\n(Фото с выбором 1 или 2)")
    await Form.OPGinhale.set()
    
@dp.message_handler(state=Form.OPGinhale)
async def process_OPGinhale(message: types.Message, state: FSMContext):
    data.append(message.text)
    await message.answer("Супер! До консультации и подарочной скидки 20% на остался последний шаг")
    await message.answer("Сделай замеры ОПГ вдох")
    await Form.OPGouthale.set()

@dp.message_handler(state=Form.OPGouthale)
async def process_OPGouthale(message: types.Message, state: FSMContext):
    data.append(message.text)
    await message.answer("Сделай замеры ОПГ выдох")
    await Form.OG.set()

@dp.message_handler(state=Form.OG)
async def process_OG(message: types.Message, state: FSMContext):
    await message.answer("Сделай замеры ОГ")
    data.append(message.text)
    await Form.end.set()

@dp.message_handler(state=Form.end)
async def process_end(message: types.Message, state: FSMContext):
    await message.answer("Спасибо за ответы!")    
    data.append(message.text)
    data.append(message.from_user.id)
    data.append(message.from_user.full_name)
    wks.append_table(data,start='A2', end=None, 
    dimension='ROWS', overwrite=False)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)


В последнем хэндлере заканчивается работа бота но юзер все равно может присылать сообщения и данные заново записываются в таблицу. Как это исправить?

Ответы

▲ 1

Чтобы завершить состояния используй:

await state.finish()