プログラミングなどなど

プログラミングに関係しそうな内容を

shell:天気情報をWebAPIで取得してみる

Twitter APIを使ってみようと思ったのですが、認証やら何やらが必要になりそうでした。これまでWebAPIは使ったことがなかったので、ひつまず手に届きそうな天気情報を取得するものから試してみました。

お天気Webサービス仕様

手に届きそうなものを探していたらちょうど「お天気Webサービス仕様」(http://weather.livedoor.com/weather_hacks/webservice)というものを見つけました。

横浜の天気情報をリクエストする

説明を読むと同ページからリンクしている「全国の地点定義表(RSS)」に記載されている一次細分区のidを使って天気情報をリクエストできるようでした。
試しに、横浜(140010)を使ってリクエストを投げてみます。

リクエストを送信する
$ GET http://weather.livedoor.com/forecast/webservice/json/v1?city=140010
{"pinpointLocations":[{"link":"http://weather.livedoor.com/area/forecast/1410000","name":"\
:

JSONデータから必要情報を得る

取得した情報から自分が欲しい情報を抽出します。
欲しい情報は予報(forecasts)の以下です。

dateLabel
date
telop

jqコマンドでの抽出
$ GET http://weather.livedoor.com/forecast/webservice/json/v1?city=140010 | jq -r '.forecasts | .[] | [ .dateLabel, .date, .telop]'
[
  "今日",
  "2020-06-11",
  "雨"
]
[
  "明日",
  "2020-06-12",
  "曇のち雨"
]
[
  "明後日",
  "2020-06-13",
  "曇時々雨"
]

整形

好みの形に整形します。

$ GET http://weather.livedoor.com/forecast/webservice/json/v1?city=140010 | jq -r '.forecasts | .[] | [ .dateLabel, .date, .telop] | @sh' | sed s/\'//g
今日 2020-06-11 雨
明日 2020-06-12 曇のち雨
明後日 2020-06-13 曇時々雨

スクリプト化(weather.sh)

#!/bin/bash
#-----------------------------------------
# 天気情報取得スクリプト
#-----------------------------------------

if [ $# -eq 0 -o _"$1" = _"-h" ]; then
  echo Usage : $(basename $0) 一次細分区ID
  echo 例 東京 : $(basename $0) 130010
  echo 例 横浜 : $(basename $0) 140010
  exit 1;
fi

city=$1
url=http://weather.livedoor.com/forecast/webservice/json/v1?city=${city}

#-----------------------------------------
# 一次細分区で指定した天気情報を得る。
#-----------------------------------------
GET ${url}                               |
#-----------------------------------------
# JSONから欲しい情報を得る。
#-----------------------------------------
jq -r '
    #-----------------------------
    # 予報部分の抽出
    #-----------------------------
    .forecasts                   |
    #-----------------------------
    # 配列の全要素を抽出(今日・明日・明後日)
    #-----------------------------
    .[]                          |
    #-----------------------------
    # 必要情報を抽出
    #-----------------------------
    [ .dateLabel, .date, .telop] |
    @sh'                                 |
#-----------------------------------------
# クォート(')を除外する。
#-----------------------------------------
sed s/\'//g

実行

$ ./weather.sh 140010
今日 2020-06-11 雨
明日 2020-06-12 曇のち雨
明後日 2020-06-13 曇時々雨