Last active
February 6, 2017 03:45
Ruby script to get road closing informations from JARTIC.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/local/bin/ruby | |
# coding: utf-8 | |
#--------------------------------------------------------------------------------- | |
#= 道路交通情報取得 | |
# : 日本道路交通情報センターサイトから規制一覧を取得する。 | |
# | |
# Copyright(C) 2015 mk-mode.com All Rights Reserved. | |
#--------------------------------------------------------------------------------- | |
#++ | |
require 'json' | |
require 'open-uri' | |
require 'timeout' | |
class Jartic | |
CD = "32" # 道路コード | |
URL = "http://www.jartic.or.jp/_json/" # 接続先のベース URL | |
TO = 10 # OpenURI 接続時のタイムアウト | |
UA = "mk-mode Bot (by Ruby/#{RUBY_VERSION}, Administrator: postmaster@mk-mode.com)" | |
# OpenURI 接続時の User-Agent, Mail Address | |
def initialize | |
@url = "#{URL}M_#{CD}_301.json" | |
end | |
# 主処理 | |
def exec | |
begin | |
get_json # JSON 取得 | |
merge_same # 同一区間統合 | |
display # 結果出力 | |
rescue => e | |
$stderr.puts "[#{e.class}] #{e.message}" | |
e.backtrace.each{|trace| $stderr.puts "\t#{trace}"} | |
exit 1 | |
end | |
end | |
private | |
# JSON 取得 | |
def get_json | |
json = nil | |
timeout(TO) do | |
json = open(@url, "r:utf-8", {"User-Agent" => UA}) do |f| | |
f.read | |
end | |
end | |
j = JSON.parse(json) | |
# 以下の `uniq` は稀に同一内容の "item" が重複することがあるため | |
@upd_time, @items, @name = j["updtime"], j["item"].uniq, j["name"] | |
rescue => e | |
raise | |
end | |
# 同一区間統合 | |
def merge_same | |
@items_m = Array.new # 統合後 item 用配列 | |
merged = false # 統合フラグ | |
begin | |
# 統合前 item ループ処理 | |
@items.each do |item| | |
# 統合後 item をループ処理しているのは、統合前 item の並び順に特徴があるため。 | |
# (統合前 item を事前にソートするのもデータの特性上容易ではない) | |
# また、無用な処理を省くため最終要素からループ | |
(@items_m.size - 1).downto(0) do |i| | |
# 路線名称(0)・号線(9)、規制区間(3,4)、原因(5)、規制内容(6)の同じ item があれば統合。 | |
if @items_m[i][0] == item[0] && @items_m[i][9] == item[9] | |
@items_m[i][3,2].sort == item[3,2].sort && | |
@items_m[i][5] == item[5] && @items_m[i][6] == item[6] | |
@items_m[i][2] << "・#{item[2]}" | |
merged = true | |
break | |
end | |
end | |
merged ? merged = false : @items_m << item | |
end | |
rescue => e | |
raise | |
end | |
end | |
# 結果出力 | |
def display | |
# タイトル | |
puts "#### 道路規制一覧(#{@name}) [ #{@upd_time} 現在 ] ####" | |
begin | |
# ヘッダ | |
if @items_m == [] | |
str = "[規制情報はありません]" | |
else | |
str = "[路線名称]" + "-" * 30 + " [方向]" + "-" * 4 | |
str << " [規制区間]" + "-" * 54 + " [原因]" + "-" * 6 | |
str << " [規制内容]" + "-" * 2 | |
end | |
puts str | |
# 明細 | |
@items_m.each do |item| | |
str = padding_sp("#{item[0]} #{item[9]}", 20) | |
str << " #{padding_sp(item[2], 5)}" | |
if item[3] == "" | |
str << " #{padding_sp(item[4], 15)}" | |
str << " " * 34 | |
else | |
str << " #{padding_sp(item[3], 15)}" | |
str << (item[2] =~ /・/ ? "<->" : "-->") | |
str << " #{padding_sp(item[4], 15)}" | |
end | |
str << " #{padding_sp(item[5], 6)}" | |
str << " #{padding_sp(item[6], 6)}" | |
puts str | |
end | |
rescue => e | |
raise | |
end | |
end | |
# スペースパディング(全角) | |
def padding_sp(str, len_max) | |
len = str.split(//).size | |
return len_max < len ? str[0,len_max] : str[0,len] + " " * (len_max - len) | |
rescue => e | |
raise | |
end | |
end | |
Jartic.new.exec |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment