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
相关产品推荐
相关产品推荐

