herokuにデプロイしてたSlackボット(Botkitベース)を治した
背景
以前slackbotを作成し、herokuにデプロイして運用していたが、最近動かなくなってることに気が付いた。
運用していたボットの主な機能としては、「雨どう」と書き込むと、アメッシュの画像を返してくれるというこれからの梅雨に入る東京では 重宝する機能を備えていた。少なくともこれは復活したい。また、最近はAmazon Echoのアレクサに聞けば予定を教えてくれるようになった ので、あまり、使っていないが、Google Calenderで予定を教えてくれる機能も備えていた。
概要
HerokuにdockerコンテナとしてデプロイしていたSlckボットが動かなくなっていた主な原因は多分、
Slack側で発行したトークンが古くなって無効かそれたことが原因と思われるが、
dockerイメージを動的に作成していた為、当時のnpmモジュールが手元にはなくて、何も考えずに
npm install
して作業を始めたら、botkitのAPIの大幅変更に対応する羽目に。
- adapterまわり
- expressを外す対応
が主な対応内容。
adapter周りには以下のQiitaの記事が参考になった。
botkit側でHTTPリクエストを受けることができ、どうもこの機能と、既存のexpressがポートを取り合うようだったので、 既存のexpressを外して、botokit側にHTTPリクエストを処理するように変更した。
このほかにも、hearsでambientをmessageにする必要があった。
また、東京アメッシュのサイトがhttpsになっていたので、これに対応した。 httpでアクセスするとHTTP statusコードの302を返されるので、もしや、ボットを蹴るように仕様変更されたかとも思ったが、 httpsへのアクセスを誘導している模様。
Google Calendarも動かなくなっていた
こちらは、認証情報を再取得することで認証エラーは回避できたが、 コールバックベースの箇所をasync/await対応するタスクが残。
おわりに
dockerでコンテナにしてたが、botkitとSlack側の変更で、外に公開しているWEBサーバーでないと 動かせなくなり、自分の環境ではデプロイ先のheroku環境以外では動かせないので、メリットが薄れたw。
async/awaitを使うだけならほんと分かり易くて便利!だが、既存のコールバックベースのロジックをこの枠組みに乗せるには すこし労力が必要。まぁ慣れもあるが、なれたころには、自前で対応するものがなくなっていそうな気もしなくもない。