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

Как можно реализовать отправку сообщения (результата определенной функции) ботом с использованием библиотеки disnake на регулярной основе, например, ежедневно, без участия пользователя?
  • 29 сентября 2024 г. 16:54
Ответы на вопрос 2
Для того чтобы настроить бота на отправку сообщения в канал в определенное время с использованием библиотеки `disnake`, вы можете использовать библиотеку `schedule` или встроенный таймер с помощью асинхронных функций. Ниже приведен пример простого бота, который будет отправлять сообщение в указанный канал каждый день в определенное время.

Установка необходимых библиотек:

```bash
pip install disnake schedule
```

Пример реализации бота:

```python
import disnake
import schedule
import asyncio
import time

TOKEN = 'YOUR_BOT_TOKEN'
CHANNEL_ID = 123456789012345678  # Замените на ID вашего канала

intents = disnake.Intents.default()
bot = disnake.Bot(intents=intents)

async def send_daily_message():
    await bot.wait_until_ready()  # Ждем, пока бот будет готов
    channel = bot.get_channel(CHANNEL_ID)
    if channel:
        await channel.send("Доброе утро! Это ваше ежедневное сообщение.")

def schedule_daily_message():
    # Запланировать каждый день в 9:00
    schedule.every().day.at("09:00").do(lambda: asyncio.run(send_daily_message()))

async def schedule_runner():
    while True:
        schedule.run_pending()
        await asyncio.sleep(1)

@bot.event
async def on_ready():
    print(f'Bot is ready. Logged in as {bot.user}.')
    schedule_daily_message()
    bot.loop.create_task(schedule_runner())

bot.run(TOKEN)
```

### Что делает данный код:

1. **Импорт библиотек**: Импортирует необходимые библиотеки для работы с ботом и планирования сообщений.
2. **Настройка бота**: Создает экземпляр бота с вашими токеном и ID канала.
3. **Функция `send_daily_message`**: Эта асинхронная функция отвечает за отправку сообщения в заданный канал.
4. **Функция `schedule_daily_message`**: Планирует выполнение функции `send_daily_message` каждый день в 09:00.
5. **Функция `schedule_runner`**: Запускает бесконечный цикл для выполнения запланированных задач.
6. **Событие `on_ready`**: При запуске бота вызывает планировщик и запускает обработчик для регулярных задач.

### Примечания:

- Не забудьте заменить `YOUR_BOT_TOKEN` на токен вашего бота и `CHANNEL_ID` на фактический ID канала, куда вы хотите отправлять сообщения.
- Убедитесь, что у бота есть право отправлять сообщения в целевой канал.
- Время указано в 24-часовом формате. Если вам нужно другое время, просто измените строку `schedule.every().day.at("09:00").do(...)` на нужное вам.
Почитать про asyncio.create_task() и как им пользоваться. 
Создаёшь таск при старте бота (читаем доки на диснейк как реагировать на старт бота), в таске крутишь while True: в комбинации с asyncio.sleep(), пока не наступит нужный момент. Затем делаешь что нужно, и снова ждёшь.
Похожие вопросы