You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:48:15