GASでSalmon Statsに自動アップロードしよう

Javascript

GASとは

GASとはGoogle Apps Scriptの略で、まあ簡単に言えば本来はサーバを借りてやらなければいけないような「定期的実行」の処理を代わりにGoogleがやってくれる仕組みのことです。

定期実行というのは例えば株価変動を読み取ったりだとか、まあそんなことに使えるのですが、これをiksm_sessionが切れるのを防ぐために使おうと考えたのが@Yukinklng氏でした。

iksm_sessionは使わないでいると24時間で切れてしまい、再発行が必要になるのですが定期的にアクセスする仕組みをつくっていれば有効期限を切らさずに済みました。

ただ、定期的にアクセスするためにサーバをわざわざ借りるというのはハードルが高く「サーバ借りてやることがそれだけ」では金を溝に捨てているような感じだったのですね。

ところがGASを利用することができれば初期投資が0でiksm_sessionをいつまでも切らすことなく更新し続けることができるのです。

iksm_sessionの有効期限を切らさないメリット

まず、任天堂のAPI変更に対して全く影響を受けないというのが最大のメリットでしょう。

影響を受けないということは今後アップデートが入っても、Salmon Statsにデータをアップロードし続けることができるということです。

これだけでも導入のメリットとしては高いのではないでしょうか。

導入手順

Googleアカウントが必要になります。持っていない方はいないと思いますが、ない場合はまずは作成しましょう。

iksm_sessionとapi_tokenの取得

GASスクリプトではiksm_sessionとapi_tokenの取得には対応していません。なのでまずはそれらを取得する必要があります。

それらを取得するツールとしてWindows版Salmoniaが使えるので、それを利用してまずは準備を整えましょう。

使い方については以下の動画を参考にどうぞ。

サーモンランリザルト取得ツールの使い方

これでデータを取得するとconfig.json内に必要なデータが書き込まれています。

このうちiksm_sessionとapi-tokenの値を使うのでファイルは開いたままにしておいてください。

新規プロジェクトの作成

左の「新しいプロジェクト」をクリック。

コード.gsの中身を次のスクリプトファイルで上書きします。

スクリプトファイルの作成

下のリンクにあるコードをコピーします。

function Salmonia() {
const iksmSessions= JSON.parse(PropertiesService.getScriptProperties().getProperty('IKSM_SESSION'))
const apiToken = PropertiesService.getScriptProperties().getProperty('API_TOKEN')
let jobNum = JSON.parse(PropertiesService.getScriptProperties().getProperty('JOB_NUM'))
iksmSessions.forEach(function(iksm_session, index) {
const present = getJobNumFromSplatNet2(iksm_session)
const preview = Math.max(parseInt(jobNum[index]), present 49)
Logger.log(iksm_session, present, preview)
if(present != preview) {
for(let job_num = preview; job_num <= present; ++job_num) {
Logger.log(`${iksm_session}: ${job_num}`)
const result = getResultFromSplatNet2(iksm_session, job_num)
Utilities.sleep(5000)
setResultToSalmonStats(result, apiToken)
}
} else {
Logger.log(`${iksm_session}: No new results`)
}
jobNum[index] = present.toString()
PropertiesService.getScriptProperties().setProperty("JOB_NUM", JSON.stringify(jobNum))
})
}
function getJobNumFromSplatNet2(iksm_session) {
const url = "https://app.splatoon2.nintendo.net/api/coop_results"
const cookie =`iksm_session=${iksm_session}`
const options = { headers: { cookie }}
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() != 200)
throw new Error("Invalid/Expired iksm_session.")
const json = JSON.parse(response.getContentText());
return Math.round(json["summary"]["card"]["job_num"])
}
function getResultFromSplatNet2(iksm_session, job_num) {
const url = `https://app.splatoon2.nintendo.net/api/coop_results/${job_num}`
const cookie =`iksm_session=${iksm_session}`
const options = { headers: { cookie }}
return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
}
function setResultToSalmonStats(result, apiToken) {
url = "https://salmon-stats-api.yuki.games/api/results"
const headers = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify({results: [result]}),
"headers": {"Authorization" : `Bearer ${apiToken}`},
"muteHttpExceptions": true
}
const response = UrlFetchApp.fetch(url, headers)
if (response.getResponseCode() != 200)
throw new Error("Invalid api-token.")
}
view raw Salmonia2.js hosted with ❤ by GitHub

よく分からん人はこのページの内容を全部コピーしてください。

コピーするとこんな感じになるはずです。なったら保存します。

プロパティの設定

ファイルから「プロジェクトのプロパティ」を選択します。プロジェクト名を決めるように言われますが、何でも構いません。

今回は適当にSalmoniaとしました。

プロジェクトのプロパティを以下のように設定します。

API_TOKENIKSM_SESSIONの値はSalmoniaで取得した値をコピーしましょう。

