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

如何通过icon_emoji_id获取Telegram论坛主题自定义表情?ASP.NET Core技术求助

解决方案

思路正确性分析

你的核心思路方向是对的——通过Messages_GetCustomEmojiDocuments接口获取自定义表情的详细信息,但存在两个关键问题:

  • 循环内重复调用接口,会产生不必要的网络请求,降低性能;
  • 未对返回的DocumentBase[]进行类型转换,无法访问Document类的详细属性;
  • 接口参数传入错误:Messages_GetCustomEmojiDocuments应该接收自定义表情ID数组,而非频道ID。

可行解决方案

步骤1:批量收集需要的自定义表情ID

先遍历所有论坛主题,收集所有非0的icon_emoji_id,去重后批量请求,避免重复调用接口。

步骤2:批量获取自定义表情文档

调用接口时传入收集到的表情ID数组,一次性获取所有需要的文档数据。

步骤3:类型转换获取详细信息

DocumentBase是Document的基类,通过LINQ的OfType<Document>()方法可以筛选出真正的Document实例,从而访问表情的文件路径、尺寸等详细属性。

修正后的代码示例

var forums = await WT.Client.Channels_GetForumTopics((Channel)subChat.Value);
if (forums != null)
{
    t.Topics = forums;
    // 收集所有非0且去重的自定义表情ID
    var emojiIds = forums.topics
        .Where(topic => topic.icon_emoji_id != 0)
        .Select(topic => topic.icon_emoji_id)
        .Distinct()
        .ToArray();

    if (emojiIds.Any())
    {
        // 批量获取自定义表情文档(传入表情ID数组)
        var emojiDocumentsBase = await WT.Client.Messages_GetCustomEmojiDocuments(emojiIds);
        // 转换为Document类型并构建ID映射字典
        var emojiDocMap = emojiDocumentsBase.OfType<Document>().ToDictionary(doc => doc.ID);

        // 将表情文档关联到对应论坛主题
        foreach (var forum in forums.topics)
        {
            if (forum.icon_emoji_id != 0 && emojiDocMap.TryGetValue(forum.icon_emoji_id, out var emojiDoc))
            {
                // 这里可将emojiDoc赋值给forum的自定义属性,方便后续视图展示
                // 例如:forum.IconDocument = emojiDoc;
            }
        }
    }
}
else
{
    t.Topics = null;
}

关键说明

  • 接口参数修正:必须传入自定义表情ID数组,而非频道ID,否则返回的文档数据会不符合预期;
  • 类型转换安全:OfType<Document>()会自动过滤掉非Document类型的基类实例,避免强制转换异常;
  • 性能优化:批量请求+字典映射,大幅减少网络请求次数,提升主题与表情的匹配效率。

内容的提问来源于stack exchange,提问作者Angus Mack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:22:55