Как связать несколько ботов и функцию с циклом aiogram 2?

Как я могу корректно соединить код для запуска ботов с использованием aiogram и очереди процессов, чтобы оба блока кода работали вместе?
  • 7 января 2024 г. 16:27
Ответы на вопрос 2
Чтобы запустить несколько ботов с использованием `aiogram` и вписать функцию с циклом, вам нужно использовать асинхронное программирование и возможно `aiogram.Dispatcher`, которые позволят обрабатывать разные ботов одновременно. Давайте рассмотрим пример с несколькими ботами:

```python
from aiogram import Bot, Dispatcher, types, executor
import asyncio
from os import getenv

API_TOKEN_1 = getenv('TELEGRAM_API_TOKEN_1')
API_TOKEN_2 = getenv('TELEGRAM_API_TOKEN_2')

# Создаем два бота и диспетчера
bot1 = Bot(token=API_TOKEN_1)
dp1 = Dispatcher(bot1)

bot2 = Bot(token=API_TOKEN_2)
dp2 = Dispatcher(bot2)

# Создаем обработчик сообщений для первого бота
@dp1.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.reply("Привет! Я бот 1.")

# Создаем отдельный обработчик для второго бота
@dp2.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.reply("Привет! Я бот 2.")

# Пример асинхронной функции с циклом, которая может работать параллельно
async def cyclic_task():
    while True:
        print("Циклическая задача работает...")
        await asyncio.sleep(10)  # Задержка для имитации работы функции

if __name__ == '__main__':
    # Создаем асинхронную задачу для циклической функции
    loop = asyncio.get_event_loop()
    loop.create_task(cyclic_task())
    
    # Запускаем ботов с помощью асинхронного executors
    tasks = [executor.start_polling(dp1, skip_updates=True),
             executor.start_polling(dp2, skip_updates=True)]
    loop.run_until_complete(asyncio.gather(*tasks))
```

В этом примере у нас имеется два бота, каждый с собственным API-токеном и обработчиком команды '/start'. Также присутствует асинхронная функция `cyclic_task`, выполняющаяся в бесконечном цикле, которая запускается как асинхронная задача и выполняется параллельно основному процессу ботов.

Обратите внимание, что функция `cyclic_task` не будет блокировать выполнение других асинхронных операций, благодаря использованию `asyncio.sleep()`, что позволяет сопрограмме уступать управление обратно event loop.

Таким образом, мы можем запустить несколько асинхронных задач и ботов одновременно, используя `asyncio`. Но помните, что все токены должны быть разными и их стоит хранить в безопасных местах, например, в переменных окружения.
1. а зачем aiogram 2? это уже неподдерживаемое старье, пиши на 3й версии 
2. для мультиботов уходи от start_polling на вебхуки
3. в примерах 3й версии есть как писать мультибота https://github.com/aiogram/aiogram/blob/dev-3.x/ex...
Похожие вопросы