(改)EC最安値を教えてくれるLINE Botを作ってみた

## LINE Bot初号機をTeachable MachineとNode-Redで進化

https://twitter.com/tnsato2000/status/1694574203582943368

今回こんなノードフローで作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/6a3abf75-6f6a-55a5-f8bf-f60218b0f68d.png)
# ここまでのあらすじと課題
私は小売業の会社に勤務しており、市場価格の変動が激しくそのチェックに手間がかかります。特にECは価格変動スピードが店頭よりも速く追うのが大変です。自社店舗や競合店の巡回時に店頭価格を見た際、現場では携帯しか使用できないため「ECと比較してどうなのか」を確認するのは大変効率が悪いため困っておりました。そこで、前回はLINEに商品コード（JAN）を打ち込むと3大ECモール(Amazon、Rakuten、Yahoo)それぞれの最安値がその場で分かるというLineBot初号機を作ってみました。MakeとSSSAPIを活用し事前に価格調査をまとめたスプレッドシートからデータを引張りLINEへ返すものでした。
【前回記事】

https://qiita.com/tnsato4000/items/ee6395df07a427573f22

しかし、実際運用してみて使い勝手に課題を感じました。店頭で通常13桁ある商品コード（JAN）の数値をLINEへ手打ちするのはかなり面倒だし、間違いやすいという点です。そこで今回は「Teachable Machine」と「Node-Red」を活用して、手打ち作業をなくし商品を撮影するだけで各モールの最安値がLINEに返ってくるという進化版に挑戦しました！
# 目次
[今回使用したツール](#今回使用したツール)
[Teachable Machineの設定](#teachable-machineの設定)
[Node-Redの設定](#node-redの設定)
[各ノード設定](#各ノード設定)
[完成！！](#完成)


# 今回使用したツール
:::note info
**LINE Bot**
**Teachable Machine**
**Node-Red**
**SSSAPI**
:::
今回、LINE Botは多くの方の記事ありますし、SSSAPIの設定については私も前回記事でも触れているので詳細設定については割愛します。

# Teachable Machineの設定
「Teachable Machine」はGoogleが提供する、簡単に機械学習のモデルを作成できるサービスです。 Teachable Machineでは「画像プロジェクト」「音声プロジェクト」「ポーズプロジェクト」の3種類のモデルが作成可能ですが、今回は「画像プロジェクト」を作成します。

### 1.さっそく機械学習
商品の外箱を複数撮影し、画像サンプルとして登録します。各商品のJANをタイトルにします。
方法はウエブカメラ撮影でもPC内の画像アップロードでもかまいません。
その後、モデルトレーニングを行いモデルエクスポートすると設定完了です。
下記写真では一つ目の商品をカメラにかざすと100％合致判定が出ています。各商品の判定率が低くないかチェックして次の工程に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/6cf44589-342d-0e19-c554-8d16a519dd5c.png)

### 2.モデルエクスポートが完了すると下記の画面になります。
共有可能なリンクは後でNode-Red内で使用しますのでどこかにキープです。
また、先程画像学習した画面左上のメニュークリックしGoogledriveへ、学習したプロジェクトを保存しておくと今後便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/f9fad428-f223-1626-3c7d-0b471925d45f.png)

# Node-Redの設定

### 1.使用するノード一覧
|番号  | 分類 | ノード |
|:-:|:-:|:-:|
|1|LINE   |Webhook   |
| 2| ネットワーク  | http request  |
| 3  |分析   |Teachable Machine   |
| 4  |機能   |templete   |
| 5  |ネットワーク  | http request  |
| 6  |機能   |function   |
| 7  |LINE   |RepyMessage   |

ちなみに番号2と5は同じノードです。
### 2.ノードフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/6a3abf75-6f6a-55a5-f8bf-f60218b0f68d.png)

### 3.必要なノード取得
デフォルトでは**LINE（番号1＆7）**　**Teachable Machine(番号3)** は実装されていないため、メニューからパレット管理を選択しノードの追加を行います。
下記のテキストで検索すると追加できるようになります。
```node-red-contrib-line-messaging-api```
```node-red-contrib-teachable-machine```

プロセス詳しく解説されている記事貼っておきます、ご参考までに。

https://qiita.com/youtoy/items/102c9ab8b5f25d542056#node-red-%E3%81%A7-teachable-machine-%E3%82%92%E4%BD%BF%E3%81%86


# 各ノード設定
初挑戦につき、詳細が全く分からないため各ノードにデバックをつけ設定を**msgオブジェクト**に変えておくことで、詳細を確認しながら進めました。
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/d0f066b6-07cc-b935-7725-d4282df7aa79.png)

### 1.LINE Webhook 
Pathは任意で入力です。
これもドキドキしながら調べつつたどり着きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/028403e6-a850-e3a0-33ed-a431d8837863.png)

### 2.http request  

**URL**は下記を入力します。

    https://api-data.line.me/v2/bot/message/{{{line.event.message.id}}}/content

**トークン**は使用する一般的な認証の名前が「Bearer認証」で、Line-DevelopersのMessaging API設定から、チャンネルアクセストークンをコピーして貼り付けます。
その他は下記画像のとおり設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/9af12db7-f3f7-9332-5866-94762c0f6cb2.png)

