Yahoo! Pipes サービス終了の発表から2か月が経過しました。その間、代替サービスを模索していましたが、やっぱり同等のサービスはないですね。9月末のサービス終了までまでカウントダウンも始まったので、最終手段のレンサバ+自作PHPに移行しました。
Yahoo! Pipesでやっていたこと
Yahoo! Pipesでやっていたことは下記のとおりです。
- 複数のRSSフィードを一つにまとめる
- 広告アイテムの削除
- 興味のないタイトルの削除
- 重複アイテムの削除
全文配信とかは複雑なことは一切やっていませんでした。全文配信は便利ですけど、iOSアプリに搭載されている「Readability」機能があれば事足ります。
「Readability」は、ReederやZinerに搭載されています。
複数の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円でした。
さすがに安すぎか…