非常游戏网
如何在 discord.py 中正确匹配心形表情符号(❤️)以触发自动回复反应

如何在 discord.py 中正确匹配心形表情符号(❤️)以触发自动回复反应

2026-05-29日常编程106479

在 discord.py 中,用户添加 ❤️ 表情时 emo.emoji 实际返回的是带变体选择符的 Unicode 序列(如 '❤️'),而非基础字符 '❤',直接用 == '❤' 比较会失败;需统一使用带变体的选择符版本或标准化处理。

在 discord.py 中,用户添加 ❤️ 表情时 `emo.emoji` 实际返回的是带变体选择符的 unicode 序列(如 `'❤️'`),而非基础字符 `'❤'`,直接用 `== '❤'` 比较会失败;需统一使用带变体的选择符版本或标准化处理。

Discord 对心形等表情符号采用 Unicode 变体序列(Emoji Variation Sequence)进行渲染:基础符号 U+2764(❤)加上变体选择符-16(U+FE0F)组合成标准显示形式 '❤️'(即 '\u2764\uFE0F')。而 emo.emoji 在绝大多数情况下返回的就是该完整序列,因此与纯 '❤'(\u2764)字面量比较必然为 False。

✅ 正确做法是使用带变体的标准心形 emoji 字符串:

@bot.event
async def on_reaction_add(reaction, user):
    # 注意:此处使用 '❤️'(含 U+FE0F),而非 '❤'
    if str(reaction.emoji) == '❤️':
        await reaction.message.add_reaction(reaction.emoji)

? 验证方式(调试建议):

print(repr(reaction.emoji))  # 输出类似 "'❤️'",明确显示是否含 \uFE0F
print(len(str(reaction.emoji)))  # '❤️' 长度为 2,'❤' 长度为 1

⚠️ 注意事项:

  • 不要依赖 str(emo.emoji) == '\u2764' 或 == '❤' —— 它们在 Discord API 中几乎从不匹配;
  • 避免手动拼接 '\u2764\uFE0F',直接复制粘贴 '❤️' 更可靠(确保编辑器/IDE 保存为 UTF-8);
  • 若需兼容多种写法(如用户可能发送无变体的旧版 ❤),可做归一化处理(推荐仅在必要时):
    import unicodedata
    normalized = unicodedata.normalize('NFC', str(reaction.emoji))
    if normalized in ['❤', '❤️']:
        # 处理逻辑

? 总结:Discord 的 emoji 字段始终返回语义完整的标准变体序列。开发中应以 repr() 观察真实值,并优先采用复制粘贴的可视 emoji(如 '❤️')进行精确匹配,这是最简洁、健壮且符合 Discord 实际行为的实践方式。