|
|
#!/usr/bin/env python3
|
|
|
"""
|
|
|
使用OpenWeatherMap API查询天气的示例代码
|
|
|
需要先注册获取API密钥:https://openweathermap.org/api
|
|
|
"""
|
|
|
|
|
|
import requests
|
|
|
import json
|
|
|
import sys
|
|
|
|
|
|
def get_weather_by_city(city_name, api_key, units="metric"):
|
|
|
"""
|
|
|
根据城市名称查询天气
|
|
|
|
|
|
Args:
|
|
|
city_name: 城市名称(如:"Beijing")
|
|
|
api_key: OpenWeatherMap API密钥
|
|
|
units: 温度单位,"metric"为摄氏度,"imperial"为华氏度
|
|
|
|
|
|
Returns:
|
|
|
天气数据的字典
|
|
|
"""
|
|
|
base_url = "http://api.openweathermap.org/data/2.5/weather"
|
|
|
|
|
|
params = {
|
|
|
"q": city_name,
|
|
|
"appid": api_key,
|
|
|
"units": units,
|
|
|
"lang": "zh_cn" # 中文返回
|
|
|
}
|
|
|
|
|
|
try:
|
|
|
response = requests.get(base_url, params=params, timeout=10)
|
|
|
response.raise_for_status()
|
|
|
return response.json()
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
print(f"请求错误: {e}")
|
|
|
return None
|
|
|
except json.JSONDecodeError as e:
|
|
|
print(f"JSON解析错误: {e}")
|
|
|
return None
|
|
|
|
|
|
def get_weather_by_coords(lat, lon, api_key, units="metric"):
|
|
|
"""
|
|
|
根据经纬度坐标查询天气
|
|
|
|
|
|
Args:
|
|
|
lat: 纬度
|
|
|
lon: 经度
|
|
|
api_key: OpenWeatherMap API密钥
|
|
|
units: 温度单位
|
|
|
|
|
|
Returns:
|
|
|
天气数据的字典
|
|
|
"""
|
|
|
base_url = "http://api.openweathermap.org/data/2.5/weather"
|
|
|
|
|
|
params = {
|
|
|
"lat": lat,
|
|
|
"lon": lon,
|
|
|
"appid": api_key,
|
|
|
"units": units,
|
|
|
"lang": "zh_cn"
|
|
|
}
|
|
|
|
|
|
try:
|
|
|
response = requests.get(base_url, params=params, timeout=10)
|
|
|
response.raise_for_status()
|
|
|
return response.json()
|
|
|
except requests.exceptions.RequestException as e:
|
|
|
print(f"请求错误: {e}")
|
|
|
return None
|
|
|
except json.JSONDecodeError as e:
|
|
|
print(f"JSON解析错误: {e}")
|
|
|
return None
|
|
|
|
|
|
def display_weather(weather_data):
|
|
|
"""
|
|
|
显示天气信息
|
|
|
|
|
|
Args:
|
|
|
weather_data: 天气数据字典
|
|
|
"""
|
|
|
if not weather_data or "cod" in weather_data and weather_data["cod"] != 200:
|
|
|
print("无法获取天气数据")
|
|
|
if weather_data and "message" in weather_data:
|
|
|
print(f"错误信息: {weather_data['message']}")
|
|
|
return
|
|
|
|
|
|
print("\n=== 天气信息 ===")
|
|
|
print(f"城市: {weather_data.get('name', '未知')}")
|
|
|
|
|
|
if "sys" in weather_data:
|
|
|
country = weather_data["sys"].get("country", "")
|
|
|
print(f"国家: {country}")
|
|
|
|
|
|
if "main" in weather_data:
|
|
|
main = weather_data["main"]
|
|
|
print(f"温度: {main.get('temp', '未知')}°C")
|
|
|
print(f"体感温度: {main.get('feels_like', '未知')}°C")
|
|
|
print(f"最低温度: {main.get('temp_min', '未知')}°C")
|
|
|
print(f"最高温度: {main.get('temp_max', '未知')}°C")
|
|
|
print(f"湿度: {main.get('humidity', '未知')}%")
|
|
|
print(f"气压: {main.get('pressure', '未知')} hPa")
|
|
|
|
|
|
if "weather" in weather_data and len(weather_data["weather"]) > 0:
|
|
|
weather = weather_data["weather"][0]
|
|
|
print(f"天气状况: {weather.get('description', '未知')}")
|
|
|
print(f"天气图标: http://openweathermap.org/img/wn/{weather.get('icon', '')}@2x.png")
|
|
|
|
|
|
if "wind" in weather_data:
|
|
|
wind = weather_data["wind"]
|
|
|
print(f"风速: {wind.get('speed', '未知')} m/s")
|
|
|
if "deg" in wind:
|
|
|
print(f"风向: {wind.get('deg', '未知')}°")
|
|
|
|
|
|
if "clouds" in weather_data:
|
|
|
print(f"云量: {weather_data['clouds'].get('all', '未知')}%")
|
|
|
|
|
|
if "visibility" in weather_data:
|
|
|
visibility = weather_data["visibility"]
|
|
|
if visibility >= 1000:
|
|
|
print(f"能见度: {visibility/1000:.1f} km")
|
|
|
else:
|
|
|
print(f"能见度: {visibility} m")
|
|
|
|
|
|
if "dt" in weather_data:
|
|
|
from datetime import datetime
|
|
|
dt = datetime.fromtimestamp(weather_data["dt"])
|
|
|
print(f"数据时间: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
|
|
|
|
if "timezone" in weather_data:
|
|
|
offset = weather_data["timezone"] / 3600
|
|
|
print(f"时区: UTC{offset:+g}")
|
|
|
|
|
|
def main():
|
|
|
"""
|
|
|
主函数:演示如何使用API
|
|
|
"""
|
|
|
print("OpenWeatherMap API 天气查询示例")
|
|
|
print("=" * 40)
|
|
|
|
|
|
# 您需要在这里填写您的API密钥
|
|
|
API_KEY = "YOUR_API_KEY_HERE" # 请替换为您的实际API密钥
|
|
|
|
|
|
if API_KEY == "YOUR_API_KEY_HERE":
|
|
|
print("\n⚠️ 请先注册OpenWeatherMap并获取API密钥:")
|
|
|
print(" https://openweathermap.org/api")
|
|
|
print("\n注册步骤:")
|
|
|
print("1. 访问 https://openweathermap.org/api")
|
|
|
print("2. 点击 'Subscribe' 或 'Sign Up'")
|
|
|
print("3. 注册免费账户(Current Weather Data API 免费套餐每天可调用60次)")
|
|
|
print("4. 在控制台获取您的API密钥")
|
|
|
print("\n获取API密钥后,请替换代码中的 'YOUR_API_KEY_HERE'")
|
|
|
return
|
|
|
|
|
|
# 示例:查询北京的天气
|
|
|
print("\n示例1:查询北京天气")
|
|
|
weather_data = get_weather_by_city("Beijing", API_KEY)
|
|
|
if weather_data:
|
|
|
display_weather(weather_data)
|
|
|
|
|
|
# 示例:使用经纬度查询(纽约的坐标)
|
|
|
print("\n" + "=" * 40)
|
|
|
print("示例2:使用经纬度查询纽约天气")
|
|
|
weather_data = get_weather_by_coords(40.7128, -74.0060, API_KEY)
|
|
|
if weather_data:
|
|
|
display_weather(weather_data)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
main() |