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

Discord.py机器人add命令为何无法将用户输入正确存入列表?

Discord.py add 命令问题排查

现有代码存在的问题

  • 列表作用域错误:存储数据的ids列表被定义在add函数内部,每次用户触发命令时都会被重新初始化为[""],之前添加的所有内容都会被清空,无法实现数据累积存储。
  • 缺少输入校验:当前仅校验了消息发送者和频道,没有验证用户输入是否符合「姓名+学号」的格式要求,不符合规范的无效内容也会被直接存入列表。
  • 冗余初始值:ids初始化自带无意义的空字符串元素,会增加后续数据处理的冗余成本。
  • 无持久化能力:数据仅保存在运行内存中,机器人重启后所有存储的记录都会完全丢失。
  • 无超时机制:wait_for没有设置超时时间,如果用户一直不输入,进程会一直卡在该状态,占用资源。

修复参考代码

# 将ids列表移到函数外部,设为全局变量,避免每次调用命令被重置
ids = []

@client.command()
async def add(ctx):
      await ctx.send("请仅输入你的姓名和学号,示例:张三 123456")

      def check(msg):
          # 新增格式校验:正则匹配「姓名+6位数字学号」格式,可根据实际需求修改规则
          import re
          input_pattern = r'^[\u4e00-\u9fa5a-zA-Z ]+ \d{6}$'
          return msg.author == ctx.author and msg.channel == ctx.channel and re.match(input_pattern, msg.content) is not None

      try:
          # 新增60秒超时,避免进程卡住
          msg = await client.wait_for("message", check=check, timeout=60)
          ids.append(msg.content)
          await ctx.send("提交成功,你的信息会尽快完成录入。")
      except TimeoutError:
          await ctx.send("提交超时,请重新运行命令提交。")
      except:
          await ctx.send("输入格式错误,请检查后重新运行命令提交。")

持久化优化(可选)

如果需要重启机器人后数据不丢失,可以用JSON文件存储数据:

import json

# 机器人启动时读取已有数据
try:
    with open("ids.json", "r", encoding="utf-8") as f:
        ids = json.load(f)
except FileNotFoundError:
    # 文件不存在时初始化空列表
    ids = []

@client.command()
async def add(ctx):
      await ctx.send("请仅输入你的姓名和学号,示例:张三 123456")

      def check(msg):
          import re
          input_pattern = r'^[\u4e00-\u9fa5a-zA-Z ]+ \d{6}$'
          return msg.author == ctx.author and msg.channel == ctx.channel and re.match(input_pattern, msg.content) is not None

      try:
          msg = await client.wait_for("message", check=check, timeout=60)
          ids.append(msg.content)
          # 新增数据后写入文件持久化保存
          with open("ids.json", "w", encoding="utf-8") as f:
              json.dump(ids, f, ensure_ascii=False, indent=2)
          await ctx.send("提交成功,你的信息会尽快完成录入。")
      except TimeoutError:
          await ctx.send("提交超时,请重新运行命令提交。")
      except:
          await ctx.send("输入格式错误,请检查后重新运行命令提交。")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:18:04