はじめに
上記の組み合わせの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
を追加します。
内容は以下です。
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
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
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を入力します。