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

@commands.has_permissions(administrator=True)失效,无权限账号可执行timeout命令

问题描述

开发Discord服务器机器人时,期望timeout命令仅对拥有管理员权限(administrator)的用户开放,但使用服务器内无该权限的小号账号时,依然能执行该命令,请问原因是什么?

当前代码

import discord
from discord import commands
import datetime

@bot.tree.command(name = 'timeout', description = 'time out a member')
@commands.has_permissions(administrator=True)
async def timeout(interaction: discord.Interaction, member: discord.Member, seconds: int = 0, minutes: int = 0, hours: int = 0, days: int = 0, rule_violation_num: int = 0):
  embed = discord.Embed(title = 'Timedout...', description = f'{member.mention} was timedout for violating rule number {rule_violation_num}')
  embed.add_field(name = 'Responsible Mod:', value = interaction.user.mention)
  embed.set_author(name = interaction.user.name, icon_url = interaction.user.avatar.url)
  embed.set_thumbnail(url = member.display_avatar)
  embed.set_footer(text = time, icon_url = 'https://cdn.discordapp.com/attachments/1118276267695931544/1120369092537352214/Alloa_Academy_Badge.jpg')
  duration = datetime.timedelta(seconds = seconds, minutes = minutes, hours = hours, days = days)

  await member.timeout(duration)
  await interaction.response.send_message(embed = embed)
原因及解决方法
  • 核心原因:你使用的@commands.has_permissions(administrator=True)是Discord.py针对**前缀命令(Prefix Commands)设计的权限检查装饰器,无法对@bot.tree.command定义的Slash命令(应用命令)**生效,导致无权限用户仍能执行命令。
  • 解决方法:替换为应用命令专用的权限检查装饰器@discord.app_commands.checks.has_permissions,同时确保导入对应模块。修改后的代码如下:
import discord
from discord import commands
from discord import app_commands
import datetime

@bot.tree.command(name = 'timeout', description = 'time out a member')
@app_commands.checks.has_permissions(administrator=True)
async def timeout(interaction: discord.Interaction, member: discord.Member, seconds: int = 0, minutes: int = 0, hours: int = 0, days: int = 0, rule_violation_num: int = 0):
  embed = discord.Embed(title = 'Timedout...', description = f'{member.mention} was timedout for violating rule number {rule_violation_num}')
  embed.add_field(name = 'Responsible Mod:', value = interaction.user.mention)
  embed.set_author(name = interaction.user.name, icon_url = interaction.user.avatar.url)
  embed.set_thumbnail(url = member.display_avatar)
  embed.set_footer(text = time, icon_url = 'https://cdn.discordapp.com/attachments/1118276267695931544/1120369092537352214/Alloa_Academy_Badge.jpg')
  duration = datetime.timedelta(seconds = seconds, minutes = minutes, hours = hours, days = days)

  await member.timeout(duration)
  await interaction.response.send_message(embed = embed)

修改完成后,需要在机器人启动时执行await bot.tree.sync()同步Slash命令到服务器,确保权限检查规则生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:14