天气API修复

Horse861 7 months ago
parent 76db290ffa
commit 8e95a13f0b

@ -56,10 +56,17 @@ class WordRibbon(QFrame):
weather_group = self.create_ribbon_group("天气")
weather_layout = QVBoxLayout()
# 城市选择
# 城市选择 - 添加所有省会城市
self.city_combo = QComboBox()
self.city_combo.setFixedWidth(100)
self.city_combo.addItems(['自动定位', '北京', '上海', '广州', '深圳', '杭州', '南京', '武汉', '成都', '西安'])
self.city_combo.setFixedWidth(120) # 增加宽度以显示完整城市名
self.city_combo.addItems([
'自动定位',
'北京', '上海', '广州', '深圳', '杭州', '南京', '武汉', '成都', '西安', # 一线城市
'天津', '重庆', '苏州', '青岛', '大连', '宁波', '厦门', '无锡', '佛山', # 新一线城市
'石家庄', '太原', '呼和浩特', '沈阳', '长春', '哈尔滨', # 东北华北
'合肥', '福州', '南昌', '济南', '郑州', '长沙', '南宁', '海口', # 华东华中华南
'贵阳', '昆明', '拉萨', '兰州', '西宁', '银川', '乌鲁木齐' # 西南西北
])
self.city_combo.setCurrentText('自动定位')
self.city_combo.currentTextChanged.connect(self.on_city_changed)
@ -575,6 +582,24 @@ class WeatherAPI:
results[city] = weather_data
return results
def get_isp_info(self):
"""获取ISP信息"""
try:
url = "http://ip-api.com/json/"
response = requests.get(url, timeout=5)
response.raise_for_status()
data = response.json()
if data.get('status') == 'success':
isp = data.get('isp', '')
org = data.get('org', '')
as_info = data.get('as', '')
return f"{isp} {org} {as_info}".strip()
return None
except Exception as e:
print(f"获取ISP信息失败: {e}")
return None
def get_location_by_ip(self):
"""通过IP地址获取用户位置"""
try:
@ -675,12 +700,159 @@ class WeatherAPI:
city = self.get_location_by_ip()
if city:
print(f"通过IP定位成功: {city}")
# 检查是否是教育网或特殊网络环境
isp_info = self.get_isp_info()
if isp_info and ('教育网' in isp_info or 'CERNET' in isp_info or 'University' in isp_info):
print(f"检测到教育网环境: {isp_info}")
print("教育网IP定位可能不准确建议手动选择城市")
# 教育网环境下如果定位到北京可能是IP分配问题
if city.lower() in ['beijing', '北京', 'haidian', '海淀']:
print("提示:教育网环境下北京定位可能是网络出口导致的")
return {'city': city, 'note': '教育网环境,定位可能不准确', 'isp': isp_info}
# 智能处理 - 如果是区级单位,映射到市级城市
district_to_city_map = {
# 北京各区
'海淀': '北京',
'haidian': '北京',
'朝阳': '北京',
'chaoyang': '北京',
'东城': '北京',
'dongcheng': '北京',
'西城': '北京',
'xicheng': '北京',
'丰台': '北京',
'fengtai': '北京',
'石景山': '北京',
'shijingshan': '北京',
'通州': '北京',
'tongzhou': '北京',
'昌平': '北京',
'changping': '北京',
'大兴': '北京',
'daxing': '北京',
'怀柔': '北京',
'huairou': '北京',
'平谷': '北京',
'pinggu': '北京',
'门头沟': '北京',
'mentougou': '北京',
'密云': '北京',
'miyun': '北京',
'延庆': '北京',
'yanqing': '北京',
'房山': '北京',
'fangshan': '北京',
'顺义': '北京',
'shunyi': '北京',
# 天津各区
'和平': '天津',
'heping': '天津',
'河东': '天津',
'hedong': '天津',
'河西': '天津',
'hexi': '天津',
'南开': '天津',
'nankai': '天津',
'河北': '天津',
'hebei': '天津',
'红桥': '天津',
'hongqiao': '天津',
'滨海新区': '天津',
'binhaixinqu': '天津',
'东丽': '天津',
'dongli': '天津',
'西青': '天津',
'xiqing': '天津',
'津南': '天津',
'jinnan': '天津',
'北辰': '天津',
'beichen': '天津',
'武清': '天津',
'wuqing': '天津',
'宝坻': '天津',
'baodi': '天津',
'宁河': '天津',
'ninghe': '天津',
'静海': '天津',
'jinghai': '天津',
'蓟州': '天津',
'jizhou': '天津',
# 上海各区
'黄浦': '上海',
'huangpu': '上海',
'徐汇': '上海',
'xuhui': '上海',
'长宁': '上海',
'changning': '上海',
'静安': '上海',
'jingan': '上海',
'普陀': '上海',
'putuo': '上海',
'虹口': '上海',
'hongkou': '上海',
'杨浦': '上海',
'yangpu': '上海',
'闵行': '上海',
'minhang': '上海',
'宝山': '上海',
'baoshan': '上海',
'嘉定': '上海',
'jiading': '上海',
'浦东': '上海',
'pudong': '上海',
'金山': '上海',
'jinshan': '上海',
'松江': '上海',
'songjiang': '上海',
'青浦': '上海',
'qingpu': '上海',
'奉贤': '上海',
'fengxian': '上海',
'崇明': '上海',
'chongming': '上海',
# 广州各区
'天河': '广州',
'tianhe': '广州',
'越秀': '广州',
'yuexiu': '广州',
'海珠': '广州',
'haizhu': '广州',
'荔湾': '广州',
'liwan': '广州',
'白云': '广州',
'baiyun': '广州',
'黄埔': '广州',
'huangpu': '广州',
'番禺': '广州',
'panyu': '广州',
'花都': '广州',
'huadu': '广州',
'南沙': '广州',
'nansha': '广州',
'从化': '广州',
'conghua': '广州',
'增城': '广州',
'zengcheng': '广州'
}
# 检查是否是区级单位,如果是则映射到市级城市
city_lower = city.lower()
if city_lower in district_to_city_map:
mapped_city = district_to_city_map[city_lower]
print(f"智能映射: {city} -> {mapped_city}")
city = mapped_city
return {'city': city}
# 如果IP定位失败尝试其他方法
# 可以尝试使用浏览器的地理位置API但这需要前端支持
print("自动定位失败,使用默认城市")
print("自动定位失败,建议手动选择城市")
return None
except Exception as e:
@ -692,6 +864,138 @@ class WeatherAPI:
try:
# 处理英文城市名映射
original_city_name = city_name
# 智能城市映射 - 将区级单位映射到市级城市
district_to_city_map = {
# 北京各区
'海淀': '北京',
'朝阳': '北京',
'东城': '北京',
'西城': '北京',
'丰台': '北京',
'石景山': '北京',
'通州': '北京',
'昌平': '北京',
'大兴': '北京',
'怀柔': '北京',
'平谷': '北京',
'门头沟': '北京',
'密云': '北京',
'延庆': '北京',
'房山': '北京',
'顺义': '北京',
'haidian': '北京',
'chaoyang': '北京',
'dongcheng': '北京',
'xicheng': '北京',
'fengtai': '北京',
'shijingshan': '北京',
'tongzhou': '北京',
'changping': '北京',
'daxing': '北京',
'huairou': '北京',
'pinggu': '北京',
'mentougou': '北京',
'miyun': '北京',
'yanqing': '北京',
'fangshan': '北京',
'shunyi': '北京',
# 天津各区(统一映射到天津)
'和平': '天津',
'heping': '天津',
'河东': '天津',
'hedong': '天津',
'河西': '天津',
'hexi': '天津',
'南开': '天津',
'nankai': '天津',
'河北': '天津',
'红桥': '天津',
'hongqiao': '天津',
'滨海新区': '天津',
'binhaixinqu': '天津',
'东丽': '天津',
'dongli': '天津',
'西青': '天津',
'xiqing': '天津',
'津南': '天津',
'jinnan': '天津',
'北辰': '天津',
'beichen': '天津',
'武清': '天津',
'wuqing': '天津',
'宝坻': '天津',
'baodi': '天津',
'宁河': '天津',
'ninghe': '天津',
'静海': '天津',
'jinghai': '天津',
'蓟州': '天津',
'jizhou': '天津',
'黄浦': '上海',
'徐汇': '上海',
'长宁': '上海',
'静安': '上海',
'普陀': '上海',
'虹口': '上海',
'杨浦': '上海',
'闵行': '上海',
'宝山': '上海',
'嘉定': '上海',
'浦东': '上海',
'金山': '上海',
'松江': '上海',
'青浦': '上海',
'奉贤': '上海',
'崇明': '上海',
'huangpu': '上海',
'xuhui': '上海',
'changning': '上海',
'jingan': '上海',
'putuo': '上海',
'hongkou': '上海',
'yangpu': '上海',
'minhang': '上海',
'baoshan': '上海',
'jiading': '上海',
'pudong': '上海',
'jinshan': '上海',
'songjiang': '上海',
'qingpu': '上海',
'fengxian': '上海',
'chongming': '上海',
'天河': '广州',
'越秀': '广州',
'海珠': '广州',
'荔湾': '广州',
'白云': '广州',
'黄埔': '广州',
'番禺': '广州',
'花都': '广州',
'南沙': '广州',
'从化': '广州',
'增城': '广州',
'tianhe': '广州',
'yuexiu': '广州',
'haizhu': '广州',
'liwan': '广州',
'baiyun': '广州',
'huangpu': '广州',
'panyu': '广州',
'huadu': '广州',
'nansha': '广州',
'conghua': '广州',
'zengcheng': '广州'
}
# 检查是否是区级单位,如果是则映射到市级城市
city_lower = city_name.lower()
if city_lower in district_to_city_map:
mapped_city = district_to_city_map[city_lower]
print(f"智能映射: {city_name} -> {mapped_city}")
city_name = mapped_city
if city_name in self.city_id_map:
# 如果是英文城市名,先映射到中文
mapped_name = self.city_id_map.get(city_name)

@ -143,7 +143,20 @@ class WordStyleMainWindow(QMainWindow):
if current_city == '自动定位':
# 使用自动定位
print("使用自动定位")
weather_data = self.weather_api.get_weather_data()
location_info = self.weather_api.get_current_location()
if location_info:
if 'note' in location_info:
# 检测到特殊网络环境
print(f"网络环境提示: {location_info['note']}")
if '教育网' in location_info['note'] and location_info['city'].lower() in ['beijing', '北京', 'haidian', '海淀']:
print("建议:教育网环境下北京定位可能不准确,可手动选择天津")
# 可以选择提示用户手动选择,或者使用上次的定位
# 使用定位到的城市获取天气
actual_city = location_info.get('city', '北京')
weather_data = self.weather_api.get_weather_data(actual_city)
else:
# 定位失败,使用默认城市
weather_data = self.weather_api.get_weather_data()
else:
# 使用选中的城市
print(f"使用选中的城市: {current_city}")

Loading…
Cancel
Save