Как запустить несколько ботов на Aiogram 3, используя список токенов?

Я впервые работаю с мультиботами в aiogram и пытаюсь запустить новых ботов из основного, используя их токены. Как правильно запустить добавленных в мой список ботов ["token1", "token2"] при инициализации основного бота? <br/> <br/> Пример из документации ( <a href="https://github.com/aiogram/aiogram/blob/dev-3.x/examples/multibot.py" rel="nofollow">https://github.com/aiogram/aiogram/blob/dev-3.x/examples/multibot.py</a> ) работает так, как мне нужно, но я не разобрался, где он хранит токены. Мне необходимо реализовать запуск ботов по токенам из моего списка. <br/> <br/> Вот функция для запуска, которая у меня получилась: <br/> <br/> <pre><code class="python">def main():
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)

    session = AiohttpSession()
    bot_settings = {"session": session, "default": DefaultBotProperties(parse_mode="HTML")}

    main_dispatcher = Dispatcher(storage=storage)
    main_dispatcher.include_router(router.main)
    main_dispatcher.include_router(router.user_main)
    main_dispatcher.startup.register(on_startup)

    multibot_dispatcher = Dispatcher(storage=storage)
    multibot_dispatcher.include_router(router.user_multi)

    app = web.Application()
    main_bot = Bot(token=api_bot, **bot_settings)
    SimpleRequestHandler(dispatcher=main_dispatcher, bot=main_bot).register(app, path=MAIN_BOT_PATH)

    bot_list = [
        "токен 1",
        "токен 2"
    ]

    for bot in bot_list:
        # Какой код нужно добавить здесь для запуска ботов по их токенам?

    setup_application(app, main_dispatcher, bot=main_bot)
    setup_application(app, multibot_dispatcher)

    web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)</code></pre>
  • 17 ноября 2024 г. 17:43
Ответы на вопрос 2
Чтобы запустить несколько ботов в Aiogram 3, вы можете использовать список токенов и инициализировать для каждого токена отдельный экземпляр `Bot` и `Dispatcher`. Вот пример того, как это можно реализовать в вашей функции `main`:

```python
import logging
import sys
from aiohttp import web
from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.utils import SimpleRequestHandler, setup_application
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.utils import start_webhook

# Настройки вашего бота
MAIN_BOT_PATH = '/webhook'
WEB_SERVER_HOST = '0.0.0.0'
WEB_SERVER_PORT = 3000

# Не забудьте инициализировать правильный storage
storage = MemoryStorage()

async def on_startup(dispatcher: Dispatcher):
    # ваш код для инициализации
    pass

def main():
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)

    session = AiohttpSession()
    bot_settings = {"session": session, "default": DefaultBotProperties(parse_mode="HTML")}

    main_dispatcher = Dispatcher(storage=storage)
    main_dispatcher.include_router(router.main)
    main_dispatcher.include_router(router.user_main)
    main_dispatcher.startup.register(on_startup)

    app = web.Application()
    
    # Создаем основной бот
    main_bot = Bot(token=api_bot, **bot_settings)
    SimpleRequestHandler(dispatcher=main_dispatcher, bot=main_bot).register(app, path=MAIN_BOT_PATH)

    # Список токенов для мультиботов
    bot_list = [
        "токен 1",
        "токен 2"
    ]

    # Создаем и запускаем дополнительных ботов
    for token in bot_list:
        # Создаем экземпляр бота
        new_bot = Bot(token=token, **bot_settings)
        
        # Создаем новый диспетчер для этого бота
        multibot_dispatcher = Dispatcher(storage=storage)
        multibot_dispatcher.include_router(router.user_multi) # Подключите необходимые роутеры

        # Регистрируем обработчики для этого бота
        SimpleRequestHandler(dispatcher=multibot_dispatcher, bot=new_bot).register(app, path=f"/{token}")

    # Настройка приложения
    setup_application(app, main_dispatcher, bot=main_bot)
    setup_application(app, multibot_dispatcher)

    # Запуск веб-приложения
    web.run_app(app, host=WEB_SERVER_HOST, port=WEB_SERVER_PORT)

if __name__ == "__main__":
    main()
```

### Объяснение кода:

1. **Импорт нужных библиотек:** Убедитесь, что у вас доступны все необходимые импорты, такие как `Bot`, `Dispatcher`, `web.Application` и другие.

2. **Создание экземпляра бота:** В цикле по списку токенов создается новый экземпляр бота `new_bot` для каждого токена.

3. **Создание отдельного диспетчера:** Для каждого нового бота создается новый `Dispatcher` (`multibot_dispatcher`), в который можно подключить нужные роутеры и обработчики.

4. **Регистрируем обработчики:** Используя `SimpleRequestHandler`, вы регистрируете путь и связанные с ним диспетчеры.

5. **Настройка и запуск приложения:** После того, как все боты зарегистрированы, приложение запускается.

Убедитесь, что у вас есть необходимые обработчики для каждого из ботов и корректные пути. Этот пример демонстрирует лишь общую структуру и концепцию для инициализации нескольких ботов.
В функции command_add_bot создается новый экземпляр бота с использованием токена. 
Каждый раз, когда новый бот добавляется, его вебхук регистрируется в системе, что позволяет главному боту получать обновления от всех добавленных ботов.

Состояния ботов хранится в MemoryStorage, как вариант, вам предлагают использовать RedisStorage.
Похожие вопросы