Чтобы бот автоматически добавлял идентификаторы каналов в список каналов (`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`.
Для отправки соощений по расписанию вам потребуется использовать асинхронный планировщик задач, например