LINE Messagin API を利用できる Node-RED のノードの新機能（Bot の返信で画像を利用）を enebular 上で試す

## はじめに
この記事は、LINE Messagin API を利用できる Node-RED のノードの新機能に関する話です。

●node-red-contrib-line-messaging-api - npm
　https://www.npmjs.com/package/node-red-contrib-line-messaging-api
●node-red-contrib-line-messaging-api (node) - Node-RED
　https://flows.nodered.org/node/node-red-contrib-line-messaging-api

このノードを作った のびすけ さんと Twitter上で以下のやりとりをした時に、画像対応に関するプルリクが来たという話を聞いたことがあったのですが、その機能が利用可能になっていたことに気がついて試してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">画像対応のプルリクもきました :)<a href="https://t.co/eHV0mV2H6f">https://t.co/eHV0mV2H6f</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1421277514517807104?ref_src=twsrc%5Etfw">July 31, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

↓気がついたのは、上記のやりとりをしてしばらく日数が経過してから、[冒頭に書いていたページ](https://www.npmjs.com/package/node-red-contrib-line-messaging-api)を見た時に以下の記載を見つけて知りました。
![リリースノート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0900f4ef-6159-e267-9ef9-e5af1fb64de4.jpeg)

## Bot のリプライで画像を使う
### LINEのチャンネルの設定など
まず、LINEアプリと連携させるための Messaging API まわりの設定を行っていきます。

今回の記事では、アカウント設定や詳細な使い方・手順の話は省きますが、[LINE Developers のページ](https://developers.line.biz/ja/)で設定などを進めていって、主に以下の内容について対応していきます。

- キーとなる文字列の情報を取得（2つ）
   - Channel secret
   - Channel access token
- 連携のための設定
   - Webhook の設定

#### キーとなる 2つの情報を取得
今回は「Node-REDで画像利用」という適当な名前をつけたチャンネルを用意しました。
このチャンネルを作成する際、Messaging API を利用するための設定を選んでいます。
![LINE_Developers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7b9465fc-de4a-c9f3-7ed6-9d5ea07abba2.jpeg)

その画面で、「Basic settings」のタブを選んだ中の「Channel secret」と、「Messaging API」のタブを選んだ中の「Channel access token」の 2つは、この後 enebular で入力する必要がある文字列です。
そのため、どこかにコピペしてメモするなどして、後で利用できるようにしておいてください。
![Basic settingsのChannel secret.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5f029672-8f50-be08-e6c3-5220f7cc0f82.jpeg)

![Messaging API の Channel access token.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ed11f1ca-ea7e-81e8-7a57-5e8f3e0fafbe.jpeg)

#### 連携のための設定やその他
重要な情報 2つをメモしたところで、他の設定なども行っておきます。

設定画面の「Messaging API」のタブを選んだ中に、以下のような Bot の応答の設定などを行う部分があるのですが、ここは「Edit」から別画面へ移動して「Disabled」になるような設定をしておくと良いです。
![設定でDisabledにする部分.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ac069452-9a42-afa5-b7ab-c97d1113b552.jpeg)

また、「Messaging API」のタブを選んだ中の上のほうに QRコードが表示されている部分があるので、LINEアプリで読み込んで Bot とのやりとりができる状態にしておいてください。
![QRコード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/424bb061-b824-a9fd-6b6a-69020a68bcef.jpeg)

その他、同じページ内で「Webhook settings」という項目があり、これも最終的には設定が必要になるのですが、今はここで設定する URL がない状態なので、今時点ではそのままにしておきます（後で設定をしていきます）。
![Webhookの設定項目.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/225bf8bf-0af9-d7a3-b638-bea092687d8e.jpeg)

### Node-RED のフローを作成する（enebular を利用）
### Node-RED用のノードを追加する
LINE Developers のページでの設定等を行った後、Node-RED用のノードを使ってフローの作成を行います。
今回は、Node-RED を試す環境として [enebular](https://www.enebular.com/ja/) を利用します。

ここでは、enebular の詳細やアカウント作成の話については省略します。
enebular を利用可能な状態にして、フローの編集ができる以下の画面まで進み、その画面中の右上のメニューからノードの追加を行います。
![メニューの選択.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b0a3dd50-2594-52f0-3711-5477491e22f2.jpeg)

上記のメニューの「パレットの管理」を選び、出てきた画面上で「ノードを追加」と書かれたタブを選択します。
そこで「node-red-contrib-line-messaging-api」を検索して、ノードの追加を行いましょう。
検索文字列に入力する内容は、名前の先頭から入力するのではなく「line-m」などと、名前の一部を入力して絞りこんでも良いです。

その後、画面左側にあるノードの一覧を見て、以下のノードが追加されているのを確認しておいてください。
![ノード追加後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a2b07038-78b7-4ed1-a37a-ba8cb95b300a.jpeg)

### フローを作成する
#### ノードを配置する
まずは、「http in ノード」を 1つ配置してから、その設定画面で「メソッド」を「POST」に変更し、「URL」の部分に「line」と入力します（この部分の名称は何でも良いです）。
![ノードの配置（http in）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/46ee3fd2-f287-046b-f15f-02dbe46c2eff.jpeg)

![http_inノードの設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/94f73ae8-80a8-285e-512e-7c4c9b858b8e.jpeg)
このノードが、LINEアプリ上で何かメッセージを入力された際に、そのデータを受けとる入り口にあたる部分になります。

そして、3つのノードを追加します。
追加するノードは「switch ノード」、「change ノード」、「Reply Message ノード」の3つです。
![ノードを3つ追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6e88683e-7c01-4a58-17ce-6d4d39779bcf.jpeg)
追加したノードの一部は、上の画像のようにワイヤーでつないでおきます。

この後は、3つのノードの設定を行っていきます。

#### Reply Message ノードの設定
Reply Message ノードの設定では、先ほどメモしておいた「Channel secret」と「Channel access token」の 2つを設定します。
![LINE用の情報を設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/00989427-41d8-c2c4-699f-7636f32e571f.jpeg)

#### switch ノードの設定
switch ノードの設定では、プロパティの部分にある「msg.」の後を「`payload.events[0].message.text`」という内容にします。

さらに、以下の画像の緑矢印で示した部分を押して、2つの処理の分岐を作ります。
その分岐のうち1つは、テキストボックスの部分に「画像」という文字を入れてください。
そして、もう1つの分岐は、プルダウンメニューの中の「その他」を選びます。
![switchノードの設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3678ebf3-db43-9f81-d28e-e60c666dae86.jpeg)
ここで設定した内容により、もし LINEアプリで「画像」という単語が入力された場合は、その返信として Bot から画像が返されます。
もし、それ以外の単語や文章を入力された場合は、Bot は入力された内容と同じ内容をオウム返しします。

#### change ノードの設定など
先ほど、switch ノードで分岐を作ったので、switch ノードの右側のワイヤーをつなぐ部分が 2箇所に増えています。
その部分と他のノードとの間を、以下のようにつなぎます。
![ノードを全てつないだ状態.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c22668be-c29a-97f8-72e8-7f5600e6404e.jpeg)

そして、change ノードの設定を行っていきます。
当初は以下のページに書かれた内容を見て設定をしました（以下は function ノードを使った事例ですが、この記事では change ノードを使う形に変更して利用しています）。

●node-red-contrib-line-messaging-api (node) - Node-RED
　https://flows.nodered.org/node/node-red-contrib-line-messaging-api
![画像のURL指定の例（公式）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/10bb2c4c-f353-ce00-750f-b72facc064e0.jpeg)

ここで、これ以降で記載している一通りの設定等も行って動作確認をしたところ、画像によるリプライが想定通りに動いていない状況になりました。
（今回の仕組みとしては、以下の画像の 2つ目のやりとりで、「画像」と書いた部分の返信がオウム返しではなく画像の表示になるはずでした）
![画像のリプライが行われない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/75925016-d771-fd5a-f25c-23e4535f407d.jpeg)

いったん、ノードから出力される内容をデバッグして確認したりしつつ、LINE Developers の仕様も見てみました。
仕様の確認を行ったのは、以下のページです。

- [メッセージタイプ | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/message-types/#sticker-messages)
- [Messaging APIリファレンス | LINE Developers](https://developers.line.biz/ja/reference/messaging-api/#image-message)
![画像メッセージの仕様.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f1beccc8-6c7e-2bf0-685f-bf9c163b26a7.jpeg)

上記の仕様を見て、「`originalContentUrl`」だけでなく「`type`」や「`previewImageUrl`」も設定すれば良いのかな、と思い試してみました。
具体的には、changeノードの設定を以下のようにしました。
![changeノードの設定内容.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5dfa2caa-c114-a4a1-a047-3b20ffd017f8.jpeg)

書きだしてみると、以下の内容になります。

- 値の代入の 1つ目： 
   - msg. の後の文字列 「`payload.events[0].message.type`」
   - 　対象の値 「`image`」
- 値の代入の 2つ目： 
   - msg. の後の文字列 「`payload.events[0].message.originalContentUrl`」
   - 　対象の値 「`https://pbs.twimg.com/profile_images/1165566424699457537/IYBnJ1i5_400x400.jpg`」
- 値の代入の 3つ目： 
   - msg. の後の文字列 「`payload.events[0].message.previewImageUrl`」
   - 　対象の値 「`https://pbs.twimg.com/profile_images/1165566424699457537/IYBnJ1i5_400x400.jpg`」

上記の設定の下2つで設定している URL は、[ノードの公式ページ](https://flows.nodered.org/node/node-red-contrib-line-messaging-api)に書かれていたものをそのまま使っています。
そして、enebular の画面右上の「デプロイ」ボタンを押して、フローのデプロイを行います。

#### Webhook用の URL を確認
ここで、Webhook用の URL を確認してみます。

enebular の画面右上の「デプロイ」ボタンの左にあるアイコンにカーソルを合わせ、そこで表示される URL をコピーしておきます。
![URLを確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6b396d1d-f7f6-7fd7-68fd-d523ceaaed9c.jpeg)
文字列としては「`https://【固有の文字列】.herokuapp.com/`」という形になっているかと思います。

この URL の文字列に、さらに「http in ノード」で付与していた文字列を追加したものが、LINE Developers のページでの Webhook設定に用いる文字列になります。

具体的には以下のとおりです。
`https://【固有の文字列】.herokuapp.com/line`

### Webhook の設定
上の手順（LINE Developers のページで進める手順）で設定を行わずに通り過ぎていた、「Messaging API」のタブの中の「Webhook settings」に URL を入力していきます。

具体的には以下のように設定しました。
![Webhookの設定.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a8509a07-4a44-cfbd-985d-0546b043fc21.jpeg)

## LINEアプリから動作を確認してみる
準備は完了したので、あとは LINEアプリから動作確認を行います。

動作としては、「画像」というメッセージを送った際は Bot から画像が返ってきて、それ以外のテキストを入力した場合は Bot からオウム返しされる、という想定です。
動作確認の結果は以下のとおりで、想定通りの動作になっていることを確認できました。
![JoQBX2mq.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/bd7cf6e2-1b48-5cd6-fdc8-b15d4ff92388.jpeg)

### 少し手を加えたものを試した話（結果のみ）
上記の内容に少し追加・変更をしてみたものも試しました。
試した内容は、[とある Node-RED の初心者向けハンズオン資料](https://github.com/1ft-seabass/node-red-beginner-handson-4/blob/master/02_api_request.md)に登場していた「Random Cat という API」を使った構成で、Bot が返す画像がランダムに選択された猫の画像になる、というものです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">先ほどツイートしていた、LINE Messaging API用の Node-RED のノードを使った画像でのリプライ、<br>猫画像を取得する API から画像をとってきて Bot がリプライする、というのも試してみた。<a href="https://twitter.com/hashtag/LINE_API?src=hash&amp;ref_src=twsrc%5Etfw">#LINE_API</a> <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> <a href="https://twitter.com/hashtag/nodered?src=hash&amp;ref_src=twsrc%5Etfw">#nodered</a> <a href="https://twitter.com/hashtag/noderedjp?src=hash&amp;ref_src=twsrc%5Etfw">#noderedjp</a> <a href="https://t.co/nMosBRz7xn">https://t.co/nMosBRz7xn</a> <a href="https://t.co/sCTPQFwtHR">pic.twitter.com/sCTPQFwtHR</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1427277963473547265?ref_src=twsrc%5Etfw">August 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記のとおり、想定通りの動作になりました。
（この話は別途、記事に書ければと思っています）

## 終わりに
LINE Messagin API を利用できる Node-RED のノードを使い、「Bot が画像によるリプライを行う」という仕組みをシンプルな構成で試しました。
Node-RED で作った部分は色々と手を入れる余地もあるので、このノードを使った別の仕組みも試していければと思います。

それと余談のような内容になりますが、今回使ったノードを過去に使った事例の話を少し載せてみます。

### 過去に node-red-contrib-line-messaging-api を使った時の話
今回使ったノードは過去に利用したことがあり、例えば「LINEアプリから OBS のシーン切り替えを行う」という仕組みを作る際などに使ったりしました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">先ほどのものに加えてもう1つ、前に作ったOBSのシーン切り替えを外部から行える仕組み、それもLINEアプリと連携させてみた！<br><br>LINE Bot用の処理や、シーン切り替えのメッセージをLINEアプリからOBSへWebsocketで送信する部分の実装などは、 <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> 上の Node-RED を使いました。<a href="https://twitter.com/hashtag/noderedjp?src=hash&amp;ref_src=twsrc%5Etfw">#noderedjp</a> <a href="https://t.co/7QMZEF4EdX">pic.twitter.com/7QMZEF4EdX</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1318962655609061376?ref_src=twsrc%5Etfw">October 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

↓その概要については、以下の LT用資料に書いています。

<script async class="speakerdeck-embed" data-id="33d4a7b4408f471eb8b7972a29c01353" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>