JOB_NUMは適当に0でも入力しておけばいいと思います。

プロジェクトの実行

タブの「実行」から「関数の実行」で動作させてみましょう。

初めて実行すると上のような許可を求められます。

アカウントを選択しましょう。

左下の「詳細」を押します。

「安全ではないページに移動」をクリックします。

するとコードが実行できるようになります。

設定したトークンなどに問題があると下のようなエラーが表示されます。

何も表示されなければ動作テストは成功です。

トリガーの設定

最後にトリガーを設定して、自動でアップロードしてくれるようにしましょう。

「現在のプロジェクトのトリガー」を選択。

「トリガーを追加」をクリック。

上のように設定して、一分おきに実行されるようにします。まあここは五分おきでもなんでも自分の好きな値にすれば良いと思います。

まとめ

さて、このGASを利用する方法が確立すれば誰でも取得漏れの心配なくサーモンランのリザルトをSalmon Statsにアップロードすることができるようになります。

となれば単純なリザルトアップロードとしてしか機能していないAndroid版のSalmoniaはお役ごめんになりますし、何ならパソコンでこれらを設定する必要がある以上Python版・Windows版も不要になるわけです。

必要なのはiksm_sessionを取得する仕組みなのですが、それに関してはこっそり開発しているSplatNet2 Simulatorをとりあえず使えばいいのではないかと思っています。

最初の設定こそ多少面倒ですが、パソコンが手元にあるサーモンラン勢でSalmon Statsを利用している方であれば絶対に設定しておいたほうがいいと思います。

コメント

  1. 匿名 より:

    新しいプロジェクト>その他>Google Apps Script
    を選ぶと下のように出てきてしまいます、、、
    現在、ファイルを開くことができません。

    アドレスを確認して、もう一度試してください。

    あれもこれも Google ドライブで

    Google ドライブにはドキュメントやスプレッドシート、プレゼンテーションなどを簡単に作成、保存してオンラインで共有できるアプリが揃っています。

    詳細はdrive.google.com/start/appsをご覧ください。

    • えむいー より:

      同様の症状を調べてみたのですが、この方法で解決しないでしょうか?

    • 匿名 より:

      その方法を難解かやってたらできました!!
      ありがとうございます
      僕も調べてそれやってみたんですがね、、、

  2. 匿名 より:

    コメント失礼します。
    switchで複数アカ使用しており、サブアカも自動化したいと思い本日この設定を試みたところ、実行の段階で以下のように表示されました。
    本アカのほうは10月ごろに自動化済みで、そちらは実行してもエラーにはならず稼働しているのですが、新たに自動化するにはどのようにしたらよいでしょうか?

    Exception: ttps://app.splatoon2.nintendo.net のリクエストに失敗しました(エラー: 404)。サーバー応答の一部: {“message”:”api_error_not_found_error”,”code”:”NOT_FOUND_ERROR”}(応答の全文を見るには muteHttpExceptions オプションを使用してください)(行 31、ファイル「コード」)

    • えむいー より:

      Exception: ttps://app.splatoon2.nintendo.net

      とありますが、コードをコピーする際にURLを間違っている可能性があります。正しくはhttps://から始まらなければいけません。

      が、せっかくなので以前書いたコードを複数アカウントでも使えるように改良しようと思います。

    • 匿名 より:

      ご返信ありがとうございます。
      コメント書き込みを押した先のページで自分のコメントが表示されず、書き込めていないのかな?と思ってh抜きなど色々試していました。
      そのため報告ではそのようになっていますが、実際のコードは記載のものをまるまるコピーさせていただいたので、hから始まる状態でエラーになっています。大変失礼いたしました。
      また、前述の通り何度か書き込もうとしてしまいまして、もしコメント承認制などでしたら荒らしてしまい申し訳ありません…

      複数アカウントに対応していただけるとのお言葉とてもありがたいです!
      エラーの方はどうしたら良いでしょうか?

  3. えむいー より:

    これだけでは(仕方はないのですが)原因を探るのは難しそうですが、そのiksm_sessionは有効なものでしょうか?(ここくらい理由が思いつかないのですが)

    • 匿名 より:

      iksm_sessionについては、Salmoniaの1.0.8を使用し、作成されたconfig.jsonを開いてコピーしました。
      作成後すぐにコピーしたので、有効でない、ということはないと思うのですが…

  4. 匿名 より:

    コメント失礼します。

    プロジェクトのプロパティが見つかりません。
    edge上で作っているのが問題でしょうか。

    • 匿名 より:

      そして画像のようなエラーが出ました。
      プログラミング初心者なので全く分からず困っています。

    • えむいー より:

      新しいエディタではプロパティの編集ができないので「以前のエディタを使う」を利用してください。ブラウザは関係ないので大丈夫です。

タイトルとURLをコピーしました