LINE Bot API の HTTPS Callback は Amazon API Gateway を使うと簡単便利安価で最高

追記 (4/15)

現在は Let's Encrypt の証明書が利用できるようになっているようです。なので「https で Callback が受け取れない」と言う理由のためだけに Amazon API Gateway を使う必要も無くなりました。


LINE Bot API は Callback URL が https のみで、しかも Let's Encrypt や StartSSL と言った無料の証明書が使えない。どうにか安価で Bot を動かしたいとなると Heroku のようなドメインを指定しなければ Wildcard 証明書が割り当てられている PaaS を使うのが一般的でしょう。

しかし Heroku は外に抜ける IP アドレスがどんどん変わっていくので、 Bot API の IP Whitelist に登録することが出来ない。仕方無いので Heroku に rack-reverse-proxy を置いて、あとはさくらの VPS のような固定 IP アドレスのあるサーバで Bot を動かすようにしました。

# Receive Callback
[LINE Bot API Callback] -- https --> [Heroku] -- https (Let'sEncrypt とか) --> [VPS]

# Call REST API
[VPS] -- https --> [LINE Bot REST API]

しかし Heroku の無料枠では一日 18 時間までしか動かせないし、一旦インスタンスが落ちるとちょっとレスポンスに時間がかかって不便。 そもそも Heroku の 1 インスタンスを使って単なる Reverse Proxy を建てるのも富豪すぎる。

一日中 Bot に話し掛けていたら Heroku の稼動時間が 18 時間を越えてしまったので、最初は「Heroku のインスタンスにカネ払うか~」と思っていたけど 7USD もあったら、もう少しで RapidSSL の証明書買えちゃうしな…。そんな時に見付けたのが Amazon API Gateway でした。

API Gateway って何?

オシャレな Reverse Proxy です。料金もだいぶ安そう。

Amazon API Gateway の無料利用枠では、最大 12 か月間、1 か月あたり 100 万回の API 呼び出しを利用できます。1 か月あたりの呼び出しがこの数値を超えると、API Gateway のレートで課金されます。

LINE Bot API の Callback に設定する方法

だいたいこれ読めばよい。

dev.classmethod.jp

ポイントとしては、 API Gateway の HTTP Proxy はパラメータや Body は転送してくれるけど、 HTTP Header は個別に指定しないと転送してくれない点です。 LINE Bot API の Callback には X-LINE-ChannelSignature が付いてくるので、それを転送するようにします。

あとは API Gateway をデプロイして出てきた URL を LINE Developers に登録します。

動作としては Heroku に Reverse Proxy を建てていたころと全く同じです。

# Receive Callback
[LINE Bot API Callback] -- https --> [API Gateway]  -- https (Let'sEncrypt とか) --> [VPS]

# Call REST API
[VPS] -- https --> [LINE Bot REST API]

Amazon API Gateway なら Heroku の無料枠と違ってインスタンスの稼動時間に制限は無いので快適に Callback を受け取ることが出来ます。

LINE Bot API で匿名グループチャット作った

現在無料で試せる LINE Bot API はトライアルということもあり、企業が利用している LINE Bot (Business Connect) と比べると機能が制限されています。これは公開されている API リファレンスを見比べると分かります。

細かな制限はいろいろありますが、大きなところとしてグループチャットに参加できません。

しかし、グループチャットの中に Bot が 1 つ居るだけで便利というのは、 IRC や Slack の Bot を開発・利用したことがある人なら容易に想像できると思います。そう、 Chat Bot と言うからには、どうしても LINE のグループで自由な Bot を動かしたいのです。

友だち追加は複数人行なえるのだから LINE Bot API 利用アカウントを仲介してグループチャットを作ってみました。単なるグループチャットでは面白くないので、とりあえず入室した人の名前は Gimei を使って適当な名前を割り当ててみました。

LINE Bot API では受信できるメッセージと送信できるメッセージに違いがあります。メッセージを転送するに当たっては以下の部分に留意する必要があります。

  • スタンプは受信できるが、送信は決められたものだけ
  • Contact (連絡先) は受信できるが、送信はできない

通常スマートフォンなどから利用する LINE と違って Bot API なら以下のメッセージが送信できます。

  • Rich Message
    • 企業アカウントなどを利用すると良く送られてくる Link が付いている画像
    • 送るのは難しい (位置指定などのパラメータが複雑)

つまり、 LINE Bot API を利用すればグループチャットとして以下の機能を実装することができます。

  • テキストメッセージの送受信
  • 画像、音声、動画の送受信
  • 位置情報の送受信
  • ショボいスタンプ

これだけあれば LINE として成り立ちます。そして、 LINE Bot API の便利なところは mid を複数指定してメッセージを送る API がある点です。つまり、 1 http request だけで全ユーザにメッセージの配送が出来ます (本当は 150 個までしか指定できませんが、 TrialBot では 50 人までしか指定することは無いと思うので) 。

と言うわけで、 LINE Bot API を使えば LINE のようなものを再実装するのも数時間で出来るという話でした。

今後はこのグループチャット上で動く、便利な Bot を実装したいと思います。

追記

その後