# メッセージ(Webhook)を受信する
ユーザーが、LINE公式アカウントを友だち追加したり、LINE公式アカウントにメッセージを送ったりすると、LINE Developersコンソールの「Webhook URL」に指定したURL(ボットサーバー)に対して、LINEプラットフォームからWebhookイベントオブジェクトを含むHTTP POSTリクエストが送られます。
ボットサーバーで、Webhookイベントオブジェクトを正しく処理してください。なお、長期にわたりWebhookの受信に失敗しているボットサーバーに対しては、Webhookの送信停止を実施する可能性があります。
ボットサーバーが受信したHTTP POSTリクエストは、LINEプラットフォームから送信されていない危険なリクエストの可能性があります。
必ず署名を検証してから、Webhookイベントオブジェクトを処理してください。
HTTP POSTリクエストの処理が後続のイベントの処理に遅延を与えないよう、イベント処理を非同期化することを推奨します。
# 署名を検証する
リクエストがLINEプラットフォームから送られたことを確認するために、ボットサーバーでリクエストヘッダーのx-line-signature
に含まれる署名を検証します。
- チャネルシークレットを秘密鍵として、HMAC-SHA256アルゴリズムを使用してリクエストボディのダイジェスト値を取得します。
- ダイジェスト値をBase64エンコードした値と、リクエストヘッダーの
x-line-signature
に含まれる署名が一致することを確認します。
Python®で署名の検証を実装する例は以下のとおりです。
import base64
import hashlib
import hmac
channel_secret = '...' # Channel secret string
body = '...' # Request body string
hash = hmac.new(channel_secret.encode('utf-8'),
body.encode('utf-8'), hashlib.sha256).digest()
signature = base64.b64encode(hash)
# Compare x-line-signature request header and the signature
詳細とコードサンプルについては、『Messaging APIリファレンス』の「署名を検証する」を参照してください。
# Webhookイベントのタイプ
Webhookイベントオブジェクトに含まれるデータに基づいて、ボットの動作を制御したり、ユーザーの要求に答えたりできます。詳しくは、『Messaging APIリファレンス』の「Webhookイベントオブジェクト」を参照してください。
# 1対1のトークまたはグループトークや複数人トークでのWebhookイベント
1対1のトーク、およびグループトークと複数人トークでは、ユーザーの操作に応じて、以下のWebhookイベントを受信します。
イベントタイプ | 説明 | 1対1のトーク | グループトークや複数人トーク |
---|---|---|---|
メッセージイベント | ユーザーがメッセージを送信したことを示すイベントです。このイベントには応答できます。 | ✅ | ✅ |
送信取消イベント | ユーザーがメッセージの送信を取り消したことを示すイベントです。 | ✅ | ✅ |
フォローイベント | LINE公式アカウントが友だち追加またはブロック解除されたことを示すイベントです。このイベントには応答できます。 | ✅ | ❌ |
フォロー解除イベント | LINE公式アカウントがブロックされたことを示すイベントです。 | ✅ | ❌ |
参加イベント | LINE公式アカウントがグループトークまたは複数人トークに参加したことを示すイベントです。このイベントには応答できます。 | ❌ | ✅ |
退出イベント | ユーザーがグループトークからLINE公式アカウントを削除したか、LINE公式アカウントがグループトークまたは複数人トークから退出したことを示すイベントです。 | ❌ | ✅ |
メンバー参加イベント | LINE公式アカウントがメンバーになっているグループトークまたは複数人トークに、ユーザーが参加したことを示すイベントです。このイベントには応答できます。 | ❌ | ✅ |
メンバー退出イベント | LINE公式アカウントがメンバーになっているグループトークまたは複数人トークから、ユーザーが退出したことを示すイベントです。 | ❌ | ✅ |
ポストバックイベント | ユーザーが、ポストバックアクションを実行したことを示すイベントです。このイベントには応答できます。 | ✅ | ✅ |
動画視聴完了イベント | ユーザーが、LINE公式アカウントから送信されたtrackingId が指定された動画メッセージの視聴を完了したことを示すイベントです。このイベントには応答できます。 | ✅ | ❌ |
✅:受信する ❌:受信しない
# LINE ThingsでのWebhookイベント
LINE Thingsに特有のWebhookイベントもあります。
イベントタイプ | 説明 |
---|---|
デバイス連携イベント | ユーザーの操作により、デバイスとLINEが連携されたことを示すイベントです。 |
デバイス連携解除イベント | ユーザーの操作により、デバイスとLINEの連携が解除されたことを示すイベントです。 |
LINE Thingsシナリオ実行イベント | 自動通信のシナリオが実行されたことを示すイベントです。 |
# その他のWebhookイベント
ビーコンを利用しているときに送信されるWebhookイベントや、Messaging APIを利用したアカウント連携が行われたときに送信されるWebhookイベントもあります。
イベントタイプ | 説明 |
---|---|
ビーコンイベント | ビーコンの電波の受信圏にユーザーが入ったことを示すイベントです。このイベントには応答できます。詳しくは、「ビーコンを使う」を参照してください。 |
アカウント連携イベント | ユーザーがLINEアカウントとプロバイダーが提供するサービスのアカウントを連携したことを示すイベントです。このイベントには応答できます。詳しくは、「ユーザーアカウントを連携する」を参照してください。 |
# 受け取りに失敗したWebhookを再送する
Messaging APIでは、ボットサーバー側で受け取りに失敗したWebhookを再送する機能を提供しています。ボットサーバーが一時的なアクセス過多などの理由でWebhookに対して正常に応答できなかった場合でも、一定の期間、LINEプラットフォームから再送されるため、ボットサーバーの復旧後にWebhookを受け取ることができます。
Webhookの再送は、すべてのMessaging APIチャネルで利用可能です。
- ネットワーク経路上の問題等により、同じWebhookイベントが重複して送信される可能性があります。これが問題になる場合は、Webhookイベントオブジェクトの
webhookEventId
を利用し、重複の検出を行ってください。 - Webhookイベントが再送されることにより、Webhookイベントの発生順序と、ボットサーバーに到達する順序が大きく崩れる可能性があります。これが問題になる場合は、Webhookイベントオブジェクトの
timestamp
を確認することによって、前後関係を確認してください。
# 再送されるWebhook
再送されるWebhookイベントオブジェクトの内容は、deliveryContext.isRedelivery
の値を除き、元のWebhookイベントオブジェクトと同じになります。WebhookイベントIDや応答トークンなどの値は変更されません。
なお、再送されるWebhookイベントオブジェクトに含まれる応答トークンは、特定の場合を除き使用できます。応答トークンについて詳しくは、『Messaging APIリファレンス』の「応答トークン」を参照してください。
# Webhookの再送を有効にする
Webhookの再送は、デフォルトでは無効になっています。Webhookの再送を有効にするには、LINE Developersコンソールより次の手順を行います。
- Webhookの再送を有効にしたいチャネルの設定画面を開く
- [Messaging API設定]タブをクリックする
- [Webhookの利用]をオンにする
- [Webhookの再送]をオンにする
[Webhookの再送]をオンにすると、Webhook再送の利用に際する注意事項が表示されます。この内容に従うことで、受け取りに失敗したWebhookを再送することができます。
# Webhookが再送される条件
LINEプラットフォームから送信されたWebhookは、次の2つの条件を満たすときに、一定の期間内に、一定の時間を空けて再送されます。
- Webhookの再送を有効にしている
- Webhookに対して、ボットサーバーがステータスコード
200
番台を返さなかった
Webhook再送機能は、Webhookの確実な再送を保証するものではありません。また、Webhook再送の件数が短期間で著しく増加し、LINEプラットフォームの動作に影響を与えると判断された場合、Webhookの再送設定が強制的に無効になる可能性があります。
# Webhookの送信におけるエラーの統計情報を確認する
Messaging APIでは、Webhookの送信におけるエラーの統計情報を確認できる機能を提供しています。ボットサーバー側の不具合などによりWebhookを受け取れなかった場合において、Webhookの送信状況を把握するときなどに役立ちます。
# エラーの統計情報を有効にする
エラーの統計情報の表示は、標準では無効になっています。エラーの統計情報を表示するには、LINE Developersコンソールより次の手順を行います。
- エラーの統計情報を表示したいチャネルの設定画面を開く
- [Messaging API設定]タブをクリックする
- [Webhookの利用]をオンにする
- [エラーの統計情報]をオンにする
以上により、エラーの統計情報を表示することができます。統計情報を表示するには、[統計情報]タブに移動し、ドロップダウンより[エラー]を選択してください。
# エラーが発生した原因を確認する
エラーの統計情報では、エラーが発生した原因とその詳細を確認できます。原因には、次の4種類があります。
原因 | 説明 |
---|---|
could_not_connect | LINEプラットフォームからボットサーバーに対してWebhookを送信しようとしましたが、ボットサーバーに正常に接続できませんでした。 |
request_timeout | LINEプラットフォームからボットサーバーに対してWebhookを送信しましたが、ボットサーバーから1秒以内にレスポンスが返されませんでした。 |
error_status_code | LINEプラットフォームからボットサーバーに対してWebhookを送信しましたが、ボットサーバーからHTTPステータスコード200番台以外のレスポンスが返されました。 |
unclassified | 上記に分類できない、不明なエラーが発生しました。 |
各原因における詳細は、次のとおりです。
# 原因が「could_not_connect」の場合
LINEプラットフォームからボットサーバーに対してWebhookを正常に送信できなかった場合、原因はcould_not_connect
になります。この場合における詳細は次のとおりです。
詳細 | 説明 |
---|---|
Connection failed | ボットサーバーへの接続に失敗しました。 |
Connection failed (received GOAWAY) | ボットサーバーへの接続時に、接続が拒否されました。 |
Connection failed (session closed) | ボットサーバへの接続が予期せず終了されました。 |
Connection timeout | ボットサーバーへの接続が一定時間内に完了しませんでした。 |
DNS Query timeout | Webhook URLの名前解決を行いましたが、一定時間内に名前解決を完了できませんでした。 |
Invalid URL syntax | 不正なWebhook URLが指定されています(RFC違反等)。 |
Session protocol negotiation failure | ボットサーバーへ接続しましたが、プロトコルネゴシエーションが失敗しました。 |
TLS handshake failure | ボットサーバーへ接続しましたが、TLSハンドシェイクが失敗しました。 |
Unknown host | Webhook URLに指定されたホストが見つかりませんでした。 |
# 原因が「request_timeout」の場合
LINEプラットフォームからボットサーバーに対してWebhookを送信したが、LINEプラットフォームがレスポンスを受け取れなかった、または送信が途中で失敗した場合、原因はrequest_timeout
になります。この場合における詳細は次のとおりです。なお、ボットサーバー側ではWebhookが正常に受信できている可能性があります。
詳細 | 説明 |
---|---|
Request timeout | ボットサーバーに対してWebhookを送信しましたが、一定期間内にレスポンスが返されませんでした。 |
# 原因が「error_status_code」の場合
原因がerror_status_code
の場合、詳細にはHTTPステータスコードが入ります。
# 原因が「unclassified」の場合
分類できないエラーが発生した場合、原因はunclassified
になります。この場合における詳細は次のとおりです。
詳細 | 説明 |
---|---|
Session closed unexpectedly | ボットサーバーに対してWebhookを送信しましたが、接続が予期せず途中で切断されました。 |
Stream closed unexpectedly | ボットサーバーに対してWebhookを送信しましたが、ストリームが予期せず途中で切断されました。 |
Unclassified webhook dispatch error | 分類できない想定外のエラーが発生しました。 |
# ユーザーが送ったコンテンツを取得する
Webhookで受信したメッセージIDを使って、ユーザーが送信した画像、動画、音声、およびファイルを取得できます。
リクエストの例
curl -v -X GET https://api-data.line.me/v2/bot/message/{messageId}/content \
-H 'Authorization: Bearer {channel access token}'
詳しくは、『Messaging APIリファレンス』の「コンテンツを取得する」を参照してください。
- ユーザーが送ったコンテンツは一定期間後、自動的に削除されます。
- ユーザーが送ったテキストは、Webhookのテキストメッセージオブジェクトで受信できます。Webhookを受信した後で、あらためてテキストを取得するためのAPIはありません。
# ユーザープロフィール情報を取得する
Webhookイベントオブジェクトには、ユーザーIDが含まれています。このユーザーIDを使用すると、ユーザーのLINEプロフィール情報(ユーザーの表示名、ユーザーID、プロフィール画像のURL、ステータスメッセージ)を取得できます。
リクエストの例
curl -v -X GET https://api.line.me/v2/bot/profile/{userId} \
-H 'Authorization: Bearer {channel access token}'
成功した場合、JSONオブジェクトが返されます。
{
"displayName": "LINE Botto",
"userId": "U4af4980629...",
"pictureUrl": "https://obs.line-apps.com/...",
"statusMessage": "Hello world!"
}
詳しくは、『Messaging APIリファレンス』の「プロフィールを取得する」を参照してください。