能否通过Telegram Bot依据用户ID追踪其在线/离线状态?
能否通过Telegram Bot追踪用户在线/离线状态?
我正在开发一款Telegram Bot,导师布置了“追踪用户状态”的任务。我已获取用户ID,但在网络上未找到可行的实现方案,特此咨询:是否可以通过Telegram Bot追踪用户的在线/离线状态?
相关代码片段:
bot.command('check_status', async (ctx) => { }
可以实现,但存在一定限制,以下是两种可行方案:
方案1:利用getChatMember接口查询群组内用户状态
Telegram Bot API的getChatMember接口可获取用户在指定群组/频道中的成员状态,返回的ChatMember对象包含status字段,对应状态值如下:
online:用户当前在线offline:用户离线(附带最后上线时间until_date)left:用户已离开群组kicked:用户被踢出群组
注意:此方法要求Bot与目标用户处于同一个群组/频道,且Bot需拥有restrict_members权限。
适配你代码风格的实现示例(基于Telegraf库):
bot.command('check_status', async (ctx) => { const targetUserId = 123456789; // 替换为目标用户ID const chatId = -1001234567890; // 替换为共同的群组/频道ID try { const chatMember = await ctx.telegram.getChatMember(chatId, targetUserId); let statusMessage; switch (chatMember.status) { case 'online': statusMessage = `用户 ${targetUserId} 当前在线`; break; case 'offline': const lastSeen = new Date(chatMember.until_date * 1000).toLocaleString(); statusMessage = `用户 ${targetUserId} 当前离线,最后上线时间:${lastSeen}`; break; case 'left': statusMessage = `用户 ${targetUserId} 已离开该群组`; break; case 'kicked': statusMessage = `用户 ${targetUserId} 已被踢出该群组`; break; default: statusMessage = `无法获取用户 ${targetUserId} 的状态`; } ctx.reply(statusMessage); } catch (error) { ctx.reply(`获取状态失败:${error.message}`); } });
方案2:被动记录用户活跃状态
如果用户与Bot有过交互(发消息、点击按钮等),可通过监听Bot事件记录用户最后活跃时间,以此判断用户的活跃情况(无法实时获取离线状态,仅能记录最后活跃时间)。
示例:
// 存储用户最后活跃时间的对象 const userLastActive = {}; // 监听消息事件,更新用户活跃时间 bot.on('message', (ctx) => { const userId = ctx.from.id; userLastActive[userId] = new Date(); }); // 实现check_status命令 bot.command('check_status', async (ctx) => { const targetUserId = 123456789; // 替换为目标用户ID if (userLastActive[targetUserId]) { ctx.reply(`用户 ${targetUserId} 最后活跃时间:${userLastActive[targetUserId].toLocaleString()}`); } else { ctx.reply(`未记录用户 ${targetUserId} 的活跃状态`); } });
关键限制说明
- 方案1依赖共同群组,无法查询不在同一群组/频道的用户状态;
- Telegram不会主动推送用户在线状态变化,只能通过主动查询或被动记录获取;
- 需严格遵守Telegram隐私政策,不得滥用用户状态数据。
内容的提问来源于stack exchange,提问作者Паувер Тзен
相关产品推荐
相关产品推荐

