Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@MYamate_jp

Alexa Skill開発でよく使いそうな関数をまとめたnpmモジュールを作った

More than 1 year has passed since last update.

Echo Showが発売され、音声と画面の合わせ技でより多くの表現が広まりつつある、Amazon Alexaの世界。
日本でも「NOID」と言ったノンプログラミングの開発ツールも出揃い、1年ほど前に日本でのAlexaサービス開始時に比べ、開発しやすい環境になってきたかと思います。
一方で、複雑なスキルを考えた時にノンプログラミングでは対応できる範囲に限界があります。そう言った時は、実際にコーディングをしてということになりますが、UserIdの取得であったり画面サポートの判定であったり、正直なところ「ask-sdk」のヘルパー関数を呼んで、何かを生成して、レスポンスに含めて戻すような部分が多く面倒に感じることが若干あります。
そんな背景もあり、個人的に面倒に感じた部分を使いやすくask-sdkの機能をラッパーしたモジュールを作ってみました。
地味に最近リリースされた、LocationAPIの検知もサポートしました。

katana-alexa-utility

できることは大きく分けて5つです。

  • デバイス情報の取得
    • UserIDの取得機能や画面インターフェースの判定機能など
  • インテントスロットの取得
    • リクエストされたインテントに含まれるスロットの値を取得する機能
  • DynamoDBの操作
    • DynamoDBへのデータ保存、取得
  • APIの同期リクエスト
    • 指定したURLへの同期リクエストを行います
  • テンプレートの生成
    • 表示したい文字列や画像のURLを渡すだけで、テンプレートの生成を行えます。

基本的に、Alexaスキルを当たり前に開発してる方からすると、普段から実装してるよー!のような簡単なものになってます。
APLが出た今、Templateの需要がどこまであるかわからないですが、Templateはとにかく作りやすくなってる。。。はず。。。です。。。

Installation

npmからどうぞ!

npm install --save katana-alexa-utility

Deviceデータを取得する

ApplicationIdを取得する

ApplicsationId.js
const Katana = require('katana-alexa-utility')
let appId = Katana.device.getApplicationId(handlerInput);

UserIdを取得する

UserId.js
const Katana = require('katana-alexa-utility')
let userId = Katana.device.getUserId(handlerInput);

DeviceIdを取得する

DeviceId.js
const Katana = require('katana-alexa-utility')
let deviceId = Katana.device.getDeviceId(handlerInput);

ディスプレイの有無を判定する

IsDisplay.js
const Katana = require('katana-alexa-utility')
let isDisplay = Katana.device.getDeviceId(handlerInput);

シェイプタイプを取得する

shapeType.js
const Katana = require('katana-alexa-utility')
let shapeType = Katana.device.getDeviceId(handlerInput);

スクリーンサイズを取得する

戻り値:[w , h]

screenSize.js
const Katana = require('katana-alexa-utility')
let screenSize = Katana.device.getScreenSize(handlerInput);

Locationインターフェースの有無を判定する

isGeolocation.js
const Katana = require('katana-alexa-utility')
let isGeolocation = Katana.device.getGeolocation(handlerInput);

GeolocationDataを取得する

Geolocation.js
const Katana = require('katana-alexa-utility')
let geolocData = Katana.device.getGeolocation(handlerInput);

API同期リクエストを行う

※ awaitで必ず実行すること

Syncrequest.js
const Katana = require('katana-alexa-utility')
let result = await Katana.syncAPI.request('request url');

インテントスロットの値を取得する

IntentSlot.js
const Katana = require('katana-alexa-utility')
let value = Katana.slot.getSlotValue(handlerInput , 'slot name');

DynamoDBのデータを取得、セーブをする

dynamodb.js
const Katana = require('katana-alexa-utility')
let dynamoDBData = Katana.dynamodb.getData(handlerInput)
await util.dynamodb.saveData(handlerInput , saveData)

テンプレートを生成する

テキスト使うにしても、画像を使うにしても、ask-sdkに用意されたヘルパー関数を一回介さないといけなく、画面対応のスキルを作れるようになったとは言っても面倒なことが多かったと思います。
なので、公式のヘルパー関数をラッパーしてより使いやすくならないかなーと思いつつ実装してみています。画面付きデバイスであるか、DisplayInterfaceが含まれているかを元に判別する必要がありますが、その判別も中で行っているので基本的には出したいコンテンツをkatana-alexa-utilityに渡せばOKです。

bodytype.js
const Katana = require('katana-alexa-utility')
//トークンの指定    
Katana.template.bodyType.setToken('TOKEN');
//バックボタンの指定 true...visible false...hidden
Katana.template.bodyType.setBackBtnIsVisible(true)
//タイトルの指定
Katana.template.bodyType.setTitle(displayTitle);
//背景の画像ソースの指定
Katana.template.bodyType.setBackgroundImgSrc('Image url');
//Body内部で使用する画像のソース指定
Katana.template.bodyType.setImgSrc('Image url');
//Body内部で使用するテキストの指定
//各項目は指定されていない場合は、空文字がデフォルト値です
Katana.template.bodyType.setText(primaryText , secondaryText , tertiaryText);
//画面下部に表示されるヒントメッセージの指定
//Body template 3 のみで有効
Katana.template.bodyType.setHintMsg('Hint text');
//Body templateを生成します
//画面付きであるかの判別もするので、Echo dotなどのデバイスでそのまま実行しても問題ありません
Katana.template.bodyType.create(handlerInput , 'Body template id')
listtype.js
const Katana = require('katana-alexa-utility')
//トークンの指定
Katana.template.listType.setToken('TOKEN');
//バックボタンの指定 true...visible false...hidden
Katana.template.listType.setBackBtnIsVisible(true)
//タイトルの指定
Katana.template.listType.setTitle(displayTitle);
//背景の画像ソースの指定
Katana.template.listType.setBackgroundImgSrc('Image url');
//List Itemをセットします
//TokenId , List表示用画像のソース,Listで表示するテキストをセットする
//ループなどで回して使う前提です
Katana.template.listType.addListItem(tokenId , imgSrc , primaryText , secondaryText , tertiaryText);
//List templateを生成します
//画面付きであるかの判別もするので、Echo dotなどのデバイスでそのまま実行しても問題ありません
Katana.template.listType.create(handlerInput , 'List template id');
3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
MYamate_jp
Beer geek engineer!!!!!
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?