You need to enable JavaScript to run this app. Discord.py如何实现将用户回复Bot的私信同步给所有者/管理员查看
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py如何实现将用户回复Bot的私信同步给所有者/管理员查看

Discord Bot 私信转管理员实现方案

前置必做配置(不完成代码无法正常运行)

  • 进入Discord开发者门户对应Bot应用的「Bot」配置页,在Privileged Gateway Intents板块开启Message Content Intent开关并保存
  • 代码初始化Bot时必须显式传入开启消息读取权限的intents对象,否则即使门户端开启权限也无法获取消息内容

核心实现逻辑

现有代码仅实现Bot主动发送DM的能力,要接收并转发用户的DM回复,需要完成两个核心步骤:

  1. 注册全局消息监听事件,筛选出来自DM频道、非Bot自身发送的消息
  2. 将筛选到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 01:15:08