ホーム > 日記 > conveyor

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リーダで。

カテゴリー: 日記 タグ:
  1. コメントはまだありません。
  1. トラックバックはまだありません。