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

Discord狼人杀机器人触发403权限缺失错误(50013)的修复

Discord狼人杀机器人权限错误(403 Forbidden/50013)修复方案

问题背景

开发《米勒山谷狼人》Discord机器人,通过9个专属角色(命名为1-9)实现玩家频道权限隔离。执行角色分配、频道权限覆盖操作时,尽管已配置正确Scopes、机器人拥有管理员权限且角色层级高于目标角色,仍触发403 Forbidden (error code: 50013): Missing Permissions错误。

报错日志

2024-10-25 00:03:37 INFO     discord.client logging in using static token
2024-10-25 00:03:38 INFO     discord.gateway Shard ID None has connected to Gateway (Session ID: 9ffd92e484c54602bf4d2fcd50893267).
Creating roles
Deleting roles on users
[<Role id=1195679159821799444 name='@everyone'>, <Role id=1239274286880133123 name='Machine_control'>, <Role id=1220862610266783806 name='9'>, <Role id=1220862606789836831 name='8'>, <Role id=1220862604390432778 name='7'>, <Role id=1220862584001925193 name='6'>, <Role id=1220862581753909288 name='5'>, <Role id=1220862578280890420 name='4'>, <Role id=1220862575957246072 name='3'>, <Role id=1220862573004460177 name='2'>, <Role id=1220862570022436914 name='1'>, <Role id=1299129640807432195 name='DisDawn'>]
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
403 Forbidden (error code: 50013): Missing Permissions
Attributing roles
[<Role id=1195679159821799444 name='@everyone'>, <Role id=1239274286880133123 name='Machine_control'>, <Role id=1220862610266783806 name='9'>, <Role id=1220862606789836831 name='8'>, <Role id=1220862604390432778 name='7'>, <Role id=1220862584001925193 name='6'>, <Role id=1220862581753909288 name='5'>, <Role id=1220862578280890420 name='4'>, <Role id=1220862575957246072 name='3'>, <Role id=1220862573004460177 name='2'>, <Role id=1220862570022436914 name='1'>, <Role id=1299129640807432195 name='DisDawn'>]
[<Role id=1220862610266783806 name='9'>, <Role id=1220862570022436914 name='1'>, <Role id=1220862581753909288 name='5'>, <Role id=1220862606789836831 name='8'>, <Role id=1220862578280890420 name='4'>, <Role id=1239274286880133123 name='Machine_control'>, <Role id=1220862584001925193 name='6'>, <Role id=1220862575957246072 name='3'>, <Role id=1220862604390432778 name='7'>, <Role id=1220862573004460177 name='2'>]
ERROR:root:
Traceback (most recent call last):
  File "c:\Users\stard\OneDrive\Documents\code\Digi\Discord bot\v2\BOT.py", line 128, in start_game
    await game.assign_roles(ctx)
  File "c:\Users\stard\OneDrive\Documents\code\Digi\Discord bot\v2\Werewolf_game.py", line 104, in assign_roles
    await player.discord.add_roles(r)
  File "C:\Users\stard\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\discord\member.py", line 1051, in add_roles
    await req(guild_id, user_id, role.id, reason=reason)
  File "C:\Users\stard\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\discord\http.py", line 739, in request
    raise Forbidden(response, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

相关代码片段

reset函数

async def reset(self, ctx: discord.ext.commands.Context):
        print("Deleting roles on users")
        overwrite = discord.PermissionOverwrite()
        overwrite.view_channel = False

        roles = list(ctx.guild.roles)
        print(roles)
        for element in roles:
            if element.name not in ["1","2","3","4","5","6","7","8","9"]:
                roles.remove(element)

        for role in roles:
            await self.werewolf_channel.set_permissions(role, overwrite=overwrite)
            await self.specials_channel.set_permissions(role, overwrite=overwrite)

        for user in self.player_list:
            for role in roles:
                try:
                    await user.discord.remove_roles(role)
                except Exception as error:
                    print(error)

assign_roles函数

async def assign_roles(self, ctx: discord.ext.commands.Context):
        print("Attributing roles")
        werewolf_channel = self.werewolf_channel
        specials_channel = self.specials_channel

        roles = list(ctx.guild.roles)
        print(roles)
        
        for element in roles:
            if element.name not in ["1","2","3","4","5","6","7","8","9"]:
                roles.remove(element)
        random.shuffle(roles)
        print(roles)

        for index, player in enumerate(self.player_list):
            r = roles[index]
            if player.role == "werewolf":
                await player.discord.add_roles(r)
                overwrite = discord.PermissionOverwrite()
                overwrite.read_message_history = False
                await werewolf_channel.set_permissions(r, overwrite=overwrite)

            if player.role in ["president", "cupidon", "hunter", "witch", "stealer"]:
                await player.discord.add_roles(r)
                overwrite = discord.PermissionOverwrite()
                overwrite.read_message_history = False
                await specials_channel.set_permissions(r, overwrite=overwrite)

            else:
                await player.discord.add_roles(r)

权限配置说明

  • 已确认Scopes配置正确,机器人拥有管理员及Manage Roles权限;
  • 机器人角色DisDawn的层级高于所有目标角色;
  • 代码中已配置必要的Intents:
intents = discord.Intents.default()
intents.message_content = True
intents.reactions = True
intents.members = True
overwrite = discord.PermissionOverwrite()
overwrite.read_messages = False
overwrite.manage_channels = True
overwrite.manage_roles = True
bot = commands.Bot(command_prefix="!", intents=intents, overwrite=overwrite)

修复方案

1. 修复角色筛选逻辑

遍历列表时直接调用remove()会导致列表索引混乱,跳过部分元素。从日志可见,筛选后的角色列表混入了Machine_control角色,机器人没有权限操作该角色,从而触发403错误。

将角色筛选代码替换为列表推导式,确保只保留目标角色:

# 替换原来的for循环删除逻辑
roles = [r for r in ctx.guild.roles if r.name in {"1","2","3","4","5","6","7","8","9"}]

2. 移除Bot初始化的无效参数

commands.Bot构造函数没有overwrite参数,该配置完全无效,直接删除相关代码:

intents = discord.Intents.default()
intents.message_content = True
intents.reactions = True
intents.members = True
# 删除以下无效代码块
# overwrite = discord.PermissionOverwrite()
# overwrite.read_messages = False
# overwrite.manage_channels = True
# overwrite.manage_roles = True
bot = commands.Bot(command_prefix="!", intents=intents)

3. 验证机器人角色层级

确保机器人角色DisDawn在服务器角色列表中位置高于所有1-9角色(Discord角色层级从上到下递减,上方角色权限优先级更高)。如果机器人角色在目标角色下方,即使拥有管理员权限,也无法操作这些角色。

4. 优化角色操作效率

批量操作角色减少API调用,比如删除用户角色时可以一次传入所有目标角色:

# 替换原来的嵌套循环删除
for user in self.player_list:
    await user.discord.remove_roles(*roles)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:25:54