SlackからTrelloのタスク起票、チェックリスト作成をするBotを作ってみた
ども、もこ@札幌オフィスです。
SlackのEventSubscriptionとTrelloのAPIを使って、Slack上からTrelloに起票を行うBotをサーバーレス(SAM)で作ってみました。
作ったもの
メッセージに対して特定のリアクションを押すと...
DynamoDBに関連情報が記録され...
Trelloにタスクが起票され、チェックリストを作成します。
スレッドのメッセージに別のリアクションをつけると...
Slackと紐づくようにTrelloのチェックリストに追加されます!
ユースケースなどとしては、Slack上で飛んでくるタスクをそのままリアクションでTrelloで起票するなどを想定しています。
使い始めかた
前提
- SlackのEventSubscriptionを利用して
reaction_added
イベントを取得するようにしています。 - DynamoDBにはスレッドに紐付けれるようにSlackのタイムリアクション、TrelloのカードID、TrelloのチェックリストID、作成者を追加しています。
- タスクの起票は
task-add
、チェックリストの作成はtask-checklist-add
の絵文字を利用しています。任意の絵文字を予め登録してください。 - コードはNode.js、SAMでAPI Gateway, Lambda, DynamoDBを作成しています。構成図はこんな感じです。
TrelloのAPIを用意する
Developer API Keysを開き、同意した上で Show API Key
を選択します。
APIキーが発行されますので、控えておきましょう。
続いて、「手動でトークンを生成できます。」のところをクリックして、許可します。
許可するとトークンが発行されますので、こちらも控えておきます。
Trelloで課題を起票したい「リスト」を取得する
カードの起票にはリアクションをつけたときに課題を起票する「リスト」のIDを取得する必要があるため、先ほど取得したAPIで確認してきましょう。
※ここでいう「リスト」とは、「看板のカラム」を指しています。
$ curl "https://trello.com/1/members/{ユーザー名}/boards?key={TrelloのAPIKey}&token={TrelloのToken}&fields=name" | jq ...略 [ { "name": "hoge", "id": "5e5dabc6e6ffaf1a01264b88" } ]
取得できたボードの中から利用するボードのIDを控え、下記APIを叩きます。
$ curl "https://trello.com/1/boards/{控えたボードのID}/lists?key={TrelloのAPIKey}&token={TrelloのToken}" | jq ...略 [ { "id": "5e6d7eb4847fa8526ae71bd3", "name": "ToDo", "closed": false, "idBoard": "5e5dabc6e6ffaf1a01264b88", "pos": 1.5, "subscribed": false, "softLimit": null }, { "id": "5e5dabc761abcf5d70314075", "name": "Doing", "closed": false, "idBoard": "5e5dabc6e6ffaf1a01264b88", "pos": 2, "subscribed": false, "softLimit": null }, { "id": "5e5dabc7e1c86259327abcff", "name": "Done", "closed": false, "idBoard": "5e5dabc6e6ffaf1a01264b88", "pos": 3, "subscribed": false, "softLimit": null } ]
ToDoのカラム(リスト)にタスクを起票したいため、こちらの「5e6d7eb4847fa8526ae71bd3」を控えておきましょう。
SlackのAPI準備
SlackのAPIを作成し、ワークスペースに紐付け、Event Subscriptionを設定していきましょう。
下記URLからアプリを作成します。
OAuth & Permissions
の Scopeで、Bot Token Scopesに reactions:read
, channels:history
を付与した後、 Install App to Workspace
でワークスペースにBot Userをインストールします。
正常にインストールが完了したら、Botを利用するチャンネルにBotUserを招待する必要があります。
インストールが完了したらBot UserのAccess Tokenが発行されるので、こちらを控えておきましょう。
Lambda/APIデプロイ
今回作成したBotのソースはGitHub上に公開しているので、こちらをcloneの上、ビルド、デプロイを行います。
https://github.com/mokonist/slack-emoji-task
clone、build、deployで一瞬で終わります。
$ git clone https://github.com/mokocm/slack-emoji-task $ cd slack-emoji-task $ sam build $ sam deploy --guided ...ガイドに従ってデプロイ Successfully created/updated stack - slack-emoji-task in ap-northeast-1
デプロイが完了したら、生成されたLambdaの環境変数に控えてある SLACK_TOKEN
, TRELLO_KEY
, TRELLO_TOKEN
, TRELLO_LIST
を入れ、正常に動作するよう設定します。
EventSubscriptionの設定
デプロイが終わったら、早速API GatewayのエンドポイントをSlackのEventSubscriptionに設定しましょう。
sam deploy時にアウトプットとして出力されるRequestURLとして設定し、Subscription to bot eventsで reaction_added
を設定して保存します。
動作確認
Slackで task-add
と task-checklist-add
のリアクションをつけてみます。
Trelloの方でもきちんと起票できていることを確認できます!
余談
チャンネル一覧を取得しようと channels.historyのドキュメントを読んでいると、「This method is deprecated.」との記載がありました。
2020年の11月25日に channels.*, groups.*, im.*, mpim.* APIが廃止され、Conversations APIに移行されるそうなので、SlackでBotを開発している方は要チェックとなるかもしれません。
https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api
まとめ
SlackのEventSubscriptionを利用して、サーバーレスにTrelloへカードを起票することができました。
ソースコードはGitHubに乗せているので、ご興味がある方はご確認ください。 https://github.com/mokocm/slack-emoji-task/blob/master/lambda/app.js