### 3.Teachable Machine
前述の学習・設定済みのプロジェクトでコピーしたURLをここで使用します。
その他の項目は、下記画像の通り設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/2b0cbc5a-0a9b-c8ec-448f-22e2d9b47da7.png)

### 4.templete
Teachable Machineからの情報を次のGoogle sheetsのデータから情報を取り出すための設定をします。
デバッグウィンドウで確認すると、**payloadのclassなかに 商品コード（JAN）** が入っていることが確認でき、これをキーにSSSAPIからデータを返したい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/50931693-54b3-9dc1-9d9b-e0c8b74e69ba.png)

よって```{{payload.0.class}}```をテンプレートに入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/7cfe577e-6710-e2d7-8c9b-5be52ed6b627.png)

### 5.http request
ここで、上記でテンプレート化した商品コード（JAN）をSSSAPIに送り、データを取得します。
SSSAPIで連携したいスプレッドシートのURLを貼付け。（詳細は前回記事参照下さい）
その他の項目は、下記画像の通り設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/e9a0b3c8-45d7-36d3-a776-38ae63c0df98.png)

### 6.function
ここが今回の最難関でめちゃく大変でした。頭から煙出ました！
商品コード（JAN）をキーにして、**商品名・モール名・それぞれの最安値**をメッセージとして受取りたい、そのために複数列の情報を切り分けなければ。。。
さっぱりやり方のイメージがわきません。
でも前回やったMake ならUIも優れていて、商品コード（JAN）を送ることができれば「HTTP」モジュールからSSSAPIにつないで返せば簡単に解決できるとイメージできたのでMakeに繋げることに挑戦してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/b5d864b2-afeb-103f-0977-caed5812a773.png)
構想はよさそうだが、どうやって商品JANのみをテキストでNode-RedからMakeへ送るかわからない、やっぱり甘くない。
<details>
<summary> それにMake内でのトラブルもどんどん増える。。。<font color="Red">折りたたんでます。</summary>

HTTP make a request でValueに　event　message text項目が出なくなりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/1732d4ad-ddf5-9951-ed09-bcb07e22b5c3.png)
send a replyの　reply token にも　event reply token 項目がなくなってしまいしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/e36e883d-4fb3-d0ef-4665-e18b84829f7b.png)


</details>
やはり今回は勉強もかねてNode-Redを深堀し、Makeへの連携は次回にします。

さっそく、データソースとなるスプレッドシートは以下のとおりで、1行に入っている列情報は5つです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/7e8d8607-f1c0-7bee-7077-58e858768c9a.png)

連携した**http request**のデバックを確認すると以下です！無事5つの列情報は取得できているようです。しかし、問題はpayloadの中に入っているこの5つを切り分けて、メッセージとして取り出す方法がわからないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/f6b92bc9-5d00-6965-ab48-6c3482090cd1.png)

迷走してあれこれいろんなノードを試した結果、**function**ノードなら解決できそうなことにたどり着きました！でも、**function**ノードの編集を開くとその設定方法はなんとJavaScript！知識ゼロです。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/f1ad7d75-d311-7e8b-4aef-2d22af0abe42.png)

しかしながら、我々にはChatGPT先生がいます。先生は質問の仕方が大事です。
何度か質問しなおして、やっとこさ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/084da34f-6e7b-4865-d22a-f98db71a38ba.png)
コードをGETです。

```js
// HTTPリクエストからのpayloadを整形してメッセージを生成
var message = "各ECモールの最安値は以下のとおりです。\n"
    + "ID: " + msg.payload["id"] + "\n"
    + "商品名: " + msg.payload["商品名"] + "\n"
    + "Amazon: " + msg.payload["Amazon"] + "円\n"
    + "Rakuten: " + msg.payload["Rakuten"] + "円\n"
    + "Yahoo: " + msg.payload["Yahoo"] + "円";

// メッセージをmsgオブジェクトにセット
msg.payload = message;

return msg;
```
これをノードに貼付けで完成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/55b357cf-654a-e7a6-591f-d306b4e1d8a8.png)

デバックでチェック。うむ！切り分けとメッセージ化できてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/42814ba4-154c-2391-51eb-b8f904640559.png)

<details>
<summary>余談：最初に返ってきたコードに違和感ありました。ChatGPT様も間違えますが素直に認めて好印象です(笑)　必ず自己責任で確認を。<font color="Red">折りたたんでます。</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/b28a70bf-64e1-4d6c-b5ac-277d16d80cb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/d7ebfaa3-4d2b-ee95-b798-e089efbe56ee.png)
</details>


### 7.LINE RepyMessage
ここまでくれば簡単です。
Line Developersで
Secret:チャンネルシークレットの値を入力
AccessToken：チャンネルアクセストークンの値を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519202/ccbb833f-65f9-44bc-6634-460aa97f0604.png)


# 完成！！
正直かなり苦戦したけどNode-Redで環椎できたことの達成感が大きいです。
やりたいことできて、めちゃくちゃうれしい！((´∀｀))ｹﾗｹﾗ
今後の改善すべく課題は、
### 1.「Teachable Machineレスポンス速度が遅い」最初の動画は4倍速です😢
### 2.「リアルタイムでの価格更新」今後のさらなる学びの中で挑戦です。
では引続き勉強してまいります。