################################################################################
# 名 称 :MTWeatherJP #
# 機 能 :http://www.tenki.jp/ から天気情報を取得するMovableType用plugin #
# 備 考 :文字コードEUC限定。その他文字コードはスマヌ.. #
# #
# 作成年月日 :v0.01 2003.12.13 #
# 修正年月日 :v0.02 2004.03.23 imageディレクトリの指定を可能にした #
# 修正年月日 :v0.03 2004.03.30 encodeの指定を可能にした #
# 修正年月日 : #
# 作 成 者 :drk #
# Copy Right :http://www.drk7.jp #
################################################################################
## コンテナtag
# ...
# default ie=euc
use strict;
package MT::plugins::MTWeatherJP;
use MT::Template::Context;
use vars qw( $VERSION );
my $VERSION = '0.03';
use Jcode;
MT::Template::Context->add_container_tag(WeatherJP => \&MTWeatherJP );
MT::Template::Context->add_tag(Today => \&get_param);
MT::Template::Context->add_tag(TodayGif => \&get_param);
MT::Template::Context->add_tag(TodayGifEx => \&get_param);
MT::Template::Context->add_tag(TodayDate => \&get_param);
MT::Template::Context->add_tag(TodayMax => \&get_param);
MT::Template::Context->add_tag(TodayMin => \&get_param);
MT::Template::Context->add_tag(TodayRain00 => \&get_param);
MT::Template::Context->add_tag(TodayRain06 => \&get_param);
MT::Template::Context->add_tag(TodayRain12 => \&get_param);
MT::Template::Context->add_tag(TodayRain18 => \&get_param);
MT::Template::Context->add_tag(Tomorrow => \&get_param);
MT::Template::Context->add_tag(TomorrowGif => \&get_param);
MT::Template::Context->add_tag(TomorrowGifEx => \&get_param);
MT::Template::Context->add_tag(TomorrowDate => \&get_param);
MT::Template::Context->add_tag(TomorrowMax => \&get_param);
MT::Template::Context->add_tag(TomorrowMin => \&get_param);
MT::Template::Context->add_tag(TomorrowRain00 => \&get_param);
MT::Template::Context->add_tag(TomorrowRain06 => \&get_param);
MT::Template::Context->add_tag(TomorrowRain12 => \&get_param);
MT::Template::Context->add_tag(TomorrowRain18 => \&get_param);
#
MT::Template::Context->add_tag(WhenReported => \&get_param); # added by admin@bal4u.dip.jp
MT::Template::Context->add_tag(MaxAvailable => \&get_param); # added by admin@bal4u.dip.jp
MT::Template::Context->add_tag(MinAvailable => \&get_param); # added by admin@bal4u.dip.jp
###--------------------------------------------------------------------------###
# コンテナタグ定義
#
# 天気の情報取得元は http://www.tenki.or.jp/index.html
# 取得元のテンプレート形式が変更になったら、コードも変更する必要あり
# 対応[ 03.12.13 ]
#
###--------------------------------------------------------------------------###
sub MTWeatherJP {
my($ctx, $args) = @_;
my ($targets, $code2gif) = &_init;
## 文字コードの変換処理update 04.03.30
$args->{ie} = 'sjis' if( $args->{ie} =~ /^s/i );
$args->{ie} = 'euc' if( $args->{ie} =~ /^e/i );
$args->{ie} = 'utf8' if( $args->{ie} =~ /^u/i );
$args->{ie} = 'euc' if( $args->{ie} !~ /sjis|euc|utf8/i );
my $area= Jcode->new($args->{area},$args->{ie})->euc;
return unless( $targets->{$area} );
my $url = "http://www.tenki.jp".$targets->{$area};
# my $url = "http://www.tenki.jp".$targets->{$args->{area}};
## Create a user agent object
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
## Specify timeout in seconds
$ua->timeout($args->{timeout} || 15);
## Specify max size in bytes
$ua->max_size($args->{max_size});
## Specify user agent
$ua->agent(($args->{agent} || "MTIncludePlusEx/$VERSION") . $ua->agent);
## Create a request
my $request = HTTP::Request->new(GET => $url);
## Pass request to the user agent and get a response back
my $result = $ua->request($request);
## Return blank, if error
return '' unless $result->is_success;
## Get image dir
my $imgdir = $args->{dir} || "images/MTWeather/";
$imgdir .= "/" unless( $imgdir =~ m|/$| );
## Get content
&_parse_html($result, $ctx, $targets, $code2gif, $imgdir, $args->{ie});
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
defined(my $out = $builder->build($ctx, $tokens)) or return $ctx->error($ctx->errstr);
return $out;
}
###--------------------------------------------------------------------------###
# 天気情報取得タグ
# MTToday : 本日の天気予報
# MTTodayGIF : 本日の天気予報GIF
# MTTodayDate : 本日の日付
# MTTodayMax : 本日の最高気温
# MTTodayMin : 本日の最低気温
# MTTodayRain00: 本日の00−06時の降水確率
# MTTodayRain06: 本日の06−12時の降水確率
# MTTodayRain12: 本日の12−18時の降水確率
# MTTodayRain18: 本日の18−24時の降水確率
#
# added by admin@bal4u.dip.jp
# MTWhenReported: 気象庁の発表時間(5時,11時,17時等)
#
# MTMaxAvailable: 数値として利用可能な最高気温
# MTMinAvailable: 数値として利用可能な最低気温
# (1) 事実
# 本日の最高、最低気温は過ぎた時間帯では「-」としか表示されていないようです。
# 例えば、午後になると、本日の最低気温は「-」と表示されます。
# 夜になると、本日の最高気温も「-」に変わります。
# http://www.tenki.jp/ にて事実確認済み。
# (2) そうなった理由(私個人の推測に過ぎませんが)
# 最高・最低気温の出た時刻がだいぶ過ぎると、予報ではなく、確定値に変わったので、
# 天気予報としては確かに「-」の表示にしてもしかたありません。
# (3) 対策
# しかし、「-」の表示では情報が全く欠けてしまうので、
# 本日の最高・最低気温が数字であれば、そのまま、タグ(変数)に代入しますが、
# 「-」との表示であれば、明日の最高・最低気温の値を利用します。
# (4) 改善策?
# しかし、(3)の対策だといつの気温なのか、判らなくなってしまうことも確かです。
# 明日の気温であれば、数字の後ろに「明日」と明記するといいかもしれません。
# この辺の対策は各自のお考えにおまかせします。
#
###--------------------------------------------------------------------------###
sub get_param {
my($ctx, $args, $cond) = @_;
my $tag = $ctx->stash('tag');
$ctx->stash('MTWeatherJP_'.$tag) || '';
}
###--------------------------------------------------------------------------###
# 天気情報取得Private関数
###--------------------------------------------------------------------------###
sub _parse_html {
my($result, $ctx, $targets, $code2gif, $imgdir, $oe) = @_;
my $loop = 0;
## html解析
my $mode = '';
my $min_available; # added by admin@bal4u.dip.jp
my $max_available; # added by admin@bal4u.dip.jp
foreach my $data ( split(/\n/, $result->content) ) {
chomp $data;
#
# added by admin@bal4u.dip.jp
if ($data =~ /時発表/) {
my $inf = '';
if ($data =~ m|\s*(\d+)stash('MTWeatherJP_WhenReported', $inf);
}
next if( $data !~ m|| && $loop==0 );
last if( $data =~ m|| );
if( $data =~ m|日付| ) { $mode = "TodayDate"; next; }
if( $data =~ m|天気| ) { $mode = "Today"; next; }
if( $data =~ m|最高| ) { $mode = "TodayMax"; next; }
if( $data =~ m|最低| ) { $mode = "TodayMin"; next; }
if( $data =~ m|06時| ) { $mode = "TodayRain00"; next; }
if( $data =~ m|12時| ) { $mode = "TodayRain06"; next; }
if( $data =~ m|18時| ) { $mode = "TodayRain12"; next; }
if( $data =~ m|24時| ) { $mode = "TodayRain18"; next; }
## 今日の天気
if( $mode eq "Today" ) {
$data =~ m|
new($1,"euc")->$oe;
my $inf = Jcode->new($2,"euc")->$oe;
$ctx->stash('MTWeatherJP_TodayGif', "http://www.tenki.jp$uri");
$ctx->stash('MTWeatherJP_Today' , $inf);
$ctx->stash('MTWeatherJP_TodayGifEx', $ctx->stash('blog')->site_url.$imgdir.$code2gif->{$2});
$mode = 'Tomorrow';
## 明日の天気
} elsif( $mode eq "Tomorrow" ) {
$data =~ m|
new($1,"euc")->$oe;
my $inf = Jcode->new($2,"euc")->$oe;
$ctx->stash('MTWeatherJP_TomorrowGif', "http://www.tenki.jp$uri");
$ctx->stash('MTWeatherJP_Tomorrow' , $inf);
$ctx->stash('MTWeatherJP_TomorrowGifEx', $ctx->stash('blog')->site_url.$imgdir.$code2gif->{$2});
$mode = '';
## 今日の日付
} elsif( $mode =~ /TodayDate/ ) {
$data =~ m|\s*(\d+)|;
my $inf = Jcode->new($1,"euc")->$oe;
$ctx->stash('MTWeatherJP_'.$mode, $inf);
$mode =~ s/Today/Tomorrow/;
## 明日の日付
} elsif( $mode =~ /TomorrowDate/ ) {
$data =~ m|\s*(\d+)|;
my $inf = Jcode->new($1,"euc")->$oe;
$ctx->stash('MTWeatherJP_'.$mode, $inf);
$mode = '';
## 今日の天気属性
} elsif( $mode =~ /Today/ ) {
$data =~ m|(.+)|;
my $inf = Jcode->new($1,"euc")->$oe;
$ctx->stash('MTWeatherJP_'.$mode, $inf);
#
# added by admin@bal4u.dip.jp
if ($mode eq 'TodayMax') {
$max_available = $inf;
$ctx->stash('MTWeatherJP_MaxAvailable', $inf);
}
if ($mode eq 'TodayMin') {
$min_available = $inf;
$ctx->stash('MTWeatherJP_MinAvailable', $inf);
}
$mode =~ s/Today/Tomorrow/;
## 明日の天気属性
} elsif( $mode =~ /Tomorrow/ ) {
$data =~ m|(.+)|;
my $inf = Jcode->new($1,"euc")->$oe;
$ctx->stash('MTWeatherJP_'.$mode, $inf);
#
# added by admin@bal4u.dip.jp
if ($mode eq 'TomorrowMax' and $max_available eq '-') {
$ctx->stash('MTWeatherJP_MaxAvailable', $inf);
}
if ($mode eq 'TomorrowMin' and $min_available eq '-') {
$ctx->stash('MTWeatherJP_MinAvailable', $inf);
}
$mode = '';
}
$loop++;
}
}
sub _init {
my $targets = {
## 北海道地方
"宗谷支庁" => "/yoh/y11.html",
"上川支庁" => "/yoh/y12.html",
"留萌支庁" => "/yoh/12.html",
"石狩支庁" => "/yoh/y14.html",
"空知支庁" => "/yoh/14.html",
"後志支庁" => "/yoh/14.html",
"網走支庁" => "/yoh/y17.html",
"釧路支庁" => "/yoh/y19.html",
"根室支庁" => "/yoh/19.html",
"十勝支庁" => "/yoh/19.html",
"胆振支庁" => "/yoh/y21.html",
"日高支庁" => "/yoh/21.html",
"渡島支庁" => "/yoh/y23.html",
"檜山支庁" => "/yoh/23.html",
## 東北地方
"青森県" => "/yoh/y31.html",
"秋田県" => "/yoh/y32.html",
"岩手県" => "/yoh/y33.html",
"宮城県" => "/yoh/y34.html",
"山形県" => "/yoh/y35.html",
"福島県" => "/yoh/y36.html",
## 関東・甲信地方
"茨城県" => "/yoh/y40.html",
"栃木県" => "/yoh/y41.html",
"群馬県" => "/yoh/y42.html",
"埼玉県" => "/yoh/y43.html",
"東京地方" => "/yoh/y44.html",
"伊豆諸島南部" => "/yoh/y01.html",
"千葉県" => "/yoh/y45.html",
"神奈川県" => "/yoh/y46.html",
"長野県" => "/yoh/y48.html",
"山梨県" => "/yoh/y49.html",
## 東海・北陸地方
"静岡県" => "/yoh/y50.html",
"愛知県" => "/yoh/y51.html",
"岐阜県" => "/yoh/y52.html",
"三重県" => "/yoh/y53.html",
"新潟県" => "/yoh/y54.html",
"富山県" => "/yoh/y55.html",
"石川県" => "/yoh/y56.html",
"福井県" => "/yoh/y57.html",
## 近畿地方
"滋賀県" => "/yoh/y60.html",
"京都府" => "/yoh/y61.html",
"大阪府" => "/yoh/y62.html",
"兵庫県" => "/yoh/y63.html",
"奈良県" => "/yoh/y64.html",
"和歌山県" => "/yoh/y65.html",
## 中国・四国地方
"岡山県" => "/yoh/y66.html",
"広島県" => "/yoh/y67.html",
"島根県" => "/yoh/y68.html",
"鳥取県" => "/yoh/y69.html",
"山口県" => "/yoh/y81.html",
"徳島県" => "/yoh/y71.html",
"香川県" => "/yoh/y72.html",
"愛媛県" => "/yoh/y73.html",
"高知県" => "/yoh/y74.html",
## 九州地方
"福岡県" => "/yoh/y82.html",
"大分県" => "/yoh/y83.html",
"長崎県" => "/yoh/y84.html",
"佐賀県" => "/yoh/y85.html",
"熊本県" => "/yoh/y86.html",
"宮崎県" => "/yoh/y87.html",
"鹿児島地方" => "/yoh/y88.html",
"奄美地方" => "/yoh/y10.html",
## 南西諸島
"沖縄本島地方" => "/yoh/y91.html",
"大東島地方" => "/yoh/y92.html",
"宮古島地方" => "/yoh/y93.html",
"石垣島地方" => "/yoh/y94.html",
"与那国島地方" => "/yoh/y95.html",
};
my $code2gif = {
"晴れ" => "100.gif",
"晴れ 時々 くもり" => "101.gif",
"晴れ 一時 雨" => "102.gif",
"晴れ 時々 雨" => "103.gif",
"晴れ 一時 雪" => "104.gif",
"晴れ 時々 雪" => "105.gif",
"晴れ 一時 雨か雪" => "106.gif",
"晴れ 時々 雨か雪" => "107.gif",
"晴れ 一時 雨か雷雨" => "108.gif",
"晴れ のち時々くもり" => "110.gif",
"晴れ のち くもり" => "111.gif",
"晴れ のち一時 雨" => "112.gif",
"晴れ のち時々 雨" => "113.gif",
"晴れ のち 雨" => "114.gif",
"晴れ のち一時 雪" => "115.gif",
"晴れ のち時々 雪" => "116.gif",
"晴れ のち 雪" => "117.gif",
"晴れ のち 雨か雪" => "118.gif",
"晴れ のち 雨か雷雨" => "119.gif",
"晴れ 朝夕 一時 雨" => "120.gif",
"晴れ 朝の内一時 雨" => "121.gif",
"晴れ 夕方一時 雨" => "122.gif",
"晴れ 山沿い 雷雨" => "123.gif",
"晴れ 山沿い 雪" => "124.gif",
"晴れ 午後は雷雨" => "125.gif",
"晴れ 昼頃から雨" => "126.gif",
"晴れ 夕方から雨" => "127.gif",
"晴れ 夜は雨" => "128.gif",
"晴れ 夜半から雨" => "129.gif",
"朝の内 霧 後 晴れ" => "130.gif",
"晴れ 明け方 霧" => "131.gif",
"晴れ 朝夕 くもり" => "132.gif",
"晴れ 時々 雨で雷を伴う"=> "140.gif",
"晴れ 一時 雪か雨" => "160.gif",
"晴れ 時々 雪か雨" => "170.gif",
"晴れ のち 雪か雨" => "181.gif",
"くもり" => "200.gif",
"くもり 時々 晴れ" => "201.gif",
"くもり 一時 雨" => "202.gif",
"くもり 時々 雨" => "203.gif",
"くもり 一時 雪" => "204.gif",
"くもり 時々 雪" => "205.gif",
"くもり 一時 雨か雪" => "206.gif",
"くもり 時々 雨か雪" => "207.gif",
"くもり 一時 雨か雷雨" => "208.gif",
"霧" => "209.gif",
"くもり のち時々 晴れ" => "210.gif",
"くもり のち 晴れ" => "211.gif",
"くもり のち一時 雨" => "212.gif",
"くもり のち時々 雨" => "213.gif",
"くもり のち 雨" => "214.gif",
"くもり のち一時 雪" => "215.gif",
"くもり のち時々 雪" => "216.gif",
"くもり のち 雪" => "217.gif",
"くもり のち 雨か雪" => "218.gif",
"くもり のち 雨か雷雨" => "219.gif",
"くもり 朝夕一時 雨" => "220.gif",
"くもり 朝の内一時 雨" => "221.gif",
"くもり 夕方一時 雨" => "222.gif",
"くもり 日中時々 晴れ" => "223.gif",
"くもり 昼頃から雨" => "224.gif",
"くもり 夕方から雨" => "225.gif",
"くもり 夜は雨" => "226.gif",
"くもり 夜半から雨" => "227.gif",
"くもり 昼頃から雪" => "228.gif",
"くもり 夕方から雪" => "229.gif",
"くもり 夜は雪" => "230.gif",
"くもり海上海岸は霧か霧雨" => "231.gif",
"くもり 時々雨で 雷を伴う" => "240.gif",
"くもり 時々雪で 雷を伴う" => "250.gif",
"くもり 一時 雪か雨" => "260.gif",
"くもり 時々 雪か雨" => "270.gif",
"くもり のち 雪か雨" => "281.gif",
"雨" => "300.gif",
"雨 時々 晴れ" => "301.gif",
"雨 時々 止む" => "302.gif",
"雨 時々 雪" => "303.gif",
"雨か雪" => "304.gif",
"大雨" => "306.gif",
"風雨共に強い" => "307.gif",
"雨で暴風を伴う" => "308.gif",
"雨 一時 雪" => "309.gif",
"雨 のち 晴れ" => "311.gif",
"雨 のち くもり" => "313.gif",
"雨 のち時々 雪" => "314.gif",
"雨 のち 雪" => "315.gif",
"雨か雪 のち 晴れ" => "316.gif",
"雨か雪 のち くもり" => "317.gif",
"朝の内雨 のち 晴れ" => "320.gif",
"朝の内雨 のち くもり" => "321.gif",
"雨 朝晩一時 雪" => "322.gif",
"雨 昼頃から 晴れ" => "323.gif",
"雨 夕方から 晴れ" => "324.gif",
"雨 夜は晴" => "325.gif",
"雨 夕方から雪" => "326.gif",
"雨 夜は雪" => "327.gif",
"雨 一時強く降る" => "328.gif",
"雨 一時 みぞれ" => "329.gif",
"雪か雨" => "340.gif",
"雨で雷を伴う" => "350.gif",
"雪か雨 のち 晴れ" => "361.gif",
"雪か雨 のち くもり" => "371.gif",
"雪" => "400.gif",
"雪 時々 晴れ" => "401.gif",
"雪 時々止む" => "402.gif",
"雪 時々 雨" => "403.gif",
"大雪" => "405.gif",
"風雪強い" => "406.gif",
"暴風雪" => "407.gif",
"雪 一時 雨" => "409.gif",
"雪 のち 晴れ" => "411.gif",
"雪 のち くもり" => "413.gif",
"雪 のち 雨" => "414.gif",
"朝の内雪 のち 晴れ" => "420.gif",
"朝の内雪 のち くもり" => "421.gif",
"雪 昼頃から雨" => "422.gif",
"雪 夕方から雨" => "423.gif",
"雪 夜半から雨" => "424.gif",
"雪 一時強く降る" => "425.gif",
"雪 のち みぞれ" => "426.gif",
"雪 一時 みぞれ" => "427.gif",
"雪で雷を伴う" => "450.gif",
};
return ($targets, $code2gif);
}
1;