LINE で送ったQRコード画像をIDに変換する


背景

昔作った、LINE で薬箱の管理をするためのデバイスの制御で、
LINE で送ったQRコード画像をIDに変換することがあったのでメモしておく。

デバイスそのものの詳細はこちら。
https://protopedia.net/prototype/c164bbc9d6c72a52c599bbb43d8db8e1

デバイスの紹介動画はこちら(2:00 あたりから)
https://www.youtube.com/watch?v=Ld_jOXHXZXg

この制御では、薬箱のIDをQRコード化しておき、
薬箱に張り付けられたQRコードを撮影してLINE でbot に送信すると、
bot を制御するサーバでLINEユーザと薬箱のIDとを関連付ける。

薬箱を開けると、関連付けられたLINEユーザに通知が飛び、
薬箱がいつ開けられた≒薬が飲まれたのかを記録し、
薬の管理ができるというもの。

前提条件

  • LINE Messaging API を登録していること
    • webhook のURL も設定していること
    • アクセストークンを発行して取得しておくこと
  • NodeRed 環境を構築済みであること
  • 公開されているNodeRed のノードの一つであるnode-red-contrib-qrdecode(以下qrdecodeノード) を使うので、Nodered でインストールしておくこと

やること

http in ノードを設置し、LINE API からのリクエストを受信する


webhook のURL をここで設定しておく。
LINE API からのリクエストがmsg.payload に入ってくる。

画像をリクエストする

  1. Javascript を実行する
    1. LINE API からのリクエストからユーザIDとメッセージIDを取得する
    2. メッセージIDから画像を取得するためのリクエスト用のURLを生成する
    3. アクセストークンからURLリクエスト時のヘッダを生成する
    4. ユーザIDから画像を保存するパスを生成する
  2. http request を発行する(http request ノードを配置)
    • メソッドはGET
    • 出力形式は「バイナリバッファ」
  3. ファイルに画像を保存する(file ノードを配置)
    • ノードのプロパティではファイル名を指定しない

Javascript のコードはこちら。

// 1. LINE API からのリクエストからユーザIDとメッセージIDを取得する
var event = msg.payload; 

// まず、イベント種別がmessage のもので、メッセージ種別がimage かどうかを判定する。
if(event.type == "message" && event.message.type == "image") {
    // 2. メッセージIDから画像を取得するためのリクエスト用のURLを生成する
    msg.url = "https://api.line.me/v2/bot/message/"+ event.message.id + "/content"; 

    // 3. アクセストークンからURLリクエスト時のヘッダを生成する
    msg.headers = {
        "Authorization" : "Bearer " + "####", // ここにアクセストークンを入れる
        "Content-Type": "application/jpeg",
    };

    // 4. ユーザIDから画像を保存するパスを生成する
    // LINE で送信された画像を一時的に保存しておくファイル名。特定のディレクトリでファイル名をユーザIDとしておく。
    // 一連の処理が終わったら消しておく
    msg.filename = "/home/hogehoge/storage/" + event.source.userId + ".jpg";

    return msg;
}

QR コードをデコードする

  1. Javascript を事項する
    1. msg.payload にデコードする画像へのパスを代入する
  2. qrdecode ノードを実行する
  3. デコード結果を取得する
    • msg.payload にデコード結果が入っている

Javascript のコードはこちら。

msg.payload = msg.filename; 

return msg;