top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_1183

RSS:この2日は、RSSフィードの出力 で格闘している。とりあえず稼動できそうだが ・・・ 【RSS】

 2009-12-15
 あるサイト(ブログではない)で、RSS配信
 行うことになった。
 情報は、毎日更新される「最新情報」だ。
 さて、メンテナンスフリーで実現するには、どうするか?

 まず考えられるのは、既存の様々なサービスだ。
 My RSS.jpMy RSS.jp
  Webサービス、無償


 RSSフィード.ccRSSフィード.cc
  Webサービス、有償(上記企業版)


 RSS フィード 自動作成 - goo RSS作成RSS フィード 自動作成 - goo RSS作成
  Webサービス、サイト内のトピックスや
 更新情報などからRSSフィード
 (新着記事リスト)を作成する
 ことのできる無料サービス


 なんでもRSSなんでもRSS
  ※なんか、今は動いてないみたいだけど(?)


 Page2RSS - Create an RSS feed for any web pagePage2RSS - Create an RSS feed for any web page
 


 RSSフィード自動作成 ビットスパイシーRSSフィード自動作成 ビットスパイシー
  Webサービス、無償


 しかし、RSSフィードは、RSS1.0 または RSS2.0 などの形式
 に対応したテキストファイルを出力してやればいいわけで
 (結局、簡単では無かった・・・が)
 自プログラムで処理することに決めた。


  追記に ( かなり長文、ご容赦 )▼


 ところで、こちらは・・・
◇今日のGoogle(2009/12/15)
今日のGoogle(2009/12/15)
 エスペラント語の創始者
  LLザメンホフ 150回目の誕生日

FC2ブログランキング にほんブログ村 IT技術ブログ Webサイト構築へ ブログ王ランキング 人気ブログランキング 人気ホームページランキングへ


more

************************************************
◎ 通常サイトにおける、RSS生成>配信 を
 メンテナンスフリーで

************************************************


 たとえば、この「創るmetaboy」ブログ であれば、
 ・おしりに "?xml" とつければ
  > 創るmetaboy RSS 生成・表示される。
 ※これは、FC2ブログの標準の機能だ。

 通常のWebサイトの場合、別に考えねばならない。
 そこで、前記にあるような
 ・Webサービス や ツール
 を利用することが考えられる。


 しかし・・・
 どこも、いまひとつこちらでのハンドリングが
 容易ではない。(いろいろやりたいことがあるから)


 で、創る

 ■RSS 形式
  ・RSSフィードには、様々な形式があり、それぞれ
   メリット・デメリットがあるようだが
   (RSS1.0,atom,RSS2.0 ・・・)


  最近特に広まっている RSS2.0 形式に決める。
  (Yahooブログ RSS などもこれ)


  ※ネットには、様々な指南サイトがあり、重宝重宝。
 RSS 2.0 Specification 日本語訳RSS 2.0 Specification 日本語訳 私のような「純日本人」には
 有難し、最高の翻訳!


 RSS 2.0 NotesRSS 2.0 Notes これまた素晴らしい。
 ずべて理解するには
 時間を要しそうだけれど


 RSS -- サイト情報の要約と公開RSS -- サイト情報の要約と公開 こちらは、RSS1.0 に
 ついてだけれど、非常に参考になる
 ところが多かった


  ※ちなみに、このあたりも一応参照。
 RFC 2822 (rfc2822) - Internet Message FormatRFC 2822 (rfc2822) - Internet Message Format

 RDF Site Summary 1.0 Modules: ContentRDF Site Summary 1.0 Modules: Content


  □RSS2.0
   2.0 の方が、より「シンプル」だよね。
   1.0 とはまったく別物らしく、
   2.0 では、
    "<item>" は、"<channel>" の子供として
    書く ところに注意、と。


 


  □guid
   ※記事のユニークなID(など)を指定
    無くてもいいようだが・・・
(例)
<guid>20091215@metaboy.blog23.fc2.com</guid>
<guid isPermaLink="true">http://metaboy.blog23.fc2.com/blog-entry-1182.html</guid>

 ■ライブラリ
  ・随分前から知られているライブラリやオープンソース
   いろいろあるようで。


 RSSWriterRSSWriter 1.0用だよね


 FeedCreator.class.phpFeedCreator.class.php 1.0用だよね


 ・・・・で。


 これらの情報参考にさせていただき、次のようなクラスを
 用意する。
 ■実装
<?
define("XMLNS","http://purl.org/dc/elements/1.1/");
define("RSSVER","2.0");
define("THIS_GENERATOR","*****");
define("RSSCHARSET","euc-jp");
define("RSSLANG","ja-jp");
define("RSSIMAGE_W",88);
define("RSSIMAGE_H",31);

