このエントリの続き。

はてなブックマークの何かが壊れて直った | 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番君。