如何使用WTelegramClient获取Telegram群组主题的完整消息?
使用WTelegramClient获取Telegram群组主题完整消息
首先明确:Telegram的群组主题(Forum Topic)仅存在于**超级群(Supergroup)**中,操作前需确认目标聊天为超级群类型。以下是具体实现步骤:
核心操作流程
- 获取目标超级群的
Chat对象,可通过聊天ID或用户名定位 - 定位目标主题:已知
topic_id可直接匹配,也可遍历超级群的topics列表按标题查找 - 调用
GetHistory方法,通过top_msg_id参数限定拉取指定主题的消息 - 处理分页逻辑:Telegram API单次返回消息数量有限,需循环拉取直至获取全部内容
代码示例
using WTelegramClient; using TL; // 初始化客户端(替换为你的API配置:api_id、api_hash、session文件路径等) var client = new WTelegram.Client(Config); // 1. 获取目标超级群Chat对象(示例用超级群ID,也可传入用户名如"@my_supergroup") var chat = await client.GetChatAsync(-1001234567890); if (chat is not ChatSupergroup supergroup) { Console.WriteLine("该聊天不支持主题功能(需为超级群)"); return; } // 2. 定位目标主题(示例通过topic_id匹配,也可按topic.title筛选) int targetTopicId = 123; var targetTopic = supergroup.topics.FirstOrDefault(t => t.id == targetTopicId); if (targetTopic == null) { Console.WriteLine("未找到指定主题"); return; } // 3. 循环拉取主题全部消息 var allTopicMessages = new List<Message>(); int offsetId = 0; while (true) { var history = await client.Messages_GetHistory( peer: supergroup, offset_id: offsetId, limit: 100, // 单次拉取最大数量,可调整 top_msg_id: targetTopicId // 关键参数:指定拉取该主题的消息 ); if (history.messages.Count == 0) break; // 无更多消息时终止循环 allTopicMessages.AddRange(history.messages.OfType<Message>()); offsetId = history.messages.Last().id; // 更新偏移量,用于下一页拉取 } // 输出结果示例 Console.WriteLine($"共获取{allTopicMessages.Count}条主题消息"); foreach (var msg in allTopicMessages) { Console.WriteLine($"{msg.date:yyyy-MM-dd HH:mm:ss} | {msg.message}"); }
注意事项
- 确保API账号已加入目标超级群,拥有消息查看权限
- 若消息量极大,建议在循环中添加短暂延迟,避免触发Telegram频率限制
- 不要遗漏
top_msg_id参数,否则会拉取整个超级群的所有消息而非指定主题
内容的提问来源于stack exchange,提问作者Alireza Alavi
相关产品推荐
相关产品推荐

