Help us understand the problem. What is going on with this article?

TwistのchatbotをGoで作ってみた

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした