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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:27:21