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

如何实现Discord.py机器人仅接收指定用户的DM命令?

实现Discord机器人接收DM命令并仅响应所有者请求

别担心,这个需求完全可以实现,我给你拆解成几个简单的步骤,代码示例也给你准备好了:

1. 先搞定基础配置:启用必要的Intents

首先,Discord机器人现在需要明确启用message_content intent才能读取消息内容(包括DM),而且要在Discord开发者后台的机器人页面开启这个权限。

在代码里,你需要这样初始化intents:

import discord
from discord.ext import commands

# 定义你的所有者ID(替换成你自己的Discord用户ID)
OWNER_ID = 123456789012345678

# 初始化Intents
intents = discord.Intents.default()
intents.message_content = True  # 必须开启才能读取消息内容
intents.members = True  # 用来获取服务器的ban列表

# 创建机器人实例,设置命令前缀(DM里也会用这个前缀)
bot = commands.Bot(command_prefix="!", intents=intents)

2. 添加仅允许所有者使用命令的校验

我们可以用commands.check装饰器来创建一个校验函数,确保只有你(OWNER_ID对应的用户)发送的命令才会被执行:

def is_owner(ctx):
    # 检查消息发送者的ID是否等于所有者ID
    return ctx.author.id == OWNER_ID

# 或者用discord.py内置的is_owner装饰器,不过需要先设置bot.owner_id
# bot.owner_id = OWNER_ID
# 然后用@commands.is_owner()装饰命令

3. 实现解封所有服务器的DM命令

接下来写核心的解封命令,这个命令会遍历机器人加入的所有服务器,检查你是否被封禁,如果是就解封:

@bot.command(name="unban_me")
@commands.check(is_owner)  # 应用校验,只有所有者能触发
async def unban_me(ctx):
    # 因为是DM命令,ctx.guild会是None,所以我们要遍历bot.guilds
    success_count = 0
    fail_count = 0
    no_ban_count = 0

    for guild in bot.guilds:
        try:
            # 检查当前服务器是否有你的ban记录
            ban_entry = await guild.fetch_ban(discord.Object(id=OWNER_ID))
            # 如果找到,就解封
            await guild.unban(discord.Object(id=OWNER_ID))
            success_count += 1
            print(f"已在服务器 {guild.name} 解封成功")
        except discord.NotFound:
            # 没有找到你的ban记录
            no_ban_count += 1
            print(f"服务器 {guild.name} 中你未被封禁")
        except discord.Forbidden:
            # 机器人没有解封权限
            fail_count += 1
            print(f"服务器 {guild.name} 中机器人无解封权限")
        except Exception as e:
            # 其他未知错误
            fail_count += 1
            print(f"服务器 {guild.name} 处理出错: {str(e)}")
    
    # 给你发DM反馈结果
    result_msg = f"解封操作完成:\n✅ 成功解封 {success_count} 个服务器\n❌ 无权限/失败 {fail_count} 个服务器\nℹ️ 未被封禁 {no_ban_count} 个服务器"
    await ctx.send(result_msg)

# 机器人启动成功的提示
@bot.event
async def on_ready():
    print(f"机器人已登录为 {bot.user.name}")
    # 可以在这里给你发一条启动成功的DM
    owner = await bot.fetch_user(OWNER_ID)
    await owner.send("机器人已启动,随时可以发送命令!")

# 运行机器人(替换成你的机器人令牌)
bot.run("YOUR_BOT_TOKEN")

4. 关键注意事项

  • 权限要求:机器人在每个服务器里必须拥有Ban Members权限才能执行解封操作,否则会返回权限不足的错误。
  • 开发者后台配置:一定要在Discord开发者 portal的机器人页面,开启Message Content Intent和Server Members Intent,否则机器人无法读取DM内容或获取ban列表。
  • 命令触发:你只需要在DM里给机器人发送!unban_me(对应代码里的命令前缀),就能触发解封操作。

这样整个流程就通了,你只需要替换代码里的OWNER_ID和YOUR_BOT_TOKEN,然后按照步骤配置好intents就能运行了。

内容的提问来源于stack exchange,提问作者user9123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:37:09