Telethon中自动转换高级Emoji至对应ID的技术方案问询
自动识别并发送Telegram高级Emoji的Telethon实现方案
我开发的Telegram机器人通过Telethon客户端转发用户输入文本,账号已开通Telegram Premium,但发送时高级Emoji会被转换为普通版本。官方文档提供的方案要求用户以[❤️](emoji/10002345)格式手动指定Emoji ID,操作繁琐;硬编码Emoji与ID的映射表又因数量庞大效率低下,现需要自动识别用户输入的高级Emoji并正确发送的实现方案。
核心思路
通过Telethon API获取当前账号已安装的所有Premium Emoji的字符与对应Document ID映射,在消息解析阶段自动识别文本中的高级Emoji并添加对应的实体,无需用户手动输入ID。
步骤1:获取Premium Emoji映射表
在客户端初始化完成后,调用Telegram API获取所有Premium Emoji集合,构建字符到Document ID的映射字典并缓存,避免重复请求:
from telethon import TelegramClient, types from telethon.tl.functions.messages import GetAllStickersRequest async def get_premium_emoji_map(client): # 获取Premium Emoji贴纸集 result = await client(GetAllStickersRequest(types.InputStickerSetPremiumEmojis())) emoji_map = {} for sticker_set in result.sets: for doc in sticker_set.documents: # 提取每个高级Emoji的字符与对应的document_id for attribute in doc.attributes: if isinstance(attribute, types.DocumentAttributeSticker): emoji = attribute.alt emoji_map[emoji] = doc.id break return emoji_map
步骤2:修改自定义Markdown解析类
在原有Markdown解析逻辑基础上,添加自动识别高级Emoji的逻辑,扫描文本中的字符并匹配映射表,生成对应的MessageEntityCustomEmoji实体:
from telethon.extensions import markdown class AutoEmojiMarkdown: def __init__(self, emoji_map): self.emoji_map = emoji_map def parse(self, text): # 先处理原有的Markdown实体(粗体、链接、剧透等) text, entities = markdown.parse(text) new_entities = [] # 遍历文本,识别并添加高级Emoji实体 i = 0 while i < len(text): char = text[i] if char in self.emoji_map: doc_id = self.emoji_map[char] new_entities.append(types.MessageEntityCustomEmoji(i, 1, doc_id)) i += 1 else: i += 1 # 合并所有实体并按偏移量排序 all_entities = sorted(entities + new_entities, key=lambda x: x.offset) return text, all_entities def unparse(self, text, entities): # 保留原有的反向解析逻辑,用于读取消息时转换为Markdown格式 for i, e in enumerate(entities or []): if isinstance(e, types.MessageEntityCustomEmoji): entities[i] = types.MessageEntityTextUrl(e.offset, e.length, f'emoji/{e.document_id}') if isinstance(e, types.MessageEntitySpoiler): entities[i] = types.MessageEntityTextUrl(e.offset, e.length, 'spoiler') return markdown.unparse(text, entities)
步骤3:客户端初始化与使用
启动客户端后获取映射表,设置自定义解析模式,后续发送消息时直接传入用户输入的文本即可:
# 替换为你的API信息 client = TelegramClient('session_name', your_api_id, your_api_hash) async def main(): await client.start() # 获取并缓存Premium Emoji映射 emoji_map = await get_premium_emoji_map(client) # 设置自定义解析模式 client.parse_mode = AutoEmojiMarkdown(emoji_map) # 测试发送:用户直接输入高级Emoji即可 await client.send_message('me', '这是高级Emoji测试:❤️🎉🔥') if __name__ == '__main__': import asyncio asyncio.run(main())
关键说明
- 映射表仅需在客户端启动时获取一次,后续复用即可,避免频繁API请求
- 自动识别所有账号已安装的Premium Emoji,无需手动维护映射表
- 保留原有的Markdown格式支持(粗体、链接、剧透文本等)
- 若账号新增Premium Emoji包,重启客户端即可更新映射表
内容的提问来源于stack exchange,提问作者MoXiTo
相关产品推荐
相关产品推荐

