conveyor
毎月変わる静的ページをチェックするためにconveyorでなんとかしようとsubscription作ってみました。
しっかりとしたドキュメントがみつからなかったので、ソース読みつつ。
・SubscriptionBaseを継承する
・タグのパースはSimpleTag(HttpPaserの名前につられるな)
・PEARでいうところのHTTP_Request相当はHttp(HTTP_ClientはBrowser?)
<?php
Rhaco::import("SubscriptionBase");
Rhaco::import("io.Cache");
Rhaco::import("network.http.Http");
Rhaco::import("tag.data.SimpleTag");
/**
* SampleIn
* @author cockok
*/
class SampleIn extends SubscriptionBase
{
function execute($variable){
$url = 'http://hoge.jp/';
$rss20 = new Rss20();
// キャッシュはなんとなく3時間
if (Cache::isExpiry($url, 3600 * 3)) {
if (!$html = Http::get($url)) {
return null;
}
Cache::set($url, $html);
} else {
$html = Cache::get($url);
}
$html = StringUtil::encoding($html);
$tag = new SimpleTag();
$tag->set($html, 'html');
$title = $tag->getIn('title');
if (count($title)) {
$feed_title = $title[0]->getValue();
} else {
$feed_title = 'title';
}
$feed_description = 'description';
$feed_url = 'http://hoge.jp/';
$feed_languege = 'ja';
$rss20->setChannel($feed_title, $feed_description, $feed_url, $feed_languege);
foreach ($tag->getIn('div') as $div) {
// いろいろ解析して登録
$rss20->setItem($title, $description, $url);
}
return $this->merge($variable, $rss20);
}
function description()
{
return "hoge.jpを取得する";
}
function config()
{
return null;
}
}
?>
キャッシュ、Last-Modifiedとれるならそれ比較しようかと思ったけど、今回のターゲットが吐いてなかった。
吐いてたとしても、どう保存しようか悩み所ですが。
Content-lengthで比較しようとしたら、Cache保存する際に文字コード変換されるらしく利用できず。
実際、HTTP通信よりもパースにコストがかかるので、パース後をserializeしてキャッシュしたほうがよさげ。
rhacoCacheはRSSフィード保存用な雰囲気だったのでどうしたもんか。
htmlspecialchars()や微妙なstrip_tags()を利用してませんので、XSS対策がされているRSSリーダで。
カテゴリー: 日記