[golang]GoのSDKで手軽にLINE BOT APIを試してみた

LINEが公開しているGoのSDKを利用して、LINE BOT APIを試してみました。

GitHub
[SDK of the LINE BOT API Trial for Go](https://github.com/line/line-bot-sdk-go)

## 環境
VM CentOS 7
Go 1.5
Heroku

## 前提
LINE BOT APIのDeveloperアカウントは取得済みであること。
[LINE Developers](https://developers.line.me/)

Herokuの詳細な操作方法は端折ります。
$GOPATHの設定などは完了していること。

## HerokuにGoのアプリケーションをデプロイする
詳細は公式サイトも参考にして下さい。
[Getting Started on Heroku with Go](https://devcenter.heroku.com/articles/getting-started-with-go#introduction)

* アプリケーションの準備

```bash
$ go get github.com/heroku/go-getting-started
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ ls -l
```

これでgo-getting-startedディレクトリ配下に必要なファイル群が配置されます。

* アプリケーションをデプロイ

```bash
$ heroku create
$ git push heroku master
  〜
* [new branch]      master -> master
```

pushが成功すれば無事にデプロイ完了です。

## HerokuへFixieアドオンを追加する

HerokuのダッシュボードからGUIで追加できます。
上記でデプロイしたアプリケーションのダッシュボードを開きます。
そこのAdd-onsというテキストに Fixie と入力すると、アドオンの候補が出てきます。

![addons.png](https://qiita-image-store.s3.amazonaws.com/0/84601/a7abfa61-6bfb-0f62-47e1-f8ea84ac69cf.png)

Fixieを選択して、「Provision」を押下すればアドオンの追加は完了です。
今回はFreeのプランを選択しました。簡単、便利ですね。

## LineにホワイトリストのIPを登録する
LINE Developersにログインして、LINE BOT APIのチャンネル画面にアクセスする。
左のメニューに「Server IP Whitelist」のリンクがあるのでそこをクリックして、先ほど追加したFixieアドオンの固定IPアドレスを登録します。

IPアドレスの確認方法は「Fixie」画面のAccountボタンを押下して、「Outbound IPs」に記載されてます。
2種類ほどあると思うので、両方登録しておきます。
[Fixie Dashboard](https://dashboard.usefixie.com/#/account)

## LINEにCallback URLを登録する。
LINE Developersにログインして、LINE BOT APIのチャンネル画面にアクセスする。
左のメニューに「Basic infomation」のリンクがあるのでそこをクリックして、「Callback URL」にLINE BOT APIからコールされるURLを登録します。

今回は以下のURLを登録しました。
```
https://デプロイしたアプリのドメイン:443/callback
```
スキームはhttpsにします。またポート番号443も忘れずに登録します。

## GoのSDKを取得する
以下のコマンドでSDKを取得します。

```bash
$ go get github.com/line/line-bot-sdk-go/linebot
```
これで完了です。

## main.goを編集する
デフォルトで用意されているGoファイルを編集します。

```bash
$ cd $GOPATH/src/github.com/heroku/go-getting-started/cmd/go-getting-started/
$ vi main.go
```

```go:main.go
package main

import (
	"fmt"
	"log"
	"net/http"
	"net/url"
	"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")
	}

	router := gin.New()
	router.Use(gin.Logger())
	router.LoadHTMLGlob("templates/*.tmpl.html")
	router.Static("/static", "static")

	router.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.tmpl.html", nil)
	})

	//この処理を追記
	router.POST("/callback", func(c *gin.Context) {
		proxyURL, _ := url.Parse(os.Getenv("FIXIE_URL"))
		client := &http.Client{
			Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
		}
		// Channel ID、Channel Secret、MIDはLINE Developers画面のBasic infomationで確認できます。
		bot, err := linebot.NewClient(<Your Channel ID>,"<Your Channel Secret>","<Your MID>", linebot.WithHTTPClient(client))
		if err != nil {
			fmt.Println(err)
			return
		}

		received, err := bot.ParseRequest(c.Request)
		if err != nil {
			if err == linebot.ErrInvalidSignature {
				fmt.Println(err)
			}
			return
		}
		for _, result := range received.Results {
			content := result.Content()
			if content != nil && content.IsMessage && content.ContentType == linebot.ContentTypeText {
				//送信されたメッセージにOK を付けて返す
				text, err := content.TextContent()
				res, err := bot.SendText([]string{content.From}, "OK "+text.Text)
				if err != nil {
					fmt.Println(res)
				}
			}
		}
	})

	router.Run(":" + port)
}
```

main.goに以下の処理を追加しました。

```
router.POST("/callback", func(c *gin.Context) {
  〜
}
```

/callbackにアクセスが来たら、ユーザから受け取ったメッセージにOK をつけて返す、というシンプルな処理です。

ポイントはインスタンスを生成する箇所です。
**url.Parse(os.Getenv("FIXIE_URL"))で、Fixieをプロキシに指定することで常に固定IPでLINE BOT APIへアクセスするようになり、事前にホワイトリストにIPを登録しておけばアクセスが許可されます。**
プロキシの指定を忘れると、LINE BOT APIへアクセスした際にエラーが返ってきます。

無事にインスタンスが生成できれば、後はSDKを利用してLINE BOT APIを手軽に利用できます。
SDKでできることは改めてGithubのUsageを参照して下さい。
[SDK of the LINE BOT API Trial for Go](https://github.com/line/line-bot-sdk-go)

## godepで依存関係を宣言する

main.goの編集が終わったらアプリケーションのルートへ移動してgodepコマンドを実行します。
godepはGoにおけるライブラリの依存関係を管理するツールです。

godepをインストールする。

```bash
$ go get -u github.com/tools/godep
```

これでGodepディレクトリのGodep.jsonを更新する。

```bash
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ godep save ./...
```

もしここでgoのversionエラーが発したら、以下のコマンドを実行して再度、saveします。

```bash
$ godep update -goversion
$ godep save ./...
```

Godep.jsonをもとに、_workspaceディレクトリへ必要なライブラリをインストールする。

```bash
$ godep go install ./...
```

## ファイルをコミットしてデプロイする

ここまで出来たら、gitでコミットしてアプリケーションを再度デプロイします。

```bash
$ git add .
$ git commit -m "コミットログ"
$ git push heroku master
```

デプロイが成功したら、LINE BOTを友達にして何か適当にメッセージを送信します。
すると送信したメッセージにOK が付与されて返ってくるはずです。

もしデプロイに失敗したら、HerokuのダッシュボードからActivityログを確認するか、デバッグコードを入れてログを確認してみて下さい。

```bash
$ heroku logs --tail
```

まだトライアルの段階ですが、いろんな可能性を秘めたLINE BOT APIに期待です。
SDKを利用するとテキストだけでなく画像や動画、スタンプなども簡単に操作できて楽しいですね。

それでは、以上です。