he0119 / CoolQBot

基于 NoneBot2 的聊天机器人

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

单 QQ 如何 OneBot V11 与 V12 适配器共存?

monsterxcn opened this issue · comments

看到您在 #261 中已经将 Bot 同时支持 V11 和 V12 的 OneBot 适配器了,是一个 NoneBot2 + 一个 QQ 就可以了?

我想将自己的 Bot 也升级一下,部分简单的插件升级到 V12,剩余的仍然维持在 V11。但是我不太懂用一个 QQ 只运行一个 NoneBot2 是否可以(如何)同时支持 V11 和 V12。

我进行了以下尝试([BOTQQ] 为我的 Bot QQ 号码,[MYQQ] 为我的 QQ 号码):

  • 在 NoneBot2(v2.0.0rc2) .env 中配置了 HOST PORT,同时在 bot.py 注册 V11 和 V12 两个适配器

    HOST=0.0.0.0
    PORT=7707
    ONEBOT_API_ROOTS={"[BOTQQ]": "http://0.0.0.0:5711/"}
    ONEBOT_V12_API_ROOTS={"[BOTQQ]": "http://0.0.0.0:5712/"}
    
  • 使用 go-cqhttp(v1.0.0-rc4) 以 MacOS 协议登录用来对接 V11 适配器

    servers:
      - http:
          address: 0.0.0.0:5711
      - ws-reverse:
          universal: ws://0.0.0.0:7707/onebot/v11/ws
    
  • 使用 walle-q(v0.2.5-fix2) 以 iPad 协议登录用来对接 V12 适配器

    [onebot]
    http_webhook = []
    websocket = []
    
    [[onebot.http]]
    host = "0.0.0.0"
    port = 5712
    
    [[onebot.websocket_rev]]
    url = "ws://0.0.0.0:7707/onebot/v12/ws"
    

