如何获取Slack组织内所有用户的最后活动时间戳?
获取Slack组织所有用户最后活跃时间的解决方案
我之前处理过完全一样的需求,刚好可以给你分享可行的实现思路和代码示例:
首先,你提到的users.getPresence接口其实支持指定目标用户ID来获取该用户的在线状态和最后活跃时间,并非只能返回令牌所有者的数据——只是需要确保你的API令牌拥有足够的权限,并且调用时传入user参数。
具体步骤:
确认并配置API权限
你的Slack应用需要拥有以下权限(在Slack API控制台的"OAuth & Permissions"页面添加):users:read:允许获取组织内的用户列表users:read.presence:允许获取用户的在线状态和最后活跃时间
添加权限后,重新安装应用到你的Slack组织,获取最新的API令牌。
获取所有真实用户的ID
调用users.list接口遍历组织内所有用户,过滤掉机器人账号(is_bot为true)和已删除的用户(deleted为true),只保留真实用户的ID。这个接口支持分页,所以要处理next_cursor来获取全量用户。批量获取每个用户的最后活跃时间
遍历拿到的用户ID列表,对每个ID调用users.getPresence接口并传入user参数,接口返回的last_activity字段就是该用户最后活跃的Unix时间戳,你可以将其转换为可读的日期时间格式。处理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
相关产品推荐
相关产品推荐

