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のパスを指定します。ユーザー環境変数でも問題ないようです。
参考にした記事:
- スクレイピングのためのNokogiri利用メモ - それはそれ。これはこれ。
- エラー:OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - komiyakの通り道
- igaiga diary(2013-06-17)
これで、eAMUSEMENTのサイトから情報を取得できるようになりました。
次回はTwitterのAPIを使ってツイートする部分について書きたいと思います。