#!/usr/bin/perl #通常は /usr/bin/perl など #プロバイダの環境にあわせて変更してください。 #このCGIのパーミッションは755(もしくは700)に設定します。 #文中でも記述しておりますが本格稼働の段階では不必要な注釈文 #はCGIサーバーの負荷軽減の為にも削除してくださいね。 use Socket; #************************************************************************** # #The Web KANZAKI(http://www.kanzaki.com/)で紹介されている #「RSS生成スクリプトのサンプル」(http://www.kanzaki.com/docs/sw/rss-generation.html) #をインターネット上で使用できるように変更したものです。 #このCGIソースは「メールやリンクについて(Disclaimer, Policy and Mails)」 #(http://www.kanzaki.com/info/disclaimer)に神崎さんが記述されています #「創造的な再利用を歓迎します」の精神に乗っ取って「創造的な再利用の再利用を歓迎します」 # #RSS全般に関する情報はThe Web KANZAKIの「RSS -- サイト情報の要約と公開」 #(http://www.kanzaki.com/docs/sw/rss.html)で非常に丁寧に解説されています。 #●ご注意ください● # #○このソースに関する質問は呉々もThe Web KANZAKIにはなさらないようにお願いします。 # #○実際に調整が完了して実稼働の段階ではオリジナルのソースは #念のために保管して頂いてサーバーに負担をかける無駄な[注釈文]は #削除されることをお勧めします。 # #○このサンプルでは元々のソースがインターネット上で使用することを想定した #ものではなく、このソースに関しても多くのトラフィックを処理するサイト(サーバー) #環境で使用することを前提にした処理が実装されておりません。 #そのようなトラフィックが多い環境でのご使用やご自身が管理されるサイト(サーバー)以外に #対して実行されることはご遠慮願います。 #(「ご自身が管理されるサイト(サーバー)以外」とはニュースサイトや他人のサイトを指します) # #○Socketを使用しているのは大手プロバイダーではCGIサーバーとWebサーバーを別々に用意 #しているケースが多く、それに対処する為のものです。 #CGIサーバーとWebサーバーが同一のものである場合はお互いのサーバーやインターネット回線の #負担を軽減できる「Socketを使用しない場合」の記述を参考にされることをお願いします。 # #○各自で変更する変数部分を "hogehoge" だとか "Your HomePage" という記述にすると #少しの解釈ミスで正しく動作しないケースもありますので実際にInfoMakerで使用している #生の記述をサンプルとしました。 #「私のサイトでもInfoMakerの新着情報を世界に配信します」という律儀な方や #自称"InfoMakerの追っかけ"という方以外はテスト実行程度は結構ですが最終的には #適切な変更をお願いします。 #(但し、InfoMakerのHTMLの記述方法が変更されている場合には正しく動作しない #場合がありますのでご注意ください) # #○サンプルで実際にInfoMakerで使用している新着情報ファイル news.htm や各種 #アイコン画像同梱しています。 #簡単な注釈文をHTML文中に挿入していますのでご覧ください。 # #○RSS対応サイトを示すための XML RDF RSS のアイコンを添付してあります。 #ご自由にお使い頂ければ結構ですが、RDFのアイコンに関しては作者の意向と #内部に著作権情報が埋め込まれていることにより画像の修正や形式の変更は #一切できませんので必ずオリジナルのままご使用ください。 # #************************************************************************** # #Socketを使用してますのでCGIサーバーとWWWサーバーが違う場合でも動作します。 #CGIソースと共にHTML形式の新着情報をホームページのトップに設置できる #場合の[Socketを使用しないケース]の説明もあります。 # #ライブラリを使用しないで簡単に設定でき、単体で動作する事を目的としていますので #抽出元のHTML形式の新着情報はShift_JIS形式で記述します。 #吐き出されるRSSデータもShift_JIS形式になります。 # #著作権は主張しませんし"創造的な再利用の再利用を歓迎します"が #変更したソースの配布を行う場合には最終的な変更者の追加を下記に行って頂ければ #導入される方が正しく"設定できない場合"や"改造する場合"に各ソースを比較(参考に) #できるのではないかとおもいます。 # #●オリジナル● #The Web KANZAKI (http://www.kanzaki.com/) #RSS生成スクリプトのサンプル(http://www.kanzaki.com/docs/sw/rss-generation.html) # #●変更● #名称 : rss.cgi (Shift_JIS版) v.2004.08.11 版 #編集者 : InfoMaker (http://www.infomaker.jp/) #最新版入手先 : http://www.infomaker.jp/download/ #実際のサンプル: http://www.infomaker.jp/news.htm #コンタクト : info@infomaker.jp #取り扱い : 利用/改造/再配布可能。確認メール不要。 #コメント : シンプルで分かり易い[RSS生成スクリプトのサンプル]を簡単に # : 使用できるように変更したつもりなのですが、子供の落書きのように汚くなって # : しまいました・・・神崎さん、申し訳ありません。 # # : /2003.10.27/ ... RSSとして抽出する件数 $rss_max = 15 を追加しました。 # : /2003.11.22/ ... RSSとして抽出する条件を少し調整しました。 # : /2004.08.11/ ... ソケットを使用しない場合の記載に間違いがありました。 # #●変更● #名称 : xxxxxxxxxxxxxxxxx #編集者 : xxxxxxxxxx (xxxxxxxxxxxxxx) #最新版入手先 : xxxxxxxxxx #実際のサンプル: xxxxxxxxxx #コンタクト : xxxxxxxxxx #取り扱い : xxxxxxxxxx #コメント : xxxxxxxxxx # #************************************************************************** #ポート番号は多くの場合固定です $port = 80; #ホスト名をIPアドレスに逆参照するために使用します。 $servername = "beerdo.jp"; #ホームページのRootを指定します。 $rss_host = "http://beerdo.jp/"; #ホームページのトップページを指定します。 #正確に記述する場合は http://www.infomaker.jp/index.htm になります。 $rss_top = "http://beerdo.jp/jiten/"; #The Web KANZAKIの「RSS -- サイト情報の要約と公開」の解説では #RSSのタグにRSS本体のURLを記述することになっていますが #実際にはホームページのトップURLを記述しているサイトなどや #記述を省略しているサイトが存在していますのでRSSリーダーソフトで #の内容を期待するのは非常に危険な #場合があります。 #InfoMakerのHeadline-Editor(http://www.infomaker.jp/)でも同じ方法を #使用していますがタグの "rdf:about" の記述は(故意に)省略します。 #使用したい場合は以下の $rss_cgi と $rss_cgi を使用している部分() #の記述を有効にしてください。 #$rss_cgi = "http://cgi.infomaker.jp/cgi-bin/rss.cgi"; #RSSファイルのタイトルを記入します。 $rss_title = "BeerDo!!ビール辞典 - 新着情報"; #RSSファイルの説明文を記入します。 $rss_desc = "BeerDo!!をより楽しむために"; #抽出する対象になるHTMLファイルを指定します。 $rss_target = "jiten/scripts/news.html"; #タイトルとリンクと更新日付を抜き出す要素 $item_title = "dt"; #説明文を抜き出す要素 $item_descr = "dd"; #RSSとして抽出する件数 $rss_max = 55; #********************** #Socketを使用しない場合 #********************** #この方法はCGIソースと $rss_target を共に $rss_host に設置できる #場合に限ります。(つまりホームページのRootフォルダに置くことができる場合) # #先頭付近の "use Socket;" と [Socketオープン] の記述部分を削除して #[ソースから情報を抽出] の部分を以下の記述を参考に変更します。 # #if (open(IN, "< $rss_target")) { # while(){ # この部分はまったく同じです # if(m|<${item_title}.*?>(.*?).*?\((.*?)\)|){ # ................. # }elsif(m|<${item_descr}.*?>(.*?)\n| and $isItem){ # ................. # } # } # close(IN); #} #************** #Socketオープン #************** $addr = (gethostbyname($servername))[4]; $ipname = pack("S n a4 x8", 2, $port, $addr); #perl5が使用できない場合やサーバーOSの種類によっては #socket(xxx,xxx,xxx,xxx)は下記の2つの記述のどちらかを #使用する必要が・・・(あるかもしれません) #if ( ! socket(SOCKET, 2, 1, 0) ){ print "Error in socket"; exit; } #if ( ! socket(SOCKET, 2, 2, 0) ){ print "Error in socket"; exit; } if ( ! socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname("tcp")) ){ print "Error in socket"; exit; } if ( ! connect(SOCKET, $ipname) ){ print "Error in Connect"; exit; } select(SOCKET); $| = 1; select(STDOUT); print SOCKET "GET $rss_host$rss_target HTTP/1.0\r\n\r\n"; #******************** #ソースから情報を抽出 #******************** while(){ #(m|<${item_title}.*?>(.*?).*?\((.*?)\)|) #この部分は
[タイトル] ([日付 yyyy-mm-dd]) #形式で記述されている行を抽出しています。 #日付部分は yyyy-mm-dd で必ず指定します。(例 2003-10-17) #日付を使用しない場合は #(m|<${item_title}.*?>(.*?)|) このように記述します。 if(m|<${item_title}.*?>(.*?).*?\((.*?)\)|){ if ($items >= $rss_max) {last;} #抽出件数を超えると中止 $link[++$items] = $1; &www("$1"); $items_list .= qq( \n); $str = $2; $str =~ s/<.*?>//g; #不要なマークアップを削除 $title[$items] = $str; $dc_date[$items] = $3; $isItem = 1; #(m|<${item_descr}.*?>(.*?)\n| and $isItem) #この部分は "
[説明文][改行]" 形式で記述されている行を抽出しています。 #The Web KANZAKIのオリジナルのソースでは "
[説明文]
"のように #XHTML形式を対象に記述されておりますが、ホームページビルダーなどの #作成ソフトで手軽に編集できるようにタグを閉じない形式(HTML形式)を対象にします。 }elsif(m|<${item_descr}.*?>(.*?)\n| and $isItem){ $str = $1; $str =~ s/<.*?>//g; #不要なマークアップを削除 $descr[$items] = $str; $isItem = 0; #説明文は1要素だけにしておく } } close(SOCKET); #以下、RSSの構文に従って出力 print "Content-Type: application/xml;\n"; print "\n"; print "\n"; print "\n"; #print " \n"; print " \n"; print " $rss_title\n"; print " $rss_top\n"; print " $rss_desc\n"; print " \n"; print " \n"; print "$items_list\n"; print " \n"; print " \n"; print " \n"; for $i (1..$#link){ &www("$link[$i]"); print " \n"; print " $title[$i]\n"; print " $msg\n"; print " $descr[$i]\n"; print " $dc_date[$i]\n"; print " \n"; } print "\n"; sub www { #"://"が含まれている場合はURLの絶対指定と判断する #そうでない場合は相対指定なので $rss_host (ホームページRoot)を付加する if($_[0] =~ /:\/\//){ $msg = "$_[0]"; } else { $msg = "$rss_host$_[0]"; } } # ---------[eof]----------