Goの勢いを感じつつ、LineBot APIが新しくなったということでGo未経験からGo+HerokuでLINE Messaging APIでBOTを作ってみました!
LINE Messaging APIの利用登録
以下URLから利用登録を行います。
今回はお試しということで「Developer Trial」を選択。
(登録するにはLINEアプリ内の設定->アカウント->ログイン許可をONにする必要があります。)
「Developer Trial」は友達等の制限はあるものの、無料でPush APIも利用出来ます。
プランはこんな感じ。
Bot名、Botアイコン、職業などを選択して登録。
登録完了後、作成したBOTのLINE@MANAGERから「アカウント設定」->「bot設定」で「APIを利用する」を選択、他設定は以下のようにしておきます。
一旦LINEの設定は終了!
次はLINEのHookに応答するサーバー環境の準備を行います。
Go環境準備
開発環境
MacOS 10
Go 1.6
インストール
$ brew install go
...
$ go version
go version go1.6.2 darwin/amd64
パス設定
(zshを利用)
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.インストール
から Community Edition をダウンロード!
2.Golang pluginをインストール
Preferences -> Plugins -> Go を検索&インストール
3.プロジェクト作成
New ProjectからGoを選択
=> Project SDKを指定(macでbrewだったら/usr/local/Cellar/go/[version]/libexec
とかかな?)
=> Project locationに$GOPATH/src/github.com/heroku/go-getting-started
を指定
Heroku環境準備
ユーザー登録
Herokuにアクセスして、ユーザー登録を行います。
右上のsign upから必要事項を入力して「CREATE FREE ACCOUNT」をクリック。
しばらくするとメールが送られてくるので、そこから本登録。
(「Primary Development Language」は初期で作られるサンプルAppが変わるだけっぽいので、なんでも大丈夫)
Herokuにアプリ登録
コマンドラインからアプリの更新を行う為に、以下のツールをインストール
インストールが完了したら、以下のコマンドをターミナルから入力し
メールアドレスとパスワードを使ってログイン確認を行う。
$ 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内にアプリが出来ているのが確認出来ます。
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を修正
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が初めてということで、実装等ご指摘頂けると幸いで御座います。
お疲れ様でした!