Discord.py机器人报错create_dm未定义 如何封禁用户后发送DM通知
问题修复方案
核心错误原因
create_dm是discord.Member实例的内置方法,不是全局函数,不能直接调用create_dm(member),需要通过成员对象调用await member.create_dm()- 非Cog类下的
@client.command装饰的命令函数不需要加self参数,保留self会触发参数匹配错误 - 逻辑顺序错误:先执行封禁操作后,bot可能失去和被封禁用户创建DM会话的权限,导致通知发送失败,需要先发送DM再执行封禁
- 笔误:封禁操作后的公屏提示文案写的是kicked,和实际操作不符
修正后完整代码
import discord from discord.ext import commands intents = discord.Intents(messages=True, guilds=True, reactions=True, members=True,presences=True,guild_messages=True) client = commands.Bot(command_prefix="!dc ", intents=intents) @client.event async def on_ready(): print("I am ready!") @client.command(aliases=["ban"]) @commands.has_role("admin") async def ban_user(ctx, member: discord.Member, *, reason=None): # 先创建DM发通知 dm_channel = await member.create_dm() await dm_channel.send("You've been banned from the server.You won't join the server until admin opens your ban.") # 再执行封禁操作 await member.ban(reason=reason) await ctx.send(f"{member} has been banned from server.") @client.command(aliases=["kick"]) @commands.has_role("admin") async def kick_user(ctx, member: discord.Member, *, reason=None): # 踢人也可以参考上面的逻辑先通知再操作 dm_channel = await member.create_dm() await dm_channel.send("You've been kicked from the server.") await member.kick(reason=reason) await ctx.send(f"{member} has been kicked from the server.") client.run(myToken)
额外注意事项
如果用户关闭了服务器成员的DM权限,发DM的操作会抛出异常,可以加try...except捕获异常避免命令运行崩溃。
内容的提问来源于stack exchange,提问作者hARASİVa
相关产品推荐
相关产品推荐

