隙あらば寝る

うぇぶのかいしゃではたらくえんじにあがかいています

LINE bot on GAE-go

Google App Engine で line bot に挑戦した。

go on Google App Engine の準備

まずはgae-goの単純なアプリを実行する。

https://cloud.google.com/appengine/docs/go/quickstart

に従って進める。

$ git clone -b part1-helloworld https://github.com/GoogleCloudPlatform/appengine-guestbook-go.git hello-linebot-gae-go
$ cd hello-linebot-gae-go
$ goapp serve .
$ curl localhost:8080
Hello, world!%

localhostのport 8080にアクセスしてHello, worldを確認。

goapp serve を使うとローカル環境で開発ができる。

次にgaeにデプロイする。

今回はgae-go-linebotというプロジェクトをwebuiから作成し、先程のhello worldアプリをデプロイ。

$ appcfg.py -A gae-go-linebot-<XXXXX> -V v1 update .
$ curl https://gae-go-linebot-<XXXXX>.appspot.com/
Hello, world!%

gae が利用可能なアカウントを持っていればここまで一瞬で進む。

LINE側の準備

まずMessaging APIアカウントが必要なのでhttps://business.line.me/からログインしてアカウントを作る。

実装的に必要なのは以下。

  • callback url
    • LINEアカウントがメッセージを受け取ったときに通知する先
    • 今回はgaeを使うので、gaeでデプロイしたプロジェクトのURLになる
  • channel secret/channel access token
    • callbackを受けてから、gaeプロジェクトからリプライをLINE側に送信する際に必要

callbackの設定

callbackを先程アカウント登録をしたLINE管理画面から設定する。

https://gae-go-linebot-<XXXXX>.appspot.com/

にしておく。

channel secret/channel access token の設定

gae側で知っている必要がある。環境変数を使うことにするので、プロジェクト設定であるapp.ymlに記述しておく。

env_variables:
  CHANNEL_SECRET: "XXXX"
  CHANNEL_TOKEN: "XXXX"

XX 部分は生成された内容に合わせて app.yml の末尾に記述する。

オウム返しアプリ

あとは go のコードを LINE API を使って書いていくだけ。

完成したサンプルを https://github.com/yoru9zine/hello-linebot-gae-go で公開した。

メッセージを受信するとLINEからwebhookが来るので、メッセージ内容をそのまま返すという単純なボット。

webhookのパース/メッセージ送信はLINE公式ライブラリの https://github.com/line/line-bot-sdk-go/linebot で実装されているので特に悩む必要もなし。

ドキュメントも充実しているので

LINE API Reference

を見ればOK。具体的な関数呼び出し等はサンプルそのままで大丈夫。

一点だけ注意があるとすれば、gae-goではnet/httpのClientがそのままは使えないという点。

http.Clientの実装はurlfetch.Clientから取得する必要があるので、linebot.WithHTTPClientで渡してやる必要がある。

このあたりはインタフェースが用意されているline-bot-sdk-goの作り込みが良くできていると感じた。

(もしかするとgaeを考慮してこのインタフェースを実装していたのかもと思った)

lineの枠組みにおいてイベントタイプはどういうものがあるか等を把握する必要はあるが、

実装面では特にハマる点もなく簡単にできた。

実装上の注意点

go のバージョン

https://cloud.google.com/appengine/docs/go/runtime

1.6.2 なので最新環境とは少し差がある。

例えば context パッケージが標準に入る前なので "golang.org/x/net/context" を使わないといけないとか。

gae-python は置いてけぼりすぎて悲しいことになっているが、go は定期的にバージョンを上げているようなのでその点は安心。