Callback (メッセージの受信)

Bot が受信したメッセージやイベント情報を、Callback としてボットサーバーが受け取ることができます。

Developer Console > Bot で指定した Callback URL(ボットサーバー)に対して、LINE WORKS のメッセージサーバーからイベントオブジェクトを含む HTTPS POST リクエストが送られます。

注意

  • Callback Url にはセキュリティ上の理由から自己署名された証明書は許可されていません。
  • 許可された認証機関のリストについては CAリスト を参照してください。

Callback イベント受信時の処理フロー {#callback-flow}

Callback イベントリクエストからレスポンスまでの流れを図にすると以下のようになります。

callback_flow

参考

  • HTTPS POST リクエストの処理が後続のイベントの処理に遅延を与えないよう、イベント処理を非同期化することを推奨します。

メッセージサーバーからのリクエスト {#request-from-message-server}

トークルームへの参加やメッセージの送信などのイベントが発生すると、Callback URL(ボットサーバー)に対して、LINE WORKS のメッセージサーバーから HTTPS POST リクエストが送信されます。

リクエストヘッダー {#request-header}

フィールド名説明
Content-Typeリクエストのコンテンツタイプ
固定で "application/json; charset=UTF-8" が入ります。
X-WORKS-BotIdBot ID
X-WORKS-Signature署名検証に使う署名

注意

  • リクエストヘッダーのフィールド名は大文字小文字を区別せずに扱ってください。表記が予告なく変更される可能性があります。
  • 参考: https://datatracker.ietf.org/doc/html/rfc7230#section-3.2

リクエストボディ {#request-body}

送信元情報 (メンバーのユーザー ID userId やトークルーム ID channelId など) やメッセージ内容等を含んだ JSON 形式になっています。

例. メッセージイベントの場合

{  "type": "message",  "source": {    "userId": "c72af563-0f21-4736-11e4-045237113344",    "channelId": "12345a12-b12c-12d3-e123fghijkl",    "domainId": 40029600  },  "issuedTime": "2022-01-04T05:16:05.716Z",  "content": {    "type": "text",    "text": "hello"  }}

内容は Callback イベントタイプ によって異なります。詳しくはそれぞれのページを参照してください。

署名検証 {#verify-signature}

注意

  • Bot サーバーが受信した HTTPS POST リクエストは、LINE WORKS プラットフォームから送信されていない危険なリクエストの可能性があります。
  • 必ず署名を検証してから、イベントオブジェクトを処理してください。

受け取ったリクエストが LINE WORKS のメッセージングサーバーから正しく送られたものであることを確認するために、リクエストヘッダーの X-WORKS-Signature に含まれる署名を検証します。

  1. 「Developers Console > Bot」から Bot の詳細画面を開き Bot Secret を取得します。
  2. Bot Secret を秘密鍵として利用し、メッセージサーバーから送られたリクエストボディを HMAC-SHA256 アルゴリズムでエンコードします。
  3. エンコードした結果を Base64 エンコードします。
  4. X-WORKS-Signature の値と比較し、一致することを確認します。

注意

  • Bot Secret を外部に流出させないよう注意してください。

Java で署名検証を実装する例は以下の通りです。

String botSecret = ...;String httpRequestBody = ...; // Request body stringSecretKeySpec key = new SecretKeySpec(botSecret.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-WORKS-Signature request header and the signature// signature == headers_signature

Python の実装例は以下の通りです。

import base64import hashlibimport hmacbot_secret = '...' # Bot Secret stringbody = '...' # Request body stringhash = hmac.new(bot_secret.encode('utf-8'),    body.encode('utf-8'), hashlib.sha256).digest()signature = base64.b64encode(hash)# Compare X-WORKS-Signature request header and the signature# signature == headers_signature

Callback イベントタイプ {#callback-event-type}

Callback イベントの種類は以下の通りです。Bot との 1 対 1 トークの場合と複数人トークの場合とで受け取れるイベントが異なります。

タイプ説明1 対 1 トーク複数人トーク
メッセージイベント (message)メンバーからメッセージが送信されたことを示すイベントです。○○
ポストバックイベント (postback)ポストバックアクションが実行されたことを示すイベントです。○○
参加イベント (join)Bot が複数人トークルームに招待されたことを示すイベントです。✕○
退室イベント (leave)Bot が複数人トークルームから退室したことを示すイベントです。✕○
メンバー参加イベント (joined)メンバーが Bot のいる複数人トークルームに参加したことを示すイベントです。✕○
メンバー退室イベント (left)メンバーが Bot のいる複数人トークルームから退室したことを示すイベントです。✕○
開始イベント (begin)Bot とメンバーが 1:1 トークルームを開始したことを示すイベントです。○✕
終了イベント (end)Bot とメンバーの 1:1 トークルームが終了したことを示すイベントです。○✕

それぞれのイベントについての詳細やオブジェクトの形式については各ページを参照してください。

イベントの種類は、今後、追加される可能性があります。

メンバー情報を取得する {#get-user-info}

イベントのオブジェクトには、送信者であるメンバーのユーザー ID userId が含まれています。このユーザー ID を使用すると、そのメンバーの名前やメールアドレスなどの情報を取得できます。

ユーザー情報の取得は ユーザー情報の取得 を使用します。アクセストークン取得時に指定した Scope によって取得できる情報は異なります。

取得できる情報Scope
メールアドレスのみuser.email.read
プロフィール情報user.profile.read
全てのユーザー情報user.read

詳しくは各 API のページを参照してください。

リプライ (メッセージ送信) {#reply}

Bot からのリプライは Bot API のメッセージ送信を用いて行います。詳しくは メッセージ を参照してください。

メッセージサーバーへのレスポンス {#response}

Callback を受け取ったボットサーバーから LINE WORKS のメッセージングサーバーへのレスポンスは、ステータスコード 200 で返してください。