代码拉取完成,页面将自动刷新
# weather_api.py - 服务器专用精简版,不含任何 GUI 代码
import requests
import math
from datetime import datetime, timedelta
# ==================== 全国150+城市坐标 ====================
# 从你的 test.py 中复制完整的 ALL_CITIES 字典到下面
ALL_CITIES = {
# ===== 直辖市 =====
"北京": {"lat": 39.9042, "lon": 116.4074, "province": "北京"},
"上海": {"lat": 31.2304, "lon": 121.4737, "province": "上海"},
"天津": {"lat": 39.0841, "lon": 117.2010, "province": "天津"},
"重庆": {"lat": 29.4316, "lon": 106.9123, "province": "重庆"},
# ===== 河北 =====
"石家庄": {"lat": 38.0423, "lon": 114.5149, "province": "河北"},
"唐山": {"lat": 39.6500, "lon": 118.1750, "province": "河北"},
"秦皇岛": {"lat": 39.9354, "lon": 119.5884, "province": "河北"},
"邯郸": {"lat": 36.6107, "lon": 114.4907, "province": "河北"},
"邢台": {"lat": 37.0695, "lon": 114.5611, "province": "河北"},
"保定": {"lat": 38.8677, "lon": 115.4850, "province": "河北"},
"张家口": {"lat": 40.7690, "lon": 114.8841, "province": "河北"},
"承德": {"lat": 40.9762, "lon": 117.9392, "province": "河北"},
# ===== 山西 =====
"太原": {"lat": 37.8706, "lon": 112.5489, "province": "山西"},
"大同": {"lat": 40.0768, "lon": 113.3001, "province": "山西"},
"阳泉": {"lat": 37.8576, "lon": 113.5833, "province": "山西"},
"长治": {"lat": 36.1941, "lon": 113.1160, "province": "山西"},
"晋城": {"lat": 35.4976, "lon": 112.8456, "province": "山西"},
"临汾": {"lat": 36.0880, "lon": 111.5190, "province": "山西"},
"运城": {"lat": 35.0269, "lon": 111.0029, "province": "山西"},
# ===== 内蒙古 =====
"呼和浩特": {"lat": 40.8424, "lon": 111.7492, "province": "内蒙古"},
"包头": {"lat": 40.6210, "lon": 109.8402, "province": "内蒙古"},
"乌海": {"lat": 39.6522, "lon": 106.7942, "province": "内蒙古"},
"赤峰": {"lat": 42.2671, "lon": 118.9580, "province": "内蒙古"},
"通辽": {"lat": 43.6523, "lon": 122.2649, "province": "内蒙古"},
"鄂尔多斯": {"lat": 39.6084, "lon": 109.7809, "province": "内蒙古"},
"呼伦贝尔": {"lat": 49.2118, "lon": 119.7658, "province": "内蒙古"},
# ===== 辽宁 =====
"沈阳": {"lat": 41.8057, "lon": 123.4315, "province": "辽宁"},
"大连": {"lat": 38.9140, "lon": 121.6147, "province": "辽宁"},
"鞍山": {"lat": 41.1078, "lon": 122.9956, "province": "辽宁"},
"抚顺": {"lat": 41.8681, "lon": 123.9258, "province": "辽宁"},
"本溪": {"lat": 41.2924, "lon": 123.7636, "province": "辽宁"},
"锦州": {"lat": 41.0966, "lon": 121.1312, "province": "辽宁"},
"丹东": {"lat": 40.0056, "lon": 124.3547, "province": "辽宁"},
"营口": {"lat": 40.6662, "lon": 122.2352, "province": "辽宁"},
"盘锦": {"lat": 41.1199, "lon": 122.0708, "province": "辽宁"},
# ===== 吉林 =====
"长春": {"lat": 43.8171, "lon": 125.3235, "province": "吉林"},
"吉林市": {"lat": 43.8378, "lon": 126.5495, "province": "吉林"},
"四平": {"lat": 43.1682, "lon": 124.3700, "province": "吉林"},
"辽源": {"lat": 42.9027, "lon": 125.1442, "province": "吉林"},
"通化": {"lat": 41.7291, "lon": 125.9369, "province": "吉林"},
"白山": {"lat": 41.9400, "lon": 126.4250, "province": "吉林"},
"松原": {"lat": 45.1411, "lon": 124.8232, "province": "吉林"},
"延边": {"lat": 42.8916, "lon": 129.5087, "province": "吉林"},
# ===== 黑龙江 =====
"哈尔滨": {"lat": 45.8038, "lon": 126.5350, "province": "黑龙江"},
"齐齐哈尔": {"lat": 47.3543, "lon": 123.9182, "province": "黑龙江"},
"鸡西": {"lat": 45.2951, "lon": 130.9691, "province": "黑龙江"},
"鹤岗": {"lat": 47.3499, "lon": 130.2900, "province": "黑龙江"},
"双鸭山": {"lat": 46.6466, "lon": 131.1540, "province": "黑龙江"},
"大庆": {"lat": 46.5907, "lon": 125.1122, "province": "黑龙江"},
"伊春": {"lat": 47.7266, "lon": 128.8420, "province": "黑龙江"},
"佳木斯": {"lat": 46.7995, "lon": 130.3155, "province": "黑龙江"},
"牡丹江": {"lat": 44.5533, "lon": 129.6195, "province": "黑龙江"},
"黑河": {"lat": 50.2403, "lon": 127.5288, "province": "黑龙江"},
"绥化": {"lat": 46.6522, "lon": 126.9700, "province": "黑龙江"},
# ===== 江苏 =====
"南京": {"lat": 32.0603, "lon": 118.7969, "province": "江苏"},
"苏州": {"lat": 31.2990, "lon": 120.5853, "province": "江苏"},
"无锡": {"lat": 31.4912, "lon": 120.3119, "province": "江苏"},
"常州": {"lat": 31.8107, "lon": 119.9741, "province": "江苏"},
"南通": {"lat": 32.0145, "lon": 120.8738, "province": "江苏"},
"徐州": {"lat": 34.2057, "lon": 117.2836, "province": "江苏"},
"扬州": {"lat": 32.3932, "lon": 119.4210, "province": "江苏"},
"镇江": {"lat": 32.2000, "lon": 119.4550, "province": "江苏"},
"泰州": {"lat": 32.4555, "lon": 119.9200, "province": "江苏"},
"盐城": {"lat": 33.3781, "lon": 120.1630, "province": "江苏"},
# ===== 浙江 =====
"杭州": {"lat": 30.2741, "lon": 120.1551, "province": "浙江"},
"宁波": {"lat": 29.8683, "lon": 121.5440, "province": "浙江"},
"温州": {"lat": 28.0000, "lon": 120.7000, "province": "浙江"},
"嘉兴": {"lat": 30.7460, "lon": 120.7580, "province": "浙江"},
"湖州": {"lat": 30.8940, "lon": 120.1020, "province": "浙江"},
"绍兴": {"lat": 30.0300, "lon": 120.5800, "province": "浙江"},
"金华": {"lat": 29.1030, "lon": 119.6470, "province": "浙江"},
"衢州": {"lat": 28.9360, "lon": 118.8760, "province": "浙江"},
"舟山": {"lat": 29.9900, "lon": 122.2050, "province": "浙江"},
"台州": {"lat": 28.6560, "lon": 121.4210, "province": "浙江"},
"丽水": {"lat": 28.4670, "lon": 119.9230, "province": "浙江"},
# ===== 安徽 =====
"合肥": {"lat": 31.8206, "lon": 117.2272, "province": "安徽"},
"芜湖": {"lat": 31.3527, "lon": 118.3760, "province": "安徽"},
"蚌埠": {"lat": 32.9394, "lon": 117.3600, "province": "安徽"},
"淮南": {"lat": 32.6260, "lon": 116.9990, "province": "安徽"},
"马鞍山": {"lat": 31.6700, "lon": 118.5000, "province": "安徽"},
"淮北": {"lat": 33.9600, "lon": 116.7980, "province": "安徽"},
"铜陵": {"lat": 30.9440, "lon": 117.8120, "province": "安徽"},
"安庆": {"lat": 30.5250, "lon": 117.0500, "province": "安徽"},
"黄山": {"lat": 29.7200, "lon": 118.3100, "province": "安徽"},
"滁州": {"lat": 32.3200, "lon": 118.3300, "province": "安徽"},
"阜阳": {"lat": 32.8900, "lon": 115.8100, "province": "安徽"},
# ===== 福建 =====
"福州": {"lat": 26.0745, "lon": 119.2965, "province": "福建"},
"厦门": {"lat": 24.4798, "lon": 118.0894, "province": "福建"},
"莆田": {"lat": 25.4540, "lon": 119.0070, "province": "福建"},
"泉州": {"lat": 24.8740, "lon": 118.6760, "province": "福建"},
"漳州": {"lat": 24.5090, "lon": 117.6470, "province": "福建"},
"龙岩": {"lat": 25.0750, "lon": 117.0170, "province": "福建"},
"宁德": {"lat": 26.6660, "lon": 119.5470, "province": "福建"},
"三明": {"lat": 26.2650, "lon": 117.6390, "province": "福建"},
"南平": {"lat": 26.6400, "lon": 118.1770, "province": "福建"},
# ===== 江西 =====
"南昌": {"lat": 28.6820, "lon": 115.8579, "province": "江西"},
"九江": {"lat": 29.7000, "lon": 116.0000, "province": "江西"},
"景德镇": {"lat": 29.2670, "lon": 117.1830, "province": "江西"},
"萍乡": {"lat": 27.6170, "lon": 113.8500, "province": "江西"},
"赣州": {"lat": 25.8300, "lon": 114.9300, "province": "江西"},
"吉安": {"lat": 27.1167, "lon": 114.9833, "province": "江西"},
"宜春": {"lat": 27.8000, "lon": 114.3830, "province": "江西"},
"上饶": {"lat": 28.4530, "lon": 117.9670, "province": "江西"},
# ===== 山东 =====
"济南": {"lat": 36.6512, "lon": 117.1201, "province": "山东"},
"青岛": {"lat": 36.0671, "lon": 120.3826, "province": "山东"},
"淄博": {"lat": 36.8130, "lon": 118.0550, "province": "山东"},
"枣庄": {"lat": 34.8100, "lon": 117.3200, "province": "山东"},
"东营": {"lat": 37.4300, "lon": 118.6700, "province": "山东"},
"烟台": {"lat": 37.4635, "lon": 121.4479, "province": "山东"},
"潍坊": {"lat": 36.7050, "lon": 119.1620, "province": "山东"},
"济宁": {"lat": 35.4000, "lon": 116.5800, "province": "山东"},
"泰安": {"lat": 36.2000, "lon": 117.0800, "province": "山东"},
"威海": {"lat": 37.5130, "lon": 122.1220, "province": "山东"},
"临沂": {"lat": 35.1050, "lon": 118.3500, "province": "山东"},
"德州": {"lat": 37.4500, "lon": 116.3000, "province": "山东"},
"聊城": {"lat": 36.4500, "lon": 116.0000, "province": "山东"},
"滨州": {"lat": 37.3830, "lon": 118.0330, "province": "山东"},
"菏泽": {"lat": 35.2400, "lon": 115.4300, "province": "山东"},
# ===== 河南 =====
"郑州": {"lat": 34.7566, "lon": 113.6253, "province": "河南"},
"开封": {"lat": 34.7973, "lon": 114.3073, "province": "河南"},
"洛阳": {"lat": 34.6181, "lon": 112.4540, "province": "河南"},
"平顶山": {"lat": 33.7350, "lon": 113.2930, "province": "河南"},
"安阳": {"lat": 36.1030, "lon": 114.3520, "province": "河南"},
"鹤壁": {"lat": 35.9000, "lon": 114.2000, "province": "河南"},
"新乡": {"lat": 35.3030, "lon": 113.9270, "province": "河南"},
"焦作": {"lat": 35.2400, "lon": 113.2400, "province": "河南"},
"濮阳": {"lat": 35.7600, "lon": 115.0700, "province": "河南"},
"许昌": {"lat": 34.0300, "lon": 113.8500, "province": "河南"},
"漯河": {"lat": 33.5800, "lon": 114.0200, "province": "河南"},
"三门峡": {"lat": 34.7700, "lon": 111.2000, "province": "河南"},
"南阳": {"lat": 32.9900, "lon": 112.5300, "province": "河南"},
"商丘": {"lat": 34.4200, "lon": 115.6500, "province": "河南"},
"信阳": {"lat": 32.1200, "lon": 114.0700, "province": "河南"},
"周口": {"lat": 33.6200, "lon": 114.6500, "province": "河南"},
"驻马店": {"lat": 32.9800, "lon": 114.0200, "province": "河南"},
# ===== 湖北 =====
"武汉": {"lat": 30.5928, "lon": 114.3055, "province": "湖北"},
"黄石": {"lat": 30.2200, "lon": 115.1000, "province": "湖北"},
"十堰": {"lat": 32.6300, "lon": 110.7800, "province": "湖北"},
"宜昌": {"lat": 30.6900, "lon": 111.2900, "province": "湖北"},
"襄阳": {"lat": 32.0400, "lon": 112.1400, "province": "湖北"},
"鄂州": {"lat": 30.4000, "lon": 114.8900, "province": "湖北"},
"荆门": {"lat": 31.0300, "lon": 112.2000, "province": "湖北"},
"孝感": {"lat": 30.9200, "lon": 113.9200, "province": "湖北"},
"荆州": {"lat": 30.3400, "lon": 112.2400, "province": "湖北"},
"黄冈": {"lat": 30.4500, "lon": 114.8800, "province": "湖北"},
"咸宁": {"lat": 29.8300, "lon": 114.3200, "province": "湖北"},
"随州": {"lat": 31.6900, "lon": 113.3700, "province": "湖北"},
"恩施": {"lat": 30.2900, "lon": 109.4800, "province": "湖北"},
# ===== 湖南 =====
"长沙": {"lat": 28.2282, "lon": 112.9388, "province": "湖南"},
"株洲": {"lat": 27.8300, "lon": 113.1500, "province": "湖南"},
"湘潭": {"lat": 27.8300, "lon": 112.9000, "province": "湖南"},
"衡阳": {"lat": 26.8900, "lon": 112.6100, "province": "湖南"},
"邵阳": {"lat": 27.2400, "lon": 111.4700, "province": "湖南"},
"岳阳": {"lat": 29.3700, "lon": 113.1000, "province": "湖南"},
"常德": {"lat": 29.0500, "lon": 111.6800, "province": "湖南"},
"张家界": {"lat": 29.1160, "lon": 110.4780, "province": "湖南"},
"益阳": {"lat": 28.5700, "lon": 112.3300, "province": "湖南"},
"郴州": {"lat": 25.7700, "lon": 113.0300, "province": "湖南"},
"永州": {"lat": 26.4300, "lon": 111.6200, "province": "湖南"},
"怀化": {"lat": 27.5700, "lon": 110.0000, "province": "湖南"},
"娄底": {"lat": 27.7300, "lon": 112.0000, "province": "湖南"},
# ===== 广东 =====
"广州": {"lat": 23.1291, "lon": 113.2644, "province": "广东"},
"韶关": {"lat": 24.8000, "lon": 113.6000, "province": "广东"},
"深圳": {"lat": 22.5431, "lon": 114.0579, "province": "广东"},
"珠海": {"lat": 22.2700, "lon": 113.5770, "province": "广东"},
"汕头": {"lat": 23.3700, "lon": 116.6800, "province": "广东"},
"佛山": {"lat": 23.0300, "lon": 113.1200, "province": "广东"},
"江门": {"lat": 22.5800, "lon": 113.0800, "province": "广东"},
"湛江": {"lat": 21.2700, "lon": 110.3500, "province": "广东"},
"茂名": {"lat": 21.6600, "lon": 110.9200, "province": "广东"},
"肇庆": {"lat": 23.0500, "lon": 112.4500, "province": "广东"},
"惠州": {"lat": 23.1100, "lon": 114.4100, "province": "广东"},
"梅州": {"lat": 24.2800, "lon": 116.1200, "province": "广东"},
"汕尾": {"lat": 22.7800, "lon": 115.3700, "province": "广东"},
"河源": {"lat": 23.7300, "lon": 114.6800, "province": "广东"},
"阳江": {"lat": 21.8500, "lon": 111.9800, "province": "广东"},
"清远": {"lat": 23.6800, "lon": 113.0200, "province": "广东"},
"东莞": {"lat": 23.0200, "lon": 113.7500, "province": "广东"},
"中山": {"lat": 22.5200, "lon": 113.3800, "province": "广东"},
"潮州": {"lat": 23.6700, "lon": 116.6300, "province": "广东"},
"揭阳": {"lat": 23.5500, "lon": 116.3700, "province": "广东"},
"云浮": {"lat": 22.9300, "lon": 112.0300, "province": "广东"},
# ===== 广西 =====
"南宁": {"lat": 22.8170, "lon": 108.3669, "province": "广西"},
"柳州": {"lat": 24.3100, "lon": 109.4000, "province": "广西"},
"桂林": {"lat": 25.2736, "lon": 110.2900, "province": "广西"},
"梧州": {"lat": 23.4800, "lon": 111.3200, "province": "广西"},
"北海": {"lat": 21.4800, "lon": 109.1200, "province": "广西"},
"防城港": {"lat": 21.6800, "lon": 108.3500, "province": "广西"},
"钦州": {"lat": 21.9500, "lon": 108.6200, "province": "广西"},
"贵港": {"lat": 23.1000, "lon": 109.6000, "province": "广西"},
"玉林": {"lat": 22.6300, "lon": 110.1500, "province": "广西"},
"百色": {"lat": 23.9000, "lon": 106.6200, "province": "广西"},
"贺州": {"lat": 24.4000, "lon": 111.5500, "province": "广西"},
"河池": {"lat": 24.7000, "lon": 108.0700, "province": "广西"},
"来宾": {"lat": 23.7300, "lon": 109.2300, "province": "广西"},
"崇左": {"lat": 22.4000, "lon": 107.3700, "province": "广西"},
# ===== 海南 =====
"海口": {"lat": 20.0440, "lon": 110.1999, "province": "海南"},
"三亚": {"lat": 18.2528, "lon": 109.5119, "province": "海南"},
"儋州": {"lat": 19.5200, "lon": 109.5800, "province": "海南"},
# ===== 四川 =====
"成都": {"lat": 30.5728, "lon": 104.0668, "province": "四川"},
"自贡": {"lat": 29.3500, "lon": 104.7700, "province": "四川"},
"攀枝花": {"lat": 26.5800, "lon": 101.7200, "province": "四川"},
"泸州": {"lat": 28.8800, "lon": 105.4300, "province": "四川"},
"德阳": {"lat": 31.1300, "lon": 104.3800, "province": "四川"},
"绵阳": {"lat": 31.4660, "lon": 104.6790, "province": "四川"},
"广元": {"lat": 32.4300, "lon": 105.8200, "province": "四川"},
"遂宁": {"lat": 30.5300, "lon": 105.5700, "province": "四川"},
"内江": {"lat": 29.5800, "lon": 105.0500, "province": "四川"},
"乐山": {"lat": 29.6000, "lon": 103.7600, "province": "四川"},
"南充": {"lat": 30.7900, "lon": 106.1100, "province": "四川"},
"眉山": {"lat": 30.0500, "lon": 103.8300, "province": "四川"},
"宜宾": {"lat": 28.7500, "lon": 104.6400, "province": "四川"},
"广安": {"lat": 30.4600, "lon": 106.6400, "province": "四川"},
"达州": {"lat": 31.2100, "lon": 107.4700, "province": "四川"},
"雅安": {"lat": 30.0100, "lon": 103.0400, "province": "四川"},
"巴中": {"lat": 31.8600, "lon": 106.7500, "province": "四川"},
"资阳": {"lat": 30.1200, "lon": 104.6300, "province": "四川"},
"阿坝": {"lat": 31.9000, "lon": 102.2200, "province": "四川"},
"甘孜": {"lat": 30.0500, "lon": 101.9600, "province": "四川"},
"凉山": {"lat": 27.8900, "lon": 102.2600, "province": "四川"},
# ===== 贵州 =====
"贵阳": {"lat": 26.6477, "lon": 106.6302, "province": "贵州"},
"六盘水": {"lat": 26.5900, "lon": 104.8300, "province": "贵州"},
"遵义": {"lat": 27.7256, "lon": 106.9370, "province": "贵州"},
"安顺": {"lat": 26.2500, "lon": 105.9300, "province": "贵州"},
"毕节": {"lat": 27.3000, "lon": 105.2900, "province": "贵州"},
"铜仁": {"lat": 27.7300, "lon": 109.1900, "province": "贵州"},
"黔东南": {"lat": 26.5800, "lon": 107.9800, "province": "贵州"},
"黔南": {"lat": 26.2500, "lon": 107.5200, "province": "贵州"},
"黔西南": {"lat": 25.0900, "lon": 104.9000, "province": "贵州"},
# ===== 云南 =====
"昆明": {"lat": 25.0409, "lon": 102.7123, "province": "云南"},
"曲靖": {"lat": 25.5000, "lon": 103.7900, "province": "云南"},
"玉溪": {"lat": 24.3500, "lon": 102.5400, "province": "云南"},
"保山": {"lat": 25.1100, "lon": 99.1600, "province": "云南"},
"昭通": {"lat": 27.3400, "lon": 103.7100, "province": "云南"},
"丽江": {"lat": 26.8721, "lon": 100.2330, "province": "云南"},
"普洱": {"lat": 22.7700, "lon": 100.9700, "province": "云南"},
"临沧": {"lat": 23.8800, "lon": 100.0800, "province": "云南"},
"大理": {"lat": 25.6065, "lon": 100.2670, "province": "云南"},
"楚雄": {"lat": 25.0400, "lon": 101.5400, "province": "云南"},
"红河": {"lat": 23.3700, "lon": 103.3900, "province": "云南"},
"文山": {"lat": 23.4000, "lon": 104.2300, "province": "云南"},
"西双版纳": {"lat": 21.9900, "lon": 100.7900, "province": "云南"},
"德宏": {"lat": 24.4300, "lon": 98.5800, "province": "云南"},
"怒江": {"lat": 25.8500, "lon": 98.8500, "province": "云南"},
"迪庆": {"lat": 27.8200, "lon": 99.7000, "province": "云南"},
# ===== 西藏 =====
"拉萨": {"lat": 29.6500, "lon": 91.1000, "province": "西藏"},
"日喀则": {"lat": 29.2780, "lon": 88.8820, "province": "西藏"},
"昌都": {"lat": 31.1300, "lon": 97.1700, "province": "西藏"},
"林芝": {"lat": 29.6500, "lon": 94.3500, "province": "西藏"},
"山南": {"lat": 29.2300, "lon": 91.7700, "province": "西藏"},
"那曲": {"lat": 31.4700, "lon": 92.0500, "province": "西藏"},
"阿里": {"lat": 30.4000, "lon": 81.1500, "province": "西藏"},
# ===== 陕西 =====
"西安": {"lat": 34.3416, "lon": 108.9398, "province": "陕西"},
"铜川": {"lat": 34.9000, "lon": 108.9500, "province": "陕西"},
"宝鸡": {"lat": 34.3600, "lon": 107.1500, "province": "陕西"},
"咸阳": {"lat": 34.3300, "lon": 108.7000, "province": "陕西"},
"渭南": {"lat": 34.5000, "lon": 109.5000, "province": "陕西"},
"延安": {"lat": 36.5855, "lon": 109.4900, "province": "陕西"},
"汉中": {"lat": 33.0600, "lon": 107.0300, "province": "陕西"},
"榆林": {"lat": 38.2800, "lon": 109.7300, "province": "陕西"},
"安康": {"lat": 32.6800, "lon": 109.0200, "province": "陕西"},
"商洛": {"lat": 33.8700, "lon": 109.9300, "province": "陕西"},
# ===== 甘肃 =====
"兰州": {"lat": 36.0611, "lon": 103.8343, "province": "甘肃"},
"嘉峪关": {"lat": 39.7900, "lon": 98.2800, "province": "甘肃"},
"金昌": {"lat": 38.5200, "lon": 102.1800, "province": "甘肃"},
"白银": {"lat": 36.5400, "lon": 104.1800, "province": "甘肃"},
"天水": {"lat": 34.5800, "lon": 105.7200, "province": "甘肃"},
"武威": {"lat": 37.9300, "lon": 102.6300, "province": "甘肃"},
"张掖": {"lat": 38.9300, "lon": 100.4500, "province": "甘肃"},
"平凉": {"lat": 35.5400, "lon": 106.6800, "province": "甘肃"},
"酒泉": {"lat": 39.7300, "lon": 98.5000, "province": "甘肃"},
"庆阳": {"lat": 35.7300, "lon": 107.6300, "province": "甘肃"},
"定西": {"lat": 35.5800, "lon": 104.6200, "province": "甘肃"},
"陇南": {"lat": 33.4000, "lon": 104.9200, "province": "甘肃"},
"临夏": {"lat": 35.6000, "lon": 103.2000, "province": "甘肃"},
"甘南": {"lat": 34.9800, "lon": 102.9000, "province": "甘肃"},
# ===== 青海 =====
"西宁": {"lat": 36.6171, "lon": 101.7785, "province": "青海"},
"海东": {"lat": 36.5000, "lon": 102.1000, "province": "青海"},
"海北": {"lat": 36.9500, "lon": 100.9000, "province": "青海"},
"黄南": {"lat": 35.5200, "lon": 102.0200, "province": "青海"},
"海南": {"lat": 36.2800, "lon": 100.6200, "province": "青海"},
"果洛": {"lat": 34.4700, "lon": 100.2300, "province": "青海"},
"玉树": {"lat": 33.0000, "lon": 97.0000, "province": "青海"},
"海西": {"lat": 37.3700, "lon": 97.3700, "province": "青海"},
"格尔木": {"lat": 36.4060, "lon": 94.9010, "province": "青海"},
# ===== 宁夏 =====
"银川": {"lat": 38.4710, "lon": 106.2580, "province": "宁夏"},
"石嘴山": {"lat": 39.0140, "lon": 106.3840, "province": "宁夏"},
"吴忠": {"lat": 38.0000, "lon": 106.2000, "province": "宁夏"},
"固原": {"lat": 36.0000, "lon": 106.2800, "province": "宁夏"},
"中卫": {"lat": 37.5100, "lon": 105.1800, "province": "宁夏"},
# ===== 新疆 =====
"乌鲁木齐": {"lat": 43.8266, "lon": 87.6168, "province": "新疆"},
"克拉玛依": {"lat": 45.5900, "lon": 84.8700, "province": "新疆"},
"吐鲁番": {"lat": 42.9500, "lon": 89.1800, "province": "新疆"},
"哈密": {"lat": 42.8200, "lon": 93.5200, "province": "新疆"},
"昌吉": {"lat": 44.0200, "lon": 87.2700, "province": "新疆"},
"博州": {"lat": 44.9000, "lon": 82.0700, "province": "新疆"},
"巴州": {"lat": 41.7300, "lon": 86.1500, "province": "新疆"},
"阿克苏": {"lat": 41.1700, "lon": 80.2600, "province": "新疆"},
"克州": {"lat": 39.7200, "lon": 76.1000, "province": "新疆"},
"喀什": {"lat": 39.4670, "lon": 75.9890, "province": "新疆"},
"和田": {"lat": 37.1200, "lon": 79.9200, "province": "新疆"},
"伊犁": {"lat": 43.9200, "lon": 81.3200, "province": "新疆"},
"塔城": {"lat": 46.7300, "lon": 83.0000, "province": "新疆"},
"阿勒泰": {"lat": 47.8300, "lon": 88.1300, "province": "新疆"},
"石河子": {"lat": 44.3000, "lon": 86.0300, "province": "新疆"},
# ===== 台湾 =====
"台北": {"lat": 25.0330, "lon": 121.5654, "province": "台湾"},
"高雄": {"lat": 22.6273, "lon": 120.3014, "province": "台湾"},
"台中": {"lat": 24.1470, "lon": 120.6730, "province": "台湾"},
"台南": {"lat": 22.9900, "lon": 120.2100, "province": "台湾"},
"基隆": {"lat": 25.1200, "lon": 121.7500, "province": "台湾"},
"新竹": {"lat": 24.8000, "lon": 120.9800, "province": "台湾"},
"嘉义": {"lat": 23.4800, "lon": 120.4500, "province": "台湾"},
# ===== 香港澳门 =====
"香港": {"lat": 22.3193, "lon": 114.1694, "province": "香港"},
"澳门": {"lat": 22.1987, "lon": 113.5439, "province": "澳门"},
}
# ==================== WeatherAPI 类 ====================
class WeatherAPI:
@staticmethod
def get_current_weather(city_name):
if city_name not in ALL_CITIES:
return None
coords = ALL_CITIES[city_name]
url = f"https://api.open-meteo.com/v1/forecast?latitude={coords['lat']}&longitude={coords['lon']}¤t=temperature_2m,relative_humidity_2m,windspeed_10m,winddirection_10m&timezone=Asia/Shanghai"
try:
resp = requests.get(url, timeout=10)
data = resp.json()
current = data.get('current', {})
if not current:
return None
return {
"城市": city_name,
"温度": current.get('temperature_2m', 'N/A'),
"湿度": current.get('relative_humidity_2m', 'N/A'),
"风速": current.get('windspeed_10m', 'N/A'),
"风向": current.get('winddirection_10m', 'N/A'),
"时间": current.get('time', 'N/A')
}
except Exception:
return None
@staticmethod
def get_forecast(city_name, days=3):
if city_name not in ALL_CITIES:
return None
coords = ALL_CITIES[city_name]
url = f"https://api.open-meteo.com/v1/forecast?latitude={coords['lat']}&longitude={coords['lon']}&daily=temperature_2m_max,temperature_2m_min,weathercode&timezone=Asia/Shanghai&forecast_days={days}"
try:
resp = requests.get(url, timeout=10)
data = resp.json()
daily = data.get('daily', {})
result = []
for i in range(len(daily.get('time', []))):
result.append({
"日期": daily['time'][i],
"最高温": daily['temperature_2m_max'][i],
"最低温": daily['temperature_2m_min'][i],
"天气代码": daily['weathercode'][i] if i < len(daily['weathercode']) else 0
})
return result
except Exception:
return None
# ==================== 分析工具 ====================
def analyze_comfort(temperature, humidity=None):
try:
t = float(temperature)
if 18 <= t <= 25:
temp_score = 1.0
elif 15 <= t < 18 or 25 < t <= 30:
temp_score = 0.7
elif 10 <= t < 15 or 30 < t <= 35:
temp_score = 0.4
else:
temp_score = 0.2
if humidity is not None:
try:
h = float(humidity)
if 40 <= h <= 70:
hum_score = 1.0
elif 30 <= h < 40 or 70 < h <= 80:
hum_score = 0.6
else:
hum_score = 0.3
except:
hum_score = 0.5
else:
hum_score = 0.5
total_score = temp_score * 0.7 + hum_score * 0.3
if total_score >= 0.8:
label = "非常舒适"
elif total_score >= 0.6:
label = "舒适"
elif total_score >= 0.4:
label = "一般"
else:
label = "不舒适"
return label, total_score
except:
return "未知", 0.5
# ==================== 微信回复专用函数 ====================
def get_weather_text(city_name):
if city_name not in ALL_CITIES:
return f"❌ 未找到城市“{city_name}”,请检查名称。"
current = WeatherAPI.get_current_weather(city_name)
if not current:
return f"❌ 获取{city_name}天气失败,请稍后重试。"
forecast = WeatherAPI.get_forecast(city_name, 3)
comfort_label, _ = analyze_comfort(current['温度'], current['湿度'])
msg = f"🌤️ {city_name} 当前天气\n"
msg += f"温度:{current['温度']}°C\n"
msg += f"湿度:{current['湿度']}%\n"
msg += f"风速:{current['风速']} km/h\n"
msg += f"舒适度:{comfort_label}\n"
msg += f"更新时间:{current['时间']}\n"
if forecast and len(forecast) >= 3:
msg += "\n📅 未来三天预报:\n"
weather_map = {0: "晴", 1: "少云", 2: "多云", 3: "阴", 45: "雾", 51: "小雨", 61: "中雨", 71: "小雪"}
for day in forecast[:3]:
desc = weather_map.get(day['天气代码'], "多云")
msg += f"{day['日期'][5:]}: {desc} {day['最低温']}~{day['最高温']}°C\n"
return msg
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。