You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:43:00