@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
相关产品推荐
相关产品推荐

