
Slack APIでメッセージの検索をしてみた(search.messages)
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部の若槻です。
今回は、とあるChrome拡張を作りたく、Slack APIによるメッセージの検索の検証を行ってみました。
どのAPIを使えば良いか
まず、Slackでメッセージの検索を行うのにどのAPIを使えば良いかを確認します。
その場合は下記のAPIメソッド一覧ページが便利です。
このうちメッセージの検索を行うにはsearch.messagesメソッドを使えばよさそうです。

また、[search.messages]ページを見ると、作成するAppのスコープはsearch:readを指定すれば良さそうです。

Slack Appの作成
Slack APIを利用するにはSlack上にAppを作成する必要があります。ここではsearch.messagesAPIを叩くための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.messagesAPIの場合は下記のページです。
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
以上







