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

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

确认目标用户在服务器内,但机器人仍无法找到该用户。

错误原因分析

  1. 参数定义错误:on_submit方法的user=answer参数无效,answer是类的TextInput实例,不能直接作为默认参数传递;正确的做法是从self.answer.value获取用户输入的ID字符串。
  2. 类型不匹配:fetch_member需要整数类型的用户ID,直接传递输入的字符串会导致API请求失败。
  3. 权限/缓存缺失:机器人可能未启用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:45:25