Discord.py — 尝试禁止用户后出现 UserNotFound 错误

Posted

技术标签:

【中文标题】Discord.py — 尝试禁止用户后出现 UserNotFound 错误【英文标题】:Discord.py — UserNotFound error after attempting to ban user 【发布时间】:2021-01-29 06:21:25 【问题描述】:

我正在尝试设计一个 Discord 机器人,如果我在主服务器上禁止用户,它可以在我的两个不同服务器上禁止用户。在测试到目前为止的进度时,一切似乎都有效,直到实际禁止用户。没有出现错误,但用户没有被禁止。当我再次尝试测试时,我不断收到 UserNotFound 错误。我重新启动了机器人,将它和测试对象用户重新添加到两台服务器,并尝试清除缓存,但机器人似乎仍然无法识别用户的存在。

这是禁止命令的代码:

async def totalban(ctx, userID):
    if ctx.message.author.guild_permissions.administrator: # check if admin
        if ctx.guild.id == GUILD_ID: # if admin, check if right guild
            await ctx.send('Confirmed administrator on proper server.')
            time.sleep(1)
            global TARGET_ID
            TARGET_ID = int(userID) # record target user ID
            converter = UserConverter()
            user = await converter.convert(ctx, userID) # convert arg to User
            username = user.name + '#' + user.discriminator # easy reference in Name#1234 format
            global TARGET_USERNAME
            TARGET_USERNAME = username
            await ctx.send('User ID ' + userID + ' corresponds to ' + username + '.')
            time.sleep(1)
            await ctx.send('To confirm ban of ' + username + ', type **!confirmtotalban ' + username + '** now.')
            global CANCONFIRMBAN
            CANCONFIRMBAN = True # allow !confirmtotalban command to function
        else:
            await ctx.send('Cannot run command from this server.')
    else:
        await ctx.send('User unauthorized to run command.')

这是我在尝试禁止测试帐户时运行的功能:

(如果有任何帮助,我在运行此代码之前从未遇到过 UserNotFound 错误。)

async def banloop(ctx):
    global TARGET_ID
    for guild in ctx.bot.guilds:
        await guild.ban(TARGET_ID)

这是回溯:

Traceback (most recent call last):
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "...\example_bot.py", line 41, in totalban
    user = await converter.convert(ctx, userID) # convert arg to User
  File "...\Programs\Python\Python38\lib\site-packages\discord\ext\commands\converter.py", line 194, in convert
    raise UserNotFound(argument)
discord.ext.commands.errors.UserNotFound: User "165995850303012864" not found.

提前感谢您提供的任何帮助,如果您需要我提供更多信息,请告诉我。

【问题讨论】:

我没有详细查看您的代码,但您是否确保机器人有权禁止它们,因为这让我困扰了半周 是的,该机器人已被添加到具有禁止权限的两个服务器中。 这个玩家的等级是否高于机器人在服务器角色中的等级,我遇到的另一个问题 不,我认为它们实际上是一样的。 使用全局变量可能是问题的一部分,因为全局变量倾向于使代码很难调试。这是唯一修改 TARGET_ID 的位置吗? 【参考方案1】:
 TARGET_ID = int(userID) # record target user ID

如果我理解正确,您可以在此处将 userID 转换为整数。然而,

discord.ext.commands.errors.UserNotFound: User "165995850303012864" not found.

目标 ID 在错误中显示为字符串。你可能想检查一下。

【讨论】:

不幸的是,这似乎不是问题。该程序显然可以识别任何其他用户,但不是我最初试图禁止的用户。 您是否尝试过将 Discord.member 作为参数并尝试以这种方式执行您的禁令命令?【参考方案2】:

回溯中的错误是抱怨您的totalban() 函数中的UserConverter.convert() 调用会产生UserNotFound 错误。因为这个函数调用会导致错误,这意味着CANCONFIRMBAN 永远不会被设置为true,这就解释了为什么没有人最终会被禁止。

根据documentation,UserConverter.convert() 接受字符串参数。您确定totalban() 中的userID 参数是字符串而不是整数值吗?

还有关于UserConverter 如何将值转换为用户对象的注释:

所有查找都通过全局用户缓存。

你确定机器人的内部缓存已经准备好了吗?

fetch_offline_members 是否设置为 False?这极大地限制了机器人的功能,并可能导致无法做很多事情。

您是否尝试过使用 name#discrim 而不是用户 ID 调用函数?

如果没有更多信息,很难确定地帮助解决问题。

【讨论】:

感谢您迄今为止的帮助。您如何建议检查内部缓存是否已准备好? @yellowlightgreen 尝试调用 ctx.bot.is_ready() 并在转换前打印出来。 另外,请考虑尝试让您的朋友拥有比机器人略低的权限,并检查这是否会使错误消失。

以上是关于Discord.py — 尝试禁止用户后出现 UserNotFound 错误的主要内容,如果未能解决你的问题,请参考以下文章

discord.py - 如何添加踢/禁止原因?

禁止命令 discord.py 的问题(重写分支)

用户执行命令后,如何删除 discord.py 中的消息?

Discord.py禁止命令

如何使用 discord.py 获取不和谐用户的用户 ID

如何在 discord.py 中设置禁止命令而不禁止管理员?