Telegram全局搜索群组返回结果受限,如何获取更多/全部群组?
Telegram全局搜索群组获取更多结果的解决方案
问题分析
你遇到的有限结果和重复数据问题,主要来自两方面:一是Telegram服务器对messages.searchGlobal接口的结果数量有防滥用限制;二是现有代码的分页逻辑和结果处理存在错误。
关键问题修正
- 分页判断错误:原代码用
flags == Messages_MessagesSlice.Flags.has_next_rate,正确逻辑应该是检查flags是否包含该标志位(用HasFlag方法) - 结果未合并:每次循环只处理当前页结果,没有累积到总集合中
- 未去重:Telegram分页返回的结果可能包含重复群组,需要根据聊天ID去重
正确实现代码
// 初始化存储去重后群组的集合 var allGroups = new List<Chat>(); int? nextRate = null; bool hasNextPage = true; while (hasNextPage) { // 调用全局搜索API,传入分页参数 var searchResult = await client.Messages_SearchGlobal("Keyword", limit: 20, offset_rate: nextRate); if (searchResult is Messages_MessagesSlice resultSlice) { // 提取当前页的群组 var currentPageGroups = resultSlice.chats .Where(kv => kv.Value.IsGroup) .Select(kv => kv.Value) .ToList(); // 去重并添加到总集合 foreach (var group in currentPageGroups) { if (!allGroups.Any(g => g.Id == group.Id)) { allGroups.Add(group); } } // 检查是否还有下一页 hasNextPage = resultSlice.flags.HasFlag(Messages_MessagesSlice.Flags.has_next_rate); // 更新下一页的offset参数 nextRate = resultSlice.next_rate; } else { hasNextPage = false; } // 可选:添加1秒延迟,避免请求过于频繁触发限流 await Task.Delay(1000); } // allGroups即为最终获取到的去重群组列表
重要注意事项
- 服务器硬限制:Telegram不会返回全部相关群组,这是官方的防滥用机制,即便正确分页,也只能获取服务器允许的最大结果量(远多于默认的5个)
- 去重必要性:不同分页请求可能返回重复的聊天项,必须通过聊天ID去重
- 限流防护:频繁请求会触发Telegram的限流机制,建议添加适当延迟,避免账号受限
内容的提问来源于stack exchange,提问作者Moslem7026
相关产品推荐
相关产品推荐

