2013年9月24日火曜日

rubyでhttpclientを作ってみる(mechnize)

自分の家のルータの設定がwebインターフェースしかないので、自動設定をしようとhttpclientを作ってみることにした。言語はrubyで、いろいろ探してみたら、mechanizeというツールであれば、cookieとレスポンスのパースができそうなので、これでやってみる。

環境は、
 ・Windows8上で作る
 ・rubyは2.0.0(32bit)を使う
で進める。で進める前にいろいろ調べたら、rubyの開発環境ではgemでインストールすると、
依存関係のライブラリを最新でインストールする動きらしく、うまく動かないことがあるらしい。
開発するプロジェクトごとのライブラリを簡易にする方法としてbundlerというものがあった。
それはこちらで環境をつくってみた。

1.環境準備
 
 まずはプロジェクト用おnフォルダを作成する。
 >mkdir d:\program\hc_mechanize
  >cd d:\program\hc_mechanize

 次にbundle環境を作成する。

  >bundle init

 Gemfileを変更し、mechanizeを設定する。

  >vim Gemfile
 ==
 gem "mechanize"
 ==

 でインストール(d:\program\hc_mechanize\gem)する。

 >bundle install --path gem

 問題なくインストール完了。

2.サンプルコードで試してみる

 mechanizeのサイトのRubyforgeのサンプルをそのまま動かしてみる。

 >vim hc.rb
 ==
 require 'rubygems'
 require 'mechanize'

 a = Mechanize.new
 a.get('http://rubyforge.org/') do |page|
   # Click the login link
   login_page = a.click(page.link_with(:text => /Log In/))

   # Submit the login form
   my_page = login_page.form_with(:action => '/account/login.php') do |f|
     f.form_loginname  = ARGV[0]
     f.form_pw         = ARGV[1]
   end.click_button

   my_page.links.each do |link|
     text = link.text.strip
     next unless text.length > 0
     puts text
   end
 end
 ==

 で実行!

 >bundle exec ruby hc.rb
 D:/tools/pik/install/Ruby-200-p195/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 errno=0 state=SSL
v3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
  ・
  ・
  ・

 なんかエラーでた。SSL証明書のチェックでこけているらしい。
  調べたら、どうもデフォルトのCAファイルの場所が問題らしいので、caをダウンロードして、パス
 を明示的に指定してみる。

 >vim hc.rb
 ==
  ・
  ・
 a = Mechanize.new
 a.agent.http.ca_file = 'D:/program/hc_mechanize/cacert.pem' #modified
 a.get('http://rubyforge.org/') do |page|
  ・
  ・
 ==

 >bundle exec ruby hc.rb
 Log In
 Support
 New Account
 RubyForge
 Home
 My Page
 Project Tree
 Code Snippets
 Project Openings
 [Lost your password?]
 [New Account]
 [Resend confirmation email to a pending account]

 となって成功!

3.実際のスクリプトを作成してみる

 と、ここで実際のルータのページを見てみたところ、、リンクにjavascriptが使われていた。
 まぁサンプルが見当たらなかったですが、適当にカスタマイズしながら、調べながら進めてみ
 たが、どうにもこのリンクをクリックできない。で、今一度mechanizeを調べてみたら、、なんと
 javascriptはサポートしていないとのこと(ブラウザ依存するから?)。しょっぱなから躓いた。

 気を取り直して調べてみたところ、ブラウザのJavascriptを実装できるツールとして、watir
 というものがあるらしい。といことで次回に持越し・・

0 件のコメント:

コメントを投稿