Yahoo! Pipes サービス終了で、レンサバ+自作PHPに移行しました。

Yahoo! Pipes サービス終了の発表から2か月が経過しました。その間、代替サービスを模索していましたが、やっぱり同等のサービスはないですね。9月末のサービス終了までまでカウントダウンも始まったので、最終手段のレンサバ+自作PHPに移行しました。

スポンサーリンク

Yahoo! Pipesでやっていたこと

Yahoo! Pipesでやっていたことは下記のとおりです。

  • 複数のRSSフィードを一つにまとめる
  • 広告アイテムの削除
  • 興味のないタイトルの削除
  • 重複アイテムの削除

全文配信とかは複雑なことは一切やっていませんでした。全文配信は便利ですけど、iOSアプリに搭載されている「Readability」機能があれば事足ります。

「Readability」は、ReederやZinerに搭載されています。

Reeder 2

600円
(2015.09.23時点)
posted with ポチレバ

複数のRSSフィードをまとめるサンプルコード

自作PHPとは言いましたが、先人の方がネット上にサンプルコードを公開していました。

そのサンプルコードに下記の変更を加えました。

  • 「重複アイテムの削除」機能を追加
  • 「セッション処理」機能の削除

セッション処理は、自分のRSSリーダーからしかアクセス(1時間おきくらい?)しないので、削除しました。頻繁にアクセルするような使い方を想定している場合は、削除しないでください。

<?php
$rsslist = array( //取得したいRSSフィードを指定します。
    'http://hogehoge.com/rss.xml'
);
 
$feedUrl = 'https://www.753ya.net/rss.php'; //RSSを再配信する(このファイルを置く)URLを指定します。
$feedTitle = 'まとめフィード';
$feedDescription = 'いろいろなニュースまとめ';
 
header('Content-Type:text/html; charset=UTF-8');
 
foreach($rsslist as $url) {
    $tmpData = file_get_contents($url);
    $tmpData = str_replace('dc:creator', 'Creator', $tmpData);
    $tmpData = str_replace('dc:date', 'Date', $tmpData);
    $tmpData = str_replace('pubDate', 'Date', $tmpData);
    $rssData[] = simplexml_load_string($tmpData);
}

foreach($rssData as $key => $value) {
    if($value['version'] == '2.0') {
        foreach($value->channel->item as $item) {
            $date = date_create($item->Date);
            $item->Date = date_format($date, 'Y-m-d\TH:i:sP');

            // [CDATA]対応
            $item->description = (string)$item->description;
        }
    }
}

// 重複アイテム削除
$i = count($rsslist);
$allrss = array();
for($n=0;$n<$i;$n++) {
    $rssarr[$n] = xml2arr($rssData[$n]);

    if(isset($rssarr[$n]['channel']['item'])) {
        $allrss = array_merge($allrss, $rssarr[$n]['channel']['item']);
    } else {
        $allrss = array_merge($allrss, $rssarr[$n]['item']);
    }
}

usort($allrss, 'cmp');
$i = count($allrss);
for($n=0;$n<$i;$n++) {
    if(empty($allrss[$n]['title'])) {
        $allrss[$n] = null;
    }
}
 
 
# オブジェクト→配列変換用関数(http://soft.fpso.jp/develop/php/entry_2764.html)
function xml2arr($xmlobj) {
    $arr = array();
    if (is_object($xmlobj)) {
        $xmlobj = get_object_vars($xmlobj);
    } else {
        $xmlobj = $xmlobj;
    }
 
    foreach ($xmlobj as $key => $val) {
        if (is_object($xmlobj[$key])) {
            $arr[$key] = xml2arr($val);
        } else if (is_array($val)) {
            foreach($val as $k => $v) {
                if (is_object($v) || is_array($v)) {
                    $arr[$key][$k] = xml2arr($v);
                } else {
                    $arr[$key][$k] = $v;
                }
            }
        } else {
            $arr[$key] = $val;
        }
    }
    return $arr;
}
 
function cmp($a, $b)
{
    return strcmp($b['Date'], $a['Date']);
}
 
foreach($allrss as $rss => $item) {
    // 広告削除
    if(preg_match('/Sponsor:/',$item['title'])) unset($allrss[$rss]);  // タイトルにSponsorを含む場合は除外
    if(preg_match('/\[Sponsor]/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/AD:/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/\[AD]/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/PR:/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/:PR/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/【PR】/',$item['title'])) unset($allrss[$rss]); 
    if(preg_match('/\[PR]/',$item['title'])) unset($allrss[$rss]); 

    // 不要なアイテム削除
    if(preg_match('/楽天/',$item['title'])) unset($allrss[$rss]);   // タイトルに楽天が含む場合は除外

}

$arr_tmp = $editrss = array();

foreach($allrss as $key => $value){
    if(!in_array($value['link'], $arr_tmp)){
        $arr_tmp[] = $value['link'];
        $editrss[] = $value;
    }
}
?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
    <title><?php echo $feedTitle; ?></title>
    <link><?php echo $feedUrl; ?></link>
    <description><?php echo $feedDescription; ?></description>
    <language>ja</language>
    <pubDate><?php echo date(DATE_RFC822); ?></pubDate>
    <lastBuildDate><?php echo date(DATE_RFC822); ?></lastBuildDate>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <?php foreach($editrss as $rss => $item): ?>
    <item>
        <title><?php echo $item['title']; ?></title>
        <link><?php echo $item['link']; ?></link>
        <description><?php echo $item['description']; ?></description>
        <pubDate><?php echo $item['Date']; ?></pubDate>
    </item>
    <?php endforeach; ?>
</channel>
</rss>

自作というと難しい印象がありますが、上記のコードの黄色部分を自分に合うように変更して、レンタルサーバーでも借りて、適当なディレクトリにアップロードするだけです。

負荷の掛かる処理でもないので最安サーバーで十分だと思います。

現在の最安サーバーは月額88円でした。

さすがに安すぎか…

スポンサーリンク
おすすめの記事