MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

QRコードをスキャンして結果を返すLINE botをつくる

概要

今回はLINEにQRコード入りの画像を送信するとQRコードを読み取った結果を返すフローを紹介します。

使うのがHTTPやサードパーティーのコネクターなのでLogic Appsを採用しました。

最近では新型ウィルスの流行などでオンラインでのミーティング、勉強会が増えてきましたがその中でアンケートが行われる場合、画面にQRコードが映し出されることがありますよね。 または登壇資料の中で参考資料がQRコードで配布されていたり。

PCで表示していればスマホで読み取れますが、スマホで見ているときに困りますよね。QRコードスマホ上だからスキャンできない!

そんな時に有効なLINE bot、フローを作成してみました。

f:id:mofumofu_dance:20200910084811p:plain

今回はLINE botとのやりとりにHTTPコネクターを、QRコード解析に Cloudmersive のBarcode APIを利用するため、Logic Appsで作成しています。 Power Automateでもプレミアムライセンスがあれば同様のフローが作成できますので、状況に応じて使い分けてください。

全体像

今回のLINE bot は Logic Appsで制御されます。ステップとしては以下の通りです。

  1. LINE botあてに送信されたメッセージ (画像) を受信
  2. メッセージ内の画像を取得
  3. 画像をQRコードスキャンのアクションに引き渡し
  4. スキャン結果を返信

このうち、LINE bot と Cloudmersive のセットアップについては下記松本典子さんの記事が丁寧に解説されているので参照してください。 以下では各ステップごとに設定を解説していきます。

ascii.jp

1. メッセージの受信

フローのトリガー部分です。LINE botからのWebhookを受け取るために、「HTTP要求の受信時」のトリガーを使います。

f:id:mofumofu_dance:20200910075145p:plain

メソッドは「POST」を指定し、スキーマには以下をコピペしてください。

{
    "type": "object",
    "properties": {
        "events": {
            "items": {
                "message": {
                    "properties": {
                        "address": {
                            "type": "string"
                        },
                        "fileName": {
                            "type": "string"
                        },
                        "fileSize": {
                            "type": "number"
                        },
                        "id": {
                            "type": "string"
                        },
                        "latitude": {
                            "type": "number"
                        },
                        "longitude": {
                            "type": "number"
                        },
                        "packageId": {
                            "type": "string"
                        },
                        "stickerId": {
                            "type": "string"
                        },
                        "text": {
                            "type": "string"
                        },
                        "title": {
                            "type": "string"
                        },
                        "type": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "postback": {
                    "properties": {
                        "data": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "properties": {
                    "replyToken": {
                        "type": "string"
                    },
                    "source": {
                        "properties": {
                            "groupId": {
                                "type": "string"
                            },
                            "type": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            }
                        },
                        "type": "object"
                    },
                    "timestamp": {
                        "type": "number"
                    },
                    "type": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            "type": "array"
        }
    }
}

トリガーの設定は以上です。ここで生成されたURLをLINEのMessaging APIに指定しましょう。

トリガーでは"events"という要素部分が配列になっていて、後続のアクションがすべてApply to each/For eachになってしまうので、先に"events"の最初の1件だけを抜き取っておきます。 これで無駄なApply to each/For eachが発生しません。

JSONの解析」アクションを挿入し、コンテンツには以下の式を指定します。 (first関数の利用については以前の投稿をご覧ください)

first(triggerBody()?['events'])

f:id:mofumofu_dance:20200910075336p:plain

JSON解析のためのスキーマとしては以下の通りです。このアクションを入れることでApply to eachが出ず、かつ動的コンテンツで受信したデータを利用できるようになります。

{
    "type": "object",
    "properties": {
        "type": {
            "type": "string"
        },
        "replyToken": {
            "type": "string"
        },
        "source": {
            "type": "object",
            "properties": {
                "userId": {
                    "type": "string"
                },
                "type": {
                    "type": "string"
                }
            }
        },
        "timestamp": {
            "type": "integer"
        },
        "mode": {
            "type": "string"
        },
        "message": {
            "type": "object",
            "properties": {
                "type": {
                    "type": "string"
                },
                "id": {
                    "type": "string"
                },
                "contentProvider": {
                    "type": "object",
                    "properties": {
                        "type": {
                            "type": "string"
                        }
                    }
                }
            }
        }
    }
}

トリガーおよび準備フェーズとしては以上です。

2. 画像の取得

LINE で送られた画像は専用のAPIで取得します。

HTTPのアクションを追加し、メソッドは「GET」で、URLには以下の文字列を設定します。

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

このURLのうち、{messageId}を先ほど解析したJSONの結果で置き換えます。(下図参照)

f:id:mofumofu_dance:20200910075609p:plain

またヘッダーにはMessaging APIのコンソールで取得できる チャンネルアクセストークンを指定する必要があります。

これでメッセージの添付画像を取得できたので、結果をCloudmersiveのアクションに入れていきます。

f:id:mofumofu_dance:20200910104556p:plain

3. QRコードのスキャン

今回のメインであるQRコードのスキャンアクションです。

Cloudmersive Barcodeコネクターの「Scan, recognize image for a barcode」アクションを追加します。

f:id:mofumofu_dance:20200910075707p:plain

アクションの入力は2つ、画像コンテンツと画像のファイル名ですが、ファイル名は任意なので今回は画像コンテンツだけを指定します。

前のステップでLINEに送られた画像をHTTPで取得しているので、この「本文」を動的コンテンツから選びます。

f:id:mofumofu_dance:20200910075845p:plain

実行結果としては以下のとおり、スキャンに成功すれば読み取った結果のデータが表示されます。今回はYoutube動画へのリンクでテストしていますが、他にもテキストなども問題なく取得できていました。

f:id:mofumofu_dance:20200910081153p:plain

4. LINE botからの返信

最後にLINE botから返信で解析結果を返しています。

メソッドは「POST」で、URIには以下を指定します。

https://api.line.me/v2/bot/message/reply

ヘッダーには

{
  "replyToken": "{ここにJSON解析の結果のreplyToken}",
  "messages": [
    {
      "type": "text",
      "text": "読み取り結果"
    },
    {
      "type": "text",
      "text": "{ここにCloudmersiveの結果のRawText}"
    }
  ]
}

{ここに~}と書かれている部分は適宜動的コンテンツで置き換えてください。

f:id:mofumofu_dance:20200910080125p:plain

以上で設定は完了です。

おわり

実際に動作確認をしてみると、期待通りスライドの一部に表示されたQRコードからコンテンツのURLを取得できていました。

読み取り結果がURLであればLINEの中でこれを表示することもできるので、非常に便利ですね。

これでオンラインの勉強会などで『アンケートはQRコードからー』と言われても対応できる!

f:id:mofumofu_dance:20200910080156p:plain

LINE を使っていない場合にはFlowボタンで開始して、画像を添付、最後はモバイル通知にしても良いかもしれません。

がちがちのビジネス系じゃないけど、何かいいコネクターないかなーと思ったらCloudmersiveの各種アクションを見てみると、ちょっとした困りごとを解決するのに役立つかも..?という紹介でした!