Discord.py封装DM通知函数报错:'msg'未定义,求解决方案
问题解决:'msg' is not defined 报错修复
核心报错原因
报错'msg' is not defined通常来自两个场景:
on_message函数未正确注册为事件,导致手动调用时未传入msg参数- 有代码在
on_message函数的作用域外部(或错误缩进层级)引用了msg变量
修复步骤
1. 正确注册on_message事件
你的on_message函数缺少Discord.py的事件装饰器,框架无法自动触发它,若手动调用时忘记传msg参数就会报错。给函数添加装饰器:
@bot.event # 注意:这里的`bot`要和你初始化机器人时用的变量名一致,比如如果用`client = commands.Bot(...)`就改成@client.event async def on_message(msg): # 你的权限检查等其他逻辑 await dm( msg.author.id, "我没有权限修改这个昵称!", "我没有权限修改这个昵称!(无法给你发送私信,请检查你的隐私设置)", msg.channel )
2. 检查msg的作用域
确认所有使用msg的代码都在on_message函数的缩进块内,不能有代码脱离函数引用msg。比如你省略的权限检查逻辑,必须和await dm(...)处在同一缩进层级。
3. 优化dm函数(可选,提升效率)
可以直接传入msg.author用户对象,避免重复调用fetch_user,让代码更高效:
async def dm(user, dm_content, server_content, channel): try: await user.send(dm_content) except discord.Forbidden: await channel.send(server_content) # 在on_message中调用 await dm( msg.author, "我没有权限修改这个昵称!", "我没有权限修改这个昵称!(无法给你发送私信,请检查你的隐私设置)", msg.channel )
额外注意事项
- 确保机器人拥有发送私信和频道消息的权限
- 检查用户的隐私设置,避免因用户关闭私信导致的
Forbidden异常
内容的提问来源于stack exchange,提问作者brickastley
相关产品推荐
相关产品推荐

