如何在 Discord.py 中获取自定义表情符号计数?
Patrick Haugh 的 answer 适用于原生表情符号,但我想添加一个额外的答案来解释为自定义表情符号获取 count 属性,因为 Discord.py 以不同方式定义这些属性。该解决方案本身很容易应用,如果您不想阅读说明,可以跳到下面的解决方案示例。
自定义表情符号反应的emoji 属性包含一组嵌套的属性,而不是原生表情符号具有的单个值。假设使用名为kirby 的自定义表情符号有反应。如果你要打印message.reactions,它会输出类似这样的东西(假设你已经正确定义了message):
[<Reaction emoji='?' me=True count=1>, <Reaction emoji=<Emoji id=900000000123456789 name='kirby' animated=False managed=False> me=False count=1>]
第一反应是将表情符号本身作为属性emoji。
因此,当您调用 get(message.reactions, emoji=payload.emoji.name) 时,它只是传递如下值:get(message.reactions, emoji='?')
现在查看名为kirby 的自定义表情符号的emoji 属性。这里没有使用表情符号作为值,您将看到嵌套的四个属性作为emoji 属性的值。属性为id、name、animated、managed。您的自定义表情符号仅存在于您的服务器上。这意味着您不能像使用原生表情符号那样简单地将表情符号粘贴到您的机器人代码中。
您也不能像 payload.emoji.name 那样单独传递 name 值。在get() 实用程序中传递emoji='kirby 将导致它返回None,因为它无法匹配emoji 属性中的kirby。
如果没有找到与传递的属性匹配的内容,则 None 是
返回。1
解决方案
我发现的最简单的方法是删除 .name 属性,然后将 payload.emoji 作为您的值传递。 Discord.py 似乎更喜欢使用此名称:自定义表情符号的 id 格式。在此示例中,get() 会将 emoji 属性与嵌套值字符串 <kirby:900000000123456789> 匹配
现在get() 实用程序将能够匹配并返回包含您要使用的count 属性的反应。这个例子假设你已经定义了message:
if payload.emoji.name == 'kirby':
# payload.emoji will be defined as <kirby:900000000123456789>
reaction = discord.utils.get(message.reactions, emoji=payload.emoji)
# Now you can get reaction.count for the custom emoji!
print(f'The reaction count for this custom emoji is: {reaction.count}.')