Discord机器人添加工单用户时触发discord.errors.NotFound错误求助
解决Discord机器人添加用户到工单频道的404错误
问题重现
我编写了一段Discord机器人代码,通过模态框将指定ID的用户添加至工单频道并赋予权限:
class Adduser(discord.ui.Modal, title="add"): answer = ui.TextInput(label = "ID de l'utilisateur à ajouter au ticket", style = discord.TextStyle.short, placeholder = "ID", required= True) def __init__(self, channel): self.channel = channel super().__init__(timeout=None) async def on_submit(self, interaction: discord.Interaction, user=answer): member = await interaction.guild.fetch_member(user) if "ticket-de-" in interaction.channel.name: await interaction.channel.set_permissions(member, view_channel=True, send_messages=True, attach_files=True, embed_links=True)
运行时触发404错误:
2022-11-18 08:35:47 ERROR discord.ui.modal Ignoring exception in modal <Adduser timeout=None children=1>: Traceback (most recent call last): File "C:\Users\Distool - User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\ui\modal.py", line 186, in _scheduled_task await self.on_submit(interaction) File "C:\Users\Distool - User\distool\env\scripts\bot.py", line 422, in on_submit member = await interaction.guild.fetch_member(user) File "C:\Users\Distool - User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\guild.py", line 2094, in fetch_member data = await self._state.http.get_member(self.id, member_id) File "C:\Users\Distool - User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\discord\http.py", line 740, in request raise NotFound(response, data) discord.errors.NotFound: 404 Not Found (error code: 0): 404: Not Found
确认目标用户在服务器内,但机器人仍无法找到该用户。
错误原因分析
- 参数定义错误:
on_submit方法的user=answer参数无效,answer是类的TextInput实例,不能直接作为默认参数传递;正确的做法是从self.answer.value获取用户输入的ID字符串。 - 类型不匹配:
fetch_member需要整数类型的用户ID,直接传递输入的字符串会导致API请求失败。 - 权限/缓存缺失:机器人可能未启用
Server Members Intent,或缺少Manage Channels权限,导致无法通过API获取成员信息。
修复后的代码
class Adduser(discord.ui.Modal, title="add"): answer = ui.TextInput( label="ID de l'utilisateur à ajouter au ticket", style=discord.TextStyle.short, placeholder="ID", required=True ) def __init__(self, channel): self.channel = channel super().__init__(timeout=None) async def on_submit(self, interaction: discord.Interaction): # 获取用户输入的ID并转换为整数 try: user_id = int(self.answer.value.strip()) except ValueError: await interaction.response.send_message("ID invalide, veuillez entrer un nombre entier.", ephemeral=True) return # 先尝试从缓存获取成员,避免API请求 member = interaction.guild.get_member(user_id) if not member: try: member = await interaction.guild.fetch_member(user_id) except discord.errors.NotFound: await interaction.response.send_message("Utilisateur non trouvé sur ce serveur.", ephemeral=True) return # 检查是否为工单频道并设置权限 if "ticket-de-" in interaction.channel.name: await interaction.channel.set_permissions( member, view_channel=True, send_messages=True, attach_files=True, embed_links=True ) await interaction.response.send_message(f"Utilisateur <@{user_id}> ajouté au ticket avec succès.", ephemeral=True) else: await interaction.response.send_message("Cette commande ne peut être utilisée que dans un canal de ticket.", ephemeral=True)
额外注意事项
- 启用特权网关意图:前往Discord开发者门户,在机器人选项卡开启
Server Members Intent,并确保机器人代码中启用了该意图:intents = discord.Intents.default() intents.members = True bot = discord.Bot(intents=intents) - 权限配置:确保机器人拥有
Manage Channels权限,能够修改频道权限。 - 错误反馈:添加了输入验证和错误提示,提升用户体验的同时便于排查问题。
内容的提问来源于stack exchange,提问作者Valentin Renaut
相关产品推荐
相关产品推荐

