BB.NETの週1プレゼントを取得するためのruby script

 間が空いてしまったのがアレですが、前回に引き続きBB.NETの週1プレゼントをもらうためのボタンを押すスクリプトを書いてみます。
 前回のloginの処理はあれで良いことに気が付いて手抜きしていましたが、今回は真面目にボタンをクリックします。まずはMechanizeがどのようなデータを持っているかを表示してみます。
present_view.rb :

#! /usr/bin/ruby

require 'rubygems'
require 'mechanize'
require 'kconv'

id = "hoge@fuga.isao.net"
password = "11223344"

agent = Mechanize.new
agent.get("https://pc.borderbreak.net/bb_p/login.do", "uid" => id, "password" => password)
r = agent.page.link_with(:text => '週1プレゼント').click

p r

 とりあえず

$ ./present_view.rb | tee a.txt

などと実行して、a.txtを見てみます。
 実行結果を貼りつけるといろいろと問題になりそうなのと長いので貼り付けません。実際に実行してみてください。
 a.txtを眺めるとformsの:nameがnilでアレなので:actionが"R"なformに、fieldが:name="am2id"と:name="pass"の値を変更してボタンをクリックしてあげれば良さそうです。
 上記のように基本的にMechanizeでページを取得して、MechanizeおよびNokogiriでどのように処理されているかを確認するか、元のhtmlファイルを読んでそれに対応するようなスクリプトを書く、という流れになります。


 ここで唐突にパスワードやIDをスクリプト毎に記述するのは後で変更した場合などに面倒だな、と思ったのでyamlという形式で記述することにします。適当にbbnet.yamlというファイル名にします。
bbnet.yaml :

account:
  :isaonet:
    :uid: "hoge@fuga.isao.net"
    :password: "11223344"
  :bbnet:
    :am2id: "HOGE1122"
    :pass: "11223344"

 中身は実際に使える値に書き換えてください。


 実際にボタンをクリックするスクリプトを書いてみます。
present_click.rb :

#! /usr/bin/ruby

require 'rubygems'
require 'mechanize'
require 'yaml'
require 'kconv'

conf = YAML.load_file("bbnet.yaml")
account = conf['account']

agent = Mechanize.new
agent.get("https://pc.borderbreak.net/bb_p/login.do", "uid" => account[:isaonet][:uid],
                                                      "password" => account[:isaonet][:password],
                                                      "am2liblogin" => "1")
agent.page.link_with(:text => '週1プレゼント').click

agent.page.form_with(:action => 'R') { |f|
  f.field_with(:name => 'am2id').value = account[:bbnet][:am2id]
  f.field_with(:name => 'pass').value = account[:bbnet][:pass]
  f.click_button
}


 実行すると何も表示されずに終わってしまいますが、ブラウザなどでBB.NETにアクセスして確認すると週1プレゼントのところが(済)になっているので無事にもらえたようです。
 真面目に書く場合は本当にもらえたのか?を確認するための処理なども書くべきかもしれませんが、めんどくさいのでこれで良いことにします。


 これをcronなどで週に1回実行されるように仕込んでおけばもらい忘れることも無くなりますね。


 次回は通算戦績詳細を表示するようなスクリプトを書いてみます。中身が変わっても大丈夫なように作ったところ、config.yamlスクリプトの記述がめちゃくちゃ長くなってしまったので、どうしようかと思案中です。