#!/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
}