はじめに
LINE Messaging API で応答メッセージを送るために必要な replyToken には有効期限があります。
以前は、以下の記事に記載の通りリファレンスには
応答できるイベントには応答トークンが発行されます。 応答トークンは一定の期間が経過すると無効になるため、メッセージを受信したらすぐに応答を返す必要があります。
と書かれており、実験的に30秒有効と判断されていました。
(自分も1年ほど前に必要があって同様の調査を行い、その時点では30秒であることを確認していました。)
ところが最近、改めてリファレンスを確認したところいつの間にか
応答トークンは、Webhookを受信してから1分以内に使用する必要があります。1分を超える場合の使用については、動作は保証されません。
のような表現に変わっていました。
本当に30秒以上有効となっているのか、「1分を超える場合の使用については、動作は保証されません。」とあるが実際はどの程度使えるのかが気になったので、本記事で検証します。
検証方法
お手軽に検証したいので今回はGASを利用してWebhookイベントを受信し、指定秒数スリープしたうえで応答メッセージを送信します。
//LINE Developersコンソールで取得したアクセストークンを入れる
const CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN';
// Sleepする秒数
const SLEEP_SEC = 60
function doPost(e) {
// Webhookイベントオブジェクトを取得
const webhookEvent = JSON.parse(e.postData.contents);
// 検証のためにSleepを入れる
Utilities.sleep(SLEEP_SEC * 1000);
// イベントを処理する
for (const event of webhookEvent.events) {
// メッセージだけ処理する
const type = event.type;
if (type !== 'message') {
continue;
}
// 応答トークンとメッセージテキストを取得
const replyToken = event.replyToken;
// メッセージを返信
UrlFetchApp.fetch('https://api.line.me/v2/bot/message/reply', {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': `Bearer ${CHANNEL_ACCESS_TOKEN}`,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': replyToken,
'messages': [{
'type': 'text',
'text': `${SLEEP_SEC}秒待機`,
}],
}),
});
}
return 'ok';
}
結論
5分以上使えたが、GASのタイムアウトに引っかかって本当の上限は分からなかった。。。
以下、検証内容です。
まず1分以上使えるかですが、これはあっさりクリアしました。
次に上限を調べるために待機時間を増やしてみました。
600秒で応答がなかったのでおっと思ったのですが、これはGASのタイムアウト6分に引っかかっているだけでした。。。
本当に上限を調べたかったら、GASではなくちゃんとサーバーを立てて検証した方が良さそうです。
まとめ
応答トークンの有効期限は本当に30秒以上に伸びていました。
今回の検証では本当の失効期限は分かりませんでしたが、基本的にはリファレンスに記載の通り1分以内に利用するのが良さそうです。