You need to enable JavaScript to run this app. Python开发Discord Bot FAQ添加命令的输入解析异常
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 02:24:04