Как настроить бот так, чтобы он автоматически добавлял идентификаторы каналов в список CHANNELS?

Как мне изменить код так, чтобы он автоматически добавлял идентификаторы каналов и начинал отправку запланированных сообщений? Версия aiogram 2.25.2
  • 4 февраля 2024 г. 16:28
Ответы на вопрос 2
Чтобы бот автоматически добавлял идентификаторы каналов в список каналов (`CHANNELS`), потребуется использовать базу данных или какой-либо другой метод хранения состояний, так как списки, которые вы создаете в коде, не будут постоянными и исчезнут после перезапуска бота.

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

В примере будет использоваться aiogram.

```python
from aiogram import Bot, Dispatcher, types
from aiogram.types import ParseMode
from aiogram.utils import executor
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher.filters import Text

API_TOKEN = 'YOUR_BOT_API_TOKEN'
CHANNELS = []  # Изначально пустой список каналов
ADMIN_ID = 123456789  # ID админа

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

async def send_scheduled_message(channel_id, text):
    """
    Функция для отправки запланированных сообщений.
    """
    await bot.send_message(channel_id, text, parse_mode=ParseMode.MARKDOWN)

@dp.message_handler(commands='start')
async def send_welcome(message: types.Message):
    await message.reply("Привет! Я бот, который может добавлять каналы для рассылки.")

@dp.message_handler(commands='add_channel', user_id=ADMIN_ID)
async def add_channel_command(message: types.Message):
    """
    Администратор должен будет отправить команду в ответ на сообщение от канала, которое он хочет добавить.
    """
    if message.reply_to_message and message.reply_to_message.forward_from_chat:
        channel_id = message.reply_to_message.forward_from_chat.id
        if channel_id not in CHANNELS:
            CHANNELS.append(channel_id)
            await message.answer(f"Канал {channel_id} добавлен в список.")
        else:
            await message.answer("Этот канал уже есть в списке.")
    else:
        await message.answer("Пожалуйста, используйте эту команду, переслав мне сообщение из канала, который хотите добавить.")

# Запланируйте отправку сообщения здесь, используя вашу логику по таймеру или задачному планировщику

executor.start_polling(dp, skip_updates=True)
```

В данном примере мы имеем следующее:

1. Список `CHANNELS`, который пустой на старте бота.
2. Команда `/add_channel` для админа, с помощью которой он может добавить в этот список новый канал, переслав сообщение из этого канала боту.

Важно: для продакшен среды вы должны использовать базу данных или другой способ хранения состояний между перезапусками бота. Примеры решений — SQLite, MongoDB, Redis, или даже текстовый файл в зависимости от ваших нужд и предпочтений.

Скрипт запускает бота и ждет команды от админа. Когда админ хочет добавить канал, он должен переслать сообщение из этого канала боту и в ответ на это сообщение написать команду `/add_channel`. Бот проверит, что команда пришла в ответ на сообщение из канала, и добавит ID этого канала в список `CHANNELS`.

Для отправки соощений по расписанию вам потребуется использовать асинхронный планировщик задач, например
тут не со списком работать нужно, а с базой данных
Похожие вопросы