某部活の季節外れ突発AdventCalendar n日目です(TODO:あとで書き換える)。
以前にslackでスクリプト組んだのでその時の話をvTuberの動画を見ながら書きます。
僕はnodejsで書きましたが、この記事では具体的なスクリプトの書き方とかには触れないのでご了承ください。
はじめに
うちの部活では連絡やコミュニケーションにslackを使用しています。現在、部のチームには結構な人数なメンバーが所属しています。しかしこの中にはOBや幽霊部員さんなども多く含まれていたのでそういった非アクティブなアカウントを一掃して整理することにしました。
理想
- slackのapiで各アカウントの最終ログイン日時を取得し、使われていないアカウントを見つける
現実
- 最終ログイン日時を取得できるapiのteam.accessLogsが有料プランじゃないと使えない。
- 弊部のslackは無料版を使用
- つらい
解決策
- 管理用のアカウントからチームに所属している全アカウントに対してDMを送り、一定期間返信が無いアカウントを非アクティブなアカウントと判断。
というわけで今回行なった「各ユーザーにDMを送信」と「そのユーザーからの返信を確認」について軽く解説します。
#各ユーザーにDMを送信
任意のアカウントにDMを送るにはまず、そのアカウントのユーザーネームを知る必要があります。users.listを使用することでチームに所属している全ユーザーのユーザーネームを含んだ様々な情報を取得できます。レスポンスの"name"がユーザーネームに当たります。
次にchat.postMessageを使用してDMを送信します。チャンネルにメッセージを送るときにも使用するapiですが、引数の"channel"を「@ユーザーネーム」とするとそのユーザーにDMを送ることが出来ます。同じく引数の"as_user"をtrueにしておくとメッセージの送信者がapiに使用しているtokenの発行ユーザーになります。falseだとbotが送信者になります。
送信するテキストに返信を促すようなメッセージを入れておくと良いかもしれません。
#ユーザーからの返信を確認
DMを送るのは簡単にできましたがそのユーザーから返信が来ているかを確認するのにはちょっと面倒な手順が必要です。
まず、ユーザーID(ユーザーネームとは別)が必要となります。ユーザーIDはslack上では確認できないのでapiを使用して取得する必要があります。取得にはDMを送信したときと同じようにusers.listを使用します。レスポンスに含まれる"id"がユーザーIDです。
次にユーザーとのDMのID(以下、DM-ID)を取得します。DM-IDはim.openで取得できます。引数の"user" にさっき取得したユーザーIDを入れます。レスポンスの"id"がDM-IDです。
そしてようやっとDMの履歴取得です。im.historyを使います。引数の"channel"には DM-IDを入れます。レスポンスでチャット履歴が返ってくるのでこれで返信が来ているかどうかの判断を行います。
おわり
以上の方法で非アクティブなアカウントを見つけました。ちなみにアカウントの削除はapiからでは行えなかったので手動でやりました(辛かった)。