From 5b1c20d625828e67fa29a5f408fad9118aa58912 Mon Sep 17 00:00:00 2001 From: Jad Date: Mon, 24 Mar 2025 02:09:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A4=A9=E6=B0=94=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 7天预报包含每日天气 --- .../plugins_func/functions/get_weather.py | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/main/xiaozhi-server/plugins_func/functions/get_weather.py b/main/xiaozhi-server/plugins_func/functions/get_weather.py index 75c0c1a3..8cdd6ea1 100644 --- a/main/xiaozhi-server/plugins_func/functions/get_weather.py +++ b/main/xiaozhi-server/plugins_func/functions/get_weather.py @@ -39,6 +39,23 @@ HEADERS = { ) } +# 天气代码 https://dev.qweather.com/docs/resource/icons/#weather-icons +WEATHER_CODE_MAP = { + "100": "晴", "101": "多云", "102": "少云", "103": "晴间多云", "104": "阴", + "150": "晴", "151": "多云", "152": "少云", "153": "晴间多云", + "300": "阵雨", "301": "强阵雨", "302": "雷阵雨", "303": "强雷阵雨", "304": "雷阵雨伴有冰雹", + "305": "小雨", "306": "中雨", "307": "大雨", "308": "极端降雨", "309": "毛毛雨/细雨", + "310": "暴雨", "311": "大暴雨", "312": "特大暴雨", "313": "冻雨", "314": "小到中雨", + "315": "中到大雨", "316": "大到暴雨", "317": "暴雨到大暴雨", "318": "大暴雨到特大暴雨", + "350": "阵雨", "351": "强阵雨", "399": "雨", + "400": "小雪", "401": "中雪", "402": "大雪", "403": "暴雪", "404": "雨夹雪", + "405": "雨雪天气", "406": "阵雨夹雪", "407": "阵雪", "408": "小到中雪", "409": "中到大雪", "410": "大到暴雪", + "456": "阵雨夹雪", "457": "阵雪", "499": "雪", + "500": "薄雾", "501": "雾", "502": "霾", "503": "扬沙", "504": "浮尘", + "507": "沙尘暴", "508": "强沙尘暴", + "509": "浓雾", "510": "强浓雾", "511": "中度霾", "512": "重度霾", "513": "严重霾", "514": "大雾", "515": "特强浓雾", + "900": "热", "901": "冷", "999": "未知" +} def fetch_city_info(location, api_key): url = f"https://geoapi.qweather.com/v2/city/lookup?key={api_key}&location={location}&lang=zh" @@ -67,9 +84,11 @@ def parse_weather_info(soup): temps_list = [] for row in soup.select(".city-forecast-tabs__row")[:7]: # 取前7天的数据 date = row.select_one(".date-bg .date").get_text(strip=True) + weather_code = row.select_one(".date-bg .icon")["src"].split("/")[-1].split(".")[0] + weather = WEATHER_CODE_MAP.get(weather_code, "未知") temps = [span.get_text(strip=True) for span in row.select(".tmp-cont .temp")] high_temp, low_temp = (temps[0], temps[-1]) if len(temps) >= 2 else (None, None) - temps_list.append((date, high_temp, low_temp)) + temps_list.append((date, weather, high_temp, low_temp)) return city_name, current_abstract, current_basic, temps_list @@ -91,13 +110,13 @@ def get_weather(conn, location: str = None, lang: str = "zh_CN"): city_name, current_abstract, current_basic, temps_list = parse_weather_info(soup) weather_report = f"根据下列数据,用{lang}回应用户的查询天气请求:\n{city_name}未来7天天气:\n" - for i, (date, high, low) in enumerate(temps_list): + for i, (date, weather, high, low) in enumerate(temps_list): if high and low: - weather_report += f"{date}: {low}到{high}\n" + weather_report += f"{date}: {low}到{high}, {weather}\n" weather_report += ( f"当前天气: {current_abstract}\n" f"当前天气参数: {current_basic}\n" - f"(确保只报告指定单日的气温范围,除非用户明确要求想要了解多日天气,如果未指定,默认报告今天的温度范围。" + f"(确保只报告指定单日的天气情况,除非未来会出现异常天气;或者用户明确要求想要了解多日天气,如果未指定,默认报告今天的天气。" "参数为0的值不需要报告给用户,每次都报告体感温度,根据语境选择合适的参数内容告知用户,并对参数给出相应评价)" ) From 02e33f68b4cbcbe9eb8a3ef7f52e89d92bac6e32 Mon Sep 17 00:00:00 2001 From: Jad Date: Mon, 24 Mar 2025 13:12:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=86=9C=E5=8E=86=E6=97=A5=E6=9C=9F=E5=92=8C=E9=BB=84?= =?UTF-8?q?=E5=8E=86=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugins_func/functions/get_time.py | 32 +++++++++++++++++-- main/xiaozhi-server/requirements.txt | 1 + 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/main/xiaozhi-server/plugins_func/functions/get_time.py b/main/xiaozhi-server/plugins_func/functions/get_time.py index 9a9aebfe..c415e4a2 100644 --- a/main/xiaozhi-server/plugins_func/functions/get_time.py +++ b/main/xiaozhi-server/plugins_func/functions/get_time.py @@ -1,11 +1,12 @@ from datetime import datetime +import cnlunar from plugins_func.register import register_function, ToolType, ActionResponse, Action get_time_function_desc = { "type": "function", "function": { "name": "get_time", - "description": "获取当前时间、日期、星期几", + "description": "获取当前日期、时间和农历、黄历等信息", 'parameters': {'type': 'object', 'properties': {}, 'required': []} } } @@ -14,12 +15,37 @@ get_time_function_desc = { @register_function('get_time', get_time_function_desc, ToolType.WAIT) def get_time(): """ - 获取当前时间、日期、星期几 + 获取当前日期、时间和农历、黄历等信息 """ now = datetime.now() current_time = now.strftime("%H:%M:%S") current_date = now.strftime("%Y-%m-%d") current_weekday = now.strftime("%A") - response_text = f"当前日期: {current_date},当前时间: {current_time},星期: {current_weekday}" + response_text = f"根据以下信息,回应用户的时间查询请求,默认仅回应公历信息;如果用户询问阴历或农历日期,则回应农历日期;如果用户要求提供更多信息,则回应黄历信息\n" + + lunar = cnlunar.Lunar(now, godType='8char') + response_text += ( + f"当前日期: {current_date},当前时间: {current_time},星期: {current_weekday}\n" + "农历信息:\n" + "%s年%s%s\n" % (lunar.lunarYearCn, lunar.lunarMonthCn[:-1], lunar.lunarDayCn) + + "干支: %s年 %s月 %s日\n" % (lunar.year8Char, lunar.month8Char, lunar.day8Char) + + "生肖: 属%s\n" % (lunar.chineseYearZodiac) + + "八字: %s\n" % (' '.join([lunar.year8Char, lunar.month8Char, lunar.day8Char, lunar.twohour8Char])) + + "今日节日: %s\n" % (",".join(filter(None, (lunar.get_legalHolidays(), lunar.get_otherHolidays(), lunar.get_otherLunarHolidays())))) + + "今日节气: %s\n" % (lunar.todaySolarTerms) + + "下一节气: %s %s年%s月%s日\n" % (lunar.nextSolarTerm, lunar.nextSolarTermYear, lunar.nextSolarTermDate[0], lunar.nextSolarTermDate[1]) + + "今年节气表: %s\n" % (', '.join([f"{term}({date[0]}月{date[1]}日)" for term, date in lunar.thisYearSolarTermsDic.items()])) + + "生肖冲煞: %s\n" % (lunar.chineseZodiacClash) + + "星座: %s\n" % (lunar.starZodiac) + + "纳音: %s\n" % lunar.get_nayin() + + "彭祖百忌: %s\n" % (lunar.get_pengTaboo(delimit=", ")) + + "值日: %s执位\n" % lunar.get_today12DayOfficer()[0] + + "值神: %s(%s)\n" % (lunar.get_today12DayOfficer()[1], lunar.get_today12DayOfficer()[2]) + + "廿八宿: %s\n" % lunar.get_the28Stars() + + "吉神方位: %s\n" % ' '.join(lunar.get_luckyGodsDirection()) + + "今日胎神: %s\n" % lunar.get_fetalGod() + + "宜: %s\n" % '、'.join(lunar.goodThing[:10]) + + "忌: %s\n" % '、'.join(lunar.badThing[:10]) + ) return ActionResponse(Action.REQLLM, response_text, None) \ No newline at end of file diff --git a/main/xiaozhi-server/requirements.txt b/main/xiaozhi-server/requirements.txt index 6afec6b5..51433cb9 100755 --- a/main/xiaozhi-server/requirements.txt +++ b/main/xiaozhi-server/requirements.txt @@ -22,3 +22,4 @@ mem0ai==0.1.62 bs4==0.0.2 modelscope==1.23.2 sherpa_onnx==1.11.0 +cnlunar==0.2.0 \ No newline at end of file