気になるあの上司は何時まで仕事をしているの？調査しよう。 Part I: データ取得編 (Slack API)

## 注意

この記事は Slack の在籍状況を DB 等に保存し、そこから勤務時間帯を分析するという企画です。
Slack では 1 つのアカウントで複数のワークスペースを管理することができるため、オンライン状態でも趣味のコミュニティにいた、なんてこともあります。
決して **「Slack がオンライン = 仕事している」ということではない** ので、あくまで参考程度にお願いします。

## 目次

- **Part I: データ取得編 (Slack API)** <- 今回はここ！
- [Part II: データ保存編 (AWS Lambda/CloudWatch)](https://qiita.com/noritakaIzumi/items/9978e35308876d2b259b)
- [Part III: データ分析編 (AWS CloudWatch/スプレッドシート)](https://qiita.com/noritakaIzumi/items/5629e6f4e36d718726da)

## 概要

今回は Slack の在籍状況を API を利用して取得するセクションとなります。

Slack には [Slack API](https://api.slack.com/) という API が提供されており、チャンネルにメッセージを投稿したり、bot のようなものを作成したりと、様々なことができます。
今回は API の中に「ユーザのオンラインステータスを取得する」メソッドがありますので、それを使うことにします。

## 前提条件

- curl コマンドが実行できるターミナル等がある
- Slack を利用している

## 手順

### トークンを取得する

まずは [Slack API](https://api.slack.com/) にアクセスし、上部の `Your apps` をクリックします。

![slack_api_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/287c0ba7-d5b7-9d8b-244e-b61bdb00840e.png)

ここで Slack にまだサインインしていない場合はサインインしてください。

`Your Apps` の画面になったら、 `Create an App` をクリックします。

![create_an_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/f5e03065-0056-e92a-512e-c6bcec69b8b7.png)

モーダルが表示されたら `From scratch` をクリックします。

![from_scratch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/ba030631-2087-5ebb-a92f-4d83547378f3.png)

アプリ名とアプリを作成するワークスペースを選択し、 `Create App` をクリックします。

![name_app_choose_workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/e45c4a7e-68e7-7888-b488-c83c87936058.png)

今回、「ユーザのオンラインステータスを取得する」ための権限設定を行いますので、 `Permissions` をクリックします。

![permissions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/7de6cc72-ffa4-babb-4ff4-66ddbce78de9.png)

画面を下にスクロールして Scopes の項を見つけたら、 Bot Token Scopes の `Add an OAuth Scope` をクリックし、出てきたダイアログで `users:read` を選択します。

（今回使うメソッドは Bot Token Scopes でも User Token Scopes でもどちらでも構いません。 `users:read` の権限があれば動きます。）

![users_read.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/30803be8-9309-4e9f-787e-e43d2e6a2db3.png)

権限の追加が終わったら、画面上部に移動し、 OAuth Tokens for Your Workspace の中にある `Install to Workspace` をクリックします。

![install_to_workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/6f28f918-6edd-3505-4425-fce44c78bea0.png)

インストールが終わると、以下のようにトークンが表示されていますので、 `Copy` を押してメモ帳等に貼り付けておいてください。

![copy_token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/d78fc81f-57c6-df26-b61c-122ab733904c.png)

### 調査したいユーザの ID を取得する

トークンの取得が終わったら、 Slack をアプリまたはブラウザで開き、調査したいユーザのプロフィールを開きます。

プロフィールは、会話中の名前をクリックするか、ユーザのダイレクトメッセージ画面に移動して画面上部の名前をクリックし、 `View full profile` をクリックすると画面右側に表示されます。

プロフィールが表示されたら `More` -> `Copy member ID` の順にクリックし、メモ帳等に貼り付けておいてください。

![copy_user_id.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/89fd3d27-74f3-d656-a5f3-d61c1e9641d5.png)

### API の動作テストをする

API のトークンとユーザ ID が取得できましたので、 API の動作確認を行います。

今回使用するメソッドは [users.getPresence](https://api.slack.com/methods/users.getPresence) です。

ターミナルで以下のコマンドを実行し、動作確認します。

なお、 `xoxb-1234-56789abcdefghijklmnop` の部分をトークンに、 `W1234567890` の部分をユーザ ID に書き換えてください。

```sh
curl -X GET -H 'Authorization: Bearer xoxb-1234-56789abcdefghijklmnop' \
https://slack.com/api/users.getPresence?user=W1234567890
```

実行すると以下のような結果が返ってきます。

成功（オンラインの場合）

```json
{"ok":true,"presence":"active"}
```

成功（オフラインの場合）

```json
{"ok":true,"presence":"away"}
```

失敗した場合（例）

```json
{"ok":false,"error":"internal_error"}
```

## 次回予告

今回はここまでです。

次回は API を定期実行して結果を保存する仕組みを構築します。

[Part II: データ保存編 (AWS Lambda/CloudWatch)](https://qiita.com/noritakaIzumi/items/9978e35308876d2b259b)

## 余談

そういえば先週 Salesforce が Slack の買収を完了したらしいですね！ (2021/07/21)

Salesforce のプレスリリースは [こちら](https://www.salesforce.com/news/press-releases/2021/07/21/salesforce-slack-deal-close/)