OpenWeather の API を使ってみた

サイトはこちらになります。

https://openweathermap.org/

世界各地のお天気情報を提供されているサイトで、一部無料で利用することができます。

## きっかけ

API 使ってみたいな～、使うなら何がいいかな～、天気情報とかにしてみるか～

## API が利用できるようになるまで

### 会員登録

API を利用するには会員登録が必要です。
トップページから `Sign In` タブをクリックし、 `Not registered? Create an Account.` のメッセージを見つけて新規登録画面に進みます。

そうすると、次のような画面になりますので、必要事項を記入し、チェックして次に進みます。
**16 歳以上であることが利用条件になりますのでご注意ください。**

![create_new_account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/7ebf9a01-82af-4a18-9756-37f602b2325f.png)

登録が完了すると E メールアドレスの認証と、利用目的の入力があります。

### API を購読する

トップページから `Pricing` をクリックします。

プランを選択する画面が出てきますが、今回は無料プランを使います。
`Free` の列の `Get API Key` をクリックします。

![pricing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/bca17d58-bd5c-9194-f5d7-464818a30b19.png)

### 使えるようになるまで待つ

サインインして `API Keys` の画面に進み、次のように API Key の一覧が表示されていれば成功です！

![key_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/e4d9f24d-7029-e9ab-1ffa-dec76b18ad86.png)

API を購読してから実際に使えるようになるまでは 10 分～ 2 時間ほどかかるようです。
しばらく待つか、また明日続きをやりましょう。
私は寝ます。

---

## 実際に使ってみる

おはようございます。よく眠れましたか？
早速 API を使っていきましょう！

### 現在の天気を取得する

`API_KEY` に自分の API Key を代入してやってみます。
取得するものは東京の現在の天気情報です。

```sh
API_KEY="自分の API Key"
# クエリパラメータに units=metric を含めることにより、気温を摂氏で表示します
curl -s "https://api.openweathermap.org/data/2.5/weather?q=Tokyo&units=metric&APPID=${API_KEY}"
```

- 出力例

かなり詳しく取得することができます。
最低気温と最高気温は謎ですが、その日のその時点のものと思われます（夜中に値を取得すると最低気温が更新されている様子が見えるかもしれません）。

```json-doc
{
  "coord": {
    "lon": 139.69, // 緯度
    "lat": 35.69 // 経度
  },
  "weather": [
    {
      "id": 802, // API の天気コード
      "main": "Clouds", // くもり
      "description": "scattered clouds", // 千切れ雲 (?)
      "icon": "03d" // 天気を表すアイコンのコード
    }
  ],
  "base": "stations", // 内部パラメータ
  "main": {
    "temp": 32.29, // 現在の気温
    "feels_like": 37.25, // 現在の体感気温
    "temp_min": 31.67, // 「現在の」最低気温
    "temp_max": 33, // 「現在の」最高気温
    "pressure": 1011, // 現在の気圧
    "humidity": 63 // 現在の湿度
  },
  "visibility": 10000, // 視界 (m)
  "wind": {
    "speed": 1.5, // 風速
    "deg": 100 // 風向 (北を基準に時計回り、この場合は東の風が吹いているということ)
  },
  "clouds": {
    "all": 40 // 雲量 (%)
  },
  "dt": 1599020768, // タイムスタンプ
  "sys": {
    "type": 1, // 内部パラメータ
    "id": 8077, // 内部パラメータ
    "country": "JP", // 国コード
    "sunrise": 1598991250, // 日の出のタイムスタンプ
    "sunset": 1599037690 // 日の入りのタイムスタンプ
  },
  "timezone": 32400, // 世界標準時からの差 (秒)
  "id": 1850144, // 都市 ID
  "name": "Tokyo", // 都市名
  "cod": 200 // レスポンスコード
}
```

### 天気予報を表示する

One Call API というものを使用します。
下記は東京の 1 時間ごと天気予報を表示するリクエストです。

```sh
# 緯度と経度を指定しなければならない
# 1 時間ごとの表示をするためには minutely,daily を表示しないというリクエストを送る必要がある
curl -s "https://api.openweathermap.org/data/2.5/onecall?lat=35.69&lon=139.69&exclude=minutely,daily&appid=${API_KEY}"
```

- 出力例

```json
{
  "lat": 35.69,
  "lon": 139.69,
  "timezone": "Asia/Tokyo",
  "timezone_offset": 32400,
  "current": {
    "dt": 1599022984,
    "sunrise": 1598991250,
    "sunset": 1599037690,
    "temp": 305.46,
    "feels_like": 310.43,
    "pressure": 1011,
    "humidity": 63,
    "dew_point": 297.51,
    "uvi": 9.57,
    "clouds": 40,
    "visibility": 10000,
    "wind_speed": 1.5,
    "wind_deg": 100,
    "weather": [
      {
        "id": 802,
        "main": "Clouds",
        "description": "scattered clouds",
        "icon": "03d"
      }
    ],
    "rain": {}
  },
  "hourly": [
    {
      "dt": 1599022800,
      "temp": 305.46,
      "feels_like": 308.76,
      "pressure": 1011,
      "humidity": 63,
      "dew_point": 297.51,
      "clouds": 40,
      "visibility": 10000,
      "wind_speed": 3.89,
      "wind_deg": 102,
      "weather": [
        {
          "id": 500,
          "main": "Rain",
          "description": "light rain",
          "icon": "10d"
        }
      ],
      "pop": 0.72,
      "rain": {
        "1h": 0.97
      }
    },
```

2020 年 9 月 2 日現在の無料プランでは、 1 時間ごとの予報は 2 日先まで表示することができます。

## 使ってみて

今回紹介したのはほんの一部の機能です。
無料プランによる制限は API 呼び出し回数が中心で、基本的には詳細なデータが取得できます。
機会があったら天気に関するアプリなど作成出来たらいいですね。