一時的にはてなブックマークAPIが壊れてたっぽい気がする – NOBODY:PLACE – MUTTER
(続き) 一時的にはてなブックマークAPIが壊れてたっぽい気がする – NOBODY:PLACE – MUTTER
やっぱりなんだかおかしいので、はてなアイディア(障害報告)に登録してみました。
はてなアイデア – はてなブックマークAtomAPIのFeedURIを利用してエントリを取得した際に、他ユーザのエントリを取得してしまうことがある(コメント欄で追記)
コメント欄で書いた追記を補足する形で書きますと、問題となっているプログラムでしていることは、「WSSE認証の後にFeedURIにリクエストを投げて自分のブックマークエントリを取得する」です。
動作プログラム(PHP)
以下、プログラムから抜粋したもの。$user = 'konaze';
$pass = password;
$atom = 'http://b.hatena.ne.jp/atom/feed';
$nonce = pack('H*', sha1(md5(time().rand().uniqid(rand(), true))));
$created = date('Y-m-d\TH:i:s\Z');
$digest = base64_encode(sha1($nonce . $created . $pass, true));
$wsse_header = sprintf('UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $user, $digest, base64_encode($nonce), $created);
$request = new HTTP_Request($atom);
$request->addHeader('X-WSSE', $wsse_header);
$request->addHeader('ContentType', 'application/x.atom+xml');
if (PEAR::isError($request->sendRequest())):
return false;
else:
return simplexml_load_string($request->_response->_body);
endif;
このときのレスポンスは、id:konazeのものであることが保証されていると思うのですが(そうですよね?)実際にはそうなっていないときがあります。このプログラムはcronによって1時間に1回動作しており、そのときのレスポンスをそのままログとして保存しているのですが、それを見ると直近48時間の結果は以下のようになっています。
リクエストレスポンス ログ一覧
- 7/7
- 11:00 → id:KOROPPY
- 12:00 → id:konaze
- 13:00 → id:konaze
- 14:00 → id:konaze
- 15:00 → id:konaze
- 16:00 → id:niwatori103
- 17:00 → id:konaze
- 18:00 → id:konaze
- 19:00 → id:konaze
- 20:00 → id:konaze
- 21:00 → id:konaze
- 22:00 → id:konaze
- 23:00 → id:konaze
- 7/8
- 00:00 → id:konaze
- 01:00 → id:konaze
- 02:00 → id:konaze
- 03:00 → id:konaze
- 04:00 → id:konaze
- 05:00 → id:konaze
- 06:00 → id:konaze
- 07:00 → id:konaze
- 08:00 → id:konaze
- 09:00 → id:konaze
- 10:00 → id:rice0001
- 11:00 → id:konaze
- 12:00 → id:konaze
- 13:00 → id:konaze
- 14:00 → id:konaze
- 15:00 → id:konaze
- 16:00 → id:konaze
- 17:00 → id:itoz
- 18:00 → id:konaze
- 19:00 → id:kaocom
- 20:00 → id:konaze
- 21:00 → id:konaze
- 22:00 → id:konaze
- 23:00 → id:konaze
- 7/9
- 00:00 → id:kaocom
- 01:00 → id:konaze
- 02:00 → id:konaze
- 03:00 → id:konaze
- 04:00 → id:konaze
- 05:00 → id:itoz
- 06:00 → id:konaze
- 07:00 → id:konaze
- 08:00 → id:konaze
- 09:00 → id:konaze
- 10:00 → id:poohya
太字で記載されている部分が僕(id:konaze)のものではないブックマークが取得されたものです。
これの何が問題なのか?
実際問題として、FeedURIが返す結果というのは、特定IDのRSSフィードと同じ内容なので、APIを使って取得することを止めて、代わりにhttp://b.hatena.ne.jp/konaze/rssを読み込んでパースするようにすれば、目的は確実に果たせます。実際、新はてなブックマークリリース直後、FeedURIのレスポンスにタグが含まれていなかった時期にはそうやって処理していました。ですから、個人的にはこれによって大きな支障が出ると言うほどではありません。利用しているのは僕だけですし。しかし…「IDとパスワードでもって認証しているにもかかわらず、その認証したIDと違うエントリが取得出来てしまう」ということをきちんと考えてみると、これは相当に気持ちが悪い。実際にそう言うケースがあったかはよくわかりませんが、もしリクエストがFeedURIではなくてPostURIだったら?もしかするとタイミング次第でPost出来てしまうのでは…単純にFeedURIだけに不具合があったのならそれで良いんですけれど。
発現条件は不明
発現条件についてはこちらのサーバーが過負荷なのか、はてなのサーバーが過負荷なのかよくわかりません。Cronで回している関係上、プログラムの実行条件は常に同じです。問題が発生した時間帯を繋いでみても、そんなに過負荷が発生する時間帯でもない気がします。だったらどうなんだと言われると困るんですが、例えばサーバーの1つのデータが上手く同期できてないとか…あ、適当なこと言ってますけど。
ともかく、正しい結果が返ってくることを期待し信頼してAPIを使っているわけで、不確かな結果が返ってくる、ましてや正しい結果が返ってくる場合もあるなんていう感じだと使いようがないわけでして…
なんとか直る、または最適化されることを祈っております。
…ここまでやっておいて自分のミスだったら笑えませんけどね。。
単純なプログラムなので紛れようがないと思うんですけどね。