※こちらの記事は「FIXER Rookies Advent Calendar 2022」9日目の記事となります。
こんにちは!三瀬と申します。
さっそく本題なのですが、私は「アイドルマスター シャイニーカラーズ」の応援に力を注いでおります。
楽曲のコンセプトや衣装のビジュアル、カードイラストの構図、作り込まれたシナリオなど魅力的な点を挙げればキリがありません。
最近だとゲーム内展開に留まらず、SNSやリアルイベント、他アイマス作品や他企業とのコラボ等様々な方面に大きく展開されるようになりました。
特に印象的な展開としては、公式Twitterでアイドルが1日限定でなりきりツイートをする企画が時たま開催されることで、ファンのツイートに対して実際にライターさんが文面を考えてリプライを送ることで本物のアイドルと実際に交流することができたり、ゲーム内のシナリオだけでは中々解釈できない「あのアイドルがSNSをやったらどんな感じになるのか」ということを実感できたりして楽しいです。
あと個人としては来年2月に開催されるアイマス合同ライブのチケットを握れたのでかなり楽しみ。
そんな悠々自適なシャニマスライフの中で自分が危惧していることがありまして、それはゲームのログイン忘れです。
最初は「まあ、まさか自分が忘れるわけ...」と思っていたのですが、自分のものぐさレベルをかなり甘く見ていました。
仕事を終えて帰宅した後にPCを開き、何かしらのアニメ鑑賞や開発に熱中し、そのまま夜中を迎えて布団にこもり、朝起きて「あっ...」となることがたまにあったりなかったりします。
ログインボーナスは最悪どうでもいいのですが、せっかくなら毎日欠かさず283プロダクションに出勤し、アイドル達と触れ合い、徳を高めていきたいですよね。
ということでシャイニーカラーズはブラウザゲームなので、毎日夜中にGoogle Chromeの履歴を取得し、シャイニーカラーズにログインしていない時に鬼リマインド通知をかけるプログラムを考えてみました。
実行環境はWindows11で、上述の通りChromeでシャイニーカラーズを開いていることを前提としています。
前提知識のようなもの
Google Chromeの履歴はローカルの以下の場所に「History」という名前のDB形式のファイルで保存されています。
~\AppData\Local\Google\Chrome\User Data\Default
このHistoryを取得し、「urls」というテーブルにSQL文で検索をかけることでURLや最終訪問日時などの閲覧履歴を抽出することができるので、"select title,url,last_visit_time from urls" で検索をかけると、以下のように履歴一覧を取得できます。
シャイニーカラーズにログインしていたらこんな感じにログに残っているということですね。
つまり、取得した履歴から「今日の0時0分0秒以降」の履歴のみを取り出すことで、その日にシャイニーカラーズにログインしているかどうかを判別することができます。
ということで上記を活用し、いい感じにリマインドまで行えるプログラムを作っていきましょう。
SQLテーブルからクエリでデータを抽出してそのままデータフレームとして使うことのできるpandasを使っていきたいので、Pythonで書いていきます。
制作編
まずは必要なモジュール達をインストールしていきます。
pip3 install pandas
pip3 install sqlalchemy
pip3 install win11toast
あとは標準ライブラリのはず。抜けがあったらごめんなさい。
モジュールが入れられたらあとはコードを書くだけです。
全文ドーン
Pythonimport os
import pandas as pd
import shutil
from time import sleep
from sqlalchemy import create_engine
from win11toast import toast
from datetime import datetime
def read_history(cache="data/history_repl"):
# 履歴のコピーファイルを生成する
appdata_ = os.path.join(os.getenv("HOMEDRIVE"),
os.getenv("HOMEPATH"), "AppData")
path_ = os.path.join(
appdata_, "Local/Google/Chrome/User Data/Default/History")
os.makedirs(os.path.dirname(cache), exist_ok=True)
shutil.copy(src=path_, dst=cache)
# SQLiteのクエリで必要項目を取り出す
query_ = "select title,url,last_visit_time from urls"
df = pd.read_sql_query(query_,
create_engine("sqlite:///{}".format(cache)))
df = df.dropna(subset=['title'])
# Chromeの場合、履歴の訪問時間は1601年1月1日から経過した時間(マイクロ秒)が入っている
# そのため、1601年1月1日から今日の0時0分0秒までに経過した時間を取得する
offset_ = datetime(1601, 1, 1)
ts_ = datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) - offset_
tms_today = ts_.total_seconds() * 1000000
# 今日の履歴のみ抽出
res = df[df['last_visit_time'] > tms_today]
return res
def no_play_shinycolors_notification():
# 訪問履歴が無ければ30分間リマインドをし続ける
for i in range(30):
df = read_history()
# 履歴からシャイニーカラーズの項目だけ抽出
shinycolors_colum = df[df['url'] == "https://shinycolors.enza.fun/home"]
# シャイニーカラーズへの訪問履歴が無ければトースト通知
# あればその時点でプログラム終了
if (shinycolors_colum.empty):
toast('リマインド','まだシャイニーカラーズにログインしていませんね?\n素敵なアイドルと物語があなたを待っています!', duration='long', button={'activationType': 'protocol', 'arguments': 'https://shinycolors.enza.fun', 'content': 'Go to 283 production'})
sleep(35) # 通知時間25秒+35秒で1分ごとに
else:
break
if __name__ == "__main__":
no_play_shinycolors_notification()
補足的なものはコメントに残しているのでいい感じにご参照ください。
簡単に説明すると、1分に1回Chromeのログを取得し、シャイニーカラーズのURLが存在すれば終了、存在しない限り(最大30分)しつこくトースト通知を送りまくるようになっています。
このプログラムをそのまま or 実行ファイル化するなどして、タスクスケジューラに放り込んで1日1回決まった時間に実行するように設定してあげましょう。
シャイニーカラーズではログインボーナスの切り替わりは4時なのですが無料ガチャがある日の切り替わりは0時なので、それ以前の時間が好ましいかもしれません。
プログラムを実行してシャイニーカラーズに未ログインだった場合、こんな感じに通知が来るようになります。
「Go to 283 production」をクリックすると実際にゲームのURLを開くこともできるようになっています。嬉しいね
今回はブラウザゲームに限定したのですが、アプリゲームでも起動ログさえ取得できれば同じようなことができると思います。
あと、もしこの先Googleアカウントに紐づいた履歴をサクっと取れるようなAPI機能が提供されたらAzure Functions等でクラウド化できたり様々な鬼リマインド方法を試せそうな気がしますね。(2022年12月現在は調べた感じ無さそうでした。あったらごめんなさい...)
まとめ
本当に気が向いたらでいいのですが、皆さんも触れてみてください。シャイニーカラーズ。
最近ですと楽曲がサブスク解禁され始め、少しずつコンテンツに触れやすくなってきているかと思われます。
現在サブスク配信されている曲の中だと個人的には、ノクチルの「アスファルトを鳴らして」、ノクチル+放クラの「相合学舎」、市川雛菜ちゃんのソロ曲「あおぞらサイダー」がおすすめです。
参考文献