#!/usr/bin/perl -w use XML::RSS; use url_get; use Template::Extract; use Jcode; # Yahoo FinanceのURL my $url = "http://quote.yahoo.co.jp"; my $charturl = "http://stocks.finance.yahoo.co.jp/stocks/chart/?t=3m&code="; # カテゴリ表示用の配列 my @cate = ( 'trade_code', 'market_place', 'company_name', 'trade_time', 'last_trade', 'change', 'change_percent', 'volume', ); # アクセス時刻の取得 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time-9*60*60); $year = $year + 1900; $mon = $mon + 1; # クエリから読み込む株価コードを取得 my @codes = getquery(); # ハッシュ配列の宣言 my %stock = (); # コード数分繰り返す for ( @codes ) { my $code = $_; my $url_code = $url."/q?s=".$_; # 自作のHTMLゲット関数の宣言 my $ug = new url_get( $url_code, "GET", "", ); # HTML配列の取得 my @lines = $ug->geturl(); # HTML配列のタブと改行を削除 my $document = ""; for (@lines) { $_ =~ tr/\x0D\x0A|\x0D|\x0A//d; $document .= $_; } # Template::Extractの利用 my $obj = Template::Extract->new; # Templateの読み込み(読み込み時に改行を削除) (my $template = << '.') =~ tr/\x0D\x0A|\x0D|\x0A|\x09//d; [% trade_code %] [% market_place %] [%[% company_name %]  [% trade_time %] [% last_trade %] [% change %] [% change_percent %] [% volume %] . # 処理 my $ext = $obj->extract($template, $document); # ハッシュ配列にカテゴリ名を付けて格納 for ( @cate ) { $ext->{$_} =~ s/^//; $ext->{$_} =~ s/<\/font>$//; $ext->{$_} =~ s/^.+\/.+$/15:00/; $stock{$code}{$_} = utf8($ext->{$_}); } } # RSSを作成 my $rss = new XML::RSS (version => '1.0'); # channelの作成 $rss->channel( title => "RSS Stock", link => "http://www.xlabo.net/cgi-bin/rss_stock.cgi", description => "RSS of stock prices", dc => { date => "2009-02-04T00:00:00+09:00", creator => 'admin@xlabo.net', rights => 'Copyright 2009, x Laboratory', } ); # 株価用のNSを作成 $rss->add_module(prefix=>'stock', uri=>'http://www.xlabo.net/'); # ハッシュ配列からRSSデータへaddする foreach my $key ( keys %stock ) { $rss->add_item( title => $stock{$key}{'company_name'}." ".$stock{$key}{'last_trade'}."(".$stock{$key}{'change'}.")", link => $charturl.$stock{$key}{'trade_code'}, description => $stock{$key}{'company_name'}." 株価:".$stock{$key}{'last_trade'}."(".$stock{$key}{'change'}.":".$stock{$key}{'change_percent'}.") 出来高:".$stock{$key}{'volume'}, dc => { date => $year."-".$mon."-".$mday."T".$stock{$key}{'trade_time'}.":00+09:00", creator => 'admin@xlabo.net', rights => 'Copyright 2005, x Laboratory' }, stock => { trade_code => $stock{$key}{'trade_code'}, market_place => $stock{$key}{'market_place'}, company_name => $stock{$key}{'company_name'}, trade_time => $year."-".$mon."-".$mday."T".$stock{$key}{'trade_time'}.":00+09:00", last_trade => $stock{$key}{'last_trade'}, change => $stock{$key}{'change'}, change_percent => $stock{$key}{'change_percent'}, volume => $stock{$key}{'volume'}, chart_url => $charturl.$stock{$key}{'trade_code'} } ); } # HTMLヘッダ出力 print "Content-Type: text/xml; charset=utf-8\n\n"; # RSSデータ出力 print $rss->as_string; # sub関数 # クエリの取得と変数への格納 sub getquery { # クエリの取得 my $buffer; if( $ENV{'REQUEST_METHOD'} eq "GET" ) { $buffer = $ENV{'QUERY_STRING'}; } else { read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); } # 取得したクエリから変数にセット my @indata = split(/&/,$buffer); return @indata; } sub utf8 { my $str = shift; my $j = jcode($str); return $j->utf8 }