mechanize を用いたギタドラのスキルポイント記録システム(1)
あけましておめでとう
去年の年末にせっかくVPSをけいやくしたのに、fav通知にしか使ってないってのは何とももったいないよナー……
と思っていたのだけど、僕は前々から音ゲーム GITADORA GuitarFreaks&DrumMania のスキルポイント (簡単にいうと、やりこみ具合を計る数値で、むつかしい曲ほど、高得点ほど高い数値を得られる) を Excel ファイルにちょこちょこ記録する習慣があったのでした。ゲームセンターで GITADORA をプレーした日は欠かさず公式サイトでポイントをチェックして記録、チェックして記録……を繰り返していたわけです。
しかしそうは言っても、毎日行ってるわけでもなし、忘れちゃうときもあります。実際やってみると5分もかからない作業なんだけど、正直ちょっと面倒だなとも感じていたところ……
友人 @kyubing に『Ruby の mechanize と Nokogiri という Gem を使うと、インターネットの各種ページから必要な情報だけ切り取ってくることができるよ』と教えてもらい、「なるほどそれを使えば自動化できちゃえそう」と思い立ち、今回の活動が開始したのでした。
Rubyの経験はおありですか
おありなんですけど、修士論文書いてたころの方が知ってたと思う……ってくらい書けなくなっていた。ひどい。
ということで『たのしいRuby』の第4版を Kindle にぶちこんで、色々あちこちで復習しつつ書いていくのでした。
@kyubing の書いた jubeat (別の音ゲーム) についてのスコア集計 (とアップロードの) スクリプト*1や、mechanize 及び Nokogiri の基本的な使い方解説*2 *3 *4などを読みあさり色々試作してみて、とりあえず http://yamatema.com から自在にテキストを切り出すところまではできるようになったのでした (cssにちゃんと触れたのは今回が初めてだったよ)。
先駆者を見つける
mechanize というやつは人間の代わりにリンクをクリックしてくれたり、フォームのボタンを押してくれたりするニクい奴で、つまりは KONAMI の e-amusement GATE (公式サイト) へのログインもしてくれるわけである。べんり。
さてフォームについてはどう書けばいいんだ……調べていたら、DDR で同じことを既にやっている人がいた*5のを発見したのでした。ログイン部分をまるまる使わせてもらってしまった。SSL証明書についてはまたあとでちゃんとやる。
あとは自力でやっていく
僕はこういうことを考える際すぐ迷子になるので、大まかな流れを書きだして方針とし、そこから詳細を突いていきました。
そのときのようすがこちら。
!! ギタドラのスキルポイントを自動で記録するシステム !!
・とりあえずの流れ
1)e-amusement GATE へログイン
2)ギターおよびドラムのスキルポイント・全スキルポイントを切り出す
3)ファイルへ書き込む・すこしくわしく
* 切り出しは Ruby の Mechanize で行う
* あとで Excel に叩き込むつもりなので CSV 形式で出力する・おなやみ
A)サーバーにうつして cron で1日1回自動で更新する
A1)ポイント変化がなかったときも記録する
A2)ポイント変化がなかったときは記録を行わない
B)サーバーにうつして任意のタイミングで、手動にて更新する更新しわすれを防ぐには(A)案がよさそう
しかし(A1)案ではログが日ごともったりしていきそうな心配
→1年毎日動かしても、せいぜい約360行のテキストファイルだし問題ない気もする
(A1)及び(A2)案のどちらも「プレーしたけどスキルがあがらなかった日」が把握できない
→(B)案ならばプレーした日に走らせる習慣をつければ把握できる
→自動化したいんですけど!!!
→はいでは(A2)と(B)を合わせてみる
大半は自動になったが、やはり手動だと忘れる可能性が大きいし、全自動にしたい
その為には(A)案の弱点である「プレーしたけどスキルポイントがあがらなかった日」をうまいこと定義しないといけない……
弱点を「プレーした」「スキルポイントがあがらなかった」と分けると、「その日プレーしたかどうか」という情報が必要だとわかる。これをどこから入手するか……
→『プレー履歴のページから、最後にプレーした日時を取得する』これだ!!!
ということで最終的に、
- e-amusement GATE へログイン
- ギターおよびドラムのスキルポイント・全スキルポイントを切り出す
- 直近のスキルポイント・全スキルポイントと比較する
- スキルポイント・全スキルポイントの変化のしかたで場合分けし、必要な場合は最終プレー日時を取得する
- 保存方法(保存しないパターンも含め4種類)のどれかで処理する
- (cron で1日1回自動更新する)
という感じになりました。
長くなりそうっていうか長いのでとりあえずここまで。
*1:https://gist.github.com/clicube/1336156
*2:Nokogiri の基本(翻訳版) - Engine Yard http://www.engineyard.co.jp/blog/2012/getting-started-with-nokogiri/
*3:Nokogiri を使った Rubyスクレイピング初心者向けチュートリアル - 酒と泪とRubyとRailsと http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/
*4:Mechanizeによるスクレイピングの基本的なことまとめ - そのねこが学ぶとき http://chroju89.hatenablog.jp/entry/2015/02/08/133507
*5:DDRで消費したカロリーを自動でツイートする (その3) http://shimazakky.hatenablog.jp/entry/2014/02/03/011424