Python开发Discord Bot FAQ添加命令的输入解析异常
为啥会出现这个解析问题
你现在的参数写法踩了discord.py的默认解析规则:没有加*前缀的普通位置参数,只会接收空格分隔的第一个连续文本片段。所以你定义的question只会抓到用户输入的第一个单词“This”,剩下的所有内容因为和后面带*=的answer参数位置相邻,就会全部被answer接收,这完全是解析规则内的预期表现,不是什么奇怪的bug。
两种可直接落地的实现方案
方案1(最简便、用户体验最好):抓取全量输入内容,按首个问号拆分
完全没必要用两个分散的参数分别接收长文本,直接把用户敲完命令后的所有内容抓成一个字符串,再按约定的问号拆分问题和答案即可,示例代码如下:
@bot.command(aliases=['faqadd']) @commands.has_permissions(manage_guild=True) # 必加:仅社群管理员可操作FAQ修改,避免普通用户乱改 async def addfaq(ctx, *, full_content: str = None): # 用户空输入的兜底提示 if not full_content: await ctx.send("正确用法:`.faqadd 你的问题? 对应的回答`") return # 缺失分隔符的格式校验 if '?' not in full_content: await ctx.send("格式有误,记得在问题末尾打问号分隔问题和回答,例如:`.faqadd 怎么申请社群身份组? 找对应身份组管理员提交申请即可`") return # 重点:按第一个问号切分,最多拆分1次,避免回答本身带问号时被切碎 question, answer = full_content.split('?', 1) # 清理两端冗余空格 question = question.strip() answer = answer.strip() # 后续直接把处理好的question、answer写入JSON存储即可
这个方法完全符合大家对FAQ的认知习惯,用户不需要额外记忆特殊输入格式,也不用手动打引号,是性价比最高的实现方式。
方案2(灵活但对用户要求更高):引导用户用双引号包裹参数
如果不想依赖问号当分隔符,也可以要求用户调用命令时,用双引号分别把问题、答案包裹起来,比如输入:
.faqadd "怎么发图片到社群" "直接把本地图片拖到聊天框发送就行"
这种格式下discord.py的内置解析器能正确识别带引号的多词片段,但缺点是对用户输入的格式要求更严,忘打引号、引号打错位置都会导致解析错误,整体体验不如方案1。
避坑提醒
- 拆分字符串时记得给
split方法加第二个参数1,要是直接无限制拆分,万一回答内容本身带问号,会把答案切得逻辑混乱 - 别再试图定义两个需要接收长文本的参数了,只要参数前面没加
*前缀,就只能接收单个不带空格的单词片段,根本收不到多词的问题内容 - 一定要给命令加权限校验,别让普通社群用户也能随便修改FAQ内容
内容的提问来源于stack exchange,提问作者Pulldown
相关产品推荐
相关产品推荐

