Node-redを使ってAlexaを自由に喋らせる方法(alexa-cookie2 v3.4.1編)

スマートホーム
スポンサーリンク

はじめに

Amazon Echoは、通常「アレクサ、○○して」と、人間から話しかけないと喋ってくれません。また、通知機能もあるのですが、通知機能ではリングが黄色く光るだけで「アレクサ、通知ある?」と、はやり人間から話しかけないと通知内容を教えてくれません。

しかし、Node-redとnode-red-contrib-alexa-remote2を使えば、Alexaを自由に喋らせることが可能です。ただAlexa-remote2は、日本語版のAmazon Alexaに対応していないので、少々ソースを変更する必要があります。今回は、その設定手順を紹介します。

設定手順

Alexa-remote2のインストール

まずは、Node-redを使ってAlexaを喋らせるために、node-red-contrib-alexa-remote2をNode-redにインストールしていきます。

①パレットの表示

Node-redの右上の「三」メニューから「パレットの管理」を選択します。

②ノードの追加

パレットの管理画面から「パレット」→「ノードを追加」タブを選択します。

③Alexa-remote2の追加

画面の検索欄に「alexa-remote2」と入力し検索して、検索結果に出て来た「node-red-contrib-alexa-remote2」の「ノードを追加」ボタンをクリックしましょう。

④ノードの追加確認

しばらく待っていると、node-red-contrib-alexa-remote2のインストールが完了するので「閉じる」ボタンをクリックします。

画面左側のパレットを見ると、「alexa」が追加され7個のノードが追加されています!!

Alexa-Routineノードの設定①

①Alexa-Routineノードの追加

まずは、パレットからAlexa Routineノードをドラッグしてフローに追加しましょう。次にAlexa Routineノードをダブルクリックして編集画面を開き、Account欄の鉛筆アイコンをクリックします。

②Alexa Accountノードの設定

Alexa Accountノードの設定画面が表示されるので、This IP欄にNode-redをインストールしたホストのIPアドレスを入力します。

次に、下にスクロールして、Service Host、Page、Language欄を以下のように設定します。

③設定の完了

「追加」ボタンをクリックし、Alexa Accountノードの設定画面を閉じます。

次に、「完了」ボタンをクリックしてAlexa Routineノードの編集画面も閉じましょう。

④デプロイ

ここまで設定できたら、Node-redに反映するために「デプロイ」ボタンをクリックします!

⑤Amazon Alexaにログイン

「デプロイ」ボタンをクリックすると、Alexa Routineノードの下に「open <<IPアドレス>>:3456 in your browser」と表示されています。指示に従って、ブラウザで新しいタブを開き「http://<<IPアドレス>>:3456」のアドレスを入力しましょう。

するとamazon alexaのログイン画面が表示されるので、お使いのアカウントとパスワードでログインします!!

ログインがうまくいくと、以下のような画面が表示されます。

⑥Alexa Routineノードの確認

ところが、Node-redの画面に戻り、Alexa Routineノードを確認すると「Unexpected end on JSON input」と表示され、エラーになってしまっています。これはAlexa-remote2が日本語版のAmazon Alexaに対応していないためです😭

Alexa-Cookieの変更

Alexa-remote2からAlexaを利用するためには、Amazon Alexaへのログイン時に取得したCookieが必要です。しかし、このCookie取得のURLが、日本サイトでは特殊なため、日本向けにカスタマイズが必要です。

①Alexa-Cookieのバージョンを確認

Node-redの設定ディレクトリ(通常はユーザディレクトリ内の.node-red)に移動して「npm list」と入力します。すると、以下のようにインストール済みモジュールが表示されるので、alexa-cookie2の欄を確認します。私のAlexa-Cookieのバージョンは3.4.1でした。

$ cd .node-red/
$ npm list
node-red-project@0.0.1 /home/pi/.node-red
├─┬ node-red-contrib-alexa-remote2@3.10.4
│ └─┬ alexa-remote2@3.3.1
│   ├─┬ alexa-cookie2@3.4.1
│   │ ├── cookie@0.4.1
│   │ ├─┬ express@4.17.1

②alexa-cookie.jsを開く

設定ディレクトリ内の「node_modules/alexa-cookie2」にalexa-cookie.jsがあるので、これをバックアップ(コピー)して、テキストエディタで開きます。

$ cd node_modules/alexa-cookie2
$ cp alexa-cookie.js alexa-cookie.js.org
$ vi alexa-cookie.js

③alexa-cookie.jsの変更

alexa-cookie.jsの261行目辺りにある「_options = __options;」の行を探し、この下に「_options.baseAmazonPage=’amazon.co.jp’;」と追加します。

 _options = __options;
 _options.baseAmazonPage='amazon.co.jp';  //<--この行を追加

④proxy.jsを開く

次に「lib」ディレクトリに、proxy.jsがあるのでこれを開きます。

$ cd lib/
$ cp proxy.js proxy.js.org
$ vi proxy.js

⑤proxy.jsの変更

181行目あたりにあるreturnedInitURLを以下のように変更します。

//returnedInitUrl =  `https://www.${_options.baseAmazonPage}/ap/signin?openid.return_to=https%3A%2F%2Fwww.${_options.baseAmazonPage}%2Fap%2Fmaplanding&openid.assoc_handle=amzn_dp_project_dee_ios${_options.baseAmazonPageHandle}&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&pageId=amzn_dp_project_dee_ios${_options.baseAmazonPageHandle}&accountStatusPolicy=P1&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns.oa2=http%3A%2F%2Fwww.${_options.baseAmazonPage}%2Fap%2Fext%2Foauth%2F2&openid.oa2.client_id=device%3A${deviceId}&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.oa2.response_type=token&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.pape.max_auth_age=0&openid.oa2.scope=device_auth_access&language=${_options.amazonPageProxyLanguage}`;                           
returnedInitUrl =  `https://www.amazon.co.jp/ap/signin?showRmrMe=1&openid.return_to=https%3A%2F%2Falexa.amazon.co.jp%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=amzn_dp_project_dee_jp&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&`;

⑥Node-redの再起動

上記の変更を有効にするために、念のため、Node-redを再起動しておきましょう。

$ sudo systemctl restart nodered.service

Alexa-Routineノードの設定②

Alexa-Cookieの変更が完了したら、再度Alexa-Routineノードの設定に戻ります。

①Cookieの再取得

上でNode-redを再起動したため、ブラウザからNode-redの画面を再読み込みします。すると、Alexa Routineノードの下に、再度「open <<IPアドレス>>:3456 in your browser」と表示されるので、ブラウザで「http://<<IPアドレス>>:3456」を開きます。

amazon alexaのログイン画面になったら、ログインします。

ログインすると、以下のようにエラー画面となります。

しかし、Node-redの画面に戻ってみるとAlexa Routineノードの下にReadyと表示されており、Alexa-RoutineからAlexaへのアクセスが可能となったことが確認できます。

②喋る言葉の入力

Readyになったら、Alexa Routineノードをダブルクリックして設定画面を表示します。そして、Text欄にAlexaに喋らせたい言葉、Device欄に喋らせたいAmazon Echoデバイスを選択します(Alexa連携できているので、利用可能なデバイス一覧が表示されます)。

③Injectノードの追加

最後にInjectノードを下のように追加し、ノード間を接続し、「デプロイ」ボタンをクリックしましょう!!

④テスト

それでは、Injectノードの左のボタンをクリックしてみましょう!!Amazon Echoが「おはよう」と喋りましたか?これで完了です!!お疲れ様です。

おわりに

今回はNode-redにnode-red-contrib-alexa-remote2をインストールし、日本語版のAmazon Alexaの仕様に合わせてソースコードを変更して、Node-redからAlexaを喋らせることをやってみました。

Node-redからAlexaを自由に喋らせる事が可能になったことで、例えば1時間に一回、部屋の温度をお知らせすることや、天気APIと連携して雨が降り出す少し前にお知らせしてくれるようなことも可能になります!!

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント

  1. こんにちは、記事通りなおしてうまく動作出来ました、ありがとうございます!
    こちらの認証ですが、デプロイ・Nodered再起動・HA(hassioのアドオンとしてNodered実装)再起動するたびに再度登録必要となり(open XXX in your browser状態になる)、そういうもんでしょうか

    • 記事をお読みいただきありがとうございます。残念ながら、そういうものです。alexa-remote/alexa-cookieの今後の改版に期待です。

  2. こんにちは。こちらの記事、参考にさせて頂きました。
    #IMAPでgmailを定期的に監視して、echoに喋らせてます。

    再起動のたびに再度「open XXX in your browser」になる件ですが、ブラウザでログインした時のCookieデータを使ってcurlで定期的に回しておけば、ほぼ自動で再接続できるようになりました。

    Alexaにログインする時、Firefoxなどで、F12で開発者ツールみたいなのを出しておいて、ログイン後のページのヘッダー情報の Cookie: 「長いヤツ(800文字くらい)」を取得。
    それをコピーして、curlにくっ付けて実行すればログインと同じ効果が得られるみたいです。

    cronで、
    */5 * * * * curl -c session.cookie -H ‘Cookie: 「長いヤツ(800文字くらい)」’ http://localhost:3456
    って、してます。
    これで、再起動しても5分以内には、再接続が出来てます。
    Raspberry Pi Zero Wでnode-red動かしてて、動作安定させるために毎日再起動してる都合、この再接続も自動化できないと面倒だったので…

    あまりcurlのオプションを分かっていないですが、ご参考まで。

    • 情報ありがとうございます。デプロイするごとにログインしなくても良いのは素晴らしいですね!

    • ありがとうございます!
      試行錯誤した結果できるようになりました!

      ハマった点として、localhost:3456のAlexaページにログインするときに開発者ツールでCookieを取得するのではなくて、本家Alexaのページalexa.amazon.co.jpにログインしたときのCookieでした。

      Cookieはどれくらいで使えなくなるのかな・・・
      ひとまずCron登録して様子見てみます。
      12時間に1回くらいの頻度でやってみようかな。

  3. 情報共有助かりました!
    超初心者ですが無事に動作し、感動です。

  4. ここ一ヶ月くらいAlexaが喋らなくなってます。
    NodeREDにはSuccessと出てるのですが・・・

    仕様変更でもあったのでしょうか・・・

    皆さん使えていますか?

  5. shiv さん、はじめまして
    本家Alexaのページにてalexa.amazon.co.jpにログインしたときのCookie取得について、
    もう少し詳細に教えてください。ブラウザの開発者ツールで探してますが ‘Cookie:
    「長いヤツ(800文字くらい)」’の部分を見つけることができません。

    自宅の電動雨戸を日没時間に合わせて、Alexaの定型アクションを使って閉めてますが、
    ラズパイ3を常時稼働させていると動作が鈍くなります。その状態ブラウザとかを操作
    するとfork失敗(メモリが確保できません)のエラーでフリーズします。

    毎日定時で再起動して回避してましたが、今回の日本語版のAmazon Alexa変更により
    再ログインが必要で、ラズパイの再起動が手動操作になってしまい困ってます。
    ご教示のほどよろしくお願いします。

    • 他所様のサイトで返事するのもアレですが、Networkのリクエストヘッダーあたりを探してみてください。
      この方法が有効だったのは、1週間くらいでした。Cookieの有効期限みたいです。