DDRで消費したカロリーを自動でツイートする (その2)

Nokogiriを使う

RubyでHTMLを解析にするにはNokogiriというライブラリが便利のようなので、これを使うことにしました。
参考にした記事:

HTMLの構造を調べる

データを取り出すために、目的のHTMLの構造を調べてみます。
f:id:shimazakky:20140130013046p:plain
丸で囲んだ部分が取り出したいデータです。
Firefoxの機能で構造を調べてみました。
f:id:shimazakky:20140130013137p:plain
idが"workout_log"のdivの下にtableがあり、その中に目的のデータが入っていることがわかりました。Nokogiri::XML::Node#xpathメソッドを使って、ドキュメントから特定のidを持つdivの下のtableの集合を取得します。
実際にローカルに保存したHTMLを解析してみました。昨日の日付のデータがなければプレー履歴がないということにします。

#! /usr/bin/ruby -Ku

require "date"
require "nokogiri"

def process_html(doc, date)
    message = ""
    matched = false
    # 日付をフォーマット
    date_form = date.strftime("%Y-%m-%d")
    # テーブルを検索
    table = doc.xpath("//div[@id='workout_log']/table")
    # テーブル内を探索
    table[0].children.each do |tr|
        # 日付
        play_date = tr.children[2].inner_text
        # 日付が一致する?
        if play_date == date_form
            matched = true
            times = tr.children[4].inner_text
            cal = tr.children[6].inner_text
            message = date_form + "にDDRを" + times + "プレーし、" + cal + "消費しました。"
        end
    end
    if !matched
        message = date_form + "はDDRをプレーしませんでした。"
    end
    return message
end

# HTMLを開く
open("./workout.html") {|f|
    # Nokogiriでパース
    doc = Nokogiri.HTML(f)
    # ドキュメント内から昨日の日付のレコードを探し、メッセージを表示
    puts process_html(doc, Date.today - 1)
}

実行すると、下記のような結果となります。

> ruby nokogiritest.rb
2014-01-29にDDRを2回プレーし、262.25 kcal消費しました。

これで、対象のHTMLがあればツイートしたい文章を作ることができるようになりました。しかしながら、eAMUSEMENTサイトはログインが必要なので単純にopen-uriで持ってくることはできません。次回はそのあたりを書きたいと思います。