公開APIを使って、コマンドラインから JSON形式のデータを取得してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。昨日はJSONについてさらっと解説してみました。今日は、公開APIからデータをJSONで取り出してみましょう。

まず本稿の内容を実際に試してみる場合の前提条件を。

  • OSはMacOSXであること。
  • Homebrewを導入済みであること。 → まだの場合はここを見てインストールしておきましょう。
  • ターミナル(コマンドライン)操作に拒絶反応がないこと。

まぁ、最後の問題さえクリアしてみれば、Linuxでもどうにかなるかもしれませんが、いろいろ自分で乗り越える必要があります。

ipifyで自分のグローバルIPアドレスを取る

さて、最初は最も簡単な例で。自分がインターネット上のサーバに対してアクセスするときのグローバルIPアドレスを取得するipifyというAPIがあります。

ターミナル(コマンドライン)を開いて、下記のコマンド *1を実行してください。-sオプションは、コンテンツ以外の余計な表示を抑制するオプションです。

$ curl -s https://api.ipify.org?format=json

すると下記のようなJSONが帰ってきたでしょうか。これがあなたの現在のグローバルIPアドレスです。

{"ip":"203.0.113.236"}

簡単過ぎましたね。

OpenWeatherMapから天気情報を取る

続いてもう少し複雑な例です。OpenWeatherMapというサービスとAPIがあります。これで、東京の天気情報を取り出してみましょう。

$ curl -s http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp

この結果がこれ。

{"coord":{"lon":139.69,"lat":35.69},"sys":{"message":1.7314,"country":"JP","sunrise":1432841263,"sunset":1432892970},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10d"}],"base":"stations","main":{"temp":295.299,"temp_min":295.299,"temp_max":295.299,"pressure":1019.03,"sea_level":1023.72,"grnd_level":1019.03,"humidity":81},"wind":{"speed":6.18,"deg":39.5005},"clouds":{"all":92},"rain":{"3h":0.18},"dt":1432875909,"id":1850147,"name":"Tokyo","cod":200}

おおおっ…。と思いつつ、ちょっとした絶望感ありますね。人間には正直読みづらい。

jq

ここでjqコマンドの出番です。以前このブログでもご紹介したことがあります。ざっくり言うと、JSONを見やすく整形したり、特定の部分だけを切り出して表示してくれたりするツールです。

まずはインストール。Homebrewで一発です。

$ brew install jq
$ jq --version
jq-1.4

この状態で、JSONを吐き出すコマンドの後に、 | jq .を付与すれば、JSONに適切なインデントと改行がつきます。

$ curl -s http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp | jq .
{
  "coord": {
    "lon": 139.69,
    "lat": 35.69
  },
  "sys": {
    "message": 1.7314,
    "country": "JP",
    "sunrise": 1432841263,
    "sunset": 1432892970
  },
  "weather": [
    {
      "id": 500,
      "main": "Rain",
      "description": "light rain",
      "icon": "10d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 295.299,
    "temp_min": 295.299,
    "temp_max": 295.299,
    "pressure": 1019.03,
    "sea_level": 1023.72,
    "grnd_level": 1019.03,
    "humidity": 81
  },
  "wind": {
    "speed": 6.18,
    "deg": 39.5005
  },
  "clouds": {
    "all": 92
  },
  "rain": {
    "3h": 0.18
  },
  "dt": 1432875909,
  "id": 1850147,
  "name": "Tokyo",
  "cod": 200
}

おおお! 緯度経度、日の出日の入り時刻 *2、そして本日はRainですね。雨。気温295.299…、というのはどうやらケルビン(絶対零度)表示のようです。なので、ここから273.15を引きましょう。22.149。今日そんなに涼しいか?

ということで本日はこのへんで。

脚注

  1. 念のため、先頭の$はプロンプトを表しますので、自身で入力するのはcurl -s https://api.ipify.org?format=jsonの部分です。
  2. unixtimeですね…。