Slackのステータスを自動で更新できるようにしてみた

## はじめに
大学の研究室では，スマートロックによって誰が鍵を開け閉めしているかわかるものの，研究室内にいるメンバーがわからないのは不便だと思っていた．Slackのステータスを使って研究室にいるかどうかわかるようにしたかったが，とはいえステータスを手動でいちいち設定するのは面倒．
そこで，ステータスを自動で更新できるようにするのを目標にした．
できたら研究室メンバー全員に導入して，みんなが研究室にいるかどうかわかったら(私が)嬉しい．

## 概要
[位置情報を使ってSlackのステータスを更新してみた](https://qiita.com/Rtakaha/items/63b54c45c9e544ac878e)
を参考にした．
位置情報を使うことも検討したが，研究室付近の講義室で間違って研究室内にいる扱いになると困る(多分)ので，**研究室内のWi-Fiを使ってステータスを自動更新する**ことにした．
私はAndroidユーザなのでAndroid側で制御することにした．アプリは「MacroDroid」を使用した．**無料**なので(ただし最初の7日間のみが無料で，その後は広告を見ることで3日間無料で使えるシステムらしい．作れるマクロ数にも制限があるので，買い切り(900円)で買ってもいいかも)．
iPhoneだと「ショートカット」を使ってもできるらしい？

## Slack APIでTokenを取得
[Slack のステータスを API で更新](https://qiita.com/cherubim1111/items/6246cb67496222224412)
を参考にした．
「Create New App」→「From Scratch」で，Appの名前とワークスペースを選択する．

OAuth&PermissionsのScopesでScopeを追加する．User Token Scopesで，`users.profile:write`を追加する．これでプロフィールを編集できるようになるらしい．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990675/7ef93db2-88b8-9b90-42c5-ec8580b27564.png)
私のワークスペースでは管理者の承認が必要だったため，承認をリクエストして承認してもらうことでTokenを発行できた．
このTokenは後で使うのでどこかスマホで取得できる場所に控えておこう．

## MacroDroidの設定
参考にしたサイトでも使用していたが，調べてみるとIFTTTがよく出てきていた．ただ，Webhooksが2024年2月頃で有料になってしまったらしい．今回は最終的に研究室のメンバー全員に導入したいので，なるべく無料で使えるものが良かった．
代替アプリとしてTaskerやAutomateを試したが，UIが私に合わなかったり色々設定で苦戦したりしたので諦めた．そんなときにMacroDroidを見つけた．


### MacroDroidについて
Androidで，トリガーやアクションを設定することでタスクを自動化することができるアプリ．バッテリーやアプリ，位置情報など何でもできそう．すごい．
「アクション」が実際に自動化したいタスクで，「トリガー」がその「アクション」を起こすきっかけみたいな感じ．「条件」はその条件を満たす場合のみアクションを起こすようにできるもので，これはオプションらしい．
今回は，トリガーでWi-Fiを設定し，アクションでHTTPリクエストを送信することで，Slackのステータスを更新する．アクションでは，接続を判定したいSSIDを設定して条件分岐をかけることで，Trueの場合に研究室在室中のステータスにし，Falseの場合に外出中のステータスに更新する．

### トリガー設定
トリガーは「Wi-FiをON時」，「Wi-FiをOFF時」，「指定SSID圏内に入った時」，「指定SSID圏外になった時」にした．
Wi-FiのON/OFFだけでも動くが，もしWi-Fi接続がONのまま外出した際に，トリガーがON/OFFのみの場合だと外出扱いにならないことが考えられるため，圏内かどうかも含めることにした．
トリガーは，「Wi-FiをON時」と「Wi-FiをOFF時」は「+」→「接続」→「Wi-Fi状態の変化」から選択できる．
「指定SSID圏内に入った時」と「指定SSID圏外になった時」は「+」→「接続」→「Wi-Fi SSIDの変化」から選択できる．指定するSSIDは複数選択可能なので，普段使っているWi-Fiが複数ある場合は全部選択しておくと嬉しい．
トリガーの内容は以下の図の通り．
![AutoStatus (1) a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990675/e1e628f4-7c18-4877-1620-128ac344041d.png)


### アクション設定
Wi-FiをONにしてからすぐにはWi-Fiが入らないことと，Wi-FiをOFFにした直後はインターネット接続がないことから，Wi-FiのON/OFFをトリガーにすぐHTTPリクエストを送信してしまうと，うまくいかない場合が考えられる．
そこで，アクションとしては最初に「トリガーまで待機」を作成し，5秒待機することにした．5秒未満は選択できなかった．
以下に，設定したそれぞれのアクションの設定方法をまとめた．

- トリガーまで待機
    1. 「+」→「MacroDroid固有」から「トリガーまで待機」を選択
    1. 「+」→「日時やアラーム」→「一定間隔」で秒数を5に設定
- 条件分岐
    1. 「+」→「条件分岐/繰り返し」→「条件分岐[if]」を選択
    1. 「+」→「接続」→「Wi-Fiの状態」→「Wi-Fi接続先：」を選択して接続を判定したいSSIDを選択
    1. 元の画面の「条件分岐を開始[if]」を選択するといろいろなメニューが出てくるので，その中から「分岐[Else]」を選択
    1. これで接続判定してFalseの場合に進む処理が記述できる
- HTTPリクエスト
    1. 「+」→「Web操作」→「HTTPリクエスト」を選択
    1. 「設定」タブ
        - リクエストメソッド:「POST」
        - URL:`https://slack.com/api/users.profile.set`
    1. 「コンテントボディ」タブ
        - コンテントタイプ:「application/json」
        - コンテントボディ:「文字」
        - Body:`text:Body
        {"profile": {"status_text": "研究室","status_emoji": ":school:"}} `
    1. 「ヘッダーパラメーター」タブでは，「+」を選択
        - パラメータ名:`Authorization`
        - 値:`Bearer xoxp-hogehoge`（xoxp-hogehogeは最初に取得したToken） 
    1. 右上のチェックボタンで保存し，元の画面で「HTTPリクエスト」を選択するといろいろなメニューが出てくるので，その中から「コピー」を選択し，Else以下に移動させる
    1. Else以下のHTTPリクエストのアクションでは，「コンテントボディ」タブのBodyを外出用に設定
    
流れは以下の図の通り．
![AutoStatus (1)b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990675/3d36e99c-b861-1f2c-6ee6-611169d7b660.png)


## まとめ
研究室内にいるときに自動でステータスが研究室用になった．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990675/3f9cfe13-15d0-66e1-286c-f2eb49f26f83.png)
Wi-Fi接続をONにしたまま大学を出てコンビニに行って戻ってきたときも，ログを確認するとしっかり外出中になっていた．
![rogu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990675/fa61ef79-a77e-b827-afad-53acc9669928.jpeg)


## 今後やりたいこと
Wi-Fi接続をONにしたまま研究室に戻ってきた際に，研究室のWi-Fiとは違うWi-Fiに繋がっていると在室中にならない問題がある（アクションの条件分岐の条件を，研究室の「Wi-Fi接続中」にしているため，研究室内の判定がTrueにならない）．
研究室に戻った際にWi-Fiを手動で指定SSIDに直すなら大丈夫だが，戻ってきた瞬間に対応できたらいいな～．
→研究室以外の構内のSSIDを条件分岐のElse Ifで指定し，「構内にいる」ステータスを作ることでどうにかなりそう？

## おまけ
研究室内のメンバーに導入する際，Slack APIの作成したApp内の設定から「Collaborators」でメンバーを追加することで，メンバーもそのAppを使用することができる．メンバーは，自分のワークスペースにインストールすることで，自分のTokenを発行することができる．