class RSSMake {
function RSSMake($url, $title, $description, $vals=array()) {
$timestamp = gmmktime(gmdate("H"), gmdate("i"), gmdate("s"), gmdate("n"), gmdate("j"), gmdate("Y"));
$pubDate = date("D, j M Y H:i:s ", $timestamp)." +0900";

$this->channels=array();
$this->channels['link']=$url;
$this->channels['title']=$title;
$this->channels['description']=$description;
$this->channels['language']=RSSLANG;
$this->channels['pubDate']=$pubDate;
$this->channels['generator']=THIS_GENERATOR;
foreach ($vals as $key => $value) {
if($key=='image'){
$this->image=array(
"uri" => $value, "title" => $title, "width" => RSSIMAGE_W,
"height" => RSSIMAGE_H);
}else{ $this->chaninfo[$key]=$value; }
}
$this->items=array();
}

function AddItem($url, $title, $pubDateitem, $valsitem=array()) {

$item=array("link" => $url,
"title" => $title, "pubDate" => $pubDateitem);
foreach ($valsitem as $key => $value) {
$item[$key]=$value;
}
$this->items[]=$item;
}

function OutRSS($work="") {
if($work!='out'){
header("Content-type: text/xml; charset=euc-jp");
}
$tempstr = "<?xml version=\"1.0\" encoding=\"".RSSCHARSET."\"?>";
$tempstr .= "<rss version=\"2.0\" xmlns:dc=\"".XMLNS."\" xml:lang=\"ja\">\n";

$tempstr .= "<channel>\n";
$tempstr .= "<title>".htmlspecialchars($this->channels['title'])."</title>\n";
$tempstr .= "<link>".htmlspecialchars($this->channels['link'])."</link>\n";
$tempstr .= "<description>".htmlspecialchars($this->channels['description'])."</description>\n";
$tempstr .= "<language>".$this->channels['language']."</language>\n";
$tempstr .= "<lastBuildDate>".$this->channels['pubDate']."</lastBuildDate>\n";

if(
(isset($this->items))&&(sizeof($this->items)>0)
){
foreach ($this->items as $values) {
$tempstr .= "$nitem>\n";
foreach ($values as $key => $value) {
$tempstr .= "$n".$key.">".htmlspecialchars($value)."$n/".$key.">\n";
}
$tempstr .= "$n/item>\n";
}
}

$tempstr .= "</channel>\n";
$tempstr .= "</rss>\n";
if($work=='out'){ return $tempstr;
}else{ print $tempstr; }
}
}
?>
 ポイントとして
  ・クラス内の関数
   ・最初の生成準備
   ・item項目の追加 部分
   ・最終処理(出力 あるいは 取得)
   のシンプルな3つにしたこと
  ・(仕事柄)様々な条件があるので、
   最終処理は、そのまま出力するものと
   値を得て、呼び出し元で処理する2通り
   で、できること
  ・必須以外の項目を簡単に
   追加できるよう、 $vals などの配列利用して
   呼び出し元で利用できること

 で、


 たとえば、今回のサイトでは次のように
 ■利用
<?
・・・データ取得・・・
require_once("*****_class.php");
$url = *****;
$title = *****;
$description = *****;
$copyright = *****;
$category = *****;
$docs = *****;
$ttl = 60 * 24; # 1日
$image = *****;
$vals=array("copyright" => $copyright,
"category" => $category,
"docs" => '',
"ttl" => $ttl,
"image" => $image);
$rss=new RSSMake($url, $title, $description, $vals);
if(sizeof($datas)>0){

for($n=0;$n<sizeof($datas);$n++){
$tempTITLE = $datas[$n]['title'];
$tempURL = $datas[$n]['url'];
$tempstrURL = "<a href='".$tempURL."' title='".$tempTITLE."'>";

$timestamp = gmmktime(gmdate("H"), gmdate("i"), gmdate("s"), gmdate("n"), gmdate("j"), gmdate("Y"));
$pubDateitem = date("D, j M Y H:i:s", $timestamp)." +0900";

$valsitem=array("description" => $tempTITLE);
$rss->AddItem($tempURL, $tempTITLE,
$pubDateitem,$valsitem);
}
}
# 直接出力
$rss->OutRSS('');
# こちらでハンドリング
# $rts = $rss->OutRSS('out');
?>

 これで、一応生成されたけれど、実際の運用を考えたとき
 利用者が
 *************rss.xml とアクセスした際に
 これを出力したい。


 ・・・で。


 サイト上の特定ディレクトリで
 ・xmlファイル内で、phpが利用できるように、
  .htaccess ファイルで
 ■設定
AddType application/x-httpd-php .php .html .htm .php3 .xml
AddHandler php-script .htm .html .xml


 この、rss.xml ファイル内で、上記を記述。
 > 一応 出力される。

しかし!


 ■チェック!
  RSS にもあるんですねぇ。
  正しいか、どうかチェックしてくれる Webサービス。
 RSS Validator - feedAnalyzer RSSの構文チェックRSS Validator - feedAnalyzer RSSの構文チェック URL入れてチェック!


  勇んでチェックするが、
  勇んでチェックする
  警告が2件!


  ・「拡張子に適切なメディアタイプを設定されることをお薦めします。
   おぉ、そうだ。xml 拡張子の設定が無かった。


   で、.htaccessで、
AddHandler default-handler xml
追加。

 ■チェック!2回目
  もうひとつの警告が消えない。
  更新時間/ファイルサイズが得られない
  ・「このサーバー(または拡張子)は If-Modified-Sinceに対応しません。


  これは、動的生成だから、だろうなぁ。

  一応、動的生成で機能提供されている 創るmetaboy RSS
  で確認してみることに。
  勇んでチェックする
  ※ やはり同じだ。
   これは、仕方の無いことか。


 今回は、これで良しとして、次の作業に
 移るが、上記の課題。いろいろ調べているうちに
 非常に興味深い記事を発見!


 ■動的なページを静的に見せる If-Modified-Since
 動的なページを静的に見せる If-Modified-Since動的なページを静的に見せる If-Modified-Since かなり前の記事だけれど・・・
 確かにここに書かれているように
 これらの知識、ほとんど
 無いんだよなぁ・・・
 ブックマークしとこ。



●追記:20091215 17:45●
 もうひとつある、RSSバリデータでもチェック。
 Feed Validator for Atom and RSSFeed Validator for Atom and RSS URL入れてチェック!


  こちらでやると、
  atom用に項目を追加しろ
  atom用に項目を追加しろ
  ということか?



●追記:20091215 18:10●
 データベースから値引っ張って、空の時不具合。
 ・クラスの修正
  配列変数チェック追加
 ・呼び出し元修正
  ループ外に基本部分を移動
commentsコメント
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/1183-11ba7254
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。