2005Apr11
サイトにRSSを埋め込んで表示させる方法
「nJOY」のトップページにこのブログの最新記事を埋め込みたいなぁと思い、色々とネットを検索して使えそうなものを何個か見つけました。
まず一番最初に試したのは「大黒屋本舗」さんが公開されている「jsRSS++」。
RSSの取得等にCGIを、表示にはJavaScriptを使うというもの。
で、結果は文字コード処理が上手く出来ていないようで文字化け。使用するのはあえなく断念。
その次に試したのが「レッツPHP!」さんが公開しているPHPで処理する「RSSブロガー」。
結論から言うと、サーバーがセーフモードで動いている為、うちでは動作しないという事が判明したので、使用を断念。
そして最後に行き着いたのが「MagpieRSS」、諦めかけていたけれど上手くサイトのトップページに表示された時は、本当に嬉しかったぁ。最初の2つが上手くいかなかったからなおさら。
設置に際しこちらの日本語解説ページが役に立ちました。
サーバーで PHP が使えないといけなかったり、処理できる RSS が RSS0.9 と RSS1.0 のみとか少し制限もありますが、それらを差し引いてもかなり使えます。
出力は短なるテキストなので、スクリプトをいじればカスタマイズも簡単ですしね。
■どんな風に動作しているかは nJOY のトップページを参照(ページ右側の「ブログ最新記事」欄)。
必要なもの
- magpierss-0.61.tar.gz(文字化けするので最新版はNG)
- 上記解説サイトから PHP のスクリプト
- jcode_1.35a.zip
設置方法
1) 解説サイトからPHPスクリプトをコピーして、適度に修正。拡張子を「.php」にして保存。【例:rss.php】
<?php修正が必要なのは青字になっている部分(「RSSのURL」と「文字コード変換」)。
require_once 'rss_fetch.inc';
require_once 'code_table.ucs2jis';
require_once 'jcode.php';
$url = 'https://i-njoy.net/blog/?mode=rss';
$rss = fetch_rss($url);
$title = $rss->channel['title'];
//JcodeConvert($str, $from, $to)
//0:PASS(無変換)1:EUC-JP 2:Shift_JIS 3:ISO-2022-JP(JIS) 4:UTF-8
$title = JcodeConvert($title, 4, 2);
foreach ($rss->items as $item ) {
$title = $item[title];
$title = JcodeConvert($title, 4, 2);
$url = $item[link];
echo '<li><a href="'.$url.'">'.$title.'</a></li>';
}
?>
文字コードについてはうちの場合、読み込む RSS が UTF-8 でそれを Shift-JIS に変換したいので「4, 2」。
どの文字コードがどの数字かはコメント行の赤字部分を参照。
2) MagpieRSS を解凍(「Lhaplas」を使用。tar.gz を解凍できる物なら何でも可。)
3) jcode_1.35a.zip を解凍
4) 解凍したファイルの中から以下のファイルと先ほどのスクリプト(rss.php)をサーバーにアップロード。
【ディレクトリ構成例】
public_html / index.html (トップページ)「cache」ディレクトリのパーミッションを 707 または 777 に変更する。
│
└ magpie / rss.php
│ jcode.php
│ code_table.ucs2jis
│ rss_cache.inc
│ rss_fetch.inc
│ rss_parse.inc
│ rss_utils.inc
│
├ extlib / Snoopy.class.inc
│
└ cache (このディレクトリは自分で作る)
5) rss.php に直接アクセスして動作確認。
上記のスクリプトが上手く動作していればリスト化された最新記事が表示されるはず。
6) RSS を埋め込みたいページに SSI で以下の記述を追加
<ul><!--#include file="rss.phpのアドレス" --></ul>
(全角の"<"と">"は本来は半角文字。)
※ SSI が使えない(例えばブログ内に設置したい)場合は Iframe を使えば OK。
(その場合は PHP スクリプトを少し書き変える必要あり。)
もしくはブログが PHP で動いてるのなら、直接記述または include するという手も。
関連記事:
2005/04/18「RSS を出力する掲示板やスクリプト等へのリンク集」2005/04/21「MagpieRSS を応用すると色々出来る」
※この記事は修正&加筆して「ぶろぐん・サイト作成ヒント集」にも追加しておきました。
関連記事
| 06:02 PM | comments (27) | Tweet
| サイト作成&運営::覚え書き |
コメント
参考になりました。
また、きます。
| coolweb | URL | 2007/10/12 05:17 PM | MptDUJ8s |
「MagpieRSS」日本語解説ページのPHPのソースをはっつけても読み込めず、こちらのサイトのソースを利用したら読み込めました^^;
大変詳しく載せてくださってありがとうございました!心から感謝いたします><
| frog | URL | 2009/04/16 05:20 PM | 5u4BWh5k |
この記事がお役に立って良かったです。
僕もはじめはかなり苦労した覚えがあります。
巷にある解説は PHP の知識がある事を前提に書かれているものが多かったので。
| CJ | URL | 2009/04/16 07:59 PM | xnOwozF. |
数々のサイトを渡り歩き、やっとこちらのソースで
RSSを表示させることに成功しました!ありがとうございます。
これをもとに複数のサイトの記事を更新時間順に
ソートさせたいのですが、色々試して見ても
表示されなくて参っています。
ぜひアドバイスいただければ幸いです
| siro | URL | 2009/08/01 11:18 PM | tsZ6JrXM |
あまりスマートなやり方ではありませんが、こんな方法ではいかがでしょう。
<?php
require_once 'rss_fetch.inc';
require_once 'code_table.ucs2jis';
require_once 'jcode.php';
$feed[] = 'http://i-njoy.net/blog/rss.xml';
$feed[] = 'http://i-njoy.net/blognplus/rss.xml';
$urls = count($feed);
for ($i = 0; $i < $urls; $i++) {
$rss = fetch_rss($feed[$i]);
//JcodeConvert($str, $from, $to)
//0:PASS(無変換)1:EUC-JP 2:Shift_JIS 3:ISO-2022-JP(JIS) 4:UTF-8
foreach ($rss -> items as $item ) {
$entry[] = array(
"utime" => strtotime($item[pubdate]),
"title" => JcodeConvert($item[title], 4, 2),
"url" => $item[link],
);
}
}
rsort($entry);
$count = count($entry);
for ($i = 0; $i < $count; $i++) {
echo '<li><a href="'.$entry[$i][url].'">'.$entry[$i][title].'</a></li>';
}
?>
RSS2.0 形式で動作確認。
読み込む RSS の文字コードがバラバラだと文字化けしますので、その場合はスクリプトを多少工夫する必要があります。
RSS を追加する場合は
$feed[] = "";
を書き足していくだけです。
| CJ | URL | 2009/08/03 10:32 PM | pAWXWe0c |
注意書きをきちんと読まずに、うっかりmagpierssの最新版をダウンロードしてしまって見事はまりました。
0.61をダウンロードしなおして上手く行きました。
ありがとうございます。非常に役立ちました。
| 地元密着なび・シンタニ | URL | 2010/06/21 11:33 AM | Cbbsqah. |
最新版の MagpieRSS でも、改造する事で日本語が文字化けせずに使えるらしいです。
一度きちんと調べて、新しい記事でも書きましょうかね。
| CJ | URL | 2010/06/21 09:48 PM | pAWXWe0c |
こんにちは。
今日たまたまMagpieRSSの存在を知り、あちこちの記事を参考にためしてみたらいとも簡単に表示されたのでとっても驚いています。
件数制御や複数読み込みはすでにコメント欄で書かれていたので、あとでやってみますが、キーワード制御がうまくいきません。
ほかのサイトを参考に2,3試してみたんですが、作動してないようです・・・
もしお分かりでしたらアドバイスいただけるとうれしいです。
サイトの記事の内容も非常にわかりやすく、コメントにも丁寧に回答されているので、とっても感動しました。
本当に役に立つ記事をありがとうございます。
| anika | URL | 2010/08/08 03:07 AM | w4xDDWP6 |
“キーワード制御”とは具体的に何をやりたいのでしょうか?
この記事では触れていないので、何の事かちょっと分かりません。
参考にしたサイトというのを書いてくださっても結構です。
| CJ | URL | 2010/08/08 10:23 AM | JBEW/VXA |
早速のお返事ありがとうございます。
すみません、言葉の使い方が不適切で。。。
キーワードを指定してRSSを表示させたいということです。
たとえばグーグルのニュースからサトイモに関する記事のみピックアップという具合です。
よろしくお願いします。
| anika | URL | 2010/08/08 12:47 PM | w4xDDWP6 |
取得した RSS から特定キーワードの入った記事を PHP でピックアップするよりも、特定キーワードで絞った RSS を MagpieRSS に登録した方が手っ取り早いです。
参考:Googleニュース用RSSジェネレータ
http://g.1o4.jp/news-rss.html
| CJ | URL | 2010/08/08 01:34 PM | JBEW/VXA |
早速のアドバイスありがとうございます!
実は、使いたいのはグーグルニュースではなく一般のブログのRSSなどなので、例にぴったりの回答が出てびっくりしました。
なるほど、逆にいうとMagpieRSSの中でキーワードを指定するのはちょっと面倒ということですね。
検索エンジンのAPIなどでキーワードを指定したRSS取得ができそうな雰囲気の記事がありますので今回のアドバイスと組み合わせて一度試してみます!
お忙しいところありがとうございました!
| anika | URL | 2010/08/08 08:03 PM | w4xDDWP6 |
MagpieRSS 内でキーワード指定して記事を絞るという事は可能だと思います。
そう大した手間がかかるものではありませんが、あまり実用的ではないかと。
例えば10個のブログの RSS を集めて、その中から「A」というキーワードの入った記事のみを表示する仕組みを作ったとして、はたしてその「A」に関する記事がいくつあるかという事です。
処理する RSS を増やせばヒットする記事が増える可能性がありますが、負荷もその分高まりますし。
そういう用途なら、僕は Yahoo! デベロッパーネットワークのブログ検索 API を使いますね。
http://developer.yahoo.co.jp/webapi/search/blogsearch/v1/blogsearch.html
| CJ | URL | 2010/08/08 09:10 PM | JBEW/VXA |
ありがとうございます!
ちょうど今グーグルで挫折してヤフーのブログ検索APIのリクエストURL組み立てはできたところです。
あとはレスポンスフィールドを組み立てればできそうなので、明日やってみようと思います。
考え方をいろいろ教えて下さりありがとうございました。
またお世話になるかと思いますのでそのときはよろしくお願いします。
| anika | URL | 2010/08/08 09:29 PM | w4xDDWP6 |
はじめまして。
こちらのサイトを参考にさせて頂き、無事に表示までいくことができました。
1つ質問があるのですが、今回「jcode」がダウンロードできなかったので、「mb_convert_encoding」を使用して設置しました。
そして、複数サイト表示が」できるよう、こちらのコメント欄にあるソースを使用させて頂きました。
「jcode」が使えないので、少しソースをいじったのですがどうもうまく表示されません。
以下ソース。
<?php
require_once 'rss_fetch.inc';
$feed[] = 'http://i-njoy.net/blog/rss.xml';
$feed[] = 'http://i-njoy.net/blognplus/rss.xml';
$urls = count($feed);
for ($i = 0; $i < $urls; $i++) {
$rss = fetch_rss($feed[$i]);
foreach ($rss -> items as $item ) {
$entry[] = array(
"utime" => strtotime($item[pubdate]),
"title" => mb_convert_encoding($title, "UTF-8", "auto"),
"url" => $item[link],
);
}
}
rsort($entry);
$count = count($entry);
for ($i = 0; $i < $count; $i++) {
echo '<li><a href="'.$entry[$i][url].'">'.$entry[$i][title].'</a></li>';
}
?>
どのように変更したら上手くいくのでしょうか?
アドバイスを頂けると幸いです。
よえろしくお願いします。
| WHT | URL | 2010/08/28 09:57 PM | saO43Ouc |
"title" => mb_convert_encoding($title, "UTF-8", "auto"),
この行が間違っています。
正しくは以下の通りです。
"title" => mb_convert_encoding($item["title"], "UTF-8", "auto"),
未定義の $title という変数が使われているため、記事のタイトルが取得できていませんでした。
$item["title"] に修正する事で正常に動きます。
| CJ | URL | 2010/08/28 11:08 PM | JBEW/VXA |
アドバイスありがとうございます。
正常に作動するようになりました。
PHPは難しくて全然分からないのですけど、おかげ様でようやく望んでいたものに近づいてきました!
あと、「ブログタイトル」「日付」等取得できるよう頑張ってみます。
本当にありがとうございました。
| WHT | URL | 2010/08/29 08:08 AM | saO43Ouc |
たびたびご質問申し訳ありません。
色々デザインを変更することはできたのですが、どうも日付とサイト名の取得がうまくいきません。
取得した複数のRSS記事タイトルの横に、「日付」「サイト名」を表示したいのですが、「日付」「サイト名」とも、なぜか1つのみが、すべての記事アイテムの横に表示されてしまいます。
例)
8月29日 Aサイト記事1 Aサイト
8月28日 Bサイト記事1 Bサイト
8月27日 Bサイト記事2 Bサイト
上のように表示したいのですが、
8月27日 Aサイト記事1 Bサイト
8月27日 Bサイト記事1 Bサイト
8月27日 Bサイト記事2 Bサイト
このようになってしまいます。
また記事の並びも、新しい順でなく不規則?な並びになってしまいます。
基本的には先日ご質問させて頂いたソースを使用しています。
なにか解決方法があれば、ご教授お願いします。
| WHT | URL | 2010/08/29 05:47 PM | saO43Ouc |
こんな感じでしょうか?
<?php
require_once 'rss_fetch.inc';
$feed[] = 'http://i-njoy.net/blog/rss.xml';
$feed[] = 'http://i-njoy.net/blognplus/rss.xml';
$urls = count($feed);
for ($i = 0; $i < $urls; $i++) {
$rss = fetch_rss($feed[$i]);
foreach ($rss -> items as $item ) {
$pdate = ($item["pubdate"]) ? $item["pubdate"] : $item["dc"]["date"];
$entry[] = array(
"utime" => strtotime($pdate),
"title" => mb_convert_encoding($item["title"], "UTF-8", "auto"),
"url" => $item["link"],
"site" => $rss -> channel['title'],
);
}
}
rsort($entry);
$count = count($entry);
for ($i = 0; $i < $count; $i++) {
echo '<li>'.date("n年d日", $entry[$i]["utime"]).' <a href="'.$entry[$i]["url"].'">'.$entry[$i]["title"].'</a> '.$entry[$i]["site"].'</li>';
}
?>
記事の並び順は新しい順に並ぶはずです。
| CJ | URL | 2010/08/29 09:58 PM | JBEW/VXA |
早々のご返信ありがとうございます。
完璧です。思っていた通りのデザインができました。
本当にありがとうございました!
| WHT | URL | 2010/08/29 10:48 PM | saO43Ouc |
度重なるご質問申し訳ありません。
アドバイスを参考に無事に使用できているのですが、フィード数が多くなり、1ページに表示するには苦しくなってしまいます。
そこで1ページに表示するフィード数を10件に制限し、「次のページ」のようなリンクで、次の10件を表示するようにしたいのですが、調べてもなかなか見つかりません。
overflow等はあまり使いたくないのですが、PHPで可能でしょうか?
お時間がある時でよいのでアドバイスをお願いします。
| WHT | URL | 2010/09/01 11:33 PM | saO43Ouc |
そのような処理はページング(paging)と言います。
「PHP ページング」で検索すれば参考になるサイトが見つかりますよ。
| CJ | URL | 2010/09/02 10:40 PM | JBEW/VXA |
はじめまして。
こちらを参考に、ようやく以下のようなソースで表示はされたのですが、
表示されたものに、スタイルシートを適用しようとして悩んでいます。
php自体をまったく理解していないので、
どのようにCSSを適用したらよいのかがわかりません。
適用したいのは、1行ごとにgifによる点線を挟んで、全体に余白を持たせたいと思っています。
お答えいただけますでしょうか?
よろしくお願いいたします。
<?php
define('MAGPIE_CACHE_AGE','900');
define('MAGPIE_CACHE_DIR', './cache');
require_once 'rss_fetch.inc';
require_once 'code_table.ucs2jis';
require_once 'jcode.php';
$count = 7;
$url = 'http://blog.jcan.jp/cocola/index.rdf';
$rss = fetch_rss($url);
array_splice($rss->items, $count);
$title = $rss->channel['title'];
$title = mb_convert_encoding($title, "UTF-8", "auto");
$link = $rss->channel['link'];
print "<p><a href=\"${link}\">$title</a></p>\n";
print "<dl>\n";
foreach ($rss->items as $item ) {
$title = $item['title'];
$title = mb_convert_encoding($title, "UTF-8", "auto");
$url = $item['link'];
$itemday = date('y/m/d',strtotime(substr($item['dc']['date'],0,10)));
$youbi = array(0 => '(日)', 1 => '(月)', 2 => '(火)', 3 => '(水)', 4 => '(木)', 5 => '(金)', 6 => '(土)');
$mday = date('w',strtotime(substr($item['dc']['date'],0,10)));
$itemtime = date('G:i',strtotime(substr($item['dc']['date'],11,8)));
print "<div class=\"part\"><dt>${itemday} <a href=\"$url\">$title</a></dt></div>\n";
}
print "</dl>\n"
?>
| zuzushiro | URL | 2010/10/20 08:47 PM | 00LQDm7Y |
> どのようにCSSを適用したらよいのかがわかりません。
PHP スクリプトで出力されるソースはただの HTML なので、普通の HTML ファイル同様 CSS を適用してやれば OK です。
div 要素に part という class を設定しているようなので、そのクラスに対して適切なスタイルを指定してみては?
PS. zuzushiro さんの PHP スクリプトでは mb_convert_encoding() が使われているので、以下の2行は不要のはずです。
require_once 'code_table.ucs2jis';
require_once 'jcode.php';
| CJ | URL | 2010/10/20 10:23 PM | JBEW/VXA |
ご回答ありがとうございました。
もう一回、質問させてください。
先の内容のまま、date という class に
print "<div class=\"date\"><dt>${itemday} <a href=\"$url\">$title</a></dt></div>\n";
このようにアンダーラインを表示させようとしているのですが、
アンダーラインが表示されません。
質問の内容が、RSSからずれてしまって申し訳ありませんが、
ご回答いただけますでしょうか?
.date {
padding:3px 2px 2px 3px;
text-decoration: none;
background-image: url("image/pinkdot1.gif");
line-height: 28px;
margin: 0px;
| zuzushiro | URL | 2010/10/21 01:31 PM | 00LQDm7Y |
アンダーライン用画像が表示されないという事ですが、まずは問題の切り分けをしましょう。
1. CSS がきちんと適用されているか?
例えばスタイルシートに次のような記述を加えて背景色が変わりますか?
.date { background-color:red; }
変わらなければスタイルシートが適用されていません。HTML の記述を見直しましょう。
2. 画像の URL 指定先は間違っていませんか?
CSS から見て image/pinkdot1.gif の相対パスが間違っていれば、アンダーラインは表示されないので、正しいパスを指定しましょう。
| CJ | URL | 2010/10/22 09:41 PM | JBEW/VXA |
お返事遅くなりましてすみませんでした。
アンダーラインの件ですが、
CSSの適用の仕方が間違っていたようで、
現在は表示することができております。
本題からずれた質問に、丁寧にお答えいただき
本当にありがとうございました。
お礼の返事が遅れたこと、
重ねてお詫び申し上げます。
| suzushiro | URL | 2010/11/01 03:08 PM | 00LQDm7Y |