Raspberry PiやローカルPCで動かすNode-REDでLine BotのPushメッセージを送るメモです。
参考とした仕組み
BMXUG女子部勉強会で登壇 したときに参考にした、
Node-REDでLINE botを作ってみた – Qiita
という記事をベースに進めていきます。ですが、IBM Cloudで作る仕組みで、かつ、replyMessage(ボットに来たメッセージに合わせて即返信する仕組み)のものなので、ユーザーとのやり取りというより単純に通知を送るようなPushメッセージの場合について切り出してみます。
事前準備
Line Botに必要な設定を把握している
LINE Developers で、今回使いたい LINE Bot の設定を済ませていて使えるようにしておきましょう。以下の設定をメモしておきましょう。
- チャネルシークレット
- チャネルアクセストークン
- あなたのユーザーID
また、以下も対応しておきましょう。
- Webhook
- 有効
- 友達登録
- QRコードを読み込んで友達登録しておきます
まだの方は、以下の記事を参考に進めましょう。
- Node-REDでLINE botを作ってみた – Qiita
- チャンネルの作成 の箇所
- 1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest – Qiita
大事なのは「Node-REDを介さなくてもLINE Botが動く」ことです。
Node-RED インストールが済んでいる
ローカルでNode-REDを実行する : Node-RED日本ユーザ会
こちらを元にNode-REDが自分のPCで動いている前提で進めます。
一旦、node-redを終了している
もし、Node-REDを起動していたら終了して作業を始めましょう。
Line Botの仕組みをインストール
コンテキストを利用する : Node-RED日本ユーザ会のに書かれている、設定ファイルのfunctionGlobalContextプロパティを利用することで、 グローバルコンテキストにnpmでインストールできるモジュールを使えるようになります。
ということで、Line Botの仕組みをインストールしてみましょう。
設定フォルダへ移動
まず、Node-REDに何かしらのnpmモジュールを使えるようにする場合は設定フォルダに移動しつつインストールするので、まず移動しましょう。もちろん、通常のNode-REDノードであればパレットにノードを追加することで進められます。
今回は、あくまで「Node-REDに何かしらのnpmモジュールを使えるようにする」ときの対応だと意識しましょう。
MacやRaspberryPiの場合は、
cd ~/.node-red
でNode-REDの設定フォルダに移動します。
Windowsの場合は、
cd <ユーザーフォルダ>\.node-red
※たとえば <ユーザーフォルダ>が、 C:\Users\hogeuser
であれば C:\Users\hogeuser\.node-red
です
でNode-REDの設定フォルダに移動します。
@line/bot-sdk インストール
設定フォルダに移動したら、インストールします。
npm i @line/bot-sdk [/html]</div> のコマンドを実行します。 ### functionGlobalContextに書き加える 設定フォルダの <div></div> を編集します。 Node-REDインストール後に何も設定した記憶がなければコメントアウトされているはずなので、 <div> functionGlobalContext: { linebot: require('@line/bot-sdk') },
functionGlobalContextの値に、このように linebot: require('@line/bot-sdk')
を加えます。これで、Node-RED上で linebot
という値で呼び出すことができるようになります。
Node-RED を起動
Node-REDを起動してフローを作ってみましょう。もし、起動中のまま作業していた場合、今までの設定を反映させるために再起動しましょう。
Node-REDのフローを作る
このようなフローを作ります。
injectノードはそのまま日付が出力されるようにしましょう。
functionノードで、いよいよ先ほどのlinebot呼び出しを使います。functionノードには以下のソースを書きます。
const line = context.global.linebot; const config = { channelSecret: '<channelSecret>', channelAccessToken: '<channelAccessToken>' }; const myUserId = "<myUserId>"; // create LINE SDK client const client = new line.Client(config); // pushMessage client.pushMessage(myUserId, { type: 'text', text: msg.payload, }); return msg;
そして、上記のソースの
<channelSecret>
- 先ほどメモしたチャネルシークレット
<channelAccessToken>
- 先ほどメモしたチャネルアクセストークン
<myUserId>
- 先ほどメモしたあなたのユーザーID
を置き換えます。
debugノードもそのままでOK。
フローJSON
このフローは以下のフローJSONをインポート可能です。
[{"id":"a536b712.f574c8","type":"function","z":"a0bffb27.dea4f8","name":"LINE pushMessage","func":"const line = context.global.linebot;\n\nconst config = {\n channelSecret: '<channelSecret>',\n channelAccessToken: '<channelAccessToken>'\n};\n\nconst myUserId = \"<myUserId>\";\n\n// create LINE SDK client\nconst client = new line.Client(config);\n\n// pushMessage\nclient.pushMessage(myUserId, {\n type: 'text',\n text: msg.payload,\n});\n\nreturn msg;","outputs":1,"noerr":0,"x":970,"y":500,"wires":[["ec99e9c0.6758b8"]]},{"id":"8774dd7b.a72cd","type":"inject","z":"a0bffb27.dea4f8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":780,"y":500,"wires":[["a536b712.f574c8"]]},{"id":"ec99e9c0.6758b8","type":"debug","z":"a0bffb27.dea4f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":1190,"y":500,"wires":[]}]
デプロイ
これで設定は完了です。
さっそく injectノードの左についているボタンを押して実行すると、
タイムスタンプがメッセージとして飛んできます!
メッセージを変えてみる
メッセージを変えるときは inject ノードの内容を変えてみましょう。
メッセージが変わります。