HatenaアンテナとFirefoxの連携

Hatenaアンテナに登録したサイトは、HatenaでRSS出力を行なってくれるのでそのままFirefoxライブブックマークに取り込むことができる。が、更新順には並んでくれるが既読済みページはわからないので何度も同じページを見ることになってしまう。

以下のPHPスクリプトを使用すると見たページを抜いたRSSを作成する。適当に作った*1ので汚いけど披露します。自由にお使いください。改良点等や感想をコメントしてもらえるとありがたいです。


<?php
/*
* HatenaAntena2LiveBookMark
*/

$user_id = "s_nobu"; //hatenaユーザーID
$host = "http://www.example.com"; //自分のホスト
$data_file = ".data"; //データファイル

touch($data_file); //データファイルがない場合は作成

//データファイルを配列に読込み
$own_lines = file($data_file);
foreach($own_lines as $own_line){
list($url, $changed) = split(",",$own_line);
$own_data[$url] = $changed;
}

//対象ページを呼び出した時はデータファイルに現在のtimestampを保存し移動
if($_GET[url]){
$url = urldecode($_GET["url"]);
$own_data[$url] = mktime();
$fp = fopen($data_file,"r+");
foreach($own_data as $key => $value){
if(ereg("^http",$key)){
fputs($fp,$key.",".$value."\n");
}
}
fclose($fp);
header("Location:".$url);
}

//RSSの再構築
require_once("XML/RSS.php");
$file = "http://a.hatena.ne.jp/$user_id/rss";
$rss =& new XML_RSS($file);
$rss->parse();
$info = $rss->getChannelInfo();
$info["link"] = htmlspecialchars($info["link"]);
$items = $rss->getItems();
foreach($items as $item){
if($own_data[$item["link"]] < strtotime(convertDateW3CtoRFC2822($item["dc:date"]))){ //データファイルの日付が古い場合
$item["link"] = $host.$_SERVER["SCRIPT_NAME"]."?url=".urlencode(htmlspecialchars($item["link"])); /* 適当 */
$item["title"] = htmlspecialchars($item["title"]);
$item["description"] = htmlspecialchars($item["description"]); /* &gt;のまま表示されてしまう問題あり */
$xml_seq .= '<rdf:li rdf:resource="'.$item["link"].'"/>';
$xml_body .= create_item_body($item);
}
}

//RSSリストの編集ページを付加
$edit_link = create_edit_link($user_id);
$xml_seq .= '<rdf:li rdf:resource="http://a.hatena.ne.jp/'.$user_id.'/edit"/>';
$xml_body .= mb_convert_encoding($edit_link,"UTF-8");

header("Content-Type:application/xml\n\n");
echo create_body($file,$info,$xml_seq,$xml_body); //RSS吐き出し

function create_item_body($item){
$return = '<item rdf:about="'.$item["link"].'">';
$return .= '<title>'.$item["title"].'</title>';
$return .= '<link>'.$item["link"].'</link>';
$return .= '<description>'.$item["description"].'</description>';
$return .= '<dc:date>'.$item["dc:date"].'</dc:date>';
$return .= '</item>';
return $return;
}

function create_body($file,$info,$xml_seq,$xml_body){
$return = '<? xml version="1.0"encoding="utf-8" ?>';
$return .= '<rdf:RDF xmlns="http://purl.org/rss/1.0/"';
$return .= 'xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"';
$return .= 'xmlns:dc="http://purl.org/dc/elements/1.1/"xml:lang="ja">';
$return .= '<channel rdf:about="'.$file.'">';
$return .= '<title>'.$info['title'].'</title>';
$return .= '<link>'.$info['link'].'</link>';
$return .= '<description>'.$info['description'].'</description>';
$return .= '<items>';
$return .= '<rdf:Seq>';
$return .= $xml_seq;
$return .= '</rdf:Seq>';
$return .= '</items>';
$return .= '</channel>';
$return .= $xml_body;
$return .= '</rdf:RDF>';
return $return;
}

function create_edit_link($id){
$edit_page = 'http://a.hatena.ne.jp/'.$id.'/edit';
$return = '<item rdf:about="'.$edit_page.'">';
$return .= '<title>hatena編集</title>';
$return .= '<link>'.$edit_page.'</link>';
$return .= '<description>'.$id.'の編集</description>';
$return .= '</item>';
return $return ;
}

function convertDateW3CtoRFC2822($dateW3C){
return date('r',strtotime(str_replace("+","+",str_replace("T","",ereg_replace("([+].*):","\\1",$dateW3C)))));
}
?>

*1:でもこれが限界?