manatee-itの備忘ログ

プログラム初心者のブログ。ruby on railsでWebサービスを作成中。(仕事が忙しくなかななか進まず) つまずいた所をなんでも記録。 環境:Ruby2.1 + Rails4.1.1 + Passenger + CentOS6.4(Apache + sqlite/MySQL)

Splatoon2のステージ情報を調べるAlexaのカスタムスキルを作った

■まえおき

Amazon Echoを購入、カスタムスキルでSplatoon2のステージ情報を調べてもらえたら便利かも、と思い作ってみました。

今回も備忘録のため、詳細は省いています。

Splatoon2のステージ情報はTwitterBotなどで確認していたが、Alexaから教えてもらえたら面白いのでは。

・LambdaとNode.jsを使ったのですが、この時点で全くの素人、ちょっと勉強してみたい。

・いずれ誰かが同じスキルをよりスマートに作成すると思われるので、とにかく動くものを作れればよい。

・できれば公開したい(まだ申請していない)

調べてみると、Splatoon2のステージ情報を調べるスキルは、すでに以下などが存在していました。 ただし、英語のみで日本語に対応したものはまだ存在してない様子。

www.amazon.com

www.amazon.com

ステージ情報はNintendo Switch Onlineにあるイカリング2にて公開されていますが、こちらから直接取得するのは大変と思われるので、公開されているAPIを利用させていただきました。

Spla2 API - スプラトゥーン2のステージ情報API

github

コードはこちら。

https://github.com/manatee2005/Splatoon2

■カスタムスキル作成について

カスタムスキル作成は、まったくの初めてなので、最初はギアパワーの説明など、埋め込んだ情報を読んでもらう簡単な機能のみとし、まずは慣れることにしました。

以下のようなものです。

ユーザ:「アレクサ、スプラトゥーンを開いて」
  ↓
Alexa:「調べたいバトルルール、またはギアパワーを言ってください。」
  ↓
ユーザ:「メインインク効率アップ」
  ↓
Alexa:「メインインク効率アップが付きやすいブランドはジモン、付きにくいブランドはバトロイカです。メインウェポンの消費インク量が少なくなります。」

その後、ステージ情報については、sync-requestモジュールのhttpGetを使い、前述のAPIから取得する機能を追加しました。

ユーザ:「ナワバリ」
  ↓
Alexa:「現在のナワバリのステージはバッテラストリートとタチウオパーキングです。次のナワバリのステージは、、」

もしくは、
ユーザ:「サーモンラン」
  ↓
Alexa:「直近のサーモンランはトキシラズいぶし工房です。ブキは○○、、」

■開発用URL

AWSコンソール(Lambda)

https://ap-northeast-1.console.aws.amazon.com

・アレクサ開発コンソール

Amazon 開発者ポータル

・アレクサログイン(アプリ)

Amazonサインイン

■カスタムスキル作成の基本的な操作・コード作成

基本的な内容は以下のサイトを参考にさせていただきました。 (その他いろいろ)

Alexa | アレクサ | Alexaスキル開発トレーニング

[日本語Alexa] Alexa Skills Kit for Node.js はじめの一歩 | Developers.IO

とりあえずこれだけで対話を動かせる!Amazon Echo ALEXA(Alexa Skill Set)カスタムスキル開発入門 - Qiita

Alexaのカスタムスキルを作る(その2) - Qiita

Alexaスキル開発トレーニングシリーズ 第2回 対話モデルとAlexa SDK : Alexa Blogs

■躓いたところ

いろいろと躓いたところは、以下のサイトが参考になりました。

・スロット値の取り出し方がわからない。

→「Synonyms(同義語)で設定した id をチェック、、」を参照しました。配列の取り出し方。

電車の運行情報を教えてくれるAlexa Skillを作ってみた - Qiita

・Lambda側の設定は完了、コンソール側のスキルを削除して作り直し、エンドポイントの設定でARNの指定を行い保存したところ、以下のエラーが発生。

「"The trigger setting for the Lambda is invalid. Error code: SkillManifestError - (日時)" 」

→Lambda側の設定を削除して作り直したところエラーは解消

・非同期処理が理由でHTMLのボディがrequest関数の外部へ取り出せない。

→requestモジュールではなく、sync-requestモジュールを用いる。

同期処理でrequestモジュールの戻り値を返す(Node.js)(非コールバック) - designetwork

・ZIPファイルにてsync-requestモジュールの追加の際に、「Lambda 関数 「GearpowerSkill」のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。ただし、関数を今すぐ呼び出すことはできます。」が発生。

→AWS SDKを削除する。

Alexa Skillで利用するLambda関数(Node.js)を、ハマらずに「一から作成」する方法 - Qiita

■その他の参考となったサイト

AWSのLambdaのタイムゾーンをUTCからJST(東京)に変更 - Qiita

【JavaScript】日付/時刻データを操作する(Dateオブジェクト) - みこむらめもむらむらむら

sandbox/日英対応表 - Splatoon2 - スプラトゥーン2 攻略&検証 Wiki*