# メッセージ(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 が指定された動画メッセージの視聴を完了したことを示すイベント。このイベントには応答できます。 | ✅ | ❌ |
✅:受信する ❌:受信しない
# ユーザーからテンプレートメッセージやFlex Messageが送信されたときのWebhook
ユーザー自身はテンプレートメッセージやFlex Messageを送ることができませんが、liff.sendMessages()
を利用することで、ユーザーの代わりに、LIFFアプリが開かれているトーク画面にメッセージを送信できます。
liff.sendMessages()
によってユーザーからテンプレートメッセージやFlex Messageが送信された場合、Webhookで届くメッセージオブジェクトはテキストになります。テンプレートメッセージやFlex MessageのaltText
で指定した文字列は、テキストメッセージオブジェクトのtext
に入ります。
"message": {
"type": "text",
"id": "468789577898262530",
"quotedMessageId": "468789532432007169",
"quoteToken": "q3Plxr4AgKd...",
"text": "this is a flex message" // Flex Messageで指定したaltText
}
# ユーザーが送った引用メッセージをWebhookで受け取る
ユーザーが過去のメッセージを引用してメッセージを送った場合、Webhookのmessage
プロパティに含まれるquotedMessageId
で引用対象となったメッセージのIDを確認できます。このとき、引用対象となったメッセージのIDは確認できますが、メッセージの内容(テキストやスタンプなど)は再取得できません。
以下は、ユーザーが過去のメッセージを引用したメッセージを送った際に、ボットサーバーに届くWebhookの例です。
{
"destination": "xxxxxxxxxx",
"events": [
{
"type": "message",
"message": {
"type": "text",
"id": "468789577898262530", // 送られてきたメッセージのID
"quotedMessageId": "468789532432007169", // 引用対象となったメッセージのID
"quoteToken": "q3Plxr4AgKd...",
"text": "Chicken, please." // 送られてきたメッセージのテキスト
},
"webhookEventId": "01H810YECXQQZ37VAXPF6H9E6T",
"deliveryContext": {
"isRedelivery": false
},
"timestamp": 1692251666727,
"source": {
"type": "group",
"groupId": "Ca56f94637c...",
"userId": "U4af4980629..."
},
"replyToken": "38ef843bde154d9b91c21320ffd17a0f",
"mode": "active"
}
]
}
quotedMessageId
プロパティについて詳しくは、『Messaging APIリファレンス』の「メッセージイベント」の「テキスト」および「スタンプ」を参照してください。
ユーザーが引用メッセージを送る方法について詳しくは、『LINEみんなの使い方ガイド』の「トークのリプライ機能を利用する (opens new window)」を参照してください。
# LINE ThingsでのWebhookイベント
LINE Thingsに特有のWebhookイベントもあります。
イベントタイプ | 説明 |
---|---|
デバイス連携イベント | ユーザーの操作により、デバイスとLINEが連携されたことを示すイベント |
デバイス連携解除イベント | ユーザーの操作により、デバイスとLINEの連携が解除されたことを示すイベント |
LINE Thingsシナリオ実行イベント | 自動通信のシナリオが実行されたことを示すイベント |
# その他のWebhookイベント
ビーコンを利用しているときに送信されるWebhookイベントや、Messaging APIを利用したアカウント連携が行われたときに送信されるWebhookイベントもあります。
イベントタイプ | 説明 |
---|---|
ビーコンイベント | ビーコンの電波の受信圏にユーザーが入ったことを示すイベント。このイベントには応答できます。詳しくは、「ビーコンを使う」を参照してください。 |
アカウント連携イベント | ユーザーがLINEアカウントとプロバイダーが提供するサービスのアカウントを連携したことを示すイベント。このイベントには応答できます。詳しくは、「ユーザーアカウントを連携する」を参照してください。 |
# 送信取消イベント受信時の処理
ユーザーは、送信後24時間以内であれば、自分が送ったメッセージの送信を取り消すことができます。
ユーザーがメッセージの送信を取り消すと、ボットサーバーに送信取消イベントが届きます。送信取消イベントを受け取った場合、サービス提供者はユーザーがメッセージの送信を取り消した意図を尊重し、以降は対象のメッセージを見たり利用したりできないよう、最大限の配慮を持って対象のメッセージを適切に扱うことを推奨します。
たとえば、送信が取り消されたメッセージを以下のように取り扱ってください。
- 独自の管理画面などで表示している対象のメッセージの表示を取り消す
- データベースなどに保存している対象のメッセージを削除する
LINEアプリでのメッセージの送信取消について詳しくは、『LINEみんなの使い方ガイド』の「トークの送信取消機能を利用する (opens new window)」を参照してください。
# 受け取りに失敗した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の送信におけるエラーの統計情報を確認する
こちらに記載されていた内容は、「エラーが発生した原因を確認する」に移動しました。
# ユーザーが送ったコンテンツを取得する
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リファレンス』の「プロフィールを取得する」を参照してください。