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

如何让Python Discord机器人给被@用户分配角色且限制命令调用权限

实现代码
# 需提前导入get方法:from discord.utils import get
@client.event
async def on_message(message):
    # 过滤机器人自己发的消息
    if message.author == client.user:
        return
    
    # 自定义命令触发词,可按需修改
    if message.content.startswith('!grant admin'):
        # 1. 权限校验:判断调用者是否持有管理员角色
        admin_role = get(message.server.roles, name='Admin')
        if admin_role not in message.author.roles:
            await client.send_message(message.channel, "你没有权限使用该命令")
            return
        
        # 2. 获取被@的用户,校验是否@了目标用户
        target_users = message.mentions
        if not target_users:
            await client.send_message(message.channel, "请@需要授予角色的用户")
            return
        
        # 3. 给所有被@的用户授予管理员角色
        for user in target_users:
            await client.add_roles(user, admin_role)
        await client.send_message(message.channel, f"已成功为{len(target_users)}名用户授予Admin角色")

版本适配提示:上述代码适配discord.py旧版async分支,如果你使用的是v2.x正式版,需要对应修改三处写法:

  1. message.server 替换为 message.guild
  2. client.send_message 替换为 message.channel.send
  3. client.add_roles(user, role) 替换为 await user.add_roles(role)
核心改动说明
  • 权限校验逻辑:命令触发后先检查发送者的角色列表是否包含指定的管理员角色,不满足条件直接终止流程,避免越权操作
  • 目标用户替换:通过message.mentions属性直接读取消息中被@的所有用户,替换原来的消息发送者message.author作为授权目标,支持同时@多个用户批量授权
  • 异常分支补全:新增了无权限、未@用户的提示逻辑,避免无意义的报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:54:08