如何使用Go的telegram-bot-api包获取通过专属邀请链接加入Telegram私密频道的用户ID
如何使用Go的telegram-bot-api包获取通过专属邀请链接加入Telegram私密频道的用户ID
嘿,这个需求我太懂了——做订阅制频道确实需要精准追踪用户的加入和到期情况,我来帮你捋清楚怎么用Go的telegram-bot-api包实现这个功能。
首先得确认你的Bot权限是否到位,这是很多人踩坑的地方:
- 必须把Bot设为频道的管理员,一定要开启「查看成员」权限(没有这个的话,Bot根本收不到成员变动的通知);
- 如果之后要移除用户,还要开启「删除成员」权限。
接下来,你之前尝试的/getUpdates思路是对的,但可能没找对正确的更新类型。Telegram不会把用户加入频道的事件当成普通消息,而是会发送ChatMemberUpdated类型的更新。下面是具体的实现步骤和代码示例:
1. 初始化Bot并配置更新监听
首先初始化你的Bot实例,然后设置长轮询的参数(比如超时时间,避免频繁请求):
package main import ( "fmt" "log" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" ) func main() { botToken := "你的BotToken" bot, err := tgbotapi.NewBotAPI(botToken) if err != nil { log.Panic(err) } bot.Debug = true // 开启调试模式,方便看请求和响应 log.Printf("Authorized on account %s", bot.Self.UserName) // 设置更新配置 updateConfig := tgbotapi.NewUpdate(0) updateConfig.Timeout = 60 // 长轮询超时时间,单位秒 // 获取更新通道 updates := bot.GetUpdatesChan(updateConfig) // 监听所有更新 for update := range updates { // 重点处理ChatMemberUpdated事件(成员变动) if update.ChatMember != nil { handleChatMemberUpdate(update.ChatMember) } } }
2. 处理成员加入事件,提取用户ID和邀请链接
在handleChatMemberUpdate函数里,我们需要判断用户是刚加入频道的状态,然后提取用户ID和对应的邀请链接:
func handleChatMemberUpdate(cm *tgbotapi.ChatMemberUpdated) { // 判断用户是否是新加入频道(从非成员变为成员) if cm.NewChatMember.Status == "member" && cm.OldChatMember.Status == "left" { userID := cm.NewChatMember.User.ID userName := cm.NewChatMember.User.UserName channelID := cm.Chat.ID // 获取用户使用的邀请链接(如果是通过专属链接加入的) var inviteLink string if cm.InviteLink != nil { inviteLink = cm.InviteLink.InviteLink } // 这里可以把userID、inviteLink、加入时间等信息存入你的数据库 fmt.Printf("用户 %s(ID: %d) 通过链接 %s 加入了频道(ID: %d)\n", userName, userID, inviteLink, channelID) // 后续你就可以根据数据库里的订阅到期时间,到期后调用BotAPI移除用户 // deleteConfig := tgbotapi.NewChatMemberConfig(channelID, userID) // deleteConfig.Action = "kick" // if _, err := bot.Request(deleteConfig); err != nil { // log.Println("移除用户失败:", err) // } } }
关键注意点
- 关联专属链接和用户:你生成专属邀请链接的时候,应该把每个链接和对应的用户ID绑定并存入数据库(比如生成链接时记录
link -> userID的映射)。当用户通过链接加入时,拿到inviteLink后就可以匹配到对应的用户,确认是哪个订阅用户加入了。 - 避免重复处理更新:Telegram可能会重复发送相同的更新,你可以在处理完更新后,把
update.UpdateID记录下来,下次请求时设置updateConfig.Offset = lastUpdateID + 1,这样就不会重复处理了。 - 私密频道的限制:只有频道的管理员Bot才能收到成员变动的更新,普通Bot是收不到的,所以一定要确保Bot的管理员权限正确设置。
之前你说用/getUpdates没成功,大概率是没监听ChatMemberUpdated这个事件,或者Bot的权限没开对。按照上面的步骤来,应该就能正常获取用户ID了。
备注:内容来源于stack exchange,提问作者Shailesh B
相关产品推荐
相关产品推荐

