Advent Calendarの間、毎日なんか作ってます。
https://qiita.com/advent-calendar/2019/project25
今回はTwistのchatbotを作ってみました。
Slackbotは作ったことあるし、いっぱい転がってるので
What is Twist?
Todoistで有名なdoistが作った、SlackやMS Teamsなどのようなチャットツールです。
フルリモートな会社が自分たちのために作ったサービスを商用化しただけあって、メッセージが流れて負えないとか一般的にチャットツールで聞かれる不満は一通り解決されています。
Integrationはまだ、Slackに分がありますが、ただのチャットツールとして使っているのであれば乗り換えたほうがハッピーになれそうです。
(ファンですが、中の人ではありませんよ)
Bot
Webhookの仕様
Slackなどであればポーリングしないといけませんが、TwistはREST Hookを採用しているので、subscribeに登録すれば、イベントが発生したときに登録したURLに勝手にリクエストが送られるのでポーリングは不要で、普通のREST APIの応用で作成できます。
https://resthooks.org/
Botの場合、General Integration
を設定すればsubscribeの登録も不要なのでかなり楽です。
設定方法
- 自分のTeamにログインし、
Add integrations
をクリックします
General Integration
を設定するとOutgoing Hookを別途設定しなくても全てのイベントに反応してくれます。
4. Bot
をクリックし、Outgoing webhook URL
を設定します。
URLはベーシック認証付きのものだとエラーで設定できないようなので、セキュリティを考慮したいときはパラメータでトークンを渡すかIPなどで制限するしかなさそうです。
Goの設定
Handlerの設定は下記のように作りました。
リクエストボディの内容がわからなかったので、とりあえずリクエストボディの内容をオウム返ししてもらうようにしました
func botHandler(w http.ResponseWriter, r *http.Request) {
if r == nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("can not get request"))
}
defer r.Body.Close()
bs, _ := ioutil.ReadAll(r.Body)
w.Write([]byte(fmt.Sprintf("header: %s, body: %s", r.Header.Get("Content-Type"), string(bs))))
}
上記のように設定して、botにコメントを送ると下記のようになります
作ったものはここにあります。
作ってみたい方は参考にどうぞ。
page: https://github.com/usk81/twistbot
release: https://github.com/usk81/twistbot/releases/tag/v0.0.1-alpha1