################################################################################ # 名 称 :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;