Aiogram как боту самому начать опрос в заданное время?

Подскажите пожалуйста, есть простенький бот, который по команде test2 начинает небольшой опрос. Как тут лучше поменять логику работы, чтобы опрос стартовал не с команды test2, а бот сам бы начинал этот опрос раз в день к примеру в 17:10 ?

@dp.message_handler(commands=['test2'])
async def cmd_start(message: types.Message):
    await Form.Q1.set()
    await message.answer("Какая задача была самой трудной?")


@dp.message_handler(state=Form.Q1)
async def process_name(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['answer1'] = message.text

    await Form.next()
    await message.reply("Как её решил?")


@dp.message_handler(state=Form.Q2)
async def process_gender(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['answer2'] = message.text

        answer1 = data['answer1']
        answer2 = data['answer2']
        print(answer1)
        print(answer2)
    await message.answer("Спасибо за ответы!")
    await state.finish()


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
1. Научиться отправлять сообщение в чат с заранее известным ID вместо использования message.answer().
2. Хранить ID (или список ID), которым надо разослать сообщение.
3. Научиться пользоваться пакетом aioschedule. В частности, как планировать вызов корутины и что нужно сделать для обеспечения работы пакета.
4. Понять, как пользоваться asyncio.create_task(), чтобы запускать рабочий цикл aioschedule параллельно с работой бота. В частности, как выполнить код непосредственно при старте бота, а не как реакцию на сообщение.
5. Свести эти знания вместе.

При старте бота запускаем рабочий цикл aioschedule и планируем выполнение корутины опроса. Корутина опроса проходит по списку ID и каждому отправляет сообщение, одновременно задавая нужное состояние на машине состояний FSM. Дальше работа идёт как обычно - приняли сообщение пользователя, обработали состоянием, перешли к следующему состоянию.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы