LoginSignup
14
14

More than 3 years have passed since last update.

GoとDockerとHerokuでLINEBOTをためしてみる

Posted at

はじめに

上記の組み合わせのQiitaの記事がなかったのでまとめてみました。
Git, Docker, Herokuの最低限の知識を前提にしています。

ディレクトリ構成

linebot_go
| -- Dockerfile
| -- heroku.yml
| -- main.go

GoとDockerとHerokuの環境を準備する

LINEBOTを導入する前に、まずはこちらの記事を参考にして準備します。
Goで書いたサーバーをHerokuにDocker Deployする

pushしたらHerokuに自動デプロイされるようにする

上記の記事だと毎回デプロイするのに2コマンドを打たなければいけないので、1コマンドでデプロイできるようにします。

・上記記事(2コマンド)

$ heroku container:push web
$ heroku container:release web

・1コマンド

$ git push heroku master

ルートディレクトリにheroku.ymlを追加します。
内容は以下です。

heroku.yml
build:
  docker:
    web: Dockerfile

参考:Building Docker Images with heroku.yml

LINEBOTを導入する

LINEアカウント作成、SDKインストール

こちらの記事を参考にして、アカウント作成とSDKのインストールをする。
Go入門!?LineAPIとGOでオウム返しbotを作る
⇒Lineアカウントの準備、Line SDKのインストール

main.goを修正

SDKにある以下のサンプルを参考にしてmain.goを修正します。
line-bot-sdk-go/examples/echo_bot/server.go

main.go
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "strconv"

    "github.com/line/line-bot-sdk-go/linebot"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world!\n")
}

func lineHandler(w http.ResponseWriter, r *http.Request) {
    bot, err := linebot.New(
        "(自分のシークレットを入力)",
        "(自分のアクセストークンを入力)",
    )
    if err != nil {
        log.Fatal(err)
    }

    events, err := bot.ParseRequest(r)
    if err != nil {
        if err == linebot.ErrInvalidSignature {
            w.WriteHeader(400)
        } else {
            w.WriteHeader(500)
        }
        return
    }
    for _, event := range events {
        if event.Type == linebot.EventTypeMessage {
            switch message := event.Message.(type) {
            case *linebot.TextMessage:
                replyMessage := message.Text
                if replyMessage == "ぶりぶり" {
                    replyMessage = fmt.Sprintf("あああああああああああああああああああああああああああああああ!!!!!!!!!!!(ブリブリブリブリュリュリュリュリュリュ!!!!!!ブツチチブブブチチチチブリリイリブブブブゥゥゥゥッッッ!!!!!!!)")
                }
                if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(replyMessage)).Do(); err != nil {
                    log.Print(err)
                }
            case *linebot.StickerMessage:
                replyMessage := fmt.Sprintf(
                    "sticker id is %s, stickerResourceType is %s", message.StickerID, message.StickerResourceType)
                if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(replyMessage)).Do(); err != nil {
                    log.Print(err)
                }
            }
        }
    }
}

func main() {
    port, _ := strconv.Atoi(os.Args[1])
    fmt.Printf("Starting server at Port %d", port)
    http.HandleFunc("/", handler)
    http.HandleFunc("/callback", lineHandler)
    http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
}

Dockerfileを修正

そのままのDockerfileだとLINEのSDKがHerokuにインストールされないので以下のコマンドを追記します。
RUN go get github.com/line/line-bot-sdk-go/linebot

Dockerfile
FROM golang:latest as builder

ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /go/src/github.com/yokoe/go-server-example
COPY . .
RUN go get github.com/line/line-bot-sdk-go/linebot
RUN go build main.go

# runtime image
FROM alpine
COPY --from=builder /go/src/github.com/yokoe/go-server-example /app

CMD /app/main $PORT

Herokuにpush

git push heroku masterでpush。

LINE DevelopersのWebhookにHerokuのURLを設定

LINE Developers>Messaging API設定>Webhook設定
にHerokuのURLを入力します。
linedev.PNG

BOTを友だち追加しておためし!

30656.jpg

14
14
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
14
14