やっぱりはてなブックマークAtomAPIの挙動がおかしいのでアイディアに登録した

何度か書いている、はてなブックマークAtomAPI、FeedURIの挙動がおかしい件ですが。

一時的にはてなブックマーク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を使っているわけで、不確かな結果が返ってくる、ましてや正しい結果が返ってくる場合もあるなんていう感じだと使いようがないわけでして…
なんとか直る、または最適化されることを祈っております。



…ここまでやっておいて自分のミスだったら笑えませんけどね。。

単純なプログラムなので紛れようがないと思うんですけどね。