Skip to content

Instantly share code, notes, and snippets.

@cherenkov
Created May 12, 2012 02:32
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cherenkov/2663761 to your computer and use it in GitHub Desktop.
Save cherenkov/2663761 to your computer and use it in GitHub Desktop.
pipes / simplexmlで複数サイトのRSSを読みこみ、新着順で表示させる方法.. - 人力検索はてな http://q.hatena.ne.jp/1336407726
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type='text/javascript'>
$(function() {
var feed = [
'http://rss.itmedia.co.jp/rss/1.0/news_security.xml',
'http://michaelsan.livedoor.biz/index.rdf',
'http://blog.livedoor.jp/domesaka/index.rdf',
'http://news4vip.livedoor.biz/index.rdf'
].map(function(e){return '"'+e+'"'}).join();
// http://pipes.yahoo.com/pipes/pipe.info?_id=6024c63c810e0a4ef1efe9eea8505b66
// クライアント側からフィードのリストをpipesに投げて、
// pipes側でフィードをまとめて、エントリータイトルにチャンネルタイトルを付けて、最新順にソートしてJSON出力。
var url = 'http://pipes.yahoo.com/pipes/pipe.run?_id=6024c63c810e0a4ef1efe9eea8505b66&_render=json&feed='+encodeURIComponent(feed);
var antena = document.getElementById('antena');
$.getJSON(url, function(e) {
var df = document.createDocumentFragment();
for (var i=0,n=e.count; i<n; i++) {
var entry = e.value.items[i];
var title = entry.item.title;
var link = entry.item.link;
var date = entry.item['dc:date'].content;
// 2012/05/11 13:51 のフォーマットにする
date = date.replace(/(\d+-\d+-\d+)T(\d+:\d+).+/,function(a,b,c) {
return b.replace(/-/g, '/') + ' ' + c;
});
var a = document.createElement('a');
a.href = link;
a.textContent = title;
var div = document.createElement('div');
div.appendChild(document.createTextNode(date + ' '));
div.appendChild(a);
df.appendChild(div);
}
antena.appendChild(df);
});
});
</script>
</head>
<body>
<div id="antena"></div>
</body>
</html>
@saruz999
Copy link

素晴らしいソース公開ありがとうございます!
一点だけお聞きしたいのですが、件数の設定を行う事は可能でしょうか?
例えば新しい日付から5件のみ表示など。
もし可能であれば、ご教示いただければ幸いです。
よろしくお願いします。

@cherenkov
Copy link
Author

新しい日付から5件

は各チャンネルごとに5件ではなく、全体をまとめた上で5件ですかね?
以下のようにしてみるとか。

for (var i=0,n=e.count; i<n; i++) {

e.count = 5; //表示件数
e.value.items = e.value.items.slice(0, e.count);
for (var i=0,n=e.count; i<n; i++) {

@saruz999
Copy link

cherenkovさん

ま、まさにこれです!
なんとお礼を申し上げてよいやら・・・。

実はもう一点だけ、お聞きしたい事がございまして・・・

タイトルは下記のように表示されると思いますが、
2012/02/28 12:01 記事タイトル

この日付を「2012年02月28日」もしくは「28 Feb 2012」のような仕様にする事は可能なのでしょうか?
色々試させていただいたのですが、なかなかうまくいかず、
そもそも「dc:date」自体そのような形式に変更する事が可能なのかすらわからない状態で。。。

ずうずうしいお願いで大変恐縮ですが、
お時間のある時で結構ですのでご教授いただければ幸いです。

よろしくお願いいたします。

@cherenkov
Copy link
Author

お礼ははてなポイントで受け付けていますよ。なんつって。

一定の日付フォーマットは、以下のようにnew Dateしてみるとそのまま扱えるか簡単に確認できます。
new Date("2012-06-22T18:30:43+09:00");

date = date.replace(/(\d+-\d+-\d+)T(\d+:\d+).+/,function(a,b,c) {
  return b.replace(/-/g, '/') + ' ' + c;
});

var d = new Date(date);
var my_year = d.getFullYear();
var my_month = d.getMonth()+1 < 10 ? '0' + (d.getMonth()+1) : (d.getMonth()+1);
//var my_month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][d.getMonth()];
var my_date = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
date = my_year + '年' + my_month + '月' + my_date + '日';
//2012年06月22日

こんな感じ。
あとはここをにらめっこすればわかるかと。
Date - MDN
https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Date

@saruz999
Copy link

cherenkovさん

お返事おくれて申し訳ありません。
完璧です・・・。

はてなポイントでお礼したいのですが、どうすれば良いでしょうか?
すみません、いまいち仕組みをわかっておらずで。。。

取り急ぎお礼まで。
ありがとうございました。

@saruz999
Copy link

cherenkovさん

理想のRSSリーダーに出会い本当に感謝感激です!

もう一点だけお聞きしたい事が・・・
タイトルの最後(2012年12月30日タイトル blog名)と「blog名」か追記されると思いますが、
これを表示しない方法はございますでしょうか?
何度も何度も本当に申し訳ございません。。。

はてなポイントはどのようにお渡しすれば良いでしょうか・・・。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment