如何利用Telegram API验证指定用户是否为目标群组成员?
解决Kotlogram中检查用户是否为群组成员的问题
嘿,我懂你现在的困惑——client.contactsSearch(@groupname)返回空完全是用错方法啦!这个API是用来搜索你的私人联系人列表的,不是找群组的,所以搜群组名肯定得不到结果。下面给你一步步捋清楚正确的操作流程:
第一步:获取目标群组的Channel对象
要操作群组,首先得通过群组的username拿到它的核心信息。用contactsResolveUsername方法就能解析任何公开的用户名(包括群组、频道、用户),代码示例:
import org.drinkless.td.libcore.telegram._ import org.drinkless.td.libcore.telegram.api._ import org.drinkless.td.libcore.telegram.objects._ // 解析群组用户名,替换成你的目标群组@username val resolveResponse = client.contactsResolveUsername("@your_group_username").execute() // 从返回结果中提取Channel对象(群组在Telegram里属于Channel类型) val targetGroup = resolveResponse.getChats.stream() .filter(chat => chat.isInstanceOf[Channel]) .findFirst() .map(_.asInstanceOf[Channel]) .orElseThrow(() => new RuntimeException("找不到指定的群组,请确认用户名正确且群组公开"))
第二步:获取群组成员列表(分页处理)
Telegram限制单次获取成员的数量(最多200个),所以如果是大群组,需要循环分页拉取。用channelsGetParticipants方法来获取成员:
var offset = 0 val limit = 200 var isTargetUserMember = false val targetUserId = 123456789L // 替换成你要检查的用户ID while (!isTargetUserMember && offset >= 0) { val participantsResponse = client.channelsGetParticipants( new InputChannel(targetGroup.getId, targetGroup.getAccessHash), new ChannelParticipantsSearch(""), // 空字符串表示拉取所有成员,也可以填用户名精准搜索 offset, limit ).execute() // 检查当前页的成员里是否包含目标用户 isTargetUserMember = participantsResponse.getParticipants.stream() .anyMatch(participant => participant.isInstanceOf[ChannelParticipant] && participant.asInstanceOf[ChannelParticipant].getUserId == targetUserId) // 更新offset,如果返回的成员数量小于limit,说明已经拉完所有成员 offset = if (participantsResponse.getParticipants.size() < limit) -1 else offset + limit }
关键注意事项
- 权限问题:如果是私有群组,你的账号必须是群组成员才能获取成员列表,否则会返回权限错误。
- Rate Limit:频繁调用成员拉取API可能触发Telegram的限流机制,建议大群组拉取时加入适当的间隔时间。
- 用户ID vs 用户名:如果只有目标用户的用户名,可以在
ChannelParticipantsSearch里填入该用户名,这样会直接返回匹配的成员,不用遍历所有成员,效率更高。
内容的提问来源于stack exchange,提问作者Isvara
相关产品推荐
相关产品推荐

