如何实现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
相关产品推荐
相关产品推荐

