DDRで消費したカロリーを自動でツイートする (その2)
Nokogiriを使う
RubyでHTMLを解析にするにはNokogiriというライブラリが便利のようなので、これを使うことにしました。
参考にした記事:
HTMLの構造を調べる
データを取り出すために、目的のHTMLの構造を調べてみます。
丸で囲んだ部分が取り出したいデータです。
Firefoxの機能で構造を調べてみました。
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で持ってくることはできません。次回はそのあたりを書きたいと思います。