現在地の天気情報の取得その2

現在地の天気情報の取得その2

import requests
import json
from pprint import pprint
url = "https://api.openweathermap.org/data/2.5/weather?zip={zip_place}&units=metric&appid={API_key}"
# xxxxx
url = url.format(zip_place = "郵便番号,JP", API_key = "APIキー")

jsondata = requests.get(url).json()
pprint(jsondata)

print("天気:",jsondata["weather"][0]["main"])
print("天気詳細:",jsondata["weather"][0]["description"])

print("都市名:",jsondata["name"])
print("気温:",jsondata["main"]["temp"])
print("体感気温:",jsondata["main"]["feels_like"])
print("最低気温:",jsondata["main"]["temp_min"])
print("最高気温:",jsondata["main"]["temp_max"])
print("気圧:",jsondata["main"]["pressure"])
print("湿度:",jsondata["main"]["humidity"])

print("風速:",jsondata["wind"]["speed"])
print("風の方角:",jsondata["wind"]["deg"])

で実行すると

{'base': 'stations',
 'clouds': {'all': 0},
 'cod': 200,
 'coord': {'lat': 緯度, 'lon': 経度},
 'dt': 1701631236,
 'id': 0,
 'main': {'feels_like': 4.12,
          'humidity': 60,
          'pressure': 1021,
          'temp': 6.65,
          'temp_max': 6.65,
          'temp_min': 6.65},
 'name': 'Kawai',
 'sys': {'country': 'JP',
         'id': 2008260,
         'sunrise': 1701639567,
         'sunset': 1701675443,
         'type': 2},
 'timezone': 32400,
 'visibility': 10000,
 'weather': [{'description': 'clear sky',
              'icon': '01n',
              'id': 800,
              'main': 'Clear'}],
 'wind': {'deg': 288, 'gust': 5.36, 'speed': 3.58}}
天気: Clear
天気詳細: clear sky
都市名: 番地
気温: 6.65
体感気温: 4.12
最低気温: 6.65
最高気温: 6.65
気圧: 1021
湿度: 60
風速: 3.58
風の方角: 288

となる

デフォルトがだと気温が華氏で取得されます。摂氏を基準としたい場合はクエリに units=metric を含めます

これだと英語なので日本語で天気を取得したい

https://zenn.dev/masaru21/articles/d26519ec888f01
を元に

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>日本語のタイトル</title>
    <!--
    <link rel="stylesheet" href="/css/style.css" type="text/css">
    <script type="text/javascript" src="/js/main.js"></script>

    -->

  </head>
  <body>
  <script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
  <script>

  $(function() {
    var API_KEY = 'APIキー'
    var item_id = 'lat=35.2932718&lon=139.97671'
    
    var url = 'https://api.openweathermap.org/data/2.5/forecast?' + item_id + '&lang=ja&units=metric&appid=' + API_KEY

    $.ajax({
      url: url,
      dataType: "json",
      type: 'GET',
    })
    .done(function(data) {
      var insertHTML = "";
      var cityName = '<h2>' + data.city.name + '</h2>';
      $('#city-name').html(cityName);
      for (var i = 0; i <= 39; i = i + 8) {
        insertHTML += buildHTML(data, i);
      }
      $('#weather').html(insertHTML);
    })
    .fail(function(data) {
      console.log("失敗しました");
    });
  });

  function buildHTML(data, i) {
    var Week = new Array("(日)","(月)","(火)","(水)","(木)","(金)","(土)");
    var date = new Date (data.list[i].dt_txt);
    date.setHours(date.getHours() + 9);
    var month = date.getMonth()+1;
    var day = month + "月" + date.getDate() + "日" + Week[date.getDay()] + date.getHours() + ":00";
    var icon = data.list[i].weather[0].icon;
    var html =
    '<div class="weather-report">' +
      '<div id="cityname">' + data.city.name + '</div>' +
      '<img src="https://openweathermap.org/img/w/' + icon + '.png">' +
      '<div class="weather-date">' + day + '</div>' +
      '<div class="weather-main">'+ data.list[i].weather[0].description + '</div>' +
      '<div class="weather-temp">' + Math.round(data.list[i].main.temp) + '℃</div>' +
    '</div>';
    return html
  }

  </script>
  <style>
    .content {
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }

    .weather-report {
        margin-right: 20px;
        margin-left: 20px;
        float: left;
    }

  </style>   
    <div class="content">
      <div id="weather"></div>

    </div>
 

  </body>
</html>

をvscode の golive で実行してみた

これで5日間の天気が表示される
ただし、場所が

http://api.openweathermap.org/geo/1.0/direct?q=fukuokashi&limit=5&appid={API KEY}

で福岡に指定している

ソースの中で

 var item_id = 'lat=35.2932718&lon=139.97671'

で緯度経度を指定している

とりあえずchat GPT で日本語で天気を取得する方法を調べたら

Pythonの辞書を使って英語の天気の説明を日本語にマッピングする
英語から日本語への基本的な翻訳の辞書を作り
APIから取得した英語の天気説明を日本語に変換

書に含まれていない天気の条件には「不明」と表示されますが、必要に応じて辞書を拡張する

とのこと

