Discord.py如何实现将用户回复Bot的私信同步给所有者/管理员查看
Discord Bot 私信转管理员实现方案
前置必做配置(不完成代码无法正常运行)
- 进入Discord开发者门户对应Bot应用的「Bot」配置页,在Privileged Gateway Intents板块开启Message Content Intent开关并保存
- 代码初始化Bot时必须显式传入开启消息读取权限的intents对象,否则即使门户端开启权限也无法获取消息内容
核心实现逻辑
现有代码仅实现Bot主动发送DM的能力,要接收并转发用户的DM回复,需要完成两个核心步骤:
- 注册全局消息监听事件,筛选出来自DM频道、非Bot自身发送的消息
- 将筛选到的DM内容附带发件人身份信息,转发到指定的Bot所有者/管理员账号/服务器日志频道
重要提醒:消息监听事件中必须添加命令处理逻辑,否则所有服务器内的前缀命令都会失效
完整可运行代码
import discord from discord.ext import commands # 初始化intents,开启消息内容读取权限 intents = discord.Intents.default() intents.message_content = True # 初始化Bot,替换为你自己的命令前缀 client = commands.Bot(command_prefix="!", intents=intents) # 全局变量存储Bot所有者,避免重复请求接口 bot_owner = None # Bot启动后自动加载配置 @client.event async def on_ready(): global bot_owner app_info = await client.application_info() bot_owner = app_info.owner print(f"Bot已成功登录,当前运行身份:{client.user}") # 你的原有DM发送命令,补充了错误处理与发送反馈 @client.command() async def dm(ctx, user: discord.User, *, message): try: await user.send(message) await ctx.send(f"已成功向{user}发送私信") except discord.Forbidden: await ctx.send(f"发送失败:{user}关闭了对Bot的私信权限") # 全局消息监听事件 @client.event async def on_message(message): # 跳过Bot自身发送的消息,避免循环触发 if message.author == client.user: return # 必须调用该方法,否则所有前缀命令(包括上面的dm命令)都会失效 await client.process_commands(message) # 仅处理DM频道内收到的消息 if isinstance(message.channel, discord.DMChannel): # 组装转发的消息内容,附带发件人身份信息 forward_content = ( f"=== 收到用户私信 ===\n" f"发件人:{message.author} (用户ID:{message.author.id})\n" f"消息内容:{message.content}" ) # 自动附带用户发送的附件链接(图片、文件等) if message.attachments: attach_text = "\n".join([f"附件:{att.url}" for att in message.attachments]) forward_content += f"\n{attach_text}" # 转发给Bot所有者 await bot_owner.send(forward_content) # 可选:给发私信的用户回自动提示 await message.channel.send("你的私信已收到,管理员会尽快查看回复") # 如果需要把消息转发到指定服务器的日志频道,替换上面的发送逻辑为: # 把下面的数字替换为你服务器里日志频道的ID # log_channel = client.get_channel(123456789012345678) # await log_channel.send(forward_content) # 启动Bot,替换为你自己的Bot Token client.run("你的Bot Token")
常见调整说明
- 如果需要通知多个管理员:可以把管理员ID存在一个列表中,循环遍历每个ID对应的用户,逐个发送转发内容即可
- 如果需要回复用户的DM:直接在对应的DM会话中发送消息即可,Bot会自动把消息回传给对应用户
- 复制用户/频道ID的方法:在Discord用户设置的「高级」板块开启开发者模式,之后右键点击用户/频道就能直接复制ID
内容的提问来源于stack exchange,提问作者Lumiscnt1
相关产品推荐
相关产品推荐

