Go(golang)+HerokuでLINE Messaging APIに触れてみたよ！

![golang-320x320.png](https://qiita-image-store.s3.amazonaws.com/0/8255/412b606e-77d5-c736-2160-865c174793a1.png)

Goの勢いを感じつつ、LineBot APIが新しくなったということでGo未経験からGo+HerokuでLINE Messaging APIでBOTを作ってみました！

## LINE Messaging APIの利用登録
以下URLから利用登録を行います。
今回はお試しということで「Developer Trial」を選択。
(登録するにはLINEアプリ内の設定->アカウント->ログイン許可をONにする必要があります。)

https://business.line.me/ja/services/bot

![スクリーンショット 2016-11-06 16.47.47.png](https://qiita-image-store.s3.amazonaws.com/0/8255/892ad39d-ecae-c2ef-59d3-151c1ad1d401.png)

「Developer Trial」は友達等の制限はあるものの、無料でPush APIも利用出来ます。
プランはこんな感じ。

![スクリーンショット 2016-11-06 16.58.38.png](https://qiita-image-store.s3.amazonaws.com/0/8255/7a44677b-b6af-b508-44bc-1cd4c4679584.png)

Bot名、Botアイコン、職業などを選択して登録。
登録完了後、作成したBOTのLINE@MANAGERから「アカウント設定」->「bot設定」で「APIを利用する」を選択、他設定は以下のようにしておきます。

![スクリーンショット 2016-11-06 20.00.09.png](https://qiita-image-store.s3.amazonaws.com/0/8255/385bffd1-d6a3-186a-f214-8d7b7228684a.png)

一旦LINEの設定は終了！
次はLINEのHookに応答するサーバー環境の準備を行います。

## Go環境準備
### 開発環境
MacOS 10
Go 1.6

### インストール

```
$ brew install go
...
$ go version
go version go1.6.2 darwin/amd64
```

### パス設定
(zshを利用)

```.zshrc
export GOPATH=$HOME/.go
export PATH=$GOPATH/bin:$PATH
source ~/.zshrc
```

### Heroku用のGoアプリを準備
```
$ go get github.com/heroku/go-getting-started
$ ls $GOPATH/src/github.com/heroku/go-getting-started
```

ちなみにここで$GOPATHに以下のように展開された

```
$ tree -L 1 ~/.go
.go
├── bin
├── pkg
└── src
```

### IntelliJ IDEA環境準備(+Golang plugin)
Syntaxチェックやメソッド補完など初心者にはありがたいのでインストールします！(好みでここは飛ばしてください)
(参考：http://qiita.com/kaiinui/items/433eb86c022ffcad0bea)

#### 1.インストール

https://www.jetbrains.com/idea/download/

から Community Edition をダウンロード！

#### 2.Golang pluginをインストール

Preferences -> Plugins -> Go を検索&インストール

![スクリーンショット 2016-10-27 22.35.38.png](https://qiita-image-store.s3.amazonaws.com/0/8255/03835a76-3fe8-d7a6-9645-473d908ce675.png)

#### 3.プロジェクト作成
New ProjectからGoを選択 
=> Project SDKを指定(macでbrewだったら```/usr/local/Cellar/go/[version]/libexec```とかかな？)
=> Project locationに```$GOPATH/src/github.com/heroku/go-getting-started```を指定

![スクリーンショット 2016-10-27 23.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/8255/2663fd6c-6476-f473-ecd0-c2a4600650d5.png)


## Heroku環境準備
### ユーザー登録

Herokuにアクセスして、ユーザー登録を行います。

https://www.heroku.com/

右上のsign upから必要事項を入力して「CREATE FREE ACCOUNT」をクリック。
しばらくするとメールが送られてくるので、そこから本登録。
(「Primary Development Language」は初期で作られるサンプルAppが変わるだけっぽいので、なんでも大丈夫)

![スクリーンショット 2016-11-06 16.18.57.png](https://qiita-image-store.s3.amazonaws.com/0/8255/fa37fafc-2cf2-2695-d886-12b3d5d8ae2e.png)

### Herokuにアプリ登録
コマンドラインからアプリの更新を行う為に、以下のツールをインストール

https://devcenter.heroku.com/articles/heroku-command-line

インストールが完了したら、以下のコマンドをターミナルから入力し
メールアドレスとパスワードを使ってログイン確認を行う。

```
$ heroku login
Enter your Heroku credentials.
Email: [メールアドレス]
Password (typing will be hidden):
Logged in as [メールアドレス]
```

ログインが確認出来たらHeroku用のGoアプリをHerokuにデプロイし、アプリ作成

```
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ heroku create
...
Creating app... done,
https://[アプリ名].herokuapp.com/ | https://git.heroku.com/[アプリ名].git
```

正しくデプロイが完了するとHerokuのPersonal apps内にアプリが出来ているのが確認出来ます。

![スクリーンショット 2016-11-06 16.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/8255/280f0f63-6137-e1c2-674c-816899ab7205.png)

## Bot実装
今回は適当にガヤを入れてくれる、ウザいBotを作ります！

### WebHook設定

LINE@MANAGER内の「bot設定」から「LINE Developers」をクリック
Basic Information内のEditを押し、Webhook URLに以下URlを設定

```
https://[herokuアプリ名].herokuapp.com/hook
```

ついでに```Channel Secret```と```Channel Access Token```を確認しておきます。

### LineのSDKを取得

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

### go-getting-started/main.goを修正
```main.go
package main

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

	"github.com/gin-gonic/gin"
	"github.com/line/line-bot-sdk-go/linebot"
	"fmt"
	"time"
	"math/rand"
)

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

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

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


	router.POST("/hook", func(c *gin.Context) {
		client := &http.Client{Timeout: time.Duration(15 * time.Second)}
		bot, err := linebot.New(<Channel Secret>, <Channel Access Token>, linebot.WithHTTPClient(client))
		if err != nil {
			fmt.Println(err)
			return
		}
		received, err := bot.ParseRequest(c.Request)

		for _, event := range received {
			if event.Type == linebot.EventTypeMessage {
				switch message := event.Message.(type) {
				case *linebot.TextMessage:
					source := event.Source
					if source.Type == linebot.EventSourceTypeRoom {
						if resMessage := getResMessage(message.Text); resMessage != "" {
							postMessage := linebot.NewTextMessage(resMessage)
							if _, err = bot.ReplyMessage(event.ReplyToken, postMessage).Do(); err != nil {
								log.Print(err)
							}
						}
					}
				}
			}
		}
	})

	router.Run(":" + port)
}


func getResMessage(reqMessage string) (message string) {
	resMessages := [3]string{"わかるわかる","それで？それで？","からの〜？"}

	rand.Seed(time.Now().UnixNano())
	if rand.Intn(5) == 0 {
		if math := rand.Intn(4); math != 3 {
			message = resMessages[math];
		} else {
			message = reqMessage + "じゃねーよw"
		}
	}
	return
}
```

### 依存関係を宣言
```
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ go get -u github.com/tools/godep
$ godep save ./...
$ godep go install ./...
```

### Herokuにデプロイ
```
$ git add .
$ git commit -m "Create Gayabot"
$ git push heroku master
```

## 完成！
トーク内にBOTを招待してメッセを送るとガヤってくれるようになりました。
他にも画像、スタンプ、カルーセル表示、クリック可能なボタンを配置したりが簡単に実装出来たので
色々可能性が広がりそうですね！
Goが初めてということで、実装等ご指摘頂けると幸いで御座います。
お疲れ様でした！

<img width="375" alt="IMG_3943.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/8255/4aa4ad0a-0cf0-7623-f5e6-b7e9f13c29c8.png">


## 参考
* [API Reference](https://devdocs.line.me/ja/)
* [わずか5分..](https://bita.jp/dml/line-messaging-api-exp)
* [[golang]GoのSDKで手軽にLINE BOT APIを試してみた](http://qiita.com/pokochi/items/cc06e3f6edc9136446ca)