Discord.py编写用户信息存储代码报AttributeError错误求助
报错根因
你报错的AttributeError: 'str' object has no attribute 'author'来源于最后一行代码:
await client.process_commands(msg)
你这里传入的msg是你命令定义的第二个参数message,是用户执行命令时传入的纯字符串内容,而client.process_commands要求传入的参数是discord.py的Message对象(包含发送者、频道、内容等完整属性),你传入字符串自然找不到author属性。
而且在命令回调函数内部不需要手动调用process_commands,框架会自动处理命令触发逻辑,直接删掉这行即可解决当前报错。
其他代码问题排查
你现有代码还有多处逻辑错误,会导致后续运行异常:
save_name函数未正确调用:你只写了save_name没有传参执行,修改为save_name(names, ctx.author)才会触发用户信息存储逻辑,且修改names字典后需要重新写入names.json文件,否则修改不会持久化。- 文件操作逻辑冗余错误:
with open上下文管理器会自动关闭文件,不需要额外调用close()方法;判断文件为空的逻辑存在指针偏移问题,建议直接用try-except处理json加载逻辑更稳妥。 - 变量名错误:
save_name内部的print语句使用了未定义的users变量,你实际存储用户信息的变量是names,会触发NameError。 - 命令参数限制:你当前定义的
message参数只能接收单个单词,如果需要接收多词内容,需要修改为async def His(ctx, *, message):。
相关参数说明
ctx:discord.py命令的第一个固定参数,为Context上下文对象,包含触发命令的所有相关信息:ctx.author:触发命令的用户对象,可获取用户id、昵称等属性ctx.send():向命令触发的频道发送消息ctx.message:触发命令的原始Message对象,即你之前传错给process_commands的正确参数类型
- 命令的自定义参数:你定义的第二个参数
message是框架自动提取的用户传入的命令内容,默认按空格分割参数,加*前缀可以匹配所有后续内容为一个字符串。
修正后参考代码
import json import os @client.command() async def His(ctx, *, message): # 初始化json文件逻辑 if not os.path.exists("names.json") or os.stat("names.json").st_size == 0: with open("names.json", "w", encoding="utf-8") as f: json.dump({}, f) # 读取现有用户数据 with open("names.json", "r", encoding="utf-8") as f: names = json.load(f) # 存储用户信息函数 def save_name(names, user): user_id = str(user.id) if user_id not in names: names[user_id] = {} names[user_id]["names"] = 0 # 打印测试 print(names[user_id]["names"]) # 写入修改后的数据到文件 with open("names.json", "w", encoding="utf-8") as f: json.dump(names, f, indent=2, ensure_ascii=False) # 调用存储函数 save_name(names, ctx.author) # 回应用户 await ctx.send(message)
内容的提问来源于stack exchange,提问作者Baam
相关产品推荐
相关产品推荐

