LINEメッセージをkintoneに記録するMicrosoftFlowを用いたサーバーレスアプリケーションの作成

#はじめに

##概要

本記事では、LINEアプリから送信したメッセージをLINE MessasingAPI経由でkintoneに記録する処理をMicrosoft Flowで作成する手順をご紹介します。この手順を応用することでLINEアプリを登録UI、kintoneをWebデータベースとしたサーバーレスアーキテクチャのアプリケーションを作成することができます。

##利用イメージ

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/5d00d094-f40c-c2a3-ae0b-9976f4bb706a.png)

##構成図

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/3842d2e0-4a31-f8b6-7186-8a3b9a243315.png)


##使用アプリ・サービス

・[LINEアプリ](https://line.me/ja/download)
・[LINE Messaging API](https://business.line.me/ja/services/bot)
・[Microsoft Flow](https://flow.microsoft.com/ja-jp/)
・[kintone](https://kintone.cybozu.com/jp/)

##参照APIリファレンス

・[kintone REST API](https://cybozudev.zendesk.com/hc/ja/articles/210064823)
・[LINE Messaging API](https://developers.line.me/messaging-api/overview)

#環境の準備

##LINE Messaging API

[LINE Business Center](https://business.line.me/ja/) に自身のLINEアカウントでログインします。※ログイン時にLINEアプリ上での本人確認が必要な場合があります
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/caba5011-8d35-50fa-2686-fd96449885c9.png)

サービスタブからMessaging APIを始めるを選択して、アカウント名（kintone登録）、必要に応じてアイコン、業種を指定してアカウントを作成します。申し込み完了画面からLINE@MANAGERを開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/7201a007-a214-5896-e6a9-bd4fadb794a2.png)

LINE@MANAGERからBot設定を行います。まず、「API利用する」のボタンをクリックします。確認画面が表示されますがそのまま進みます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/d17de2bd-adce-41cb-3930-d29b58f2b7c0.png)

続いて、リクエスト設定内の「Webhook設定」を「利用する」に設定して、詳細設定内の「Botのグループトーク参加」「自動応答メッセージ」「友だち追加時あいさつ」を全て「利用しない」にします。設定が終わったら下部の「保存」ボタンをクリックして設定を保存し、BOT設定内の「LINE Developersで設定する」を開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/5e604aa8-28ae-9102-974d-a2ec6b221de8.png)

LINE developersの画面が開きます。作成したアカウントの以下の値をメモしておきます。

 - Channel ID
 - Channel Secret ※「show」ボタンをクリックすると表示されます
 - Webhook URL　※後の手順で設定しますので現時点では空白で構いません
 - Channel Access Token　※「issue」ボタンをクリックすると表示されます

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/0dce7e9f-0a6f-85e7-9d88-6697c00d2f5c.png)

画面下部にQRコードが表示されるので、モバイルデバイスなどのLINEアプリから友だち追加でQRコードを読み取り友達として追加します。
<img width="375" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/123181/00067537-0b4c-123c-73f9-d19439bb4242.png">

「トーク」から何かメッセージを送ってみましょう。この時点では何も応答がありませんね。これで（WebHookの設定を除く）LINE側の準備ができました。

##Microsoft Flow
Microsoft Flowの環境を準備します。[Microsoft Flow](https://flow.microsoft.com/ja-jp/)のページを開きます。既にMicrosoftアカウントもしくはoffice365のアカウントを持っている方は右上の「サインイン」、持っていない方は「無料でサインアップ」をクリックしてアカウントを作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/2e338d91-3e26-512e-29f8-f54a17585f62.png)

サインインされていることを確認して、マイフロータブを開きます。これで処理フローを作成する準備ができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/86aba59d-a621-25d4-634d-eb05486572e8.png)

##kintone

WebデータベースとしてLINEメッセージを蓄積するkintoneの設定を行います。アカウントをお持ちでない場合は、[サイボウズ社のkintone](https://kintone.cybozu.com/jp/)のページを開き、30日間無料お試しを申し込みます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/20816211-717e-c3d3-3a63-93f0205d5b30.png)

アカウントが準備できたら準備されたURLからkintoneにログインします。ポータル画面が表示されたら右下のアプリの「＋」ボタンをクリックして「はじめから作成」を選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/96463c7a-4dff-94c2-08b7-ddd368a346dd.png)

アプリ設定が開くので、アプリ名称を変更（LINEメッセージ）します。フォームタブにて、以下の内容で配置します。配置したら「アプリを公開」します。

| フォーム種類|フィールド名|フィールドコード|
|---|---|---|
| 文字列（1行）|メッセージ|メッセージ|
| 文字列（1行）|ユーザー|ユーザー|
| 作成日時|-|-|

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/ee0158d0-63c9-2bb0-ca51-0e9fb4bacf0a.png)

続いて一覧タブを開き、「＋」ボタンから「一覧」を追加します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/0ef06f54-f5a5-5be6-641a-7442899d267d.png)

