👀

PythonでSlack APIを使ってPresenceを取得する

2021/04/25に公開

概要

決してサボっている人を検知したいのではなく、参考情報として取得したかったのでまとめました。
PresenceというのはSlackのアイコンの右下に出るアクティブとかの表示です。

準備編

Slack Appを作成し、対象のワークスペースに対して使用可能な状態にしておく。
必要なスコープはusers:readとなります。

開発環境

Pythonにslack_sdkをインストールします。

pip install slack_sdk

今回試したのは下記環境です。
Python: 3.9.4
slack_sdk: 3.5.0

実装

とりあえずは動かしてみましょう。
下記の感じでコード書いたら動きます。環境変数にトークン入れるのが面倒な場合は、token=のところに直接文字列で入れても動きます。

import os
from slack_sdk import WebClient

token = os.environ.get("SLACK_BOT_TOKEN")
client = WebClient(token=token)

response = client.users_list()
users = response["members"]
awayList = []

for user in users:
  if user['is_bot'] == False and 'is_restricted' in user:
    if user['is_restricted'] == False:
      userPresence = client.users_getPresence(user=user['id'])
      if userPresence['presence'] == 'away':
        awayList.append([user['id'], user['name'], user['real_name']])

この実装が推奨されるのかはちょっとわからないので、頻繁に取得する場合は自己責任でお願いします。
ユーザー毎にgetPresenceしているので総ユーザー数が多いと実行に時間がかかります。
本当はforで回したくなかったんですけど、これ以外の方法が見つからなかったんです。

あとエラー処理等も全く入れてません。申し訳ないです。
定期実行したい場合は適宜エラー処理入れてください。

User presenceの仕様

公式のUsage guidesを見てみると、値としてはactiveまたはawayが返ってきます。
また、自動と手動の離席があり自動の離席についてはクライアントの仕様を見てねと書いてある気がします。

クライアントの仕様を見てみると、

デスクトップが 10 分間操作されなかった時

と書いてあります。
この仕様がよくわかっていなくて、OS上の操作であるのかクライアント上の操作であるのかが不明です。
誰か調べてもらえませんかね?

Discussion