Amzaonに接続を試みた

しばらくCocoaと全然関係ない話が続きそうなので、Programmingというカテゴリを作ってみた。
しかし、MechanizeのAPIを調べたり、amazonのHTMLを覗きこんだりで、プログラミングともあまり関係ない話が続きそう。

必要なアクセスの種類

おそらく必要になるのは…
1. カートの読み出し
2. カートの更新
3. 商品情報の読みだし

このうち3はAmazon Web Serviceでもできるかもしれないけど、アプリケーションに認証のIDとシークレットキー必要とかでいろいろやっかいそう。HTMLから直接情報をひっこぬく形にするかもしれない。サーバー負荷が問題になるようなアプケーションではないので、それで駄目ということはないはず。
どっちみち1と2はHTMLをごにょごにょするしかないだろう。
そこでRubyのMechanizeを使ってみようと思い思考錯誤を開始した。

最初のトラブル

実は本当の最初のトラブルは、amazonのHTMLがおよそ情報を抜きだすにはまったく適していない様に見える事だけど、まだその問題にぶちあたるところまで行っていない。
最初にgemでmechanizeをインストールしてぶちあたった問題は↓

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:567: warning: using default DH parameters.
/Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/util.rb:40:in `iconv': can't convert nil into String (TypeError)
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/util.rb:40:in `from_native_charset'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:152:in `from_native_charset'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:144:in `proc_query'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:143:in `map'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:143:in `proc_query'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:166:in `build_query'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:165:in `each'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:165:in `build_query'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:214:in `request_data'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize.rb:401:in `post_form'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize.rb:344:in `submit'
	from /Library/Ruby/Gems/1.8/gems/mechanize-0.9.3/lib/www/mechanize/form.rb:130:in `submit'

何これ?formをsubmitした時に、encodingがnilだと怒られる。

ruby-debuggerをインストールしていろいろ追跡してわかった事実は、
「nokogiriがhtmlをparseする時点で文字コードnilに設定されてる」
という事

これはひょっとしてアレか?あのrequire 'mechanize'をした時にでてくる、↓のウザい警告が関係しているのかな?

HI.  You're using libxml2 version 2.6.16 which is over 4 years old and has
plenty of bugs.  We suggest that for maximum HTML/XML parsing pleasure, you
upgrade your version of libxml2 and re-install nokogiri.  If you like using
libxml2 version 2.6.16, but don't like this warning, please define the constant
I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 before requring nokogiri.

という事でMacPortでlibxml2をインストールしてからgem install nokogiriしなおしてみた。

そしたらformをsubmitする事ができるようになりましたとさ。

次の問題

実は上のコードはsign-inフォームにemailとpasswordを入れているつもりなのだが、submitしてからカートに移動してもカートの中身が見えてない。
この辺てmechanizeが自動的にハンドリングしてくれるのかと思ってたのだが、何か勘違いしてるのだろうか?
mechanizeは使い方がよくわからないままサンプルを見ながら適当に起動してみただけなので、まだ謎が多い。
明日以降はここを見ていこう。

できれば連休開始前にカートと商品の情報くらいは取れるようになっておきたいのう…
そうしないとCocoaの話が再開できない。
しかし、そうなる可能性は非常に低いと言わざるをえない