From d8c12f7ad3d4a31f55ec885d4e35617acc38ecd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E5=85=89-k?= <36470587+kxgx@users.noreply.github.com> Date: Fri, 17 Jan 2025 07:07:49 +0800 Subject: [PATCH] Update weather.py --- bin/weather.py | 79 +++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/bin/weather.py b/bin/weather.py index 26ae26b..56a07db 100644 --- a/bin/weather.py +++ b/bin/weather.py @@ -17,49 +17,48 @@ if os.path.exists(libdir): sys.path.append(libdir) # 将引入文件添加到环境变量 def get_area_id(city_name): - """从city.js中检索AREAID""" + """从city.js中检索AREAID,无限重试直到成功""" url = "https://j.i8tq.com/weather2020/search/city.js" - try: - response = requests.get(url) - response.raise_for_status() # 检查请求是否成功 - # 直接打印原始数据 - logging.debug("Raw data from city.js: %s", response.text) - # 预处理返回的数据,去除非JSON部分 - city_data_text = response.text.strip() - city_data_text = city_data_text.split('var city_data = ')[-1].rstrip(';') - if city_data_text: - city_data = json.loads(city_data_text) - # 遍历数据结构,查找城市名称 - for province, cities in city_data.items(): - for city, districts in cities.items(): - for district, info in districts.items(): - if info['NAMECN'] == city_name: - return info['AREAID'] - logging.error("城市名称 '%s' 在城市数据中未找到,将使用默认城市信息", city_name) - else: - logging.error("从city.js接收到的数据为空") - except requests.RequestException as e: - logging.error("检索城市数据时发生网络错误: %s", e) - except json.JSONDecodeError as e: - logging.error("解析城市数据时发生JSON解码错误: %s", e) - return None + while True: + try: + response = requests.get(url) + response.raise_for_status() # 检查请求是否成功 + # 直接打印原始数据 + logging.debug("Raw data from city.js: %s", response.text) + # 预处理返回的数据,去除非JSON部分 + city_data_text = response.text.strip() + city_data_text = city_data_text.split('var city_data = ')[-1].rstrip(';') + if city_data_text: + city_data = json.loads(city_data_text) + # 遍历数据结构,查找城市名称 + for province, cities in city_data.items(): + for city, districts in cities.items(): + for district, info in districts.items(): + if info['NAMECN'] == city_name: + return info['AREAID'] + logging.error("城市名称 '%s' 在城市数据中未找到,将使用默认城市信息", city_name) + else: + logging.error("从city.js接收到的数据为空") + except (requests.RequestException, json.JSONDecodeError) as e: + logging.error("检索或解析城市数据时发生错误: %s", e) + time.sleep(5) # 重试前等待5秒 def get_current_city(): - """获取当前城市名称""" + """获取当前城市名称,无限重试直到成功""" url = "http://ip-api.com/json/?lang=zh-CN" - try: - response = requests.get(url) - response.raise_for_status() # 检查请求是否成功 - data = response.json() - if data['status'] == 'success': - return data['city'] - else: - logging.error("获取当前城市失败: %s", data['message']) - except requests.RequestException as e: - logging.error("检索当前城市时出现网络错误: %s", e) - except json.JSONDecodeError as e: - logging.error("解析当前城市数据时出现JSON解码错误: %s", e) - return None + while True: + try: + response = requests.get(url) + response.raise_for_status() # 检查请求是否成功 + data = response.json() + if data['status'] == 'success': + return data['city'] + else: + logging.error("获取当前城市失败: %s", data['message']) + except (requests.RequestException, json.JSONDecodeError) as e: + logging.error("检索或解析当前城市时出现错误: %s", e) + time.sleep(5) # 重试前等待5秒 +# 注意:无限重试可能会在特定情况下导致程序无法终止,请确保在实际使用中考虑适当的退出条件或限制重试次数。 def getWeath(city='101060101'): headers = { @@ -97,4 +96,4 @@ except Exception as e: exit() # 脚本正常结束后的清理操作 -exit() \ No newline at end of file +exit()