TT-RSS+はてなアンテナ(guid対応版)

まさかこのネタで、ここまで続くことになるとは・・・(笑)
今回で終わりなはず。てか終わらせたい!

昨日一昨日とPHPで作っていた、
非公開のはてなアンテナのRSSを垂れ流すスクリプト。

問題なくTT-RSSに登録出来て、
取得も普通に出来てそうだったんだけど・・・
ふと気付くと、はてなのメールは届くのに
RSSの方では未読のフィードが1件も出てこなくて、
中を開いてみると読んでないのに既読になってる現象が・・・

ただ公式のデータをそのまま垂れ流してるだけで、
データの中身は全く弄ってないんだけど何故・・・?

と調べてみると、そもそも公式のデータに問題があった。
いや、TT-RSSの処理が問題なのかな・・・?

その記事が既に同じ記事で重複した物かどうかを判断するのに、
<guid>要素を使っているみたいなんだけど、
もしその要素が無い場合は<link>要素で判断してるっぽい。
なので同じリンクが何度も更新されるアンテナだと
2度目以降は勝手に既読に・・・

まぁRSSの仕様上、<guid>要素はオプションだから、
はてなのデータが悪いワケじゃないのかな。
TT-RSSの方が、ちゃんと時間の要素も見てくれれば良いのに。

多分、TT-RSSの設定の中にある「重複記事の許可」を
有効にしてやれば直るような気がするけど、
それだけの為に有効にするのも何だかなーっと。

で、悩んだ挙げ句、ダメ元で取得したデータに
<guid>要素を突っ込む処理を実装してみた。
思いの外、簡単にできて「PHPすげー」てなった!

// XMLをロード
$xml = @simplexml_load_string($con);
if ($xml === FALSE) {
	// ロード失敗
	http_response_code(500);
	echo libxml_get_errors();
	exit;
}

// 使用している名前空間を取得
$ns = $xml->getNamespaces(TRUE);
// 全itemノードの下にguidノードを追加
foreach ($xml->item as $item) {
	// dcの空間を取得
	$dc = $item->children($ns['dc']);
	// guidを追加
	$guid = $item->addChild('guid', $dc->date.'-'.$item->link);
	// guidにisPermaLink属性を追加
	$guid->addAttribute('isPermaLink', 'false');
}
// XMLを出力
echo $xml->asXML();

これだけ。
若干インデントがおかしいけど、
別に人が読むわけじゃないから気にしない。

昨日のコードだと、

// 結果を出力
echo $con;

の部分を置き換える感じで。

一昨日のコードだと、

// 応答をそのまま出力
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);

の部分を削って、

curl_exec($ch);

$con = curl_exec($ch);

変数で受け取るように変更して、
その下に↑のXMLの処理を挿入する形で。

これでちゃんとguid要素が入って未読になった!
いちいちXMLを処理するから負荷は掛かるけど仕方ない・・・
もう問題もないはず・・・!

いやーPHPってXMLも簡単に処理出来るんだなあー
お手軽すぎて怖い。

じゃ、ゲームして寝るー
バイニー☆

test?

コメントを残す