[Golang]LINE Botを作ってみよう!

GolangでLINE Botを作っていきましょう!LINE側の設定で戸惑ったところとかも書いておきます。

必要パッケージのインストール

パッケージ管理にdepを、フレームワークにGinを、デプロイ先にHerokuを使います。Herokuへのデプロイについては別記事にしてあるので、ぜひ下記をご覧ください。

[Golang]Herokuにデプロイする!

そして、Go用のLINE Bot SDKもインストールしておきます。

$ go get github.com/line/line-bot-sdk-go/linebot

dep ensureするのも忘れずに!

そして、LINE Botのトークンを入手しましょう。こちらのURLから入手してください。

コードを書いていく

main.goを下のように書いていきます。Botの準備になります。

package main

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

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

func main() {
	port := os.Getenv("PORT")

	if port == "" {
		log.Fatal("$PORT must be set")
	}

	// create line bot
	bot, err := linebot.New(
		os.Getenv("CHANNEL_SECRET"),
		os.Getenv("CHANNEL_TOKEN"),
	)
	if err != nil {
		log.Fatal(err)
	}

	router := gin.New()
	router.Use(gin.Logger())

	router.Run(":" + port)
}

LINEで送信されたメッセージにおうむ返しする機能をつけるためmain関数のなかにCallback処理を書いていきます。

router.POST("/callback", func(c *gin.Context) {
  events, err := bot.ParseRequest(c.Request)
  if err != nil {
    if err == linebot.ErrInvalidSignature {
      log.Print(err)
    }
    return
  }
  for _, event := range events {
    if event.Type == linebot.EventTypeMessage {
      switch message := event.Message.(type) {
      case *linebot.TextMessage:
        if _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(message.Text)).Do(); err != nil {
          log.Print(err)
        }
      }
    }
  }
})

これで「こんにちは」と打つと「こんにちは」と返してくれるようになります。

動かしてみる

Herokuにデプロイしてみます。しかし、環境変数は直にかけないので、下記のようにターミナルで入力してください。

$ heroku config:set CHANNEL_SECRET="******" CHANNEL_TOKEN="******" --app "<app_name>"

これでセキュアに環境変数が扱えるようになりました。これでHerokuにデプロイしてください。

次にLINE developers側の設定をします。

まず、プランをフリープランに変えます。そして、Webhook URLをhttps://<app_name>.herokuapp.com/callbackに設定します。

これで動けるかと思ったんですが、思った挙動をしません。ログをみてみると、linebot: APIError 400 Invalid reply tokenとなっています。なぜだろうと色々試行錯誤していたら、解決策を見つけました。

なんと、「Webhook送信を利用しない」になっていたのです。これを「利用する」にして、念の為LINE@の「自動応答メッセージを利用しない」に変更しました。

これでうまくおうむ返しすることができました!