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

如何获取Slack组织内所有用户的最后活动时间戳?

获取Slack组织所有用户最后活跃时间的解决方案

我之前处理过完全一样的需求,刚好可以给你分享可行的实现思路和代码示例:

首先,你提到的users.getPresence接口其实支持指定目标用户ID来获取该用户的在线状态和最后活跃时间,并非只能返回令牌所有者的数据——只是需要确保你的API令牌拥有足够的权限,并且调用时传入user参数。

具体步骤:

  1. 确认并配置API权限
    你的Slack应用需要拥有以下权限(在Slack API控制台的"OAuth & Permissions"页面添加):

    • users:read:允许获取组织内的用户列表
    • users:read.presence:允许获取用户的在线状态和最后活跃时间
      添加权限后,重新安装应用到你的Slack组织,获取最新的API令牌。
  2. 获取所有真实用户的ID
    调用users.list接口遍历组织内所有用户,过滤掉机器人账号(is_bot为true)和已删除的用户(deleted为true),只保留真实用户的ID。这个接口支持分页,所以要处理next_cursor来获取全量用户。

  3. 批量获取每个用户的最后活跃时间
    遍历拿到的用户ID列表,对每个ID调用users.getPresence接口并传入user参数,接口返回的last_activity字段就是该用户最后活跃的Unix时间戳,你可以将其转换为可读的日期时间格式。

  4. 处理API速率限制
    Slack API有请求频率限制(users.getPresence大概是每分钟500次请求),建议在循环中添加短延迟(比如0.2秒),避免触发限流导致请求失败。

Python代码示例

import requests
import time
from datetime import datetime

# 替换为你的Slack API令牌
SLACK_API_TOKEN = "xoxp-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

def fetch_all_real_user_ids():
    """获取组织内所有真实用户的ID(排除机器人和已删除用户)"""
    user_ids = []
    next_cursor = None

    while True:
        api_params = {
            "token": SLACK_API_TOKEN,
            "cursor": next_cursor,
            "limit": 1000  # 每页最多返回1000条用户数据
        }
        response = requests.get("https://slack.com/api/users.list", params=api_params)
        response_data = response.json()

        if not response_data["ok"]:
            raise RuntimeError(f"获取用户列表失败: {response_data['error']}")
        
        # 过滤有效用户
        valid_users = [
            member["id"] for member in response_data["members"]
            if not member["is_bot"] and not member["deleted"]
        ]
        user_ids.extend(valid_users)

        # 处理分页
        next_cursor = response_data.get("response_metadata", {}).get("next_cursor")
        if not next_cursor:
            break
    
    return user_ids

def get_last_active_time(user_id):
    """获取指定用户的最后活跃时间(转换为可读格式)"""
    api_params = {
        "token": SLACK_API_TOKEN,
        "user": user_id
    }
    response = requests.get("https://slack.com/api/users.getPresence", params=api_params)
    response_data = response.json()

    if not response_data["ok"]:
        print(f"警告:无法获取用户 {user_id} 的活跃数据: {response_data['error']}")
        return None
    
    last_activity_ts = response_data.get("last_activity")
    if last_activity_ts:
        return datetime.fromtimestamp(last_activity_ts).strftime("%Y-%m-%d %H:%M:%S")
    else:
        return "从未活跃或无数据记录"

if __name__ == "__main__":
    try:
        user_ids = fetch_all_real_user_ids()
        print(f"共获取到 {len(user_ids)} 个真实用户")
        
        for idx, user_id in enumerate(user_ids, 1):
            last_active = get_last_active_time(user_id)
            print(f"[{idx}/{len(user_ids)}] 用户ID {user_id}: 最后活跃时间 {last_active}")
            time.sleep(0.2)  # 控制请求频率,避免触发限流
    except Exception as e:
        print(f"程序运行出错: {str(e)}")

注意事项:

  • 如果用户从未在Slack上活跃过,last_activity字段可能不存在,代码中已经做了相应处理。
  • 如果你使用的是Slack企业网格版,可能需要额外的权限配置,建议参考Slack官方文档确认。
  • 确保你的API令牌妥善保管,不要泄露给无关人员。

内容的提问来源于stack exchange,提问作者user8696290

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:07:36