# 天気の英語から日本語への翻訳辞書
weather_translation = {
    "Clear": "晴れ",
    "Clouds": "曇り",
    "Rain": "雨",
    "Snow": "雪",
    "Thunderstorm": "雷雨",
    "Drizzle": "霧雨",
    "Mist": "霧",
    "Fog": "濃霧"
}

# APIから取得した天気を翻訳する
weather_english = jsondata["weather"][0]["main"]
weather_japanese = weather_translation.get(weather_english, "不明")  # 辞書にない場合は「不明」と表示

print("天気(日本語):", weather_japanese)

この処理を加え

import requests
import json
from pprint import pprint
url = "https://api.openweathermap.org/data/2.5/weather?zip={zip_place}&units=metric&appid={API_key}"
# xxxxx
url = url.format(zip_place = "郵便番号,JP", API_key = "APIキー")

# 天気の英語から日本語への翻訳辞書
weather_translation = {
    "Clear": "晴れ",
    "Clouds": "曇り",
    "Rain": "雨",
    "Snow": "雪",
    "Thunderstorm": "雷雨",
    "Drizzle": "霧雨",
    "Mist": "霧",
    "Fog": "濃霧"
}


jsondata = requests.get(url).json()

# APIから取得した天気を翻訳する
weather_english = jsondata["weather"][0]["main"]
weather_japanese = weather_translation.get(weather_english, "不明")  # 辞書にない場合は「不明」と表示

pprint(jsondata)

# print("天気:",jsondata["weather"][0]["main"])
print("天気:",weather_japanese)

print("天気詳細:",jsondata["weather"][0]["description"])

print("都市名:",jsondata["name"])
print("気温:",jsondata["main"]["temp"])
print("体感気温:",jsondata["main"]["feels_like"])
print("最低気温:",jsondata["main"]["temp_min"])
print("最高気温:",jsondata["main"]["temp_max"])
print("気圧:",jsondata["main"]["pressure"])
print("湿度:",jsondata["main"]["humidity"])

print("風速:",jsondata["wind"]["speed"])
print("風の方角:",jsondata["wind"]["deg"])

とすることで天気が日本語になった

つまり自分で辞書を作成しないとだめ

とりあえず
* Clear sky(晴天)
* Few clouds(少し曇り)
* Scattered clouds(散らばった雲)
* Broken clouds(雲が多い)
* Overcast clouds(曇天)
* Light rain(小雨)
* Moderate rain(中雨)
* Heavy intensity rain(大雨)
* Very heavy rain(非常に激しい雨)
* Extreme rain(極端な雨)
* Freezing rain(凍雨)
* Light intensity shower rain(弱いにわか雨)
* Shower rain(にわか雨)
* Heavy intensity shower rain(激しいにわか雨)
* Ragged shower rain(不規則なにわか雨)
* Light snow(小雪)
* Snow(雪)
* Heavy snow(大雪)
* Sleet(みぞれ)
* Light shower sleet(軽いにわかみぞれ)
* Shower sleet(にわかみぞれ)
* Light rain and snow(小雨と雪)
* Rain and snow(雨と雪)
* Light shower snow(軽いにわか雪)
* Shower snow(にわか雪)
* Heavy shower snow(激しいにわか雪)
* Mist(靄)
* Smoke(煙)
* Haze(霞)
* Sand/ dust whirls(砂塵旋風)
* Fog(霧)
* Sand(砂)
* Dust(ほこり)
* Volcanic ash(火山灰)
* Squalls(スコール)
* Tornado(竜巻)
* Thunderstorm with light rain(雷雨と小雨)
* Thunderstorm with rain(雷雨)
* Thunderstorm with heavy rain(雷雨と大雨)
* Light thunderstorm(軽い雷雨)
* Thunderstorm(雷雨)
* Heavy thunderstorm(激しい雷雨)
* Ragged thunderstorm(不規則な雷雨)
* Thunderstorm with light drizzle(雷雨と弱い霧雨)
* Thunderstorm with drizzle(雷雨と霧雨)
* Thunderstorm with heavy drizzle(雷雨と激しい霧雨)

となるらしい

面倒なので

url = "https://api.openweathermap.org/data/2.5/weather?zip={zip_place}&units=metric&lang=ja&appid={API_key}"

としたら詳細天気は英語から日本語になったけど
天気は英語のままなのでやっぱり辞書は必要かも

とりあえず一日の最高気温と最低気温を取得したいのなら
もう少し処理が必要

import requests
import json
from datetime import datetime, timedelta

# OpenWeather APIのURLとパラメータを設定
url = "https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude=hourly,minutely&units=metric&appid={API_key}"
latitude = "緯度"  # 例としての緯度
longitude = "経度"  # 例としての経度
API_key = "YOUR_API_KEY"  # あなたのAPIキーをここに入力

# APIリクエスト
url = url.format(lat=latitude, lon=longitude, API_key=API_key)
response = requests.get(url)
jsondata = response.json()

# 今日の日付を取得
today = datetime.now().date()

# 今日の最高気温と最低気温を探す
for daily in jsondata["daily"]:
    date = datetime.fromtimestamp(daily["dt"]).date()
    if date == today:
        min_temp = daily["temp"]["min"]
        max_temp = daily["temp"]["max"]
        print("今日の最高気温:", max_temp, "度")
        print("今日の最低気温:", min_temp, "度")
        break

というように緯度経度で取得する

とりあえず日本語で天気取得できたので
これを音声にする