Discord.py TypeError:无法向刚启动的协程发送非None值
Discord机器人跨频道通信TypeError问题解决
报错信息
Traceback (most recent call last): File "C:\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 441, in _run_event await coro(*args, **kwargs) File "C:\Desktop\Code Projects\DiscordBot.py", line 90, in MessageResponder await client.fetch_channel(Connections[message.channel.id]).send(message) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: can't send non-None value to a just-started coroutine
问题场景
开发具备基础跨频道通信功能的Discord机器人时触发上述错误,已尝试添加await但问题未解决。
原代码
@client.listen("on_message") async def MessageResponder(message): if message.author == client.user: return try: await client.fetch_channel(Connections[message.channel.id]).send(message) Idmain = list(Connections.keys())[list(Connections.values()).index(message.channel.id)] if Idmain and message.channel.id in Connections: try: CheckActivity[f"{Idmain}/{message.channel.id}"] += 1 except KeyError: CheckActivity[f"{message.channel.id}/{Idmain}"] += 1 except KeyError: return
解决方案
1. 修复异步调用逻辑
错误核心是异步方法链式调用错误:client.fetch_channel()是异步方法,必须先通过await获取到频道对象后,再调用其send()方法,不能在链式调用时只在最外层加await。同时,send()方法不能直接传入message对象,需要传入消息内容message.content。
修正后的代码:
@client.listen("on_message") async def MessageResponder(message): if message.author == client.user: return try: # 先获取目标频道对象 target_channel_id = Connections[message.channel.id] target_channel = await client.fetch_channel(target_channel_id) # 发送消息内容(而非message对象) await target_channel.send(message.content) Idmain = list(Connections.keys())[list(Connections.values()).index(message.channel.id)] if Idmain: key = f"{Idmain}/{message.channel.id}" CheckActivity[key] = CheckActivity.get(key, 0) + 1 except KeyError: return
2. 优化反向查找逻辑
原代码中通过列表遍历反向查找Connections的写法效率极低,且存在重复值时会出错。建议将Connections初始化为双向映射字典:
# 初始化时同时存双向关联 Connections = { 频道A_ID: 频道B_ID, 频道B_ID: 频道A_ID } # 后续直接取值即可,无需遍历 Idmain = Connections[message.channel.id]
这种写法能大幅提升代码性能和稳定性。
内容的提问来源于stack exchange,提问作者Joshy
相关产品推荐
相关产品推荐

