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

Mechanizeを使う

さて、前回HTMLからデータを取り出すことはできましたが、自分のデータを持ってくるためにはeAMUSEMENTのサイトにログインする必要があります。

ここでMechanizeというライブラリを使うと、ブラウザのようにセッションを維持してログインしてから別のページに遷移することが可能になります。また、MechanizeはNokogiriのオブジェクトを返すため、Nokogiriとスムーズに連携することができます。

実際にコードを書いてみます。出力は前回と同じですので割愛します。

#! /usr/bin/ruby -Ku

require "mechanize"

# 前回作成した process_html 関数
require "./process_ddr_workout_html.rb"

KONAMI_ID   = "foobar" # 自分のKONAMI IDを指定
KONAMI_PASS = "******" # 自分のパスワードを指定

# エージェント生成
agent = Mechanize.new

# ログイン
agent.get("https://p.eagate.573.jp/gate/p/login.html")
agent.page.encoding = "SJIS"
form = agent.page.forms.first
form.field("KID").value  = KONAMI_ID
form.field("pass").value = KONAMI_PASS
agent.submit(form, form.buttons.first)

# ワークアウト履歴のページを要求
agent.get("http://p.eagate.573.jp/game/ddr/ac/p/playdata/workout.html")
agent.page.encoding = "SJIS"

# 解析してメッセージを作成 (agent.page.root は Nokogiri::HTML::Document)
message = process_html(agent.page.root, Date.today - 1)

# 結果を表示
puts message

SSL証明書エラーへの対処

Windows環境で実行した場合、"certificate verify failed (OpenSSL::SSL::SSLError)" というようなエラーが出てうまく動きませんでした。

1つの方法は、証明書を無視することです。下記のコードを追加すると、証明書の検証をしなくなります。(定数を書き換えている旨の警告が出ます)

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

とりあえず動かすには良いですが、偽のeAMUSEMENTサイトが存在した場合にIDとパスワードを送ってしまうことになります。

もう1つの方法は、Ruby用に証明書をインストールすることです。下記のサイトから、cacert.pemを入手して適当なディレクトリに置きます。これはMozillaにインストールされている証明書を変換したもののようです。

次に、環境変数SSL_CERT_FILEを追加して、cacert.pemのパスを指定します。ユーザー環境変数でも問題ないようです。

参考にした記事:

これで、eAMUSEMENTのサイトから情報を取得できるようになりました。
次回はTwitterAPIを使ってツイートする部分について書きたいと思います。