Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Подскажите,пожалуйста, как сделать,чтобы телеграм бот присылал подписчику определённое сообщение в выбранное подписчиком время?

Как просто отправлять сообщения в определённое время - знаю. Важно именно то, чтобы пользователь мог сам выбрать это время. Допустим, на выбор будет несколько вариантов, пользователь, нажимая на кнопку, выбирает время, сообщение приходит в это время по часовому поясу пользователя. И с возможностью изменить время, отменить прошлое время и выбрать другое. Использую  библиотеку aiogram
ПрограммированиеPython+3
KS
  ·   · 10,2 K
Чтобы реализовать отправку сообщения в выбранное подписчиком время с использованием библиотеки aiogram, вам понадобится следующий подход:
  1. Добавьте кнопки с вариантами времени в сообщение, чтобы пользователь мог выбрать желаемое время. Например, кнопки "10:00", "14:00", "18:00" и т.д. Вы можете использовать InlineKeyboardMarkup для создания кнопок.
  2. Обработайте нажатия кнопок с помощью функций-обработчиков (handlers) в aiogram. Когда пользователь выбирает время, соответствующая функция-обработчик получает уведомление о нажатии кнопки и может выполнить необходимые действия.
  3. Сохраните выбранное пользователем время в базе данных или другом хранилище, чтобы затем использовать его для отправки сообщения.
  4. Создайте функцию, которая будет выполнять отправку сообщения в определенное время. Для этого можно использовать планировщик задач, например, встроенный модуль asyncio в Python.
  5. Настройте планировщик задач для вызова функции отправки сообщения в выбранное время. Вы можете использовать метод
loop.create_task()
для планирования задачи.
6. Проверяйте время регулярно, чтобы определить, наступило ли выбранное пользователем время для отправки сообщения. Вы можете использовать модуль datetime для работы с временем.
7. Когда наступает время отправки сообщения, вызывайте функцию отправки сообщения для каждого подписчика, которому было выбрано это время.
Вот пример кода, который может помочь вам начать:
import asyncio
from aiogram import Bot, Dispatcher, types

# Создание объектов бота и диспетчера
bot = Bot(token="YOUR_BOT_TOKEN")
dp = Dispatcher(bot)

# Обработчик нажатия кнопок
@dp.callback_query_handler(lambda c: c.data.startswith('time_'))
async def process_time_button(callback_query: types.CallbackQuery):
    selected_time = callback_query.data.split('_')[1]
    # Сохранение выбранного времени в базе данных для конкретного пользователя
    # ...

    await bot.answer_callback_query(callback_query.id, text=f"Вы выбрали время: {selected_time}")

# Функция отправки сообщения в выбранное время
async def send_message_at_time(chat_id: int, message: str, send_time: str):
    while True:
        current_time = datetime.datetime.now().strftime('%H:%M')
        if current_time == send_time:
            await bot.send_message(chat_id, message)
            break
        await asyncio.sleep(60)  # Проверка времени каждую минуту

# Главная функция
async def main():
    # Получение времени из базы данных для каждого пользователя
    # users_time = ...

    # Запуск функции отправки сообщения для каждого пользователя
    for user_id, send_time in users_time
    for user_id, send_time in users_time.items():
asyncio.create_task(send_message_at_time(user_id, "Ваше сообщение", send_time))
    
    #Запуск цикла событий
    if name == 'main':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    loop.run_forever()
В приведенном коде предполагается, что вы дополните функцию
main()
кодом для получения времени из базы данных для каждого пользователя и сохраните его в переменной
users_time
в виде словаря, где ключом является идентификатор пользователя, а значением - выбранное время. Затем используйте цикл
for
для запуска функции
send_message_at_time
для каждого пользователя и его выбранного времени.
Обратите внимание, что код выполняет проверку времени каждую минуту с помощью
await asyncio.sleep(60)
внутри функции
send_message_at_time
Это позволяет регулярно проверять текущее время и отправлять сообщение, когда наступает выбранное время. Вы можете настроить интервал проверки, изменяя значение
60
на другое количество секунд, если вам нужно более частое или реже выполнение проверки.
Также не забудьте заменить
"YOUR_BOT_TOKEN"
на фактический токен вашего бота Telegram.
Примечание: Данный код является примером и не полностью рабочим решением. Вам может потребоваться дополнительная настройка и оптимизация для интеграции с вашими базами данных и логикой приложения.