这样配置之后,依次启动 go-cqhttp、walle-q、NoneBot2,查看 NoneBot2 日志发现 OneBot V11 连接后会报错一次 RuntimeError: Duplicate bot connection with id [BOTQQ],之后又正常建立了 OneBot V12 连接。再之后似乎就开始正常工作了,但我不知道这样是否正确。

  • go-cqhttp

    [2023-01-09 08:33:12] [WARNING]: 连接到反向WebSocket Universal服务器 ws://0.0.0.0:7707/onebot/v11/ws 时出现错误: dial tcp 0.0.0.0:7707: connect: connection refused 
    [2023-01-09 08:33:15] [INFO]: 开始尝试连接到反向WebSocket Universal服务器: ws://0.0.0.0:7707/onebot/v11/ws 
    [2023-01-09 08:33:15] [INFO]: 已连接到反向WebSocket Universal服务器 ws://0.0.0.0:7707/onebot/v11/ws 
    [2023-01-09 08:34:06] [INFO]: 收到好友 Monstx([MYQQ]) 的消息: 2 (186369373)
    
  • walle-q

    23-01-09 08:33:12  WARN Walle-OBC: connect to ws://0.0.0.0:7707/onebot/v12/ws failed: Connection refused (os error 111)
    23-01-09 08:33:12  INFO Walle-OBC: Retry in 4 seconds
    23-01-09 08:33:16  INFO Walle-OBC: Success connect to ws://0.0.0.0:7707/onebot/v12/ws
    23-01-09 08:33:16  WARN Walle-OBC: Disconnected from ws://0.0.0.0:7707/onebot/v12/ws
    23-01-09 08:33:16  INFO Walle-OBC: Success connect to ws://0.0.0.0:7707/onebot/v12/ws
    23-01-09 08:34:06  INFO walle-q: [message.private] user_name: "", message: "2", user_id: "[MYQQ]", self: platform: "qq", user_id: "[BOTQQ]", message_id: "[MYQQ] 27114 -1248751046 1673253246"
    
  • NoneBot2

    01-09 08:33:12 [INFO] uvicorn | Application startup complete.
    01-09 08:33:12 [INFO] uvicorn | Uvicorn running on http://0.0.0.0:7707 (Press CTRL+C to quit)
    01-09 08:33:15 [INFO] uvicorn | ('127.0.0.1', 44688) - "WebSocket /onebot/v11/ws" [accepted]
    01-09 08:33:15 [INFO] nonebot | OneBot V11 | Bot [BOTQQ] connected
    01-09 08:33:15 [INFO] websockets | connection open
    01-09 08:33:16 [INFO] uvicorn | ('127.0.0.1', 44694) - "WebSocket /onebot/v12/ws" [accepted]
    01-09 08:33:16 [INFO] websockets | connection open
    01-09 08:33:16 [ERROR] nonebot | OneBot V12 | Error while process data from websocket for bot [BOTQQ].
    Traceback (most recent call last):
      File "/home/msx/Service/qqbot/nonebot/.venv/bin/nb", line 8, in <module>
        sys.exit(main())
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/click/core.py", line 1130, in __call__
        return self.main(*args, **kwargs)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/click/core.py", line 1055, in main
        rv = self.invoke(ctx)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/click/core.py", line 1657, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/click/core.py", line 1404, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/click/core.py", line 760, in invoke
        return __callback(*args, **kwargs)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nb_cli/commands/main.py", line 30, in run
        run_bot(file, app)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nb_cli/handlers/deploy.py", line 25, in run_bot
        nonebot.run(app=f"{module_name}:{app}")
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/__init__.py", line 273, in run
        get_driver().run(*args, **kwargs)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/drivers/fastapi.py", line 172, in run
        uvicorn.run(
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/uvicorn/main.py", line 569, in run
        server.run()
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/uvicorn/server.py", line 60, in run
        return asyncio.run(self.serve(sockets=sockets))
      File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
        return loop.run_until_complete(main)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 238, in run_asgi
        result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
        return await self.app(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/fastapi/applications.py", line 270, in __call__
        await super().__call__(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/applications.py", line 124, in __call__
        await self.middleware_stack(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/middleware/errors.py", line 149, in __call__
        await self.app(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
        await self.app(scope, receive, sender)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
        await self.app(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/routing.py", line 706, in __call__
        await route.handle(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/routing.py", line 341, in handle
        await self.app(scope, receive, send)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/starlette/routing.py", line 82, in app
        await func(session)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/fastapi/routing.py", line 287, in app
        await dependant.call(**values)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/drivers/fastapi.py", line 127, in _handle
        await self._handle_ws(websocket, setup)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/drivers/fastapi.py", line 238, in _handle_ws
        await setup.handle_func(ws)
    > File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/adapters/onebot/v12/adapter.py", line 301, in _handle_ws
        self._handle_status_update(event, bots, websocket)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/adapters/onebot/v12/adapter.py", line 497, in _handle_status_update
        self.bot_connect(bot)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/internal/adapter/adapter.py", line 58, in bot_connect
        self.driver._bot_connect(bot)
      File "/home/msx/Service/qqbot/nonebot/.venv/lib/python3.10/site-packages/nonebot/internal/driver/driver.py", line 134, in _bot_connect
        raise RuntimeError(f"Duplicate bot connection with id {bot.self_id}")
    RuntimeError: Duplicate bot connection with id [BOTQQ]
    01-09 08:33:16 [INFO] uvicorn | ('127.0.0.1', 44706) - "WebSocket /onebot/v12/ws" [accepted]
    01-09 08:33:16 [INFO] websockets | connection open
    01-09 08:33:16 [INFO] websockets | connection closed
    01-09 08:33:16 [INFO] nonebot | OneBot V12 | Bot [BOTQQ] connected
    01-09 08:34:06 [SUCCESS] nonebot | OneBot V11 [BOTQQ] | [message.private.friend]: Message 186369373 from [MYQQ] "2"
    01-09 08:34:06 [SUCCESS] nonebot | OneBot V12 [BOTQQ] | [message.private]: Message [MYQQ] 27114 -1248751046 1673253246 from [MYQQ] "2"
    

除了正确同时使用 V11 和 V12 适配器的问题,我还在想一个问题,两个适配器都显示接收到了同一条消息,那样同一条消息应该会被处理两次?💦💦

但是我不太懂用一个 QQ 只运行一个 NoneBot2 是否可以(如何)同时支持 V11 和 V12。

我现在其实是一个 QQ 用 go-cqhttp 走 v11,然后 kook 用 walle-k,telegram 用 teydacore 走 v12。其实我也不太懂,该怎么同时支持两个协议但是不同 QQ 号(就算是同一个协议,同时发两个一样的事件也不太好搞)。

除了正确同时使用 V11 和 V12 适配器的问题,我还在想一个问题,两个适配器都显示接收到了同一条消息,那样同一条消息应该会被处理两次?💦💦

是的,同时支持 ob11/12 其实只是指 matcher 收到任意事件都能处理,但是每个事件来了都会处理一次。

这样配置之后,依次启动 go-cqhttp、walle-q、NoneBot2,查看 NoneBot2 日志发现 OneBot V11 连接后会报错一次 RuntimeError: Duplicate bot connection with id [BOTQQ],之后又正常建立了 OneBot V12 连接。再之后似乎就开始正常工作了,但我不知道这样是否正确。

寄,我发现 ob12 adapter 代码似乎写错了,按理来说,如果 nb 已经有一个 bot 的 id 是 123 的话,另外一个 123 的 bot 是不应该连接成功,并且处理事件的。

😢那看来我还是需要把 v11 和 v12 的分开到两个 Bot QQ 上咯?

我其实主要就是想在一个 Bot QQ 上处理,那个 同一条消息被处理两次 想了想其实倒不是大问题,只要我单独导 nonebot.adapters.onebot.v11 或者 nonebot.adapters.onebot.v12 去写对应的插件就好了。

😢那看来我还是需要把 v11 和 v12 的分开到两个 Bot QQ 上咯?

我其实主要就是想在一个 Bot QQ 上处理,那个 同一条消息被处理两次 想了想其实倒不是大问题,只要我单独导 nonebot.adapters.onebot.v11 或者 nonebot.adapters.onebot.v12 去写对应的插件就好了。

但是处理两次是 bug(

确实是这样,所以有没有什么魔法🤣

在一个 QQ Bot 搞定 v11 和 v12,不觉得这很酷吗(

确实是这样,所以有没有什么魔法🤣

在一个 QQ Bot 搞定 v11 和 v12,不觉得这很酷吗(

继续用现在这个版本不升级,不就能用了🤣

很好的建议,谢谢。我觉得可以 close 了哈哈