Tweet

2018年12月11日火曜日

【AmazonAlexaスキル開発】Node.js 8.10(alexa-sdk V1)でAPI通信(HTTPS通信)を行う方法を解説

こういう人向け

  • APIを利用して外部のデータを取得してAlexaスキルに反映したい。
  • モジュールって何?って人
  • モジュールインストールにnpmやターミナルを使用するのに抵抗がある人
  • サンプルコードを元に作業してみたい人
  • モジュール導入が最大の鬼門の人(これはわかる)

今回作った教材用スキル「仮想通貨の終値チェック」


なんでも良かったんですけどパラメータのシンプルさが気に入りました。
(API通信という概念が初めての人は上記URL押して下さい。データが返ってきます)

ビットコイン、ネム(ゼム)、モナーコインっていうと、
昨日の終値を答えてくれるスキルです。
もちろん最新の情報を取得しに行っているのでAPI通信しております。

  • ビットコインなら上記URLをbtc
  • ネムなら上記URLをxemに変換する
みたいな処理を行って、URLを可変にしてあげれば
通信して取得出来ます。

今回使うモジュール(全然気にしなくていいですが)


recipes(recipes.js)moduleを使用します。
とはいえ、これを導入してくださいねなど言わないので安心してください。
全部解説しますので。

モジュール関連の豆知識というか前提知識(知っておいてもいいかも)


const Alexa = require ('alexa-sdk'); 
という表記って多く見ませんか?
みなさん多くの方がソースコードの1行目に書いているだろうアレです。

あれは実はモジュールの宣言と言って、こういう作法で書かれているものです。
  const  変数名 = require ('モジュール名') ;

なので、const Alexa = require ('alexa-sdk'); の意味はalexa-sdkモジュール使いますという、
意味だったんです。

今回はLambda関数の作り方だけ大きく異なるので解説します。


私はいつも自前のzipファイルをアップロードしてから、
インラインコードにたまにATOMエディタから貼り付けるみたいな流れでやっていますが、
今回はそんな面倒な事しなくてもOKです。

Lambda関数で用意されているテンプレートを今回は使用いたします。
(テンプレートめっちゃ便利、用途にあった物があればの話だけど)

 画像を編集してチェック付けたので分かりやすいと思います。
いつもは新規作成しておりましたが、「設定図」からhowなどで検索して、
「alexa-skill-kit-sdk-howtoskill」を選択して下さい。

その後、自動で必要なファイルなど読み込んで、すぐにindex.jsを編集可能になります。


作成後、ランタイム(下画像上部)がNode.js 6.10になっていますが、
Node.js 8.10に変えましょう。

検証した感じ、verUPによる弊害などありませんでした。問題なしです。

あとはいつも通り記述する感じです。
先ほどお話したモジュールの宣言も、
const recipes = require('./recipes');があるのでしっかりされています。

また、モジュール追加もしっかりされているので動作します。

API通信部分のコーディング解説


例の如く、index.jsを全文公開しているので下記URLをクリックしてご確認下さい。

該当部分を下部にコピペしました。
下記記述を上手く自分の使いたいようにカスタマイズすれば出来ると思います。
API通信はコーディングが鬼門じゃなくてモジュール追加が最大の鬼門です。


moneyName = intent.slots.crypt.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"];
            let http = require('https');

            var URL = 'https://api.zaif.jp/api/1/last_price/'+moneyName+'_jpy';
            console.log(URL);

            http.get(URL, (res) => {
                res.setEncoding('utf8');

                res.on('data', (chunk) => {
                    var parsedValue = JSON.parse(chunk);
                    var key1 = "last_price";
                    console.log(parsedValue);
                    console.log(parsedValue[key1]);
                    var message = '昨日の終値は' + String(parsedValue['last_price']) + '円です。次にお調べしたい仮想通貨があれば教えてください';
                    this.response.speak(message).listen(message + ' ' + SECOND_MESSAGE);
                    this.emit(':responseReady');

                });

            }).on('error', (e) => {
                console.log(e.message); //エラー時
                // this.emit(':tell', 'エラーです'+e.message);
                this.response.speak('エラーです');
                this.emit(':responseReady');

            });
          }

API通信 まとめ

  • API通信の最大の鬼門はモジュールの追加インストールだと思ってます。
  • コードは大したことない、サンプルコードだけで十分対応可能な範囲。
  • 返ってくる値がJSONでも適切に処理してあげればOK

参考


https://qiita.com/miutex/items/ff09b2f171be1588ce7b
※元記事からtell,askからresponseオブジェクトへ書き換えなど行っております。

    0 件のコメント:

    コメントを投稿