mechanize を用いたギタドラのスキルポイント記録システム(2)

KONAMIへのログインに画像の認証が必要になっちゃったので以下の方法はのちのち改良します。

前回までのあらすじ

ギタドラスキルポイント推移を自動で記録したい!
Ruby の mechanize と Nokogiri を使うんだ
・よーし
・だいたいの方針

  1. e-amusement GATE へログイン
  2. ギターおよびドラムのスキルポイント・全スキルポイントを切り出す
  3. 直近のスキルポイント・全スキルポイントと比較する
  4. スキルポイント・全スキルポイントの変化のしかたで場合分けし、必要な場合は最終プレー日時を取得する
  5. 保存方法(保存しないパターンも含め4種類)のどれかで処理する
  6. (cron で1日1回自動更新する)

はてさて、今回はどうなることやら……

スキルポイントについて

ギタドラで遊べる数百曲について、各曲のスキルを合計したものが全曲スキルポイント
全曲のうち、高いものから50曲ぶんのスキル値を合計したものがスキルポイント。(この値でその人の腕前がわかる)
ようするに昨日よりうまくなっていれば上がります。そうでなければ上がりません。*1

スキルポイントを取得してみる

とりあえず、実際にログインしてスキルポイントを切り出してみる

agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE
agent.get(ログイン画面のURL)
agent.page.encoding = "utf-8"
form = agent.page.forms.first
form.field("KID").value = コナミID
form.field("pass").value = パスワード
agent.submit(form, form.buttons.first)

これでログイン完了。証明書無視しちゃってるけどとりあえずはOKってことで。

page = agent.get(スキルポイントが書いてあるページのURL)
agent.page.encoding = "Shift-JIS"

puts page.search('td')[1].text.to_f
puts page.search('td')[2].text.to_f
puts page.search('td')[4].text.to_f
puts page.search('td')[5].text.to_f

で、

取れた!

場合分けのお時間

直近のスキルポイント (GF/DM/GF全/DM全) と、 最新のスキルポイント (GF/DM/GF全/DM全) を比較するとなると、全部で16パターンあった。

からの

こうである。(playG, playD は ギターフリークス/ドラムマニア をプレーしたかどうか)
全曲スキルポイントが上がった、ということはその日その機種をプレーしていることがわかる。ここに着目して、上図では16パターンを大きく4つに分けている。

  • (A)両方上昇
  • (B)GFだけ上昇
  • (C)DMだけ上昇
  • (D)両方変化なし

の4種類である。まずこの4種類のどれかに当てはまり、そして (B)〜(D) の場合は最終プレー日時をチェックして、その日ゲームをプレーしてるかをはっきりさせる。GF も DM もプレーしていなければ、その日は記録を行わない。

方針をすこし変更

さて16パターン中、最終プレー日時を調べる必要があるのは12パターンであることがわかった。だいたい4分の3で調べにいく必要があるのである。
だったら“必要に応じて”より、毎回やることにしちゃったほうがすっきりしそう……ということで、基本的に最終プレー日時を取得しにいくことにした。また、スキルポイントを記録していくファイル (output.txt) とは別に、動作結果を出力しておくファイル (log.txt) をつくることにした。柔軟な姿勢だ。

結局のところ

  1. e-amusement GATE へのログイン
  2. 最新のスキルポイント・全スキルポイントおよび最終プレー日時を取得
  3. 直近のスキルポイント・全スキルポイントを読みだす
  4. 各ポイントおよび日付の比較を行う
  5. スキルポイントの変化のしかたに応じて場合分けし、実行日に両機種をプレーしているかどうかはっきりさせる
  6. ファイルヘ保存 (もしくは保存しない)

という感じの流れになった。

書いたのがこちら。
https://gist.github.com/yamatema/b1f54793e02a303f7c79

cron の設定は
crontab - cron で ruby を自動実行する - Qiita http://qiita.com/tkwn1/items/204ebfaffa3bad9e2a99 を参考に、毎晩23時55分に実行されるように設定。つまり23時半くらいにはゲーセンを出ろってことになる。

出力のようすがこちら。上が output.txt、 下が log.txt。


ゲーセンいってねえな!

今後やりたいこと

・実行結果を twitter に流す
・今後、曲の削除が起こったときにスキルポイントが下がるのでちゃんと対応したい
・証明書どうすんだ

・文章がギッタンギッタンなのでもう少し整理すればよかった


◇いじょうです◇