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

能否通过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,提问作者Паувер Тзен

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:43:28