Apple WeatherKit(REST API)を使って、天気予報情報を取得してみる

Programming

天気予報を取得するAPIはいくつかあるのですが、無料というものは少ないようです。

Apple Developer Programの登録者であれば追加料金不要で使えるWeatherKitを触ってみましたので、そちらをご紹介します。AppleのAPIなのですが、SwiftなどのネイティブAPIに加え、REST APIも用意されているのが個人的には驚きでした。

スポンサーリンク

あらまし

以前、気象庁の天気予報をもとに蓄電池の充電時間を調整するという記事を書きました。

このとき課題に感じたのが、天気の「晴れ」「曇り」だけでは太陽光発電の出力をうまく見積もれないことです。
発電量は「どれだけ日が差すか」が重要なので、天気予報で言えば、空にどのくらい雲が出ているか、つまり「雲量」が分かると嬉しいわけです。

無料で使える天気APIをいくつか探してみましたが、雲量を取得できるサービスはほとんどが有料プランでの提供でした。
そんな中で、AppleがWeatherKitというAPIを提供していることを知りました。
Apple Developer Programの登録者であれば、月に50万回まで無料で利用できます公式ドキュメントを見ると雲量を含む豊富な項目が取得できるとのことだったので、試してみました。

スポンサーリンク

WeatherKitとは?

Appleが提供する天気APIで、iOSやmacOSのアプリから利用できるネイティブAPIだけでなく、REST APIも用意されています。
そのため、PythonやNode.jsなどを使ったCLIツールやウェブサービスからもアクセスできます。

特にデータソースを見ると、JMA、つまり日本の気象庁を含む複数のデータソースが使われており、日本国内でも実用的な精度が期待できそうです(以前の記事はOpenWeatherMapの精度が不安、と言及しました)。

スポンサーリンク

WeatherKitを利用するための事前準備

WeatherKitのREST APIを使うには、JWT(JSON Web Token)ベースの認証が必要です。
そのためには、Apple Developerアカウントにログインした上で「Private Key」と「Service ID」を作成しておく必要があります。

Request authentication for WeatherKit REST API | Apple Developer Documentation
Create a developer token to access weather data.

こちらの記述に従って作成していきましょう。

Apple Developer Programに登録

まず前提として、Apple Developer Program(年額99USDまたは現地通貨の同等額)に加入しておく必要があります。

Identifier (Service ID)の作成

  1. Apple Developer Center の中の、Identifiersページにアクセス
  2. 「+」をクリック
  1. 「Service IDs」を選択して「Continue」
  1. 任意の「Identifier(例: com.example.weatherkit-client)」と表示名を入力して「Continue」
  1. 「Register」で確定

このService ID(Identifierに入力したもの)は、あとでJWTを発行する際に iss(issuer)や sub(subject)として使います。

Key(Private Key)の作成

  1. Keys ページ にアクセス
  2. 「+」をクリックして新しいKeyを作成
  1. Key名を入力し、「WeatherKit」を有効にチェック
  1. 「Continue」→「Register」→「Download」で .p8 ファイルを保存

⚠️ この .p8 ファイル(Private Key)は一度しかダウンロードできないため、必ず安全な場所に保存しておきましょう

このとき発行された Key ID(kid)Team ID は、JWT生成時に必要になります。

4. 必要な情報の一覧

JWTの生成に必要となる情報は以下の通りです:

パラメータ用途取得元
key_idJWTヘッダーに記載Key作成時に表示される値
team_idApple DeveloperのTeam情報Apple Developerのプロフィール画面
service_idsubJWTのサブジェクト作成したService ID
private_key(.p8)JWT署名に使用作成時にダウンロードしたファイル

Pythonなどからこの情報を使ってJWTを生成すれば、REST APIの呼び出しが可能になります。
GitHubのサンプルコードではこのJWT生成処理も含めてありますので、ぜひそちらも参考にしてください。

スポンサーリンク

サンプルコード

百聞は一見にしかず。コードをGitHubに公開しました。

GitHub - hiroaki0923/WeatherKit-Samples
Contribute to hiroaki0923/WeatherKit-Samples development by creating an account on GitHub.

準備

.env.exampleファイルをコピーし、.envファイルを作成します。

