discord.py中reply命令无法接收完整多词消息参数的问题
问题原因
discord.py 框架下的命令默认按空格分割用户输入的指令后缀内容,按照函数声明的参数顺序依次赋值。你当前实现的reply命令仅定义了id、message两个位置参数,当用户输入!reply XXXXX Test 1时,参数匹配逻辑如下:
- 指令后第一段空格分隔的内容
XXXXX被赋值给id参数 - 第二段空格分隔的内容
Test被赋值给message参数 - 第三段及之后的内容(本例中的
1)没有对应的参数接收,会被框架直接丢弃,因此无法被正常捕获。
另外你现有代码的私信发送逻辑存在写法错误:DMChannel.send是类方法不能直接调用,获取到目标用户对象后,直接调用用户实例的send方法即可发送私信。
修复方法
在message参数前添加*标记,discord.py 识别到该标记后,会自动将id参数之后的所有剩余输入(包含空格)全部传入message参数,同时修正私信发送的错误写法即可。
修复后的完整代码:
@bot.command() async def reply(ctx, id, *, message): found = False with open('data.json', 'r') as f: data = json.load(f) for entry in data: # 注意:如果data.json中存储的message_id是整数类型,需要将输入的id转为int再比对,即 int(id) == entry["message_id"],避免类型不匹配导致查找失败 if entry["message_id"] == id: found = True user_id = entry["user_id"] user = await bot.fetch_user(user_id) emb = discord.Embed(title=message) # 修正私信发送调用方式 await user.send(embed=emb) await ctx.send("replied to user") if not found: await ctx.send("This id doesn't exist or has already been answered")
补充提示:如果需要对回复内容做长度限制、敏感词过滤,可以在拿到
message参数后自行添加校验逻辑。
内容的提问来源于stack exchange,提问作者LeoIts
相关产品推荐
相关产品推荐

