Dialogflow API V2使ってGoogle Homeのアプリを作成

# はじめに
Google Homeのアプリ？を作りたくなって、下記サイトを参考にためしてみた。
非公式なNode.jsのライブラリ？でなんとかしようってプログラムもやってみたけど、本家で試したくなった。

進めてくとDialogflowの開発環境に、API V2が公式にローンチされたから移行しろってInfoがでてくるので、V2使うことにした（下記サイトはV1）。V2にすると、いろいろ躓いたので、投稿することにした。

[Google HomeとFlask(Python)サーバでスマートスピーカーアプリを作成してみた - カタカタブログ](http://totech.hateblo.jp/entry/2018/02/06/162102)

ちなみに、こんなInfoがでる。
> Dialogflow API V2 has officially launched. It is now the default API for all new Dialogflow agents and all new features will only be released on V2. Learn how to migrate your V1 agents here.

# すること
Google Homeに話したら、そのまま真似してくるオウムみたいなアプリ？を作る。
処理は、PythonとFlaskで作ったWebサーバーで行う。
Herokuで作る。
Dialogflow（開発環境的なもの）はAPI V2使えって出て来るので、そっちに変更。

# Heroku
はじめ、GCEで良いかと思ってたけど、Dialogflowからアクセスできるのは、httpsサーバーだけっぽかった。httpsの証明書？を発行したり、めんどくさいし、せっかくなのでHeroku使うことにした。

Herokuを使うにあたって、軽く下記サイトに目を通した。初めの方だけ、実行してみた。
Python3.6必要って書かれてて、ラズパイに入ってたのは3.5で、GCEはAnacondaで入れてて3.6だったので、GCEで試した。

- インストール
- ログイン
- チュートリアルのファイルを`git clone`
- Herokuに`git push
って流れやった。

[Getting Started on Heroku with Python | Heroku Dev Center](https://devcenter.heroku.com/articles/getting-started-with-python)

# Webサーバー
コードは全部で4つ。

- app.py
- Procfile
- requirements.txt
- runtime.txt

これらをgit pushすると公開してくれる。

```
git add .
git commit -m ''
git push heroku master
```

以下、コード。

```python:app.py
from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/echo', methods=['POST'])
def echo():
    message = request.json.get("queryResult").get("parameters").get("message")
    response = {
        "payload": {
            "google": {
                "expectUserResponse": True,
                "richResponse": {
                    "items": [
                        {
                            "simpleResponse": {
                                "textToSpeech": message
                            }
                        }
                    ]
                }
            }
        }
    }

    return json.dumps(response)
```

変更したポイントは、以下の3つ。

- `message`のところを公式ドキュメントを参考に`queryResult`にしてる
- `response`のところを公式ドキュメントを参考に長々書いて`textToSpeech`にしてる
- Pythonの`True`を`json.dumps()`でJavaScriptの`true`に変換してる

参考にしたとこ。
[Dialogflow Webhook Format V1 |  Actions on Google  |  Google Developers](https://developers.google.com/actions/reference/v1/dialogflow-webhook)
[Dialogflow Webhook Format V2 |  Actions on Google  |  Google Developers](https://developers.google.com/actions/build/json/dialogflow-webhook-json)
[Converting "true" (JSON) to Python equivalent "True" - Stack Overflow](https://stackoverflow.com/questions/33722662/converting-true-json-to-python-equivalent-true)


他のファイルはこんな感じ。

```:Procfile 
web: gunicorn app:app --log-file -
```

```:runtime.txt 
python-3.6.6
```



```:requirements.txt 
Flask==0.12.2
# Flask-Cors==3.0.3
# Flask-SQLAlchemy==2.3.2
gunicorn==19.9.0
```



## curlで確認
```
pi@raspberrypi:~ $ curl -XPOST -H 'Content-Type:application/json' -d '{"queryResult":{"parameters":{"message":"hello"}}}' https://xxx.herokuapp.com/echo

{"payload": {"google": {"expectUserResponse": true, "richResponse": {"items": [{"simpleResponse": {"textToSpeech": "hello"}}]}}}}
```

いい感じ。

# DialogFlow
基本、ポチポチやってくだけ。
迷ったところだけ、投稿する。

## Intents
いまいちよくわからなかったけど、
Contexts, Eventsを空欄にしてTraining phrasesに入れた。
これに気づくのに時間がかかった。
入力された文字列をmessageに入れて送信するっぽい。

![Dialogflow (1).png](https://qiita-image-store.s3.amazonaws.com/0/184221/d57da907-4bd3-11f2-16e0-3f54392eb46a.png)

## Entities
空欄。

## Fulfillment
Webhookに、アドレスを入れた。
DOMAINS、よくわからんけど、Disableでいけた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/cbfecc03-294c-21d5-2c82-7cfa9bad5427.png)

## その他
適当にポチポチしてたら行けた。
下記サイトみながらやって、なんとかなった。
[Google HomeとFlask(Python)サーバでスマートスピーカーアプリを作成してみた - カタカタブログ](http://totech.hateblo.jp/entry/2018/02/06/162102)

# Simulatorでの動作確認
Integrationsを設定して、ここで、動作確認した。
[Actions on Google](https://console.actions.google.com/)

結果、こんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/cfa49928-60c1-bb53-21f0-3424fa5428f6.png)

自分のGoogle Homeでも確認した。いい感じ。

# おわりに
やりたいことはだいたいできた。
いまいち、動きがわかってないので、要勉強。
もうちょい、高度なことも試してみたい。
公開する方法もわかってないので、要調査。