You need to enable JavaScript to run this app. discord.py中on_message事件内校验触发用户是否持有Admin角色的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

discord.py中on_message事件内校验触发用户是否持有Admin角色的实现方法

Discord机器人on_message模式管理员角色校验实现代码

可直接运行的完整示例

import discord
from discord.ext import commands

# 替换为你的机器人令牌
TOKEN = "你的机器人令牌"
# 配置机器人Intents,必须开启对应权限才能正常获取角色、读取消息
intents = discord.Intents.default()
intents.message_content = True
intents.members = True

client = commands.Bot(command_prefix=".", intents=intents)

@client.event
async def on_ready():
    print(f"机器人已登录,当前身份:{client.user}")

@client.event
async def on_message(message):
    # 忽略机器人自身发送的消息,避免循环触发
    if message.author.bot:
        return

    # 重置指令示例
    if message.content == ".admin reset":
        # 立即删除触发消息,避免被其他用户查看
        await message.delete()
        # 校验用户是否持有Admin角色
        is_admin = any(role.name == "Admin" for role in message.author.roles)
        if is_admin:
            await message.channel.send("正在重置服务...")
            # 此处写入你的重置业务逻辑
        else:
            await message.channel.send("你没有管理员权限,无法执行该指令")

    # 关停指令示例
    if message.content == ".admin shutdown":
        await message.delete()
        is_admin = any(role.name == "Admin" for role in message.author.roles)
        if is_admin:
            await message.channel.send("正在关停机器人...")
            await client.close()
        else:
            await message.channel.send("你没有管理员权限,无法执行该指令")

    # 禁言指令示例,可按相同格式扩展其他指令
    if message.content.startswith(".admin mute"):
        await message.delete()
        is_admin = any(role.name == "Admin" for role in message.author.roles)
        if not is_admin:
            await message.channel.send("你没有管理员权限,无法执行该指令")
            return
        if len(message.mentions) == 0:
            await message.channel.send("请@要禁言的目标用户")
            return
        target_user = message.mentions[0]
        # 示例为禁言10分钟,可自行调整时长
        await target_user.timeout(discord.utils.utcnow() + discord.timedelta(minutes=10))
        await message.channel.send(f"已禁言用户{target_user.mention}10分钟")

client.run(TOKEN)

注意事项

  • 你提供的初始示例代码存在两处错误:首先user.roles是属性不是方法,不需要加()调用;其次roles列表存储的是角色对象而非字符串,必须比对role.name才能正常判断角色是否存在
  • 必须在Discord开发者后台开启机器人的Server Members Intent和Message Content Intent权限,否则无法正常获取用户角色和读取消息内容
  • 其他管理员指令可按照相同格式扩展,复用角色校验逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 01:54:07