lty/qy_lty/weather_test.py
2026-03-17 13:17:02 +08:00

208 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
import json
from datetime import datetime
class QWeatherAPI:
def __init__(self, api_key):
self.api_key = api_key
self.base_url = "https://devapi.qweather.com/v7/weather/now"
self.geo_url = "https://geoapi.qweather.com/v2/city/lookup"
def verify_api_key(self):
"""
验证API密钥是否有效
"""
try:
# 使用一个简单的城市ID测试API
test_params = {
"location": "101010100", # 北京的城市ID
"key": self.api_key
}
response = requests.get(self.base_url, params=test_params)
data = response.json()
if data["code"] == "402":
print("错误: API密钥无效或已过期")
print("请检查:")
print("1. API密钥是否正确")
print("2. 是否使用了正确的API版本开发版/正式版)")
print("3. API密钥是否已过期")
return False
elif data["code"] == "200":
return True
else:
print(f"API返回错误: {data['code']}")
return False
except Exception as e:
print(f"验证API密钥时发生错误: {e}")
return False
def search_city(self, location_name, range=None, number=1):
"""
搜索城市
:param location_name: 城市名称,如 "北京""上海"
:param range: 搜索范围使用ISO 3166国家代码"cn"
:param number: 返回结果数量范围1-20默认1
:return: 城市信息列表
"""
try:
params = {
"location": location_name,
"key": self.api_key,
"number": min(max(1, number), 20) # 确保number在1-20之间
}
# 添加可选参数
if range:
params["range"] = range
response = requests.get(self.geo_url, params=params)
response.raise_for_status()
data = response.json()
if data["code"] == "402":
print(data)
print("错误: API密钥无效或已过期")
print("请检查:")
print("1. API密钥是否正确")
print("2. 是否使用了正确的API版本开发版/正式版)")
print("3. API密钥是否已过期")
return None
elif data["code"] != "200":
print(f"城市查询API返回错误: {data['code']}")
return None
return data.get("location", [])
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
return None
except Exception as e:
print(f"未知错误: {e}")
return None
def get_weather(self, location):
"""
获取实时天气数据
:param location: 城市ID或经纬度坐标"101010100""116.41,39.92"
:return: 天气数据字典
"""
try:
params = {
"location": location,
"key": self.api_key
}
response = requests.get(self.base_url, params=params)
response.raise_for_status() # 检查HTTP错误
data = response.json()
if data["code"] == "402":
print("错误: API密钥无效或已过期")
print("请检查:")
print("1. API密钥是否正确")
print("2. 是否使用了正确的API版本开发版/正式版)")
print("3. API密钥是否已过期")
return None
elif data["code"] != "200":
print(f"API返回错误: {data['code']}")
return None
return data
except requests.exceptions.RequestException as e:
print(f"请求错误: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
return None
except Exception as e:
print(f"未知错误: {e}")
return None
def format_weather_data(data, city_info):
"""
格式化天气数据为易读的格式
"""
if not data or "now" not in data:
return "无法获取天气数据"
now = data["now"]
return f"""
城市信息:
名称: {city_info['name']}
所属地区: {city_info.get('adm2', 'N/A')}
所属省份: {city_info.get('adm1', 'N/A')}
所属国家: {city_info.get('country', 'N/A')}
实时天气信息:
观测时间: {now['obsTime']}
温度: {now['temp']}°C
体感温度: {now['feelsLike']}°C
天气状况: {now['text']}
风向: {now['windDir']}
风力等级: {now['windScale']}
风速: {now['windSpeed']}km/h
相对湿度: {now['humidity']}%
降水量: {now['precip']}mm
大气压强: {now['pressure']}hPa
能见度: {now['vis']}km
云量: {now['cloud']}%
露点温度: {now['dew']}°C
"""
def format_city_info(city):
"""
格式化城市信息
"""
return f"""
城市信息:
名称: {city['name']}
ID: {city['id']}
经度: {city['lon']}
纬度: {city['lat']}
所属地区: {city.get('adm2', 'N/A')}
所属省份: {city.get('adm1', 'N/A')}
所属国家: {city.get('country', 'N/A')}
时区: {city.get('tz', 'N/A')}
"""
def main():
# 替换为您的API密钥
API_KEY = "cad07d0a5866405ba0084f559efdf911"
qweather = QWeatherAPI(API_KEY)
# 首先验证API密钥
if not qweather.verify_api_key():
print("\n请更新API密钥后重试")
return
# 测试城市搜索
city_name = input("请输入要查询的城市名称: ")
# 直接搜索中国城市
cities = qweather.search_city(city_name, range="cn")
if cities and len(cities) > 0:
selected_city = cities[0] # 直接选择第一个匹配的城市
print(f"\n已选择城市: {selected_city['name']}")
# 获取选中城市的天气
weather_data = qweather.get_weather(selected_city['id'])
if weather_data:
print(format_weather_data(weather_data, selected_city))
else:
print("获取天气数据失败")
else:
print("未找到匹配的城市")
if __name__ == "__main__":
main()