LoginSignup
8
9

More than 5 years have passed since last update.

Google HomeとGoogle Apps Scriptsでスプラトゥーン2のステージ情報を取得する

Posted at

やりたいこと

ゲームやりたいです笑
スプラトゥーン2をやるにも時間は有限です。
また、スプラトゥーンは、2時間毎に遊べるステージや、ルールが変わるため、自分の好きなステージ、ルールに合わせてゲームを始めたいと思います。

現在のステージやルールの情報を確認するために、Switchを起動して確認するのも時間がかかりますし、スマホアプリでの確認もおっくうなときに、「Google Homeに話かけるだけで、教えてくれる!」という使い方をします。

私:「OK グーグル。スプラ ステージ情報」
 (スプラトゥーンとすると認識率が低かったので、「スプラ」としました)

Google Home:「ステージ情報をお知らせします。」
「現在の、ナワバリバトルのステージは、デボン海洋博物館と、バッテラストリートです。」
「現在の、ガチアサリのステージは、モズク農園と、アロワナモールです。」
「次の、ナワバリバトルのステージは、ザトウマーケットと、マンタマリア号です。」
「次の、ガチヤグラのステージは、コンブトラックと、フジツボスポーツクラブです。」
「現在、サーモンランは、やっています。〇月、〇日の、〇時、までです。」

※オレンジがスプラトゥーンでのルール、赤がステージになります。

前提

 Google Homeは自発的に発声することは標準ではできません。
 「Google Home しゃべらせる」等で検索して、設定しました。
 google-home-notifierをRaspberry Piにインストールし、firebaseの更新をトリガに
 発声させる仕組みにしています。

参考

情報の取得元として、以下サイトを利用させていただきました。
ありがとうございます。APIの仕様も詳細に記載されています。
- Spla2 API

また、以下の記事を参考にさせていただきました。ありがとうございます。
- GoogleHomeをDialogflow(旧:API.ai)でスプラトゥーンアシスタントにする
- GoogleHomeをスプラトゥーンアシスタントにする #2 Twitterからステージ情報の取得
- Actions on GoogleとDialogflowでスプラトゥーンのアシスタントを作った

概要

spla.png

1.IFTTTの設定
Google Homeに「スプラ ステージ情報」と言うと、IFTTTを経由して、スプレッドシートに「ステージ情報」という内容を追記します。

2.スクリプトの作成
スプレッドシートの更新を検知して、動作するスクリプトを作成します。スクリプト内で、Spla API2にアクセスし、ステージやルールの情報を取得し、Google Homeにしゃべらせる言葉の形式に変換し、FirebaseのDBへ書込みます。

3.ラズベリーパイの設定(本記事では、説明は割愛します)
ラズベリーパイ側でFirebaseの更新を検知して、Google Homeをしゃべらせます。

詳細

1.IFTTTの設定

「スプラ ステージ情報」というキーワードを元に、スプレッドシートを更新する設定を行います。ただ、固定の文字列をスプレッドシートに追加するだけですが、この更新を検地して、スクリプトの起動トリガとします。

ifttt003.png

2.スクリプトの作成

以下のスクリプトを作成し、APIのサイトにアクセスし、情報の取得、しゃべらせる言葉の形式に変換を行います。
「CommonScripts.sendGoogleHomeLiving」の中身は、こちらの記事に記載しています。

1)作成したスクリプト

コード.gs
/* 情報取得元 */
var url = "https://spla2.yuu26.com/";

function splaStage() {
  var totalMessage = "";

  totalMessage = totalMessage + "現在の、" + changeOnsei(getStage("regular","now"));
  totalMessage = totalMessage + "現在の、" + changeOnsei(getStage("gachi"  ,"now"));
  totalMessage = totalMessage + "次の、"   + changeOnsei(getStage("regular","next"));
  totalMessage = totalMessage + "次の、"   + changeOnsei(getStage("gachi"  ,"next"));

  totalMessage = totalMessage + getSalmonRun();

  CommonScripts.sendGoogleHomeLiving(totalMessage);  

}


/*
 * ステージ情報のJSONデータを読上げテキストに変換
 * 
 * @param {JSON} スプラトゥーン2のステージ情報のJSONデータ
 * 変換後の文字列を返却する
 * @return {String} 変換後データ
 *
 */
function changeOnsei(json) {
  var map = "" + json["result"][0]["maps"];

  return json["result"][0]["rule"] + "のステージは、" + map.replace(/,/,"と、") +"です。";
}


/**
 *ステージ情報取得関数
 * @param {String} rule = regular or gachi(レギュラーマッチ or ガチマッチ)
 * @param {String} when = now or next (現在のルール or 次のルール)
 * @return {JSON} JSONデータ
 */

function getStage(rule,when) {

  var sendUrl = "";


  // 引数のチェック
  if( /regular|gachi/.test(rule) == false) {
    return null;
  }
  if( /now|next/.test(when) == false ) {
    return null;
  }

  sendUrl = url + "/" + rule + "/" + when ;


  // スプラステージ情報のJSONデータを取得
  var response = UrlFetchApp.fetch(sendUrl);

  // HTTPレスポンスコードが正常(200)かチェック
  if( response.getResponseCode() != 200 ) {
    Logger.log("エラーです。HTTPSTATUS=["+response.getResponseCode()+"]");
    return null;
  }

  return JSON.parse(response.getContentText());

}

/**
 *サーモンラン情報 取得関数
 * @return {String} 読上げテキスト情報
 */
function getSalmonRun(){
  var sendUrl =  url + "/coop/schedule";
  var jsonData = null;
  var nowDate = new Date();

  // スプラステージ情報のJSONデータを取得
  var response = UrlFetchApp.fetch(sendUrl);

  // HTTPレスポンスコードが正常(200)かチェック
  if( response.getResponseCode() != 200 ) {
    Logger.log("エラーです。HTTPSTATUS=["+response.getResponseCode()+"]");
    return null;
  }

  // データ分割
  jsonData = JSON.parse(response.getContentText());

  var startTime = jsonData["result"][0]["start"];
  var endTime   = jsonData["result"][0]["end"];


  var startDate = new Date( startTime.substring(0,4), startTime.substring(5,7)-1, startTime.substring(8,10), startTime.substring(11,13),0,0);
  var endDate   = new Date( endTime.substring(0,4),   endTime.substring(5,7)-1,   endTime.substring(8,10),   endTime.substring(11,13),0,0);

  if( startDate.getTime() <= nowDate.getTime() && nowDate.getTime() <= endDate.getTime() ) {
    // サーモンランは現在やっている
    message = "現在、サーモンランは、やっています。"
    message = message + (endDate.getMonth()+1) + "がつ、" + endDate.getDate() + "にちの、" + endDate.getHours() + "じ、までです。";
  } else if ( nowDate.getTime() < startDate.getTime() ) {
    // 次のサーモンランの時間になっていない
    message = "現在、サーモンランは、やっていません。"
    message = message + (startDate.getMonth()+1) + "がつ、" + startDate.getDate() + "にちの、" + startDate.getHours() + "じ、からです。";    

  }

  Logger.log(message);



  return message;

}

2)スクリプトの起動設定

 ツールバーから起動トリガーを設定します。
 

trigger003.png

まとめ

Google Apps Scriptがいろいろ便利です。
WEBページへのアクセス、JSONの解析、メール通知など、いろいろ使えますね。
また、少しスクリプトを作成するだけで、Google Homeで出来ることが増えるのも興味深いです。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9