Google HomeにIDCFクラウドの料金をしゃべらせる。その2


その1からの続きです。

左ペインのFulfillmentをクリックします。
Webhook横のトグルをクリックし、ENABLEDにします。
URLに、http://localhost/webhook と入力し、【SAVE】をクリックします。
(後ほどURLは変更しますが、ひとまずlocalhostのURLで設定します。)

左ペインのIntentsをクリックします。
その1で作成した、billingsayをクリックします。
下のほうにスクロールし、Fulfillmentをクリックします。
Use Webhookにチェックを入れ【SAVE】をクリックします。

pythonソースを変更する

IDCFクラウドのビリングAPIをpythonで利用する方法を変更していきます。
(非プログラマが、頑張ってやっているので、エラー処理は全然やってなかったり、
つくりが適当だったりだと思いますのでのアドバイス頂けるとうれしいです!)

 # -*- conding: utf-8 -*-

import os
import json
import requests
import hashlib,hmac
import time
import base64

from flask import Flask,jsonify
from flask import request
from flask import make_response

app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
        req = request.get_json(silent=True, force=True)
        #print(json.dumps(req,sort_keys=True,indent=4,separators=(',', ': ')))
        cmd = req['result']['parameters']['command']
        m = req['result']['parameters']['date-period']
        if cmd == "料金":
                print("料金を提示")
                yyyymm = m[:7]
                ret = str(idcf_billing(yyyymm)) + "円です。"
                print(ret)
                r = make_response(jsonify({'speech':ret,'displayText':ret}))
                r.headers['Content-Type'] = 'application/json'
                return r


def idcf_billing(month):
        #IDCF billing API
        METHOD='GET'
        QUERY_STRING = 'format=json'
        APIKEY=os.getenv("IDCF_APIKEY")
        SECRET_KEY=os.getenv("IDCF_SECRETKEY")
        ENDPOINT='https://your.idcfcloud.com'
        ENDPOINT_URI='/api/v1/billings/history'
        EXPIRATION_SECONDS = 240

        expiration = int(time.time()) + EXPIRATION_SECONDS
        #print(expiration)

        message = METHOD + "\n" + ENDPOINT_URI + "\n" + APIKEY + "\n" + str(expiration) + "\n" + QUERY_STRING
        #message = METHOD + "\n" + ENDPOINT_URI + "\n" + APIKEY + "\n" + QUERY_STRING
        secret = SECRET_KEY

        signature=hmac.new(bytes(secret, 'ascii'), bytes(message, 'ascii'), hashlib.sha256).digest()
        sig=base64.b64encode(signature)

        head = {'X-IDCF-APIKEY': APIKEY, \
                'X-IDCF-Expires' : str(expiration), \
                'X-IDCF-Signature' : str(sig,'utf-8') }
        #print(head)
        uri = ENDPOINT + ENDPOINT_URI + '?' + QUERY_STRING
        res = requests.get(uri, headers=head)
        data = res.json()
        #print(json.dumps(data,sort_keys=True,indent=4,separators=(',', ': ')))
        data = data['data']
        for amt in data:
                if amt['month'] == month:
                        return amt['billing_amount']
                        #print(amt['month'] + ":" + str(amt['billing_amount']))

if __name__ == "__main__":
        app.run(host='0.0.0.0')

実行してみる

上記のソースコードで実行します。

$python3.6 idcf.py
*Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

ngrokを利用して外部からアクセスができるようにします。
ngrokの設定は、ngrokを使ってローカル環境上で実行するWebアプリケーションにインターネットからアクセスするを参考にさせていただきました。

コマンドプロンプトを起動し、下記コマンドを実行します。

>ngrok.exe http 5000
ngrok by @inconshreveable                                       (Ctrl+C to quit)

Session Status                online
Account                       k (Plan: Free)
Update                        update available (version 2.2.8, Ctrl-U to update)
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://1XXXXXX0.ngrok.io -> localhost:5000
Forwarding                    https://1XXXXX0.ngrok.io -> localhost:5000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

httpsのURLをコピーします。(Google Assistantを利用する場合、httpsでないと入力できません)
Dialogflowに戻り、FulfillmentのWebhook URL欄へコピーします。
今回 /webhook にきた場合と定義しているので、https://1XXXXX0.ngrok.io/webhook のように入力し、【SAVE】をクリックします。

右ペインでテストをします。
その1と同様に、Try it nowに、今月の金額は? と入力しEnterキーを押します。

DEFAULT RESPONSEに、該当月の金額+円です。と応答があれば成功です!
SHOW JSONをクリックすると、JSONが表示されます。

googleアシスタント側の設定

App informationを設定する

各項目の値すべてを入力していきます。
途中アプリ用画像を設定する項目があり、large,small画像が必須となっているので、
適当な画像を用意して、設定していきます。

app nameをIDCFクラウドと設定してみました。

左ペインのOverviewをクリックします。
【TEST DRAFT】をクリックします。

シミュレータでテストする

左ペインのSimulatorをクリックします。
app nameで指定したアプリ名+につないで という文言がすでに入った状態となるため、
このままEnterを押します。

IntentのDefault Welcome IntentのDefault Responseの内容が返ってきます。

今月の料金は?と問いかけてみます。

2016年9月はなんぼ? とも問いかけてみます。

google homeに問いかけてみる

前提として、Actions on Googleの設定をしたアカウントと同じアカウントでgoogle homeがセットアップされている必要があります。
画像をクリックするとYoutubeに飛びます。

pythonアプリが反応して、応答を返していることがわかります。

サーバを声だけで作成できる仕組みとかもできそうですね。