SlackからTrelloのタスク起票、チェックリスト作成をするBotを作ってみた

2020.03.16

ども、もこ@札幌オフィスです。

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で確認してきましょう。

※ここでいう「リスト」とは、「看板のカラム」を指しています。

/members/{id}/boards

$ curl "https://trello.com/1/members/{ユーザー名}/boards?key={TrelloのAPIKey}&token={TrelloのToken}&fields=name" | jq
...略
[
  {
    "name": "hoge",
    "id": "5e5dabc6e6ffaf1a01264b88"
  }
]

取得できたボードの中から利用するボードのIDを控え、下記APIを叩きます。

/boards/{id}

$ 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からアプリを作成します。

https://api.slack.com/apps

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-addtask-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