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")判断条件。
修复步骤:- 打开Discord开发者后台,进入对应Bot的管理页,在「Bot」标签页下找到「Privileged Gateway Intents」板块,开启「Message Content Intent」开关后保存
- 修改代码中客户端初始化部分,替换为如下代码:
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
相关产品推荐
相关产品推荐

