
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円でした。
さすがに安すぎか…






