You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord PY异步与Websocket问题:on_message/on_open未被await报错

解决GRBOT.on_message和on_open未被await的问题

核心排查方向

  • Discord事件不要手动调用(除非必要):Discord.py的on_message是框架自动触发的事件,正常场景下无需手动调用。如果代码里存在GRBOT.on_message(message)这类手动调用,必须改成await GRBOT.on_message(message)——因为它是异步函数。
  • Websocket的on_open回调要异步处理:如果你的Websocket客户端(比如websockets库)用了异步的on_open函数,要么确保库本身支持异步回调,要么在触发这个函数时加上await。比如自定义了async def on_open(): ...,调用时必须写await on_open()。

代码规范检查

  1. Discord事件函数必须异步定义:

    @GRBOT.event
    async def on_message(message):
        # 你的消息处理逻辑
        await message.channel.send("收到消息")
    

    别漏掉async关键字,否则框架调用时也会触发异步相关错误。

  2. 同时运行Discord机器人和Websocket的正确方式:
    不能用同步方式启动两者,得用asyncio.gather把两个异步任务放在同一个事件循环中:

    import asyncio
    from websockets import connect
    
    GRBOT = discord.Bot(intents=discord.Intents.all())
    
    async def websocket_task():
        async with connect("wss://目标网站地址") as ws:
            async def on_open():
                await ws.send("连接成功")
            await on_open()  # 这里必须加await
            # 监听Websocket消息并转发到Discord
            async for msg in ws:
                channel = GRBOT.get_channel(你的频道ID)
                await channel.send(msg)
    
    async def main():
        await asyncio.gather(
            GRBOT.start("你的Discord令牌"),
            websocket_task()
        )
    
    if __name__ == "__main__":
        asyncio.run(main())
    

请补充代码片段

把main.py里涉及on_message调用、on_open定义/调用的部分贴出来,或者直接贴完整代码,这样能精准定位哪里漏加了await。

内容的提问来源于stack exchange,提问作者whenimbender

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:31:14