現在地の天気情報の取得その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
というように緯度経度で取得する
とりあえず日本語で天気取得できたので
これを音声にする