SBS のエントリーから Feed AutoDiscovery

記事単位の切り取りと SBS から取得するフィードに頼りっきりで、RSS の収集がおろそか。

気になる記事があったサイトなんだから、他にも興味深い事を書いているかもしれない。と言う訳で、SBS でクリップした記事から Feed AutoDiscovery で Feed の URL を取得してみる。取得したデータはメールで送信。これを自分の SBS の最新フィードか、日付で抽出したフィードを対象に定期的に行う。

記事 URL から他にブックマークされてる記事を芋づる式で(実際ははてなの entrylist とか bookmarklist で)取り出してもいいんだけど、とりあえず『自分の興味』を優先。絶対 URL にしてなかったり、AutoDiscovery への対応が適当だったりするけどとりあえずソースはっておしまい。朝日を拝んでから再挑戦。

この辺のおもちゃは PHP より Perl の方がライブラリとか充実してそう。勢いで PHP 使う癖はどうにかしないと…。AutoDiscovery の仕様とか Feed の MIME TYPE とか意識しないですみそう。でも、Feed AutoDiscovery は後でちゃんと調べとこう。どうも曖昧だ。


2006/03/07 追記
クラス化してサンプル置いてみた

<?php

require_once("HTTP/Request.php");

// Get Hatena-Bookmark's RDF
$ua = new HTTP_Request();
$ua->addHeader("User-Agent", "Feed Notifier/0.1 (http://blog.koshigoe.jp/)");
$ua->setURL("http://b.hatena.ne.jp/KoshigoeBushou/rss");
if (PEAR::isError($ua->sendRequest())) {
    exit;
}
if ($ua->getResponseCode() < 200 or $ua->getResponseCode() >= 300) {
    exit;
}

// parse Feed
$feed = simplexml_load_string($ua->getResponseBody());

// check Feed auto-discovery
$mailBody = "";
foreach ($feed->item as $item) {
    $title = (string) $item->title;
    $title = (preg_match("/EUC/", mb_detect_encoding($title))) ?
        $title : mb_convert_encoding($title, "euc", "auto");
    $url   = (string) $item->link;
    $ua->setURL($url);
    if (PEAR::isError($ua->sendRequest())) {
        exit;
    }
    if ($ua->getResponseCode() < 200 or $ua->getResponseCode() >= 300) {
        continue;
    }
    $html = (preg_match("/EUC/", mb_detect_encoding($ua->getResponseBody()))) ? 
        mb_convert_encoding($ua->getResponseBody(), "euc", "auto") : $ua->getResponseBody();
    $links = getLinks($html);
    if (count($links) > 0) {
        $mailBody .= <<<MAIL
- $title
-- $url

MAIL;
        foreach ($links as $link) {
            $mailBody .= <<<MAIL
--- $link

MAIL;
        }
    }
}

mb_send_mail("KoshigoeBushou@gmail.com", "Feed Notifier", $mailBody , "From: FeedNotifier@lab.koshigoe.jp");
echo $mailBody . "\n";

function getLinks($html) {
    $lines = explode("\n", str_replace("\r", "\n", $html));
    $links = array();
    foreach ($lines as $line) {
        if (strlen($line) > 0 and
            preg_match("/<link .*rel\=[\"\']*alternate[\"\']* /", $line) and
            preg_match("/.+href\=.+/", $line) and
            preg_match("/{application\/xml|application\/rss\+xml|application\/atom\+xml|application\/rdf+xml|text\/xml}/", $line)) {
            $links[] = preg_replace("/^.+href\=[\"\']*([^\"\']+)[\"\']*.+$/", "$1", $line);
        }
    }
    return $links;
}

?>
プロフィール

このブログ記事について

このページは、koshigoeが2006年3月 7日 01:13に書いたブログ記事です。

ひとつ前のブログ記事は「JIS 規格って高い?妥当?」です。

次のブログ記事は「OSX Security Update と PHP」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。