Discord.js 如何检测消息是否包含Emoji 用于投票机器人功能开发
Discord机器人Emoji开头检测实现方案
问题根因
你遇到的匹配失效问题是没有覆盖Discord生态内所有的Emoji呈现形式,你的用户输入的选项可能包含三类Emoji,需要同时匹配:
- 原生Unicode Emoji:用户直接输入的可视化表情(如✅),无特殊前缀
- Discord短码Emoji:形如
:white_check_mark:的冒号包裹的短码 - Discord自定义Emoji:静态格式为
<:emoji名称:emoji数字ID>,动态GIF格式为<a:emoji名称:emoji数字ID>
核心实现逻辑
用组合正则直接匹配消息开头的有效Emoji,以下为Python(discord.py)示例:
import re # 组合正则,同时匹配三类Emoji开头 EMOJI_REGEX = re.compile( r"^(" r"<a?:\w+:\d+>|" # 匹配自定义动/静态Emoji r":\w+:|" # 匹配短码格式Emoji r"[\U0001F1E0-\U0001F1FF\U0001F300-\U0001F5FF\U0001F600-\U0001F64F\U0001F680-\U0001F6FF\U0001F700-\U0001F77F\U0001F780-\U0001F7FF\U0001F800-\U0001F8FF\U0001F900-\U0001F9FF\U0001FA00-\U0001FA6F\U0001FA70-\U0001FAFF\U00002702-\U000027B0\U000024C2-\U0001F251]" # 匹配原生Unicode Emoji r")" ) def get_start_emoji(message_content: str): # 先去除消息首尾空白字符再匹配 match_result = EMOJI_REGEX.match(message_content.strip()) if match_result: # 返回匹配到的Emoji内容,可直接用于添加反应 return match_result.group(1) return None
适配注意事项
- 如果你使用discord.js等其他语言的开发库,直接平移正则规则即可,规则跨语言通用
- 匹配到的短码Emoji可以直接传给对应库的
add_reaction方法,Discord官方库会自动完成短码到原生表情的转换 - 自定义Emoji需要确保机器人在该Emoji归属的服务器内,否则无法添加反应,可以在调用添加反应的逻辑外层加异常捕获,避免无效Emoji导致程序崩溃
内容的提问来源于stack exchange,提问作者staubigerkaktus
相关产品推荐
相关产品推荐

