Skip to content

Instantly share code, notes, and snippets.

@mnzk
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mnzk/9070635 to your computer and use it in GitHub Desktop.
Save mnzk/9070635 to your computer and use it in GitHub Desktop.
天気予報逆引き。 (tenki.jp の http://tenki.jp/webservice/rss/ より)
;;-*- coding: utf-8 -*-
(ns tenki.core
(:require [clojure.xml :as xml]
[clojure.zip :as zip]
[clojure.data.zip.xml :refer :all]
[clojure.core.cache :as cache]))
(defn city-url
[city-id]
(->> city-id (format "http://tenki.jp/component/static_api/rss/forecast/city_%d.xml")))
;; RSS Zipperを記録するTTLキャッシュ (5分間キャッシュに残す)
(def rss-cache
(atom (cache/ttl-cache-factory {} :ttl (* 5 60 1000))))
(defn hit-or-miss
[c k f]
(if (cache/has? c k)
(cache/hit c k)
(cache/miss c k (f))))
(defn rss-zip*
"RSS URLから、rssのZipperを作る"
[url]
(-> url xml/parse zip/xml-zip))
(defn rss-zip
"rss-zip* のTTLキャッシュ版"
[url]
(-> (swap! rss-cache hit-or-miss url #(rss-zip* url))
(get url)))
(defn title-city
"RSS Zipper から地域名取得"
[rss]
(->> (xml1-> rss :channel :title text)
(re-find #"^(.+)の今日")
second))
(defn search-forecast
"RSS Zipper から予報を正規表現検索"
[re rss]
(->> (xml-> rss :channel :item :title text)
(filter #(re-find re %))))
(defn report*
[re id]
(let [rss (rss-zip (city-url id))]
(when-let [fcs (-> (search-forecast re rss) seq)]
(let [city (title-city rss)]
(->> fcs (map (fn [fc]
{:forecast fc
:city city
:id id})))))))
(defn report
([re city-id]
(report* re city-id))
([re start-city-id end-city-id]
(->> (range start-city-id end-city-id)
(mapcat #(report* re %)))))
;;
;; Example
;;
;; 関東甲信越の雪の予報を取得
;; (report #"雪" 50 77)
;;
;; 全地域から豪/強を含む予報を取得
;; (report #"豪|強" 1 143)
1 道北 宗谷地方(稚内)
2 道北 上川地方(旭川)
3 道北 留萌地方(留萌)
4 道央 石狩地方(札幌)
5 道央 空知地方(岩見沢)
6 道央 後志地方(倶知安)
7 道東 網走地方(網走)
8 道東 北見地方(北見)
9 道東 紋別地方(紋別)
10 道東 根室地方(根室)
11 道東 釧路地方(釧路)
12 道東 十勝地方(帯広)
13 道南 胆振地方(室蘭)
14 道南 日高地方(浦河)
15 道南 渡島地方(函館)
16 道南 檜山地方(江差)
17 青森県 津軽(青森)
18 青森県 下北(むつ)
19 青森県 三八上北(八戸)
20 秋田県 沿岸(秋田)
21 秋田県 内陸(横手)
22 岩手県 内陸(盛岡)
23 岩手県 沿岸北部(宮古)
24 岩手県 沿岸南部(大船渡)
25 宮城県 東部(仙台)
26 宮城県 西部(白石)
27 山形県 村山(山形)
28 山形県 置賜(米沢)
29 山形県 庄内(酒田)
30 山形県 最上(新庄)
31 福島県 中通り(福島)
32 福島県 浜通り(小名浜)
33 福島県 会津(若松)
34 静岡県 中部(静岡)
35 静岡県 伊豆(網代)
36 静岡県 東部(三島)
37 静岡県 西部(浜松)
38 愛知県 西部(名古屋)
39 愛知県 東部(豊橋)
40 岐阜県 美濃地方(岐阜)
41 岐阜県 飛騨地方(高山)
42 三重県 北中部(津)
43 三重県 南部(尾鷲)
44 富山県 東部(富山)
45 富山県 西部(伏木)
46 石川県 加賀(金沢)
47 石川県 能登(輪島)
48 福井県 嶺北(福井)
49 福井県 嶺南(敦賀)
50 新潟県 下越(新潟)
51 新潟県 中越(長岡)
52 新潟県 上越(高田)
53 新潟県 佐渡(相川)
54 茨城県 北部(水戸)
55 茨城県 南部(土浦)
56 栃木県 南部(宇都宮)
57 栃木県 北部(大田原)
58 群馬県 南部(前橋)
59 群馬県 北部(みなかみ)
60 埼玉県 南部(さいたま)
61 埼玉県 北部(熊谷)
62 埼玉県 秩父地方(秩父)
63 東京都 東京地方(東京)
64 東京都 伊豆諸島北部(大島)
65 東京都 伊豆諸島南部(八丈島)
66 東京都 小笠原諸島(父島)
67 千葉県 北西部(千葉)
68 千葉県 北東部(銚子)
69 千葉県 南部(館山)
70 神奈川県 東部(横浜)
71 神奈川県 西部(小田原)
72 長野県 北部(長野)
73 長野県 中部(松本)
74 長野県 南部(飯田)
75 山梨県 中・西部(甲府)
76 山梨県 東部・富士五湖(河口湖)
77 滋賀県 南部(大津)
78 滋賀県 北部(彦根)
79 京都府 南部(京都)
80 京都府 北部(舞鶴)
81 大阪府 大阪(大阪)
82 兵庫県 南部(神戸)
83 兵庫県 北部(豊岡)
84 奈良県 北部(奈良)
85 奈良県 南部(風屋)
86 和歌山県 北部(和歌山)
87 和歌山県 南部(潮岬)
88 岡山県 南部(岡山)
89 岡山県 北部(津山)
90 広島県 南部(広島)
91 広島県 北部(庄原)
92 島根県 東部(松江)
93 島根県 西部(浜田)
94 島根県 隠岐(西郷)
95 鳥取県 東部(鳥取)
96 鳥取県 中・西部(米子)
97 山口県 西部(下関)
98 山口県 中部(山口)
99 山口県 東部(柳井)
100 山口県 北部(萩)
101 徳島県 北部(徳島)
102 徳島県 南部(日和佐)
103 香川県 高松(高松)
104 愛媛県 中予(松山)
105 愛媛県 東予(新居浜)
106 愛媛県 南予(宇和島)
107 高知県 中部(高知)
108 高知県 東部(室戸岬)
109 高知県 西部(清水)
110 福岡県 福岡地方(福岡)
111 福岡県 北九州地方(八幡)
112 福岡県 筑豊地方(飯塚)
113 福岡県 筑後地方(久留米)
114 大分県 中部(大分)
115 大分県 北部(中津)
116 大分県 西部(日田)
117 大分県 南部(佐伯)
118 長崎県 南部(長崎)
119 長崎県 北部(佐世保)
120 長崎県 壱岐・対馬(厳原)
121 長崎県 五島(福江)
122 佐賀県 南部(佐賀)
123 佐賀県 北部(伊万里)
124 熊本県 熊本地方(熊本)
125 熊本県 阿蘇地方(阿蘇乙姫)
126 熊本県 天草・芦北地方(牛深)
127 熊本県 球磨地方(人吉)
128 宮崎県 南部平野部(宮崎)
129 宮崎県 北部平野部(延岡)
130 宮崎県 南部山沿い(都城)
131 宮崎県 北部山沿い(高千穂)
132 鹿児島県 薩摩地方(鹿児島)
133 鹿児島県 大隅地方(鹿屋)
134 鹿児島県 種子島・屋久島地方(種子島)
135 鹿児島県 奄美地方(名瀬)
136 沖縄県 本島中南部(那覇)
137 沖縄県 本島北部(名護)
138 沖縄県 久米島(久米島)
139 沖縄県 大東島地方(南大東島)
140 沖縄県 宮古島地方(宮古島)
141 沖縄県 石垣島地方(石垣島)
142 沖縄県 与那国島地方(与那国島)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment