基本となるLambda関数


基本となるLambda関数

手順1: ビデオスキルとLambda関数を作成するでは、手始めに基本コードをサンプルのLambda関数として統合しました。簡単に利用・参照ができるよう、その関数を以下に添付します。

クリップボードにコピーされました。

/**
* Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Amazon Software License (the "License"). You may not use this file except in # compliance with the License.
* A copy of the License is located at http://aws.amazon.com/asl/
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS
* OF ANY KIND, express or implied. See the License for the specific # language governing permissions and limitations under the License.
**/

// このファイルはFire TVでビデオスキルAPIを統合する際に使用するLambda関数のサンプルコードで、
// Discovery、SearchAndPlay、FastForward、ChangeChannelなどのディレクティブに対するレスポンスが
// 含まれています。このコードを土台として、作成したロジックを追加してください。
// また、本番環境で使用する際は必ず事前にコードをテストし、検証してください。
// Lambda関数が受信したディレクティブは、ADMを介して直接アプリに送信する方法をお勧めします。
// それ以降の処理は、すべてアプリ内で実行可能です。
// 注: Alexaへのレスポンスには変更を加えず、ディレクティブの処理・送信部分のみコーディングしてください。
// 注: ディレクティブはLambda関数からアプリに送信すべきですが、アプリからLambda関数へは
// メッセージを送信しないでください。Lambda関数からの成功レスポンスは、Lambda関数がメッセージを
// 受信したことを示すもので、アプリによる受信を示すものではありません。

var AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
    console.log("AlexaによるLambda関数の呼び出し");
    console.log("イベント:" + JSON.stringify(event, null, 2));
    console.log("コンテキスト:" + context);
    let directive = event.directive;
    if (directive)
    {
        console.log("Alexaからディレクティブを受信:" + directive);
        if (directive.header.name == "Discover")
        {
            console.log(directive.header.name, "ディレクティブをAlexaから受信");
            let resp = {
               event: {
                   header : {
                       messageId : directive.header.messageId,
                       name : "Discover.Response",
                       namespace: "Alexa.Discovery",
                       payloadVersion: "3"
                   },
                   "payload": {
                       "endpoints": [
                           {
                               "capabilities": [
                                   {
                                       "interface": "Alexa.RemoteVideoPlayer",
                                       "type": "AlexaInterface",
                                       "version": "1.0"
                                   },
                                   {
                                       "interface": "Alexa.PlaybackController",
                                       "type": "AlexaInterface",
                                       "version": "1.0"
                                   },
                                   {
                                       "interface": "Alexa.SeekController",
                                       "type": "AlexaInterface",
                                       "version": "1.0"
                                   },
                                   {
                                       "interface": "Alexa.ChannelController",
                                       "type": "AlexaInterface",
                                       "version": "1.0"
                                   }
                               ],
                               "endpointId": "VSKTV",
                               "description": "VSKTVは、Fire TVに組み込むために開発されたビデオスキル用デフォルトデバイスです",
                               "friendlyName": "VSKTV",
                               "manufacturerName": "Amazon"
                           }
                       ]
                    }
               }
            };
            console.log("Alexaに", directive.header.name, "レスポンスを送信中:", JSON.stringify(resp));
            callback(null, resp);
        }
        else if (  directive.header.name == "SearchAndPlay"
				|| directive.header.name == "SearchAndDisplayResults"
				|| directive.header.name == "Play"
				|| directive.header.name == "Resume"
				|| directive.header.name == "Pause"
				|| directive.header.name == "Next"
				|| directive.header.name == "Previous"
				|| directive.header.name == "Rewind"
				|| directive.header.name == "FastForward")
        {
            console.log(directive.header.name, "ディレクティブをAlexaから受信");

			// ディレクティブを処理する独自のロジックをここに指定
			// ディレクティブをLambda関数からアプリに送信するためのコードをここに指定

            // 以下で成功レスポンスをAlexaに返し、Lambda関数によるディレクティブの受信を通知
            let resp = {
                event: {
                    "header" : {
                        "messageId": "not-required",
                        "correlationToken": "not-required",
                        "name": "Response",
                        "namespace": "Alexa",
                        "payloadVersion": "3"
                    },
                    "endpoint": {
                        "scope": {
                            "type": "DirectedUserId",
                            "directedUserId": "not-required"
                        },
                        "endpointId": "not-required"
                    },
                    "payload": { }
                }
            };
            console.log("Alexaに", directive.header.name, "レスポンスを送信中:", JSON.stringify(resp));
            callback(null, resp);
        }
        else if (directive.header.name == "AdjustSeekPosition")
        {
            console.log(directive.header.name, "ディレクティブをAlexaから受信");

			// AdjustSeekPositionディレクティブを処理する独自のロジックをここに指定
			// このディレクティブをLambda関数からアプリへ送信するためのコードをここに指定

            // 以下で成功レスポンスをAlexaに返し、Lambda関数によるディレクティブの受信を通知
            let resp = {
                event: {
                    "header" : {
                        "messageId": "not-required",
                        "correlationToken": "not-required",
                        "name": "StateReport",
                        "namespace": "Alexa.SeekController",
                        "payloadVersion": "3"
                    },
                    "endpoint": {
                        "scope": {
                            "type": "DirectedUserId",
                            "directedUserId": "not-required"
                        },
                        "endpointId": "not-required"
                    },
                    "payload": {
                      "properties": [{
                        "name": "positionMilliseconds",
                        "value":  0 
                      }]
                    }
                }
            };
            console.log("Alexaに", directive.header.name, "レスポンスを送信中:", JSON.stringify(resp));
            callback(null, resp);
        }
		else if (directive.header.name == "ChangeChannel")
        {
            console.log(directive.header.name, "ディレクティブをAlexaから受信");

			// ChangeChannelディレクティブを処理する独自のロジックをここに指定
			// このディレクティブをLambda関数からアプリへ送信するためのコードをここに指定

            // 以下で成功レスポンスをAlexaに返し、Lambda関数によるディレクティブの受信を通知
            let resp = {
                context: {
                    "properties": [
                    {
                        "namespace": "Alexa.ChannelController",
                        "name": "channel",
                        "value": {
                            "number": "1234",
                            "callSign": "not-required",
                            "affiliateCallSign": "not-required"
                        },
                        "timeOfSample": "2017-02-03T16:20:50.52Z",
                        "uncertaintyInMilliseconds":  0 
                    }
                    ]
                },
                event: {
                    "header" : {
                        "messageId": "not-required",
                        "correlationToken": "not-required",
                        "name": "Response",
                        "namespace": "Alexa",
                        "payloadVersion": "3"
                    },
                    "endpoint": {
                        "endpointId": "not-required"
                    },
                    "payload": { }
                }
            };
            console.log("Alexaに", directive.header.name, "レスポンスを送信中:", JSON.stringify(resp));
            callback(null, resp);
        }
        else if (directive.header.name == "AcceptGrant")
        {
            console.log(directive.header.name, "ディレクティブをAlexaから受信");
            let resp = {
                "event": {
                    "header": {
                        "messageId": "abc-123-def-456",
                        "namespace": "Alexa.Authorization",
                        "name": "AcceptGrant.Response",
                        "payloadVersion": "3"
                        },
                "payload": {}
              }
            };
            console.log("Alexaに", directive.header.name, "レスポンスを送信中:", JSON.stringify(resp));
            callback(null, resp);

        }
        else
        {
			console.log("サポート対象外のディレクティブです。無視します。");
			callback(null, 'サポート対象外のディレクティブです。無視します。');
        }
    }
    else
    {
		console.log( 'ディレクティブがnullです。無視します。');
        callback(null, 'ディレクティブがnullです。無視します。');
    }
};