Discord.py Userinfo 命令错误:在 embed.fields.2.value 中:此字段为必填项

Posted

技术标签:

【中文标题】Discord.py Userinfo 命令错误:在 embed.fields.2.value 中:此字段为必填项【英文标题】:Discord.py Userinfo Command error: In embed.fields.2.value: This field is required 【发布时间】:2021-04-14 13:46:53 【问题描述】:

我的 userinfo 命令有问题。

这是我的命令代码:

@client.command()
async def userinfo(ctx , member: discord.Member = None):
    
    member = ctx.author if not member else member
    roles = [role for role in member.roles if role.name != '@everyone']
    
    
    uiembed = discord.Embed(description = member.mention, timestamp = ctx.message.created_at , color = 0x146da8)
    uiembed.set_author(name = f'member' , icon_url = member.avatar_url)
    
    developer = (530894795384815616 , 619621027873423360)
    
    uiembed.set_thumbnail(url=member.avatar_url)
    uiembed.set_footer(text=f"ID:member.id" , icon_url = "https://media.discordapp.net/attachments/788938397568991234/790040765346217984/unknown.png")
    
    uiembed.add_field(name = 'Joined' , value = member.joined_at.strftime("%a, %b %d, %Y %I:%M %p"))
    uiembed.add_field(name = 'Registered' , value = member.created_at.strftime("%a, %b %d, %Y %I:%M %p") , inline = True)
    
    uiembed.add_field(name = f'Roles (len(roles))' , value = ''.join([role.mention for role in roles[1:]][::-1]) , inline = False)
    uiembed.add_field(name = 'Key permissions' , value = "Coming soon" , inline = False)
    
    if member == ctx.guild.owner and developer:
        uiembed.add_field(name = 'Acknowledgements' , value = 'Owner , Developer')
        
    elif member.id == ctx.guild.owner:
        uiembed.add_field(name = 'Acknowledgements' , value = 'Owner')
        
    elif member.id in developer:
        uiembed.add_field(name = 'Acknowledgements' , value = 'Developer')
        
    else:
        pass
    
    
    await ctx.send(embed = uiembed)

这是我过去 2 天遇到的错误:

Traceback (most recent call last):
  File "/home/fakeblob/.local/lib/python3.7/site-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/home/fakeblob/.local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/home/fakeblob/.local/lib/python3.7/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body
In embed.fields.2.value: This field is required

如果你能帮我解决这个错误,那对我来说真的很重要。

【问题讨论】:

您提供的代码没有问题,请添加创建嵌入的全过程 @ŁukaszKwieciński 我更新了代码,它显示了整个事情。 【参考方案1】:

您不能在添加的字段中使用空字符串作为 namevalue

问题在于这一行:

uiembed.add_field(name=..., value=''.join([role.mention for role in roles[1:]][::-1]), inline=...)

如果用户除了默认角色之外只有 1 个角色,那么您所做的列表理解将为空。 这意味着.join(... 将返回一个空字符串:'',正如我之前提到的,它会引发您所看到的错误:

>>> ''.join([])
''

有几种方法可以解决这个问题,但归根结底,无论如何你都希望有一个价值。 你如何处理这取决于你,但我个人会这样做:

role_mentions = [role.mentions for role in roles[1:]][::-1]
text = "Nothing was found..." if len(role_mentions) == 0 else ', '.join(role_mentions)

uiembed.add_field(name=..., value=text, inline=...)

我不确定您添加的拼接 ([1:]) 是否出于其他原因,但如果用户至少有一个除@everyone 之外的角色,这也可以解决问题。

我还添加了 , 作为加入字符以供偏好,但请随意删除它。

【讨论】:

我的删除声明,只会删除@everyone,因为它看起来很丑 如果我理解你在说什么,那么你之前所做的列表理解已经去掉了@everyone,这意味着你不需要添加[1:] on已将其排除在外的列表。

以上是关于Discord.py Userinfo 命令错误:在 embed.fields.2.value 中:此字段为必填项的主要内容,如果未能解决你的问题,请参考以下文章

找不到命令“ping”错误 discord.py

如何将错误添加到特定命令 discord.py

Discord.py - 重新启动命令错误 - RuntimeError:事件循环已关闭

当用户是角色 discord.py 时,头像命令给出错误

如何获取在 discord.py 中引发错误的命令名称?

discord.py - 出现 MissingRequiredArgument 错误时显示正确的命令语法