LINEが公開しているGoのSDKを利用して、LINE BOT APIを試してみました。
GitHub
SDK of the LINE BOT API Trial for Go
環境
VM CentOS 7
Go 1.5
Heroku
前提
LINE BOT APIのDeveloperアカウントは取得済みであること。
LINE Developers
Herokuの詳細な操作方法は端折ります。
$GOPATHの設定などは完了していること。
HerokuにGoのアプリケーションをデプロイする
詳細は公式サイトも参考にして下さい。
Getting Started on Heroku with Go
- アプリケーションの準備
$ go get github.com/heroku/go-getting-started
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ ls -l
これでgo-getting-startedディレクトリ配下に必要なファイル群が配置されます。
- アプリケーションをデプロイ
$ heroku create
$ git push heroku master
〜
* [new branch] master -> master
pushが成功すれば無事にデプロイ完了です。
HerokuへFixieアドオンを追加する
HerokuのダッシュボードからGUIで追加できます。
上記でデプロイしたアプリケーションのダッシュボードを開きます。
そこのAdd-onsというテキストに Fixie と入力すると、アドオンの候補が出てきます。
Fixieを選択して、「Provision」を押下すればアドオンの追加は完了です。
今回はFreeのプランを選択しました。簡単、便利ですね。
LineにホワイトリストのIPを登録する
LINE Developersにログインして、LINE BOT APIのチャンネル画面にアクセスする。
左のメニューに「Server IP Whitelist」のリンクがあるのでそこをクリックして、先ほど追加したFixieアドオンの固定IPアドレスを登録します。
IPアドレスの確認方法は「Fixie」画面のAccountボタンを押下して、「Outbound IPs」に記載されてます。
2種類ほどあると思うので、両方登録しておきます。
Fixie Dashboard
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を取得します。
$ go get github.com/line/line-bot-sdk-go/linebot
これで完了です。
main.goを編集する
デフォルトで用意されているGoファイルを編集します。
$ cd $GOPATH/src/github.com/heroku/go-getting-started/cmd/go-getting-started/
$ vi 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
godepで依存関係を宣言する
main.goの編集が終わったらアプリケーションのルートへ移動してgodepコマンドを実行します。
godepはGoにおけるライブラリの依存関係を管理するツールです。
godepをインストールする。
$ go get -u github.com/tools/godep
これでGodepディレクトリのGodep.jsonを更新する。
$ cd $GOPATH/src/github.com/heroku/go-getting-started
$ godep save ./...
もしここでgoのversionエラーが発したら、以下のコマンドを実行して再度、saveします。
$ godep update -goversion
$ godep save ./...
Godep.jsonをもとに、_workspaceディレクトリへ必要なライブラリをインストールする。
$ godep go install ./...
ファイルをコミットしてデプロイする
ここまで出来たら、gitでコミットしてアプリケーションを再度デプロイします。
$ git add .
$ git commit -m "コミットログ"
$ git push heroku master
デプロイが成功したら、LINE BOTを友達にして何か適当にメッセージを送信します。
すると送信したメッセージにOK が付与されて返ってくるはずです。
もしデプロイに失敗したら、HerokuのダッシュボードからActivityログを確認するか、デバッグコードを入れてログを確認してみて下さい。
$ heroku logs --tail
まだトライアルの段階ですが、いろんな可能性を秘めたLINE BOT APIに期待です。
SDKを利用するとテキストだけでなく画像や動画、スタンプなども簡単に操作できて楽しいですね。
それでは、以上です。