Slack APIでメッセージの検索をしてみた(search.messages)
こんにちは、CX事業本部の若槻です。
今回は、とあるChrome拡張を作りたく、Slack APIによるメッセージの検索の検証を行ってみました。
どのAPIを使えば良いか
まず、Slackでメッセージの検索を行うのにどのAPIを使えば良いかを確認します。
その場合は下記のAPIメソッド一覧ページが便利です。
このうちメッセージの検索を行うにはsearch.messages
メソッドを使えばよさそうです。
また、[search.messages]ページを見ると、作成するAppのスコープはsearch:read
を指定すれば良さそうです。
Slack Appの作成
Slack APIを利用するにはSlack上にAppを作成する必要があります。ここではsearch.messages
APIを叩くためのSlack Appを作成します。
https://api.slack.com/apps にアクセスし、[Create New App]をクリックします。
ダイアログが表示されるので、[App Name]でApp名(今回はtest-app
)を入力し、[Development Slack Workspace]でAppを使用するワークスペースを指定して、[Create App]をクリックします。
作成されたApp(test-app
)の[Basic Information]ページが開くので、画面左の[Features]欄より[OAuth & Permissions]を開きます。
[OAuth & Permissions]ページの[Scopes]では、Appに付与するScopeとして[Bot token Scopes]と[User token Scopes]が選択できます。下記ドキュメントによると、これらの違いはBot tokenを使用するとworkspaceにインストールされたAppとして、User tokenを使用するとユーザーとしてアクションを実行できるようです。
今回はユーザーとしてAPIを利用したいので、[Scopes] - [User Token Scopes]で[Add an OAuth Scope]をクリックします。
プルダウンメニューで先ほど確認したスコープsearch:read
を選択します。
同じページの[OAuth Tokens & Redirect URLs]欄で[Install App to Workspace]をクリックします。
するとAppが追加先のワークスペースへのアクセス権限をリクエストするので、[許可する]をクリックします。
Appがワークスペースにインストールされると、xoxp-
から始まるOAuth Access Tokenが発行されるので控えておきます。
これでSlack Appの作成は完了です。
APIでメッセージを検索してみる
次に、作成したAppを使って実際にAPIでメッセージを検索してみます。
SlackのTesterページの場合
SlackのTesterページを使えばGUIから簡単にSlack APIを使うことができます。search.messages
APIの場合は下記のページです。
token
でApp作成時に控えたOAuth Access Tokenを指定し、query
で検索クエリ(Slackアプリでメッセージ検索に使うクエリと同じ)を指定し、[Test Method]をクリックします。すると、API実行で実際に叩かれたURLとレスポンス結果を確認できました。
Node.jsの場合
以下のようなNode.jsで実行可能なスクリプトを作成しました。
検索クエリとして、「team-cx-kintai
チャネルでslackbot
が投稿したrimokai
というワードが含まれるメッセージ」を検索するようにsearch_url
のquery
で指定しています。
また、r.messages.matches[0].ts
により取得したメッセージのうち最新のもののts
をコンソール表示するようにしています。
var https = require('https'); var search_url = `https://slack.com/api/search.messages?\ token=xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&\ query=rimokai%20in%3Ateam-cx-kintai%20from%3Aslackbot&\ count=1`; var data = []; https.get(search_url, function (res) { res.on('data', function(chunk) { data.push(chunk); }).on('end', function() { var events = Buffer.concat(data); var r = JSON.parse(events); console.log(r.messages.matches[0].ts); }); });
取得できました。
$ node sample.js 1592510426.067200
おわりに
Slack APIでメッセージの検索をしてみました。
Slack APIを使うためのAppの作成は割と簡単にできましたが、今までほとんど使ったことのなかったNode.jsでWebリクエストとJSONパースを実装するのが大変でした。
参考
- Node.js:JSONデータをPOSTする | Qiita
- Node.js で HTTP/HTTPS リクエスト を行う方法 | galife
- Node.jsでHTTP GETしてJSONパースするメモ | Qiita
- 【Node.js入門】https.get / requestによるJSONの取得・パース方法まとめ! | Samurai Blog
以上