Задать вопрос
@nemolayn

Каким образом я могу запускать привязанных ботов в основном, что-бы основной loop не ломался и не дублировался?

Сейчас мой бот запускается так:
def main():
    logger.info(f"Starting bot...")

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    loop.run_until_complete(group_manager.setup_group_clones())
    loop.create_task(check_old_tokens())
    loop.create_task(periodic_check())
    loop.create_task(periodic_refresh_groups())

    try:
        bot.run_forever()
    except KeyboardInterrupt:
        logger.info("Shutting down")


Класс для работы с ботами:
class GroupCloneManager:
    def __init__(self):
        self.group_bots: Dict[int, Bot] = {}
        self.group_tasks: Dict[int, asyncio.Task] = {}

    async def setup_group_clones(self):
        try:
            async with make_session() as db_session:
                groups = await get_connected_groups(db_session)
                for group in groups:
                    await self.add_group_clone(group)
        except Exception as e:
            logger.debug(f"Error adding groups: {e}")

    async def add_group_clone(self, group_data: ConnectedGroups):
        group_id = group_data.group_id
        token = ssl_crypter.decrypt(group_data.access_token).decode('utf-8')

        try:
            group_api = API(token=token)
            group_bot = Bot(
                api=group_api,
                labeler=deepcopy(labeler),
                state_dispenser=deepcopy(state_dispenser)
            )

            self.group_bots[group_id] = group_bot
            self.group_tasks[group_id] = asyncio.create_task(
                self._run_group_bot(group_bot, group_data)
            )

            logger.debug(f"Group {group_id} added and successfully started")
            return True
        except Exception as e:
            logger.debug(f"Group {group_id} failed to start, unavailable token ({e})")
            return False

    async def _run_group_bot(self, group_bot: Bot, group_data: ConnectedGroups):
        group_id = group_data.group_id
        try:
            await group_bot.run_polling()
            async with make_session() as db_session:
                async with make_session() as db_session:
                    stmt = sa.update(ConnectedGroups).where(ConnectedGroups.group_id == group_id).values(is_active=True)

                    await db_session.execute(stmt)
                    await db_session.commit()

        except Exception as e:
            logger.debug(f"Group {group_id} stopped: {e}")

    async def remove_group_clone(self, group_id: int):
        if group_id in self.group_bots:
            self.group_tasks[group_id].cancel()

        if group_id in self.group_bots:
            del self.group_bots[group_id]
            del self.group_tasks[group_id]

        async with make_session() as db_session:
            stmt = sa.update(ConnectedGroups).where(ConnectedGroups.group_id == group_id).values(is_active=True)

            await db_session.execute(stmt)
            await db_session.commit()

        logger.debug("Group removed from polling")

    async def refresh_group_clones(self):
        try:
            async with make_session() as db_session:
                current_groups = await get_connected_groups(db_session)
                current_group_ids = {g['group_id'] for g in current_groups if g['is_active']}
                existing_group_ids = set(self.group_bots.keys())

                for group_data in current_groups:
                    if group_data.is_active and group_data.group_id not in existing_group_ids:
                        await self.add_group_clone(group_data)

                for group_id in existing_group_ids:
                    if group_id not in current_group_ids:
                        await self.remove_group_clone(group_id)
        except Exception as e:
            logger.debug(f"Error refreshing groups: {e}")


Сейчас у меня есть варнинги в консоли:
DEBUG    | 2025-11-15 14:51:44 | bot.control_groups:add_group_clone:46 > Group |id| added and successfully started
DEBUG    | 2025-11-15 14:51:44 | bot.control_groups:_run_group_bot:64 > Group |id| stopped: Cannot close a running event loop


Но боты (2) запускаются и реагируют но два раза на одну команду.
Сейчас схема примерно такая:
Бот (основной) запускает привязанные боты пользователями (другие группы)
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Python-разработчик
    9 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы