自分のはてなブックマーク一覧を取得するスクリプトが上手く動いていなかったのを修正した

このエントリの続き。

はてなブックマークの何かが壊れて直った | mutter

結論から言うと、PHPプログラムからRSS(http://b.hatena.ne.jp/nobodyplace/rss)へのアクセスが遮断されているっぽい。20分に1回GETリクエストを投げているだけなのだけど、それが嫌がられたんだろうか。それともサーバの不調?よくわからないがSimpleXml_load_fileだけでなくfile_get_contentsでも取得出来ない(falseが返る。エラーをよく見ると503が返されてる)ので、XMLパース出来ないとかいう問題ではないみたい。



修正方法

はてなブックマークAPIのatom/feedにGETリクエストを出して文字列を取得、XMLとして読み込んで処理するようにした。

プログラム内でのはてなブックマークAPI関連の処理はすべて、「PEAR::Services_Hatena_Bookmark」を経由して行われているが、このクラスには「ブックマーク一覧を取得」というメソッドがない。ある方が便利なので、追加する。

具体的には「function Services_Hatena_Bookmark()」に「feedurl」としてatom/feedを追加。


function Services_Hatena_Bookmark()    {
$this->http = new HTTP_Request();
$this->addurl   = 'http://' . $this->bookmark_url . '/atom/post';
$this->editurl  = 'http://' . $this->bookmark_url . '/atom/edit';
$this->feedurl  = 'http://' . $this->bookmark_url . '/atom/feed';
}


さらに、メソッド「get_bookmarks」を追加する。これは文字列を返す。


 function get_bookmarks()
{
$this->setHeader(HTTP_REQUEST_METHOD_GET, $this->feedurl);
$res = $this->http->sendRequest();
$result = $this->http->getResponseBody();
if ($result) {
return $result;
}
else {
return PEAR::raiseError('missing the result.');
}
}


これならきちんと取得出来るので、XMLパースして適当に要素を取り出す。必要なデータは十分取得出来る。

以上で、明日の朝からまた、まとめ記事がアップされるようになるはず。



システム構造に関する簡単なメモ

  1. 20分に一度バッチ処理でブックマーク済みエントリを取得。
  2. 取得したエントリのエントリIDが登録されていなければDBに登録。
  3. 毎朝6時にDB内で前日ブックマークされたページを取得し、自分のサイトを除いてリスト化
  4. まとめエントリー生成
  5. ブログに投稿

構造を勘違いしてて、3番目でこけてるとずっと思ってたんだけど、実は1だったというオチ。
3番のバッチ君は濡れ衣を着せられながらも、「だってDBに昨日のブックマークないんだもん……」と言ってめそめそ泣いていたのだった。すまん、3番君。