こんにちは、のびすけです。
年末恒例になってきましたがLINE Messaging APIノードのアップデートをしました。
最新ぽいあたりに対応したり、Node-RED Conでコメントもらったバグ対応など諸々です。
以下まとめています。
既読 - Mark As Readノード
既読機能
少し前のLINE Messaging APIの機能追加で既読をつける機能が追加されました。
LINEから送られてくるメッセージオブジェクトにmarkAsReadTokenというものが付与されて送られてくるようになりました。
$ node app.js
listening on 3001
{
type: 'message',
message: {
type: 'text',
id: '593436378864812122',
quoteToken: 'QzDbcIu5WeNySMCZ5bS1wI.....',
markAsReadToken: 'Miz26Y4JPyHcrQEjZ4yBHDi-.....',
text: 'ほげほげ'
},
webhookEventId: '01KD76EJ4DAMEF9XRH2GZHJHZY',
deliveryContext: { isRedelivery: false },
timestamp: 1766546949776,
source: { type: 'user', userId: 'Ud267f1e29292354a587273f391e7a923' },
replyToken: '925bf551c8674b8e9293ab8c1e331ad3',
mode: 'active'
}
昔と比べるとquoteTokenやらmarkAsReadTokenやら送られてくる情報が増えましたね。
Node.jsのSDK側もv10.5.0で対応してました。
client.markMessagesAsReadByToken({
markAsReadToken: event.message.markAsReadToken
})
ちなみに管理画面でチャットのところをONにしないと使えません。
ONになってないと以下のエラーがAPIで返ってきます。
body: '{"message":"Failed to mark messages as read. Please ensure that chat is enabled."}'
ノード対応
メソッドを呼び出すだけなので特殊なことはないですがエラーメッセージ出力もしておくようにしました。
{"message":"Failed to mark messages as read. Please ensure that chat is enabled."}
試しに別のトークンを送ってみるとしっかりエラーメッセージがデバッグパネルに表示されます。
この辺りイマイチノードによって対応状況が異なっている...
利用はこんな感じでリプライメッセージを送る前に既読を付けるイメージです。
メソッド呼び出し的に以下のように逆にしても特にエラーは出なさそうでした。
await client.replyMessage(event.replyToken, {
type: 'text',
text: config.replyMessage || event.message.text
});
..省略..
const res = await client.markMessagesAsReadByToken({ markAsReadToken: markAsReadToken });
ただ、メッセージを読んでいない(既読をつけていない)のに返信をするのは基本的にはありえないと思うのでサンプル的にはmarkAsRead => Replyの流れとしています。
ローディングアニメーション - Loadingノード
ローディングアニメーションを表示するAPIが去年くらいに出ていて以前どこかのバージョンのノードで対応しました。
ただ、なぜかUserIDを指定しないと動かないバグがあり、報告も受けていたので改修です。
基本的には返信をするときに時間が掛かる処理をしているというときにアニメーションを表示させる使い方を想定してると思うので、メッセージオブジェクトが送られてくるリプライメッセージと同時に利用し、UserIDは特に指定しなくても使えるような形に修正です。
また、ローディングアニメーションを表示しているときに実際に処理もスリープさせる機能も追加しておきました。
const { setTimeout: sleep } = require('node:timers/promises');
//省略
if (waitForCompletion) {
await sleep(loadingSeconds * 1000); // 指定秒数待機させる
}
ただこれはDelayノードで指定した方が良い気もしたのでチェックして切り替えられるようにしています。
const res = await client.showLoadingAnimation({
chatId: chatId, //現状user idのみ
loadingSeconds: loadingSeconds,
});
if (waitForCompletion) {
await sleep(loadingSeconds * 1000); // 指定秒数待機させる
}
// レスポンスが {}(空のJSONオブジェクト)なら成功らしい
if (res && Object.keys(res).length === 0) {
node.log('ローディングが成功したかも?: {} が返却されました');
} else {
node.warn('ローディング処理失敗:', res);
}
その他
外観やパッケージの細かい情報を整備したりしました。
結構やれてないところが多いですね。
締め
Node-REDでLINE Bot作るときには結構作りやすいと思うので機会があれば触ってみてください。