その内容を、上記のPrivate KeyやService IDの情報に更新します。

# Apple Developer Account Settings
TEAM_ID=YOUR_TEAM_ID
KEY_ID=YOUR_KEY_ID  
SERVICE_ID=YOUR_SERVICE_ID
KEY_FILE=AuthKey_YOUR_KEY_ID.p8

また、ダウンロードしたPrivate Keyをこのプロジェクトのルートディレクトリに保管します。

実行方法

以下のコマンドを実行すると、WeatherKitで取得できる情報をコンソールに出力します。

(uvコマンドは必要に応じてインストールください)

% uv run python weatherkit_sample.py 35.68 139.76
=== データセット利用可能性の確認 ===
対象地点: (35.680000, 139.760000)
利用可能なデータセット: ['currentWeather', 'forecastDaily', 'forecastHourly', 'forecastNextHour']

取得するデータセット: currentWeather,forecastDaily,forecastHourly,forecastNextHour
=== 現在の天気 ===
気温: 26.1°C
体感温度: 26.1°C
天候: MostlyCloudy
雲量: 84%
湿度: 85%
風速: 16.8 m/s

=== 今後12時間の予報(日本時間) ===
=== 利用可能なフィールド分析(最初の時間データ) ===
Required fields:
✅ cloudCover: 0.81
✅ conditionCode: MostlyCloudy
✅ forecastStart: 2025-07-18T13:00:00Z
✅ humidity: 0.82
✅ precipitationChance: 0.0
✅ precipitationType: clear
✅ pressure: 1017.62
✅ temperature: 26.1
✅ temperatureApparent: 28.78
✅ uvIndex: 0
✅ visibility: 25018.0
✅ windSpeed: 16.51

Optional fields:
✅ daylight: False
✅ pressureTrend: rising
✅ temperatureDewPoint: 22.79
✅ windDirection: 182
✅ windGust: 31.33
✅ precipitationAmount: 0.0
✅ snowfallIntensity: 0.0
==================================================
07/18 22:00: 26.1°C, MostlyCloudy, 雲量: 81%
07/18 23:00: 25.8°C, MostlyCloudy, 雲量: 82%
07/19 00:00: 25.43°C, MostlyCloudy, 雲量: 82%
07/19 01:00: 25.29°C, MostlyCloudy, 雲量: 83%
07/19 02:00: 25.18°C, MostlyCloudy, 雲量: 78%
07/19 03:00: 24.95°C, PartlyCloudy, 雲量: 59%
07/19 04:00: 24.97°C, PartlyCloudy, 雲量: 57%
07/19 05:00: 25.18°C, MostlyCloudy, 雲量: 77%
07/19 06:00: 25.83°C, MostlyCloudy, 雲量: 79%
07/19 07:00: 27.06°C, MostlyCloudy, 雲量: 80%
07/19 08:00: 28.55°C, MostlyCloudy, 雲量: 75%
07/19 09:00: 29.88°C, Cloudy, 雲量: 92%

=== 今後7日間の予報 ===
=== 利用可能なフィールド分析(最初の日データ) ===
Required fields:
✅ conditionCode: MostlyCloudy
✅ forecastEnd: 2025-07-19T15:00:00Z
✅ forecastStart: 2025-07-18T15:00:00Z
✅ maxUvIndex: 7
✅ moonPhase: waningCrescent
✅ precipitationAmount: 0.0
✅ precipitationChance: 0.0
✅ precipitationType: clear
✅ snowfallAmount: 0.0
✅ temperatureMax: 32.49
✅ temperatureMin: 24.93

