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

discord.py机器人网关连接正常但自定义命令无法执行故障排查

问题代码

文件名:learn.py

import asyncio
import datetime
import discord
import openpyxl    

client = discord.Client(command_prefix='?',intents=discord.Intents.default())

@client.event
async def on_message(message):

    if message.content.startswith("learn"):
        word = message.content.split(" ")
        word_ = message.content.replace("learn ", "").replace(word[1], "")
        wb = openpyxl.load_workbook("memory.xlsx")
        ws = wb.active

        for i in range(1, 10):
            if wb["A" + str(i)].value == "." or ws["A" + str(i)].value == word[1]:
                wb["A" + str(i)].value = word[1]
                wb["B" + str(i)].value = word_
                await message.channel.send("adding success.")
                break
        ws.save("memory.xlsx")
        await message.send(message)
运行现象

程序启动后日志显示已成功连接Discord网关,但所有命令均无法触发执行,日志输出如下:

[30;1m2022-07-10 12:08:12[0m [34;1mINFO    [0m [35mdiscord.gateway[0m Shard ID None has sent the IDENTIFY payload.
[30;1m2022-07-10 12:08:12[0m [34;1mINFO    [0m [35mdiscord.gateway[0m Shard ID None has connected
to Gateway (Session ID: cdc97a8a298cb316248b9995fbbb2cdc).
故障原因与修复方法

一共3个核心问题,按优先级修复即可:

  • 第一优先级:Intents权限未配置,这是命令完全不触发的核心原因
    discord.py 2.0+版本默认的Intents.default()配置不会开启消息内容读取权限,没有该权限时Bot无法获取普通用户发送的消息内容,自然匹配不到你写的startswith("learn")判断条件。
    修复步骤:
    1. 打开Discord开发者后台,进入对应Bot的管理页,在「Bot」标签页下找到「Privileged Gateway Intents」板块,开启「Message Content Intent」开关后保存
    2. 修改代码中客户端初始化部分,替换为如下代码:
    intents = discord.Intents.default()
    intents.message_content = True
    # 注意:discord.Client本身不支持command_prefix参数,该参数是commands.Bot的专属参数,直接删除即可
    client = discord.Client(intents=intents)
    
  • 第二优先级:代码末尾的方法调用错误
    代码最后一行await message.send(message)存在错误,Message对象没有send()方法,就算前面的命令逻辑触发,执行到这行也会抛出属性错误导致逻辑中断。这行没有实际业务意义,直接删除即可。
  • 第三优先级:命令匹配逻辑和预期前缀不匹配
    你原本给命令设置了?前缀,但discord.Client不支持自动识别前缀,现有判断message.content.startswith("learn")只会匹配开头直接是learn的消息,如果用户按你预期发送?learn xxx的格式,会因为开头是?无法匹配。如果要保留?前缀,把判断条件改为if message.content.startswith("?learn"):即可,同时对应调整后面的内容截取逻辑,把前缀部分一并去掉。

额外优化提示:当前Excel写入逻辑只遍历前9行查找可写入位置,最多只能存储8个词条,且遍历完无匹配位置时不会给用户任何提示,可以修改为遍历全表找空行的逻辑,提升可用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:54:28