upinetree's memo

Web系技術の話題や日常について。

Mechanizeでニコ動スクレイピングしようとしてコケた

ニコ動スクレイピングしたら楽しそうだなーと思ってやってみたら、 2回ほどコケたのでメモ。

homebrewで入れたopensslの証明書でコケる

opensslのバージョンが古かったので、homebrewでopenssl入れたら ruby2.0.0で証明書エラーでました。

http://qiita.com/items/12457815d5cee3723b97

こちらを参考に、証明書を入れて無事解決。

$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/usr/local/etc/openssl/cert.pem"

$ brew install curl-ca-bundle
$ brew list curl-ca-bundle
/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

追記(2013/05/01)

WindowsでRubyInstallerを使ってRubyをインストールした場合、下記で対応します。

$ wget http://curl.haxx.se/ca/cacert.pem
$ cp cacert.pem /c/Ruby193/
$ export SSL_CERT_FILE=/c/Ruby193/cacert.pem

参考:Root certificates? · Issue #148 · oneclick/rubyinstaller

SSLバージョンでコケる

さて、Mechanizeを使ってみましょー。

ニコニコ動画にアクセスしてログインしてみます。

require 'mechanize'

LOGIN = 'https://secure.nicovideo.jp/secure/login?site=niconico'

agent = Mechanize.new
agent.post(LOGIN, 'mail' => mail, 'password' => pass)

が、ここで怒られます。

Errno::ECONNRESET: Connection reset by peer - SSL_connect
from /Users/upinetree/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/net/http.rb:917:in `connect'

どうも、ニコ動はSSLv3じゃないとダメっぽいです。

http://stackoverflow.com/questions/11855324/ruby-mechanize-https-error

ここを参考に。

agent = Mechanize.new
agent.ssl_version = 'SSLv3'
agent.post(URL::LOGIN, 'mail' => mail, 'password' => pass)

これでOK!

追記(2013/05/01)

SSLv3は脆弱性が発見されたので、TLSv1以上にしましょう。

agent.ssl_version = 'TLSv1'