この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
ども、もこ@札幌オフィスです。
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/mokocm/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