二、三ヶ月前からうまくうごかなかったPerlスクリプトが動いた!
ものすごくうれしいんですけど。
LWPでAmazonのアフィリエイト管理画面にログインして、
売り上げのデータを取得したい、というのが目的だった。
LWPでユーザエージェントを作って
それに情報をとってこさせる方法を知ってから、
単にGETメソッドでのアクセスしかできなかったのが、
POSTメソッドでアクセスしたり、
Cookieをユーザーエージェントに保持させたりと
複雑なことができるようになってきて、
その成果がGoogleAnalyticsWidgetというMTのプラグイン。
そのプラグインはMTの背後でLWPのユーザーエージェントが
MTで設定されたIDとパスワードでGoogleにログインして、
あたかも本物のユーザーになりすまして、
データを取得するというのをやっている。
これができるんだから、Amazonでもできるはず!と思って、
何度かトライしたのだけど、何故かできなかった。
AmazonがLWPを嫌うせい?と考えて、ユーザーエージェント名を偽装したり、
Javascriptを使わないと埋められないPOSTデータがあるとか?と
考えて、javascriptの部分を読んで、考えうる限りjavascriptで
設定されるPOSTデータ部分を埋めたりした。
しかし、惨敗。
今日、再度トライしてみて、やっと原因がわかった。
問題はログインの認証には成功しているのだが、
実はそのあとにリダイレクトが起こっていて、
そのリダイレクトに追随できずに止まってしまっていたということだった。
GETでアクセスしたときは自動的にリダイレクトするのだけど、
POSTの場合は自動ではそうしないという仕様なのだった!
HTTPヘッダをよく見るべきだった。
Connection: close
Date: Wed, 11 Feb 2009 17:35:31 GMT
Location: https://affiliate.amazon.co.jp/gp/associates/join/landing/main.html
Server: Server Vary: Accept-Encoding,User-Agent
Content-Type: text/html; charset=UTF-8
Client-Date: Wed, 11 Feb 2009 17:35:32 GMT
Client-Peer: 207.171.191.185:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O・・・(中略)・・・
Client-SSL-Cipher: RC4-MD5
Client-SSL-Warning: Peer certificate not verified
Client-Transfer-Encoding: chunked
Set-Cookie: ubid-・・・(略)
HTTP/1.1 302 MovedTemporarily:これはページが移ったということ。
301と302はHTTPリダイレクト用のコード。
これをきちんと確認しておけばよかった。
それに気付く前は、
Client-SSL-Warning: Peer certificate not verified
という部分があやしいと思っていて、
確かにこのセンテンスでググるとSSLのあたりでhttps.pmに問題があるから、
パッチをあてたという話がでてくる。
けれどそれらの話は2002年頃の話で、すでに修正は済んでいる模様だった。
まあ、なんとか気付けてよかった。
参考リンク:
Perlモジュール/LWP - Walrus, Digit.
HTTPリダイレクトとは 【HTTP redirect】 - 意味・解説 : IT用語辞典
PATCH: Peer certificate not verified for https Crypt::SSLeay