Slack APIでメッセージの検索をしてみた(search.messages)

2020.06.19

こんにちは、CX事業本部の若槻です。

今回は、とあるChrome拡張を作りたく、Slack APIによるメッセージの検索の検証を行ってみました。

どのAPIを使えば良いか

まず、Slackでメッセージの検索を行うのにどのAPIを使えば良いかを確認します。

その場合は下記のAPIメソッド一覧ページが便利です。

このうちメッセージの検索を行うにはsearch.messagesメソッドを使えばよさそうです。 image.png

また、[search.messages]ページを見ると、作成するAppのスコープはsearch:readを指定すれば良さそうです。 スクリーンショット 2020-06-19 19.05.23.png

Slack Appの作成

Slack APIを利用するにはSlack上にAppを作成する必要があります。ここではsearch.messagesAPIを叩くためのSlack Appを作成します。

https://api.slack.com/apps にアクセスし、[Create New App]をクリックします。 スクリーンショット 2020-06-19 18.03.21.png

ダイアログが表示されるので、[App Name]でApp名(今回はtest-app)を入力し、[Development Slack Workspace]でAppを使用するワークスペースを指定して、[Create App]をクリックします。 スクリーンショット 2020-06-19 18.05.15.png

作成されたApp(test-app)の[Basic Information]ページが開くので、画面左の[Features]欄より[OAuth & Permissions]を開きます。 スクリーンショット 2020-06-19 18.32.57.png

[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]をクリックします。 スクリーンショット 2020-06-19 18.28.47.png

プルダウンメニューで先ほど確認したスコープsearch:readを選択します。 スクリーンショット 2020-06-19 19.06.45.png

同じページの[OAuth Tokens & Redirect URLs]欄で[Install App to Workspace]をクリックします。 スクリーンショット 2020-06-19 19.08.28.png

するとAppが追加先のワークスペースへのアクセス権限をリクエストするので、[許可する]をクリックします。 スクリーンショット 2020-06-19 19.09.57.png

Appがワークスペースにインストールされると、xoxp-から始まるOAuth Access Tokenが発行されるので控えておきます。 スクリーンショット 2020-06-19 19.14.32.png

これでSlack Appの作成は完了です。

APIでメッセージを検索してみる

次に、作成したAppを使って実際にAPIでメッセージを検索してみます。

SlackのTesterページの場合

SlackのTesterページを使えばGUIから簡単にSlack APIを使うことができます。search.messagesAPIの場合は下記のページです。

tokenでApp作成時に控えたOAuth Access Tokenを指定し、queryで検索クエリ(Slackアプリでメッセージ検索に使うクエリと同じ)を指定し、[Test Method]をクリックします。すると、API実行で実際に叩かれたURLとレスポンス結果を確認できました。 スクリーンショット 2020-06-19 19.33.26.png

Node.jsの場合

以下のようなNode.jsで実行可能なスクリプトを作成しました。

検索クエリとして、「team-cx-kintaiチャネルでslackbotが投稿したrimokaiというワードが含まれるメッセージ」を検索するようにsearch_urlqueryで指定しています。

また、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パースを実装するのが大変でした。

参考

以上