Slackの投稿をまとめて一つのチャンネルに流すbotを作った

この記事は PMOB Advent Calendar 25日目の記事です.

チャンネルにbotを追加するだけで,そのチャンネルの発言を特定のチャンネルに流すことができるbotを作った.

こんな感じで,チャンネルの投稿を別のチャンネルに流すことができる

f:id:cohalz:20181231154616p:plain

構成図

f:id:cohalz:20181231152507p:plain

  1. botがチャンネルの発言をAPI Gatewayに送信する

  2. API GatewayからのイベントをLambdaが受け取る

  3. チャンネルやユーザの情報がDynamoDBに保存されているか確認する

  4. 保存されていなければSlack APIに問い合わせる

  5. 問い合わせた情報をDynamo DBに保存

  6. 取得した情報を元に投稿先チャンネルへ投稿

何故作ったのか

  • 複数チャンネルを巡回する手間の削減
    • 分報チャンネル追うの大変
  • TwitterのTLみたいに混ざったら面白そうという気持ち

使うためには

  • Slack APIのtoken
  • 投稿するためのincoming webhook
  • slack botを追加しEvent Subscriptionsでmessage.channelsのイベントを受け取るようにする

ハマったところなど

ユーザやチャンネルの情報がidで渡されてくる

こういう構成にする事になった理由として,イベントではidが渡されてくるため,名前を引くためにAPIを使うことになった

api.slack.com

Slackのイベントタイムアウトは3秒

タイムアウトが3秒しかなく,それまでにイベントに対してのレスポンスを返さないともう一度イベントが送信されてしまう

そうすると投稿先チャンネルへ二重投稿されてしまうため,できる限りすぐレスポンスを返せるようにしないといけない

今回はDynamo DBを使って,そこに情報が保存されていたらそれを使うことでタイムアウトまでにレスポンスを返せるようになった

api.slack.com

終わりに

最初は遊びで作ってたものだったけれど,意外と面白いし実用性もあって良かった

分報が全部流れるとどのくらいの流量になるのか気になる

今回作ったリポジトリはこちら

github.com