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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:09:03