理系学生日記

おまえはいつまで学生気分なのか

LINE ビジネスコネクトについて

LINE のビジネスコネクトについて勉強しなくちゃいけなくなったので調べてみました。

平成26年情報通信メディアの利用時間と情報行動に関する調査報告書 によると、LINE の利用率というのは SNS の中で相当数を占めていて、もはやライフラインと言っても良いようなレベルに達しています。

f:id:kiririmode:20161218191818p:plain

そこで LINE がビジネス向けに提供しているのが、LINE ビジネスコネクトというサービスです。

n# LINE ビジネスコネクト

LINE ビジネスコネクトは一言で言えば、企業に対し LINE メッセージングシステムを公開するサービスです。 企業は LINE のアカウントを用意するとともに、BusinessConnect Server とも呼ばれるメッセージの中継サーバを LINE に登録することで、そのアカウントに対して送信されたメッセージを API 経由で受信することができ、また、API 経由でエンドユーザのアカウントに LINE メッセージを送信することができます。

何ができるのか

ピザ屋さんの LINE アカウントにピザのアイコンを含むメッセージを送ったらピザが配達される、みたいな それPla なユースケースが例として良く出てくるんですが、具体的なサービスとしては、クロネコヤマトや日本郵便でやってる LINE 上での配達予定日の変更や配達状況の確認であったりがあります。

他にも、SBI 証券でやっている LINE で株式発注を行えるサービスも、この LINE ビジネスコネクトを使っていると思います。

費用構造

費用構造については、こちらが非常に分かりやすかったです。

システム構成

こちらの図の通り、企業側では、BusinessConnect Server と呼ばれる API サーバを用意して、LINE 側のメッセージングシステムとの送受信を行うことになります。

ビジネスコネクトを利用すると、企業アカウント宛に送信されたメッセージは、LINE のメッセージングシステムの 1 つである Channel Gateway と呼ばれるサーバから、BusinessConnect Server への API 呼出という形で、企業側のシステムに伝えられます。企業側はメッセージを受信したことを Channel Gateway にレスポンス 200 で伝えます。 この後、企業のシステムは受信したメッセージに対して処理(荷物の配送状況を取得するとか)を行い、その処理結果を、BusinessConnect Server から Channel Gateway への API 呼出を行うことでエンドユーザに通知することになります。

ここで、BusinessConnect Server が Channel Gateway からの API 呼出処理の中で、メッセージ送信のために Channel Gateway に API 呼出をし、その正常終了を以って Channel Gateway に正常応答を返却するという処理フローが考えられますが、ビジネスコネクトではこのような処理フローは採るべきではないとされています。 理由については、文脈こそ LINE BOT サーバになっていますが、以下の記事が参考になります。

基本的に、LINE の Channel Gateway から呼び出される API に対して、BusinessConnect Server は 10 秒 以内にレスポンスを返却しなければなりません。もう少し詳しく言うと、5 秒を上回った段階で LINE から注意されてしまいます(SLOW_RESPONSE のメールが送付される)。 このあたりは、先程の LINE BusinessConnectの技術話 にも記述がありまして、

BusinessConnect Serverの責務は、「とにかく受け取った内容を受け取って迅速に200を返すこと」です。メッセージ送信を行ったユーザに対する返信を、このEndpointへのリクエスト送信のレスポンスとして行うことはできません。返信要求は、Channel Gatewayが提供するAPIを使って行います。そのAPIアクセスを、このリクエストを受け持つプロセスやスレッドの中で行った後に200を返すという実装をすべきではありません。非同期に処理を行うことが、スケールするBusinessConnect Serverの条件として必要です。

とされています。 これを実現するためには、DB/KVS/MQ 等でメッセージをバッファする形の非同期処理を行う必要があるでしょう。

API 仕様

認証

API は HTTPS 経由で行われますが、メッセージが確かに LINE のシステムから送られていることを確かめるために HTTP ヘッダ X-LINE-ChannelSignature に署名を付けてくれます。 HTTP Body を HMAC SHA256 でハッシュ化する実装が必要ですが、このあたりの実装は、https://developers.line.me/businessconnect/development-bot-server に記載があるので、凡そコピーすれば良いでしょう。

String channelSecret = ...; // Channel Secret string
String httpRequestBody = ...; // Request body string
SecretKeySpec key = new SecretKeySpec(channelSecret.getBytes(), “HmacSHA256”);
Mac mac = Mac.getInstance(“HmacSHA256”);
mac.init(key);
byte[] source = httpRequestBody.getBytes(“UTF-8”);
String signature = Base64.encodeBase64String(mac.doFinal(source));
// Compare X-LINE-CHANNELSIGNATURE request header string and the signature

逆方向として、メッセージが確かに BusinessConnect Server から送られていることを確認するためには、BusinessConnect Server から Channel Gateway への API 呼び出しの際に X-Line-ChannelToken ヘッダに Access Token を付与する必要があります。 Access Token は Channel Console と呼ばれる管理画面から取得が可能です。注意すべきは Access Token には有効期限が設定されている点で、有効期限が切れた Access Token を使って API を呼び出してもエラーになってしまいます。 Access Token は、払出される際に一緒に発行される refreshToken とともに accessToken 発行用の API を呼び出すことで再発行されるので、バッチ処理等でこの再発行のスキームを用意しておく必要があります。

API

Channel Gateway -> BusinessConnect Server

API の endpoint は管理画面で登録する形になります。

  1. メッセージの受信
    • ユーザが企業アカウントに送信したメッセージを BusinessConnect Server に通知するために使用される
    • テキストだけでなく、画像、動画、音声、位置情報や LINE スタンプもこの API で受け取れる
    • LINE の負荷状況によって、1 回の API 要求に最大 100 メッセージが含まれる。10 秒以内に API レスポンスを返却しなければならないため、上述の通り非同期処理が必要になる。
  2. オペレーションの受信
    • フレンド登録がなされたり、ルームに追加された、アカウントがブロックされた、といったイベントを通知してくれる API。

BusinessConnect Server -> Channel Gateway

メッセージの送信系は、POST https://api.line.me/v1/events で可能。

  1. メッセージの送信
    • POST https://api.line.me/v1/events
    • テキストや画像、動画、音声、位置情報などを送信できる
      • 画像や動画は実画像とサムネイル画像を送信する
      • これらは、ファイルの URL を API パラメータとして送信する
  2. リンクの送信
  3. 複数メッセージの送信
  4. リッチメッセージの送信
  5. 画像/動画のコンテンツ取得
    • GET https://api.line.me/v1/bot/message//content
    • レスポンスとして、バイナリデータが返却される
    • オリジナルのファイル名は Content-Disposition ヘッダで返却される
  6. メッセージのプレビュー
    • GET https://api.line.me/v1/bot/message//content/preview
    • レスポンスとして、バイナリデータが返却される
    • オリジナルのファイル名は Content-Disposition ヘッダで返却される
  7. ユーザのプロフィール取得
  8. グループを離脱する
  9. ルームを離脱する
  10. ユーザのフレンドリストへの企業アカウント追加