如何通过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
相关产品推荐
相关产品推荐

