LoginSignup
0
0

More than 3 years have passed since last update.

TwistのchatbotをGoで作ってみた

Last updated at Posted at 2019-12-02

Advent Calendarの間、毎日なんか作ってます。
https://qiita.com/advent-calendar/2019/project25

今回はTwistのchatbotを作ってみました。
Slackbotは作ったことあるし、いっぱい転がってるので

What is Twist?

Todoistで有名なdoistが作った、SlackやMS Teamsなどのようなチャットツールです。
フルリモートな会社が自分たちのために作ったサービスを商用化しただけあって、メッセージが流れて負えないとか一般的にチャットツールで聞かれる不満は一通り解決されています。
Integrationはまだ、Slackに分がありますが、ただのチャットツールとして使っているのであれば乗り換えたほうがハッピーになれそうです。

(ファンですが、中の人ではありませんよ)

https://twist.com/
title.png

Bot

Webhookの仕様

Slackなどであればポーリングしないといけませんが、TwistはREST Hookを採用しているので、subscribeに登録すれば、イベントが発生したときに登録したURLに勝手にリクエストが送られるのでポーリングは不要で、普通のREST APIの応用で作成できます。
https://resthooks.org/

Botの場合、General Integrationを設定すればsubscribeの登録も不要なのでかなり楽です。

設定方法

  1. 自分のTeamにログインし、 Add integrations をクリックします add-integrations.png
  2. Manageをクリックして新規追加をします integrations-dashboard.png
  3. 名前や説明を書きます。Integration typeGeneral Integrationを設定してください。

General Integrationを設定するとOutgoing Hookを別途設定しなくても全てのイベントに反応してくれます。
new-integration.png
4. Botをクリックし、Outgoing webhook URLを設定します。

URLはベーシック認証付きのものだとエラーで設定できないようなので、セキュリティを考慮したいときはパラメータでトークンを渡すかIPなどで制限するしかなさそうです。
bot-settings.png

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にコメントを送ると下記のようになります

スクリーンショット.png

作ったものはここにあります。
作ってみたい方は参考にどうぞ。

page: https://github.com/usk81/twistbot
release: https://github.com/usk81/twistbot/releases/tag/v0.0.1-alpha1

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0