Raspberry PiやローカルPCで動かすNode-REDでLine BotのPushメッセージを送るメモ

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が動く」ことです。

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のフローを作る

image

このようなフローを作ります。

image

injectノードはそのまま日付が出力されるようにしましょう。

image

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

を置き換えます。

image

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":[]}]

デプロイ

これで設定は完了です。

image

さっそく injectノードの左についているボタンを押して実行すると、

image

タイムスタンプがメッセージとして飛んできます!

メッセージを変えてみる

image

メッセージを変えるときは inject ノードの内容を変えてみましょう。

image

メッセージが変わります。