全AMEDAS観測地点対応!はてなグラフ降水量・気温ポストRubyスクリプト

気象庁のサイトから情報を取得して、はてなグラフにポストするスクリプト - Λάδι Βιώσας
を下地にして、
http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?block_no=1596&year=2008&month=04
などのAMEDASデータから前日の降水量、平均・最高・最低気温をはてなグラフにポストするスクリプトを作成した。
初めてのスクリプトなのでへたくそなところが多いと思うが、ご指摘いただければ幸い。

getAMEDASdata2.rb

観測地点番号("0001"〜"1596")、西暦4桁、月を指定することで一ヶ月の降水量、気温データを取得する。

# -*- coding: utf-8 -*-
$KCODE='u'
require 'kconv'
require 'ostruct'
require 'date'

require 'rubygems'
require 'mechanize'
require 'hpricot'

def get_point_data(placeno,yy,mm)
  url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_a1.php?block_no=" + placeno.to_s + "&year=" + yy.to_s + "&month=" + mm.to_s
  agent = WWW::Mechanize.new
  agent.user_agent_alias = 'Windows IE 6'
  page = agent.get(url)
  
  amedas_hash = {}
  doc = Hpricot(page.body)
  place_pre = (doc/:html/:body/:table/"caption.m").inner_text.toutf8.gsub(/ /,' ')
  if place_pre =~ /^.*?\s/u
    place = $&.strip
  end
  data = (doc/:html/:body/:table/"tr.mtx")
  data.each do |days|
    dd = (days/'a[@href^="hourly_a1.php"]').inner_html.toutf8 # 日付
    next if dd == ""
    amedas_data = (days/"td.data_0_0")
    rainfall = amedas_data[0].inner_html.toutf8.to_f # 降水量
    avg      = amedas_data[3].inner_html.toutf8.to_f # 平均気温
    high     = amedas_data[4].inner_html.toutf8.to_f # 最高気温
    low      = amedas_data[5].inner_html.toutf8.to_f # 最低気温
    amedas_hash[dd] = OpenStruct.new({:place => place, :rainfall => rainfall, :avg => avg, :low => low, :high => high})
  end
  return amedas_hash
end

下のpostHatenaGraph2.rbでは使っていないけど、観測地点名もamedas_hash.placeとして含めている。
#観測地点名の切り出しが下手くそで…。

postHatenaGraph2.rb

# -*- coding: utf-8 -*-
$KCODE='u'
require 'kconv'
require 'ostruct'
require 'date'

require 'rubygems'
require 'hatena/api/graph'

require 'getAMEDASdata2'

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

def post_graph(pointno)
  yesterday = Date.today - 1
  yy = yesterday.year
  mm = yesterday.month
  dd = yesterday.day
  amedas = get_point_data(pointno,yy,mm)
  graph = Hatena::API::Graph.new(HATENA_ID, HATENA_PASSWORD)
  graph.post_data("降水量",   'date' => yesterday, 'value' => amedas[dd.to_s].rainfall)
  graph.post_data("平均気温", 'date' => yesterday, 'value' => amedas[dd.to_s].avg)
  graph.post_data("最高気温", 'date' => yesterday, 'value' => amedas[dd.to_s].high)
  graph.post_data("最低気温", 'date' => yesterday, 'value' => amedas[dd.to_s].low)
end

post_graph("1596") # "0001"〜"1596"

最後のpost_graph("観測地点番号")で、観測地点を指定している。