任意の一覧名（LINEメッセージ一覧）をつけ、レコード一覧の表示形式を「表形式」のままで、「メッセージ」「ユーザー」「作成日時」を右側のエリアにドラッグ＆ドロップして「保存」、続いて「アプリを更新」します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/d9c6e409-dcea-0b5f-8a9d-f6132ff92c0f.png)

「メッセージ」「ユーザー」「作成日時」の一覧ができましたね。これでkintone側の準備ができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/52216587-11a9-727f-8a91-115322a05c12.png)

#処理の作成

##トリガーの作成

準備が終わりましたら、いよいよ処理のフローを作成していきます。MicrosoftFlowの「マイフロー」タブを開き、画面右上の「一から作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/b64e1b83-b756-8161-3dea-ccfcb729a174.png)

新規フロー作成画面が表示されるので、フロー名（LINEメッセージkintone登録）を設定して、検索ボックスから「要求」と入力して検索結果として表示された「要求と応答 - 要求」トリガーを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/ee2df73b-8c67-678a-6168-32b29228fb99.png)

本トリガーで生成されるURLをLINEサーバーのWebHookURLで指定したURLに設定することでLINEサーバーからMicrosoftFlowで作成している本フローを起動することができるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/d63ab11f-c8de-bec4-93a9-3f4e53eff748.png)

「要求本文のJSONスキーマ」にLINEサーバーから送られたRequestのBodyを読み込めるようにJSONスキーマを設定します。WebHookAPIでリクエストされるJSONを取得するためにLINE API Reference - Messaging API内の[Webhookエンドポイント](https://devdocs.line.me/ja/#webhooks)を開き右側の「Webhook request bodyの例」のJSONをコピーして[jsonschema.net](http://jsonschema.net/#/)等のサイトを利用したりしてJSONスキーマを生成します。作成したJSONスキーマを「要求本文のJSONスキーマ」に貼り付けます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/5d95ef8c-f94b-b3e3-195f-1355f4f40689.png)

これで処理のトリガーは作成できました。「フローの作成」ボタンをクリックして保存しようとすると一つ以上のアクションが必要な旨のメッセージが表示されるので「＋新しいステップ」からアクションを追加します。検索ボックスに「作成」と入力して検索結果の一覧から「データ操作-作成」アクションを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/a66d323f-dafa-33b5-56ba-8ed2f1a0f8f1.png)

「作成」アクション内の「入力」には、「要求と応答 - 要求」トリガーで指定したJSONスキーマ内の項目を選択できるので、LINEメッセージに該当する「Text」を選択します。JSONスキーマが配列構造になっているので「Apply to each」が自動的に定義され「作成」アクションが中に含まれる処理となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/3832d977-fed0-f07c-c47a-ad9254bf3a22.png)

ここまで出来ましたら一度「フローの作成」ボタンをクリックして保存して完了します。そうすると「完了しました。新しいフローは実行中です」とのメッセージが表示された画面となります。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/8b75d39b-2642-9569-26cf-e857b25f2b54.png)

続いてマイフロータブから作成したフローを再び開きます。「要求と応答 - 要求」トリガーを開くと「この URL に HTTP POST」にURLが生成されますのでコピーします。これでトリガーは作成されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/a3d1150e-3ad3-cc76-cbd9-c9193f106eeb.png)

##LINEサーバ側のWebHookURLの設定

LINE@MANAGERから該当アカウントの「LINE developers」の画面を開き、「Webhook URL」に、前の手順でコピーしたURLを張り付けて保存(Save)します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/84183a23-edb3-6d55-938a-d4c3994580db.png)

##LINE側のWebHook設定とMicrosoftFlow側の要求トリガーの接続確認

これで、本アカウントにLINEメッセージが送られると、本WebHookで指定したMicrosoftFlowの「要求」トリガーが自動的に起動されるようになりました。それでは動作を確認してみましょう。
モバイルデバイスのLINEアプリから作成したアカウント（kintone登録）にメッセージを送信します。
<img width="375" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/123181/88d4e843-50b9-7df6-56ee-9b381ec31bd0.png">

Microsoft Flowにてマイフローから作成したフローの右横の青の「i」ボタンを開きます。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/17d072f6-64dc-e17c-029d-ad80dc5b1aae.png)
処理結果の一覧画面にて状態がSuceededになっていることを確認して処理結果を確認します。「作成」アクションの出力にLINEアプリから送信したメッセージが表示されていればここまでは成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/1a938678-fc96-f8b1-a122-a569a265e271.png)

##LINEユーザ名の取得

次に誰から送られてきたメッセージなのかを判別するために、LINEのユーザ表示名（DisplayName）を取得します。作成したフローの実行結果の「要求」の出力結果には、useridが含まれていることを確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/a542d0b9-da11-c80a-ba07-6223fdd359e3.png)
LINE APIリファレンス Messaging API内の[Profileエンドポイント](https://devdocs.line.me/ja/#bot-api-get-profile)を参照するとuseridをパラメータにユーザの表示名を取得できることがわかります。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/8fba352e-4dcf-aeee-ba61-f18bf0a2bbd5.png)
それでは、フローにユーザ表示名を取得するアクションを追加します。「作成」アクションの下に新たにアクションを追加します。検索にて「HTTP」と入力して検索結果に表示された「HTTP - HTTP」アクションを追加します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/4944975f-d0ba-4e00-0cce-d7ec9bd621ad.png)
以下の内容をセットします。

|項目|値|補足|
|---|---|---|
|方法|GET|-|
|URI|https://api.line.me/v2/bot/profile/[userId]|[userId]には「要求」トリガーのレスポンス値を指定|
|ヘッダー|{<BR>"Authorization": "Bearer [Channel Access Token]"<BR>}|[Channel Access Token]はLINE Developersで取得した値をセット|
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/8153a0b2-0e6f-5c4e-118e-6771d914a936.png)
作成したHTTPアクションの名前を分かりやすい名称（GetLineUsername）に変更します。HTTPアクションを追加したので「作成」アクションは削除します。「フローの更新」で保存して「完了」します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/71a17855-68d2-2b68-7911-8abd90f77003.png)

そこまで出来ましたら、もう一度、LINEアカウントからメッセージを送信してフローの実行結果を見てみましょう。追加したHTTPアクションの出力の本文内のdisplayNameにLINEアカウント表示名（kuwazzy）が表示されていれば成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/6ab6f02f-02b6-8e8c-e707-30474bf60296.png)

##kintoneアプリへの登録

いよいよ取得したメッセージとユーザ表示名をkintoneのアプリに登録する処理を作成します。前の手順と同様にHTTPアクションを追加します。kintoneアプリへの登録には、kintone REST APIの[レコードの登録(POST)](https://cybozudev.zendesk.com/hc/ja/articles/202166160-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%99%BB%E9%8C%B2-POST-#step2)を使用します。

|項目|値|補足|
|---|---|---|
|アクション名|PostKintone|-|
|方法|POST|-|
|URI|https://[SubDomain].cybozu.com/k/v1/record.json|[SubDomain]にはサブドメインをセット|
|ヘッダー|{<BR> "Content-Type": "application/json",<BR> "X-Cybozu-Authorization":"[Base64 encoded UserID:Password]"<BR>}<BR>|[Base64 encoded UserID:Password]はkintoneへのログインUserIdとPasswordをコロンで繋げてBase64エンコーディングした文字列をセット|
|本文|{<BR> "app": [AppId],<BR>&nbsp;"record": {<BR>&nbsp;&nbsp;"ユーザー": {<BR>&nbsp;&nbsp;&nbsp;"value": "@{body('GetLineUsername').displayName}"<BR>&nbsp;&nbsp;},<BR>&nbsp;&nbsp;"メッセージ": {<BR>&nbsp;&nbsp;&nbsp;"value": "[text]​​"<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>}| [AppId]にはkintoneのアプリ管理画面から確認できるIｄをセット、「@{body('GetLineUsername').displayName}」は上流のHTTPリクエスト（GetLineUsername）の出力本文からdisplayNameを取得、[text]には要求トリガーの値をセット|
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/8145e1ed-b847-70c2-ad16-9d05088fb43e.png)
「フローの更新」で保存して「完了」します。それでは、LINEアプリからメッセージを送信してテストを実施してみましょう。追加したHTTPアクション（PostKintone）の実行結果を確認します。出力の状態コードが200（正常）、displayNameにLINEのユーザ名が表示されていることを確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/1a8a95b0-f34a-fa5d-cfbc-1df3cee3f7da.png)
続いてkintoneのアプリ（LINEメッセージ）にLINEアプリから送信したメッセージとLINEのユーザ名のレコードが追加されたことを確認します。レコードが追加されていれば成功です。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/2102899a-ba6b-233a-f8a0-cbf48763ad0a.png)

##LINEアプリへの登録内容の返信

最後にLINEアプリにkintoneへ登録できた旨のメッセージを返信する処理を追加します。LINE APIリファレンス Messaging API内の[Reply Messageエンドポイント](https://devdocs.line.me/ja/#reply-message)を参照するとリクエストの本文にReplyTokenとMessageが必要であることを確認できます。

|項目|値|補足|
|---|---|---|
|アクション名|PostLineReply|-|
|方法|POST|-|
|URI|https://api.line.me/v2/bot/message/reply|-|
|ヘッダー|{<BR>"Content-Type": "application/json",<BR>"Authorization": "Bearer [Channel Access Token]"<BR>}|[Channel Access Token]はLINE Developersで取得した値をセット|
|本文|{<BR>&nbsp;"replyToken": "[replyToken]​​",<BR>&nbsp;"messages": [<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;"type": "text",<BR>&nbsp;&nbsp;&nbsp;"text": "メッセージ「[text]​」を登録しました"<BR>&nbsp;&nbsp;}<BR>&nbsp;]<BR>}|[replyToken]​​と[text]は要求トリガー内の値をセット|
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/ee851940-6ec2-7de7-032f-b250e1295d80.png)
「フローの更新」で保存して「完了」します。それでは、LINEアプリからメッセージを送信してテストを実施してみましょう。メッセージを送信して間もなく登録した旨の返信が届くようになれば成功です。
<img width="375" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/123181/2f144cb3-03e7-068b-0456-8416809fe7ba.png">
kintoneアプリにもレコードが追加されていることも確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/3ad6d32a-f1b3-c51c-b57c-dff110a0463e.png)

#まとめ

今回の手順では処理を簡略化したため、各エラーハンドリングやLINE Messaging APIを利用する場合の[下記の内容](https://devdocs.line.me/ja/#webhooks)については実装していません。実際に運用する場合には必要となりますのでご注意ください。

- WebhookのHTTPS POSTリクエストに対しては、常にstatus code 200を返してください。
- Signature validation

今回作成したフローと同じものはMicrosoft Azure内の[Logic Apps](https://azure.microsoft.com/ja-jp/services/logic-apps/)でも作成することができます。Logic Appsだと[Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/)と呼ばれるサーバー不要のコードアーキテクチャを呼び出せる、更にリージョンの指定や処理スペックの指定が出来ますので、組織として運用する場合、複雑な処理が必要な場合にはLogic Appsの方が向いています。個人レベルの運用で処理も本フロー程度のものであればMicrosoft Flowで実現できることを確認できたと思います。

#最後に

本サンプルを作成するきっかけとなったのは[nkjm](http://qiita.com/nkjm)さんが主催するnode.js×Herokuの環境でLINEChatBotを作成する[Oracle Cloud Developers Meetupでおこなうワークショップ](https://oracleclouddevelopers.doorkeeper.jp/events/54137)に出席したことでした。本ワークショップに参加することでLINE Messaging APIについて理解することができました。この場を借りてお礼申し上げます。