柳屋

ソースコードのリファクタからよもやままで

Google Homeとヨドバシ.comを連携させてみた

f:id:ultrasevenstar:20171105134856p:plain 流行りに乗ってGoogle Homeを買いました。
なんですかね。この近未来感
年代なのか、やはり声で操作できるってのは無条件ですごいですよね。

と言いながらまだ何ができるかよくわかってなく、もっぱら朝のラジオとアラームに終始しています

ただそれだけではさすがに勿体無いので、日頃お世話になってる
ヨドバシ.comと連携させてGoogleHomeから買い物できるようにした

Yodobashi Go Homeを作ってみました

GitHub

github.com

構成

  • Google Home
  • さくらVPS
  • IFTTT
  • NodeJS
  • CasperJS(PhantomeJS)
  • SQLite

処理の流れ

f:id:ultrasevenstar:20171105134537p:plain

Google Home → IFTTT → NodeJS → CasperJs → ヨドバシ.com

GoogleHomeに「おk Google 烏龍茶買って」と話しかければ 連携しているIFTTTのレシピが発火し さくらVPSのNodeJSにPOSTリクエストを送ります その際にAPI KEYと商品名も一緒に送ります

NodeJSがPOSTリクエストを受け取れば、CasperJSに商品詳細のURLを送り
CasperJSがyodobashi.comにアクセスし、ログインし対象の商品を買います

ハイテクになりきれてない1/3ぐらいのアナログ感が気に入ってます
CasperJS使わないと買い物できないヨドバシに踊らされてる感が好きです

IFTTTの設定

まずはGoogle HomeとNodeJSの架け橋のIFTTTの設定から
IFTTTさえ設定すればGoogle Home側では特に設定する必要はありません。
便利ですIFTTT

Appletの作成

Google Homeに紐づいてるGoogleアカウントでログインし New AppletでGoogle Assistantを選択 Triggerは「 Say a simple phase」にする
f:id:ultrasevenstar:20171102173719p:plain

トリガーの設定

Complete trigger fields画面で 以下の通り設定する

■What do you want to say?
烏龍茶買って

■What do you want the Assistant to say in response?
わかりました

■Language
japanese

これでまずはIFTTTのthisの部分はできました。
次はthatの部分です

f:id:ultrasevenstar:20171102195305p:plain

アクションの設定

Google Homeに話しかける部分までは終わったので、それに対するアクションを設定します。
Node JSにPOSTを送る部分ですね

Choose action serviceでWebhooksを選択し Make a web requestでは以下のように設定します

■URL NodeJSのURL

■Method POST

■Content Type (optional) text/plain

■Body (optional) key=uroncha&apiKey={api key}

これでsaveすればIFTTTの設定は完了です

サーバ側の設定はまた次回

;(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ if (pre.className.indexOf("gist") !== -1) { return } var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) || 0 ol.className = "preLine" ol.setAttribute("role", "presentation") // no lang, no line-number if( pre.className && ! /lang-./.test(pre.className) ){ br.length += 1 } for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)