Optional fields:
✅ daytimeForecast: {...} (ネストされたオブジェクト)
✅ overnightForecast: {...} (ネストされたオブジェクト)
✅ moonrise: 2025-07-19T14:43:40Z
✅ moonset: 2025-07-19T04:22:59Z
✅ solarMidnight: 2025-07-19T14:47:29Z
✅ solarNoon: 2025-07-19T02:47:17Z
✅ sunrise: 2025-07-18T19:39:20Z
✅ sunset: 2025-07-19T09:55:07Z
✅ sunriseAstronomical: 2025-07-18T17:55:43Z
✅ sunriseCivil: 2025-07-18T19:10:12Z
✅ sunriseNautical: 2025-07-18T18:34:42Z
✅ sunsetAstronomical: 2025-07-19T11:38:34Z
✅ sunsetCivil: 2025-07-19T10:24:12Z
✅ sunsetNautical: 2025-07-19T10:59:39Z
==================================================
07/19 (Sat): 32.49°C / 24.93°C, MostlyCloudy
07/20 (Sun): 32.95°C / 24.84°C, PartlyCloudy
07/21 (Mon): 33.16°C / 24.81°C, PartlyCloudy
07/22 (Tue): 32.5°C / 25.28°C, PartlyCloudy
07/23 (Wed): 32.62°C / 25.03°C, Thunderstorms
07/24 (Thu): 31.86°C / 25.11°C, Thunderstorms
07/25 (Fri): 32.05°C / 24.89°C, Thunderstorms

=== 次1時間の詳細予報 ===
データポイント数: 88分間
最初のデータ: 降水確率 0%, 降水強度 0.0mm/h

Private Keyを使ってJWTも自動生成しますので、敷居は高くないと思います。

スポンサーリンク

どんな情報が取得できるか?

WeatherKitのAPIで取得できるデータはドキュメントに載っていますが、実際に返ってくるフィールドは地域によって異なるようです。おそらくデータソースが国によって異なるからでしょう。
東京(35.68, 139.76)で確認した結果を、「時間単位」と「日単位」それぞれについて、取得できた項目/できなかった項目に分けて表形式で整理しました。

結論としては、optionalなフィールド(以下の太字部分)も全て取得できました。気象庁優秀、ということなのでしょうかね?

時間別データ(HourlyWeatherConditions)

カテゴリフィールド名状態備考(値例など)
天候conditionCode✅ 取得可MostlyCloudy
時刻・日中判定forecastStart, daylight✅ 取得可13:00 UTC, False
気温・湿度temperature, temperatureApparent, temperatureDewPoint, humidity✅ 取得可26.1°C など
雲量cloudCover✅ 取得可0.81
降水・降雪precipitationChance, precipitationIntensity, precipitationType, precipitationAmount, snowfallIntensity, snowfallAmount✅ 取得可clear, 0.0 など
気圧・気圧傾向pressure, pressureTrend✅ 取得可1017.6 hPa, rising
視程visibility✅ 取得可約25km
風情報windSpeed, windDirection, windGust✅ 取得可16.5 km/h など
UV指数uvIndex✅ 取得可0

日別データ(DayWeatherConditions)

カテゴリフィールド名状態備考(値例など)
天候conditionCode✅ 取得可MostlyCloudy
時刻関連forecastStart, forecastEnd✅ 取得可ISO8601形式
気温temperatureMax, temperatureMin✅ 取得可32.4°C / 25.0°C
降水・降雪precipitationChance, precipitationAmount, precipitationType, snowfallAmount✅ 取得可0.0, clearなど
風情報windSpeedAvg, windSpeedMax, windGustSpeedMax✅ 取得可15.4 / 19.7 / 40.0 km/h
日照・月相sunrise, sunset, moonPhase, moonrise, moonset✅ 取得可waningCrescentなど
太陽情報(高度)solarNoon, solarMidnight✅ 取得可時刻形式
市民・航海・天文時sunriseCivil, sunriseNautical, sunriseAstronomical, sunsetCivil, sunsetNautical, sunsetAstronomical✅ 取得可
ネスト構造daytimeForecast, overnightForecast, restOfDayForecast✅ 取得可オブジェクト形式
スポンサーリンク

まとめ

Appleが提供するAPIということでネイティブアプリ向けの印象が強かったのですが、ご覧の通りREST APIを通じてサーバサイドやスクリプトからも柔軟に使うことができます。
特に日本国内でも雲量やUVインデックス、降水量といった詳細なデータが取得できるのは魅力です。

WeatherKitのためだけにApple Developer Programに登録するということはないと思いますが、すでに登録している方はぜひ活用してみてください。

今後はこのデータを活用して、発電量予測の精度を上げたり、蓄電池制御のロジックを改善したりしてみようと思います。

コメント

タイトルとURLをコピーしました