両親にあと何回会えるのかを計算してくれるサービスをLINEBotとGoogleHomeスキルにリメイクしてみた

# 0.はじめに
お正月に実家に帰省した人も多いはず。私もその一人ですが、**両親の老いを感じ、あと何回会えるのかなとふと感じてしまいました。**「あと何回両親と会えるか計算してくれるアプリを作ろう」と思いたったのですが、すでに素敵なサービスが英語ですがありました。Gigazineで紹介されています。こうやって**数字で可視化してみるといつかいなくなってしまう現実味が増しますよね**。

参考記事：[両親にあと何回会えるのかを計算してくれるサービス「See Your Folks」](https://gigazine.net/news/20131018-see-your-folks/)

**See Your Folks**　http://seeyourfolks.com/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/4334a411-78fe-1bf3-54ae-dda81c73ac26.png)


# 1.作ってみたものはこちら
WEBサービスはもうあったので、LINEBotとスマートスピーカー（GoogleAssistant）対応する**両親にあと何回会えるのかを計算してくれるアプリ**にリメイクしてみることにしました。実際に作ったデモ動画（LINEBot)はこちらです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Google Dialogflow＆python であと何回親に会えるか計算してくれる <a href="https://twitter.com/hashtag/linebot?src=hash&amp;ref_src=twsrc%5Etfw">#linebot</a> を作成。こうやって数字化されると切なくなりますね。<br><br>男女、年齢、頻度のslotで埋める対話処理を作るのがコードをかくより簡単でした。 良かったら使ってみて下さい。<a href="https://t.co/fFJtMwATR0">https://t.co/fFJtMwATR0</a> <a href="https://t.co/ledlHW9D6I">pic.twitter.com/ledlHW9D6I</a></p>&mdash; さい🦏 (@saisan78) <a href="https://twitter.com/saisan78/status/1084823467009032192?ref_src=twsrc%5Etfw">2019年1月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　実際に利用してみたい方はLINEQRコードから友達になってみてください。
※（注意）時々Herokuが眠っています。。。
<img width="200" src="https://qiita-image-store.s3.amazonaws.com/0/133230/abd79048-d7ed-4ca5-da75-3aa81c90f432.png">

#2. 全体構成
今回は以下のような構成で作成します。
DialogFlowを用いることでLINEBotとGoogleAssistantの両方に簡単に対応することができる構成にしました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/a087abf4-5a8a-af1d-df19-53745f771955.png)


#3.あと何回会えるのか計算する
計算式ですが、(平均寿命 － 親の年齢)×(一年間に会える日数) = 今から親と過ごせる残り日数としました。平均余命のデータなどもありますが、今回はシンプルに上記の式を利用しています。
そのため、以下を変数としてLINEBotを作りました。

 - 性別（男女）
 - 年齢
 - 一年間に会える回数

>　２０１７年の日本人の平均寿命は女性が８７・２６歳、男性が８１・０９歳で、いずれも過去最高を更新した。２０日に厚生労働省が発表した「簡易生命表」で明らかになった。
https://www.asahi.com/articles/ASL7N51XSL7NUTFK01Y.html

#2. Dialogflowで対話ロジックを作成する
Dialogflowの使い方やLINEBotの作成方法は以下の記事を参考にしました。
- [Dialogflow で LINE BOT を作ってみました](https://9bo.hateblo.jp/entry/2018/03/21/152450)

今回は必要なSlotを以下のように設定しています。

 - 男女: Person
 - 年齢: number
 - 一年間に会える回数: times

<img width="683" alt="スクリーンショット 2019-01-15 0.02.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/1381cba9-f5b2-b298-4811-bf5b2a266923.png">

上記の３つの変数をいろんなパターンでユーザが聞いてきそうなので、以下のようなIntentを登録しました。

<img width="680" alt="スクリーンショット 2019-01-15 0.03.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/0616e49a-8246-8e9f-4bc8-26aa1c31e5af.png">

母親も父親の呼び方も人それぞれなので、色々な呼び方に対応できるよう辞書を作っています。
<img width="688" alt="スクリーンショット 2019-01-15 0.02.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/133230/f223d85a-2198-0408-a3c1-efa7c0523683.png">

#4. 外部の計算処理部分

３つの変数を用いて計算する部分は外部のサーバ(Heroku)を利用しています。
私も以下のポイントにまんまとハマったので共有しておきます。

[Dialogflow のチュートリアルが間違ってた話](https://qiita.com/Tanasho0928/items/e953a1dc805978aafe99)

また、参考までに計算部分のPythonは以下になります。

```main.py
@app.route("/post_request_google", methods=['POST'])
def webhook():
    data = request.json
    print(json.dumps(data, ensure_ascii=False))#デバッグ用

    try:
        times = data["queryResult"]["parameters"]["times"]
        userAge = data["queryResult"]["parameters"]["number"]
        userInfo = data["queryResult"]["parameters"]["Person"]
        if(userInfo == "お母さん"):
            familydays = (87 - userAge)*times
        else:
            familydays = (81 - userAge)*times
        message =  "１年に" + str(int(times)) + "回会うとして、あなたが" + userInfo + "と会えるのは残り約" + str(int(familydays)) + "回かもしれません。大事にしてくださいね。"
        if(familydays <= 0):
            message =  "長生きされてますね。あなたが" + userInfo + "と会える回数は私にはわかりません。大事にしてくださいね。"
        else:
            print("ok")
    except KeyError:
        print("KeyError")

    reply_body = {
         "fulfillmentText":message
        ,"fulfillmentMessages":[
            {
                "text": {
                    "text": [
                        message
                    ]
                }
            }
        ]
        ,"source":""
    }
    print(message)
    return jsonify(reply_body)
```

#5. DialogFlowを使ってみての感想
今回感じたDialogFlowのメリットは以下です。

- LINEBotとGoogleAssistantのスキルの両方を一度に簡単に作成できる！
- 対話の処理がGUIベースで簡単に作成できる！

一方で、画像を扱うLINEBotなどを作りたい場合にはなかなか使い方が難しいかなとも感じました。
また何か分かり次第まとめたいと思います。

GoogleAssistantのスキルもリリース待ちなので、なにか学びがあればまとめたいと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133230/c7e6a05f-4167-91f6-05eb-e2dedd454f5a.png)