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()。
代码规范检查
Discord事件函数必须异步定义:
@GRBOT.event async def on_message(message): # 你的消息处理逻辑 await message.channel.send("收到消息")别漏掉
async关键字,否则框架调用时也会触发异步相关错误。同时运行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
相关产品推荐
相关产品推荐

