Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

気象庁のサイトから情報を取得して、はてなグラフにポストするスクリプト

id:riocampos2さんの日記から、トラックバックをいただいたので見に行ってみたところ、pythonを使って気象庁から降水量や気温を取得して、はてなグラフに自動でポストしたいそうな。
ちょっと考えてみたところ、rubyで書いた方が楽そうだったので、rubyで書いてみた。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
$KCODE='u'
require 'kconv'
require 'ostruct'
require 'date'

require 'rubygems'
require 'mechanize'
require 'hpricot'
require 'hatena/api/graph'

HATENA_ID = '****'
HATENA_PASSWORD = '****'

def get_yesterday_spots_data
  url = "http://www.data.jma.go.jp/obd/stats/data/mdrr/synopday/data2.html"
  agent = WWW::Mechanize.new
  agent.user_agent_alias = 'Windows IE 6'
  page = agent.get(url)
  
  h = {}
  doc = Hpricot(page.body)
  places = (doc/:html/:body/:table/"tr.o1|tr.o2")
  places.each do |place|
    spot_infos = (place/"td.oR")
    break unless spot_infos[11]
    
    spot = (place/"td.o0").inner_html.toutf8 # 地点
    low = spot_infos[4].inner_html.toutf8 # 最低気温
    high = spot_infos[3].inner_html.toutf8 # 最高気温
    avg = spot_infos[2].inner_html.toutf8 # 平均気温
    rainfall = spot_infos[11].inner_html.toutf8 # 降水量
    rainfall = 0 if rainfall == '--'
    h[spot] = OpenStruct.new({:low => low, :high => high, :avg => avg, :rainfall => rainfall})
  end
  h
end

def post_graph(spot)
  d = get_yesterday_spots_data
  yesterday = Date.today - 1

  graph = Hatena::API::Graph.new(HATENA_ID, HATENA_PASSWORD)
  graph.post_data("#{spot}の最高気温", 'date' => yesterday, 'value' => d[spot].high)
  graph.post_data("#{spot}の最低気温", 'date' => yesterday, 'value' => d[spot].low)
  graph.post_data("#{spot}の平均気温", 'date' => yesterday, 'value' => d[spot].avg)
  graph.post_data("#{spot}の降水量", 'date' => yesterday, 'value' => d[spot].rainfall)
end

post_graph("東京")

気象庁このページから、昨日の日付の降水量、最高、最低、平均気温を取得して、はてなグラフにポストします。こんな感じ。post_graphメソッドの引数には、適当な場所を指定します。

ちなみに、get_yesterday_spots_data は、昨日の全国の気象情報のハッシュを返しますので、下のように書くと、全国の降水量ベスト10を取得できます。(気象庁のサイトでもみれますけど。。。)

>> d = get_yesterday_spots_data
>> d.map {|k, v| [k, v.rainfall.to_f]}.sort {|x, y| y[1] <=> x[1]}[0...10]
[["那覇", 138.5],
 ["久米島", 111.5],
 ["清水", 64.0],
 ["延岡", 52.0],
 ["枕崎", 51.0],
 ["大分", 46.5],
 ["名護", 43.0],
 ["宮古島", 42.5],
 ["阿蘇山", 39.0],
 ["平戸", 38.5]]