From 02cffff608b0817d8ec3e4be7e13adb6cf2b5266 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Mon, 18 May 2026 13:54:42 +0800 Subject: [PATCH] f --- app/main/api/internal/service/1.md | 178 ++++ .../api/internal/service/toolboxService.go | 875 ++++++++---------- 2 files changed, 586 insertions(+), 467 deletions(-) create mode 100644 app/main/api/internal/service/1.md diff --git a/app/main/api/internal/service/1.md b/app/main/api/internal/service/1.md new file mode 100644 index 0000000..f64b0ac --- /dev/null +++ b/app/main/api/internal/service/1.md @@ -0,0 +1,178 @@ +首页 +企业商务 +节假日 +节假日接口 +139 146929 +节假日正常服务支持MCP +判断指定日期是否为法定节假日、调休日或工作日,并返回薪资倍数。 +会员免费・升级会员畅享160+免费接口,立即升级>> +收藏 +普通会员 +100次/天 +高级会员 +1W次/天 +黄金会员 +50W次/天 +钻石会员 +不限次数 + +▼ 接口文档 + +价格 + +返回示例 + +参考代码 + +MCP服务 + +帮助 + +生成小程序 +查询节假日信息,接口返回节日名称类型、农历信息、上班调休、工资倍数、假期范围、拼假建议、及工作日相关信息等。通过请求参数mode还可以指定是否返回当天有关的国内外节日信息。使用前建议阅读参考文章:节假日接口增加多种查询方式 +接口支持按年、按月、按日期范围和多个日期批量查询。如按年查询(type=1&date=2020)、按月查询(type=2&date=2020-10)、按日期范围查询(type=3&date=2020-11-1~2020-11-10)、按多个日期批量查询(date=2020-10-1,2020-11-12) + +请注意,按年查询只返回中国官方节假日信息;按月查询如只传年月,则为从该月第一天到最后一天;按范围查询,起点和终点用波浪号~分隔;按多个日期批量查询用英文半角逗号分隔。无论哪种查询方式,单次查询所包含的总日期数不能超过31天。 + +daycode表示日期类型,0表示工作日、1节假日、2双休日、3调休日(需上班)。判断是否需要上班建议用isnotwork字段,其中值为0表示上班,为1表示休息。wage表示薪资倍数,周末为两倍,法定节假日当天为三倍其他两倍(按年查询时返回三倍薪资的具体日期)。 + +提示:info字段和daycode并非对应关系,建议仅用于日期类型标记;节日指某个具体日期(如2021年1月1号),节假日指整个假期(如2021年1月1号至3号);节日范围宽泛(如会包含植树节、圣诞节),节假日指来自官方发布的有假节日,每年底政府公布后同步更新。 + +接入点列表: + +节假日查询 +相关资源: + +节假日功能演示 +节假日接口更新了,增加批量/范围按年按月查询 +如何利用节假日API让日程规划更轻松 +为什么节假日查询接口,按年查询返回250错误? +节假日接口数据有误,怎么回事? +节假日接口没有更新吗? +我想知道哪天是国家规定的3倍工资呢? +请问我如何知道节假日接口已经更新了下一年的数据呢? +▼ 接口信息 +判断日期是否为官方节假日支持按年、按月和范围批量查询 + +接口地址:https://apis.tianapi.com/jiejiari/index?key={apiKey} +支持协议:http/https +请求方法:get/post +返回格式:utf-8 json +▼ 请求参数 +上传文件时请使用标准表单格式 multipart/form-data + +普通参数请使用默认表单格式 application/x-www-form-urlencoded + +当参数值(如url、base64)包含特殊字符时,建议urlencode编码后传递 + +名称 类型 必须 示例值/默认值 说明 +key string 是 您自己的ApiKey(注册账号后获得) API密钥 +date string 是 2021-01-01 查询日期或日期范围 +type int 是 0 查询类型,0批量、1按年、2按月、3范围 +mode int 否 0 查询模式,为1同时返回中外特殊节日信息 +▼ 返回示例 +接口数据示例仅作为预览参考,请以实际测试结果为准 + +旧接口域名返回的数据结构和现在略有不同,请查看说明 + + + +成功调用,返回内容并产生计费: + + + { + "msg": "success", + "code": 200, + "result": { + "list": [ + { + "end": 2, + "now": 0, + "tip": "1月1日放假,共3天。", + "date": "2021-01-01", + "info": "节假日", + "name": "元旦节", + "rest": "2020年12月28日至2020年12月31日请假四天,与周末连休可拼七天长假。", + "wage": 3, + "start": 0, + "enname": "NewYear", + "remark": [ + "2021-12-26", + "2021-01-08" + ], + "daycode": 1, + "holiday": "1月1号", + "weekday": 5, + "lunarday": "十八", + "vacation": [ + "2021-01-01", + "2021-01-02", + "2021-01-03" + ], + "cnweekday": "星期五", + "isnotwork": 1, + "lunaryear": "庚子", + "lunarmonth": "冬月" + } + ] + } +} + + + + +失败调用,查看接口错误码释义: + + + { + "code": 150, + "msg": "API可用次数不足" +} + + + +▼ 返回参数 +公共参数指所有接口都会返回的参数,应用参数每个接口都不同 + +建议对返回的字段进行存在性与类型校验,可参考API安全接入指南 + +名称 类型 示例值 说明 +公共参数 +code int 200 状态码 +msg string success 错误信息 +result object {} 返回结果集 +应用参数 +end int 6 假期终点计数 +now int 0 假期当前计数 +tip string 10月1日至7日放假调休,共7天...... 放假提示 +date string 2019-10-01 当前阳历日期 +info string 节假日 文字提示,工作日、节假日、节日、双休日、调休日 +name string 国庆节 节假日名称(中文) +rest string 10月8日至10月10日请假2天,与周末连休可拼11天长假。 拼假建议 +wage int 3 薪资法定倍数/按年查询时为具体日期 +start int 0 假期起点计数 +enname string National Day 节日名称(英文) +remark array ["2021-12-26","2021-01-08"] 调休日数组 +update boolean true/false 是否更新法定节假日(按年查询专有字段) +daycode int 1 日期类型,为0表示工作日、为1节假日、为2双休日、3为调休日(上班) +holiday string 10月1日 节日日期 +weekday int 2 星期(数字) +lunarday string 初三 农历日 +vacation array ["2021-01-01","2021-01-02","2021-01-03"] 节假日数组 +cnweekday string 星期二 星期(中文) +isnotwork int 1 是否需要上班,0为工作日,1为休息日 +lunaryear string 己亥 农历年 +lunarmonth string 九月 农历月 +▼ 接口价格 +本接口为会员免费类接口,可根据业务需求选择升级会员方案>> + + +不同会员方案仅每日调用量等配额上限不同,数据本身无区别 + + +会员方案 免费接口数 每日调用量 QPS 价格 +普通会员 10个 100次 3 免费 +高级会员 不限 1万次 20 29元/月、348元/年169元/年惠 +黄金会员 不限 50万次 30 89元/月、1068元/年529元/年惠 +钻石会员 不限 不限次 60 3380元/年1699元/年惠 +▼ 返回状态码 \ No newline at end of file diff --git a/app/main/api/internal/service/toolboxService.go b/app/main/api/internal/service/toolboxService.go index 7054696..3e4dcff 100644 --- a/app/main/api/internal/service/toolboxService.go +++ b/app/main/api/internal/service/toolboxService.go @@ -29,9 +29,9 @@ import ( // - 天行聚合 SDK 工具:136 个 // // 【工具分类】 -// 1️⃣ 实用查询类 (25个) +// 1️⃣ 实用查询类 (26个) // ip-location, idcard-info, phone-location, beijing-time, bank-card, -// plate-parse, domain, zone, areadata, citylookup, addressparse, +// plate-parse, domain, domainparse, zone, areadata, addressparse, // telecode, obdcode, charconvert, checkipv6, worldtime, timezone, // shares, fxrate, oilprice, holiday, zone, scenic, lunar, aqi // @@ -60,22 +60,10 @@ import ( // areanews, wxnew, wxhottopic, weibohot, nethot, hotword, hotreview, // bulletin, douyinhot, zaowanwords, wananwords, caihongpi // -// 6️⃣ 搜索查询类 (16个) +// 6️⃣ 搜索查询类 (15个) // one, proverb, slogan, chengyu, lexicon, cnmoney, lzmy, baiketiku, // gjmj, shares, hotlajifenlei, garbage, lajifenlei, anslajifenlei, -// hotreview, domainparse -// -// ============================================================================ -// 🆕 2024年第二批新增工具 (46个) -// ============================================================================ -// timezone, duoyinzi, dailytel, obdcode, chaizi, citylookup, huayu, -// moodpoetry, pcterm, targa, duishici, msdl, shijing, chepai, flmj, -// xhzd, telecode, charconvert, checkipv6, worldtime, wxhottopic, zmsc, -// hsjz, gjmj, cnmoney, lzmy, baiketiku, dialogue, tiangou, robotlog, -// aqi, addressparse, pet, hotreview, anslajifenlei, douyinhot, -// zaowanwords, wananwords, areadata, mgjuzi, songci, story, qingshi, -// lajifenlei, domainparse, hanzipinyin, shorthistory -// +// hotreview, // ============================================================================ // ToolboxService 工具箱服务 —— 所有工具业务方法统一在此文件 @@ -160,7 +148,6 @@ func (s *ToolboxService) registerAllProcessors() { s.processors["oilprice"] = s.processOilPrice // 实时油价 s.processors["chengyujielong"] = s.processChengyuJielong // 成语接龙 s.processors["weibohot"] = s.processWeiboHot // 微博热搜 - s.processors["domain"] = s.processDomainResolve // 域名解析 s.processors["scenic"] = s.processScenic // 景点查询 s.processors["mingyan"] = s.processMingyan // 名言警句 s.processors["tianqishiju"] = s.processTianqiShiju // 天气诗句 @@ -204,15 +191,15 @@ func (s *ToolboxService) registerAllProcessors() { s.processors["fanyi"] = s.processFanyi // 在线翻译 s.processors["holiday"] = s.processHoliday // 节假日查询 s.processors["garbage"] = s.processGarbage // 垃圾分类查询 - s.processors["zone"] = s.processZone // 地区编码查询 + s.processors["zone"] = s.processZone // 地区搜索查询 // ─── 第二批新增工具 ─── s.processors["timezone"] = s.processTimeZone + s.processors["domain"] = s.processDomainParse // 域名解析 s.processors["duoyinzi"] = s.processDuoYinZi s.processors["dailytel"] = s.processDailyTel s.processors["obdcode"] = s.processObdCode s.processors["chaizi"] = s.processChaiZi - s.processors["citylookup"] = s.processCityLookup s.processors["huayu"] = s.processHuaYu s.processors["moodpoetry"] = s.processMoodPoetry s.processors["pcterm"] = s.processPcTerm @@ -245,13 +232,12 @@ func (s *ToolboxService) registerAllProcessors() { s.processors["douyinhot"] = s.processDouYinHot s.processors["zaowanwords"] = s.processZaoAnWords s.processors["wananwords"] = s.processWanAnWords - s.processors["areadata"] = s.processAreaData + s.processors["areadata"] = s.processAreaData // 全国五级行政区划 s.processors["mgjuzi"] = s.processMgJuZi s.processors["songci"] = s.processSongCi s.processors["story"] = s.processStory s.processors["qingshi"] = s.processQingShi s.processors["lajifenlei"] = s.processLaJiFenLei - s.processors["domainparse"] = s.processDomainParse s.processors["hanzipinyin"] = s.processHanZiPinYin s.processors["shorthistory"] = s.processShortHistory } @@ -695,8 +681,16 @@ func processPlateParse(ctx context.Context, params map[string]interface{}) (map[ // processMoneyToChinese 金额转换为中文 func processMoneyToChinese(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { - amount, ok := params["amount"].(float64) - if !ok || amount < 0 || amount > 999999999999 { + var amount float64 + switch v := params["money"].(type) { + case float64: + amount = v + case string: + amount, _ = strconv.ParseFloat(v, 64) + default: + return nil, xerr.NewErrMsg("金额不合法") + } + if amount < 0 || amount > 999999999999 { return nil, xerr.NewErrMsg("金额不合法") } @@ -2233,9 +2227,16 @@ func (s *ToolboxService) processFxRate( params map[string]interface{}, ) (map[string]interface{}, error) { - // 1. 参数校验 - money, ok := params["money"].(float64) - if !ok || money <= 0 { + var money float64 + switch v := params["money"].(type) { + case float64: + money = v + case string: + money, _ = strconv.ParseFloat(v, 64) + default: + return nil, xerr.NewErrMsg("参数 money 必须为大于 0 的数字") + } + if money <= 0 { return nil, xerr.NewErrMsg("参数 money 必须为大于 0 的数字") } @@ -2715,8 +2716,8 @@ func (s *ToolboxService) processWeiboHot( }, nil } -// processDomainResolve 查询域名解析记录 -func (s *ToolboxService) processDomainResolve( +// processDomainParse 域名DNS解析查询 +func (s *ToolboxService) processDomainParse( ctx context.Context, params map[string]interface{}, ) (map[string]interface{}, error) { @@ -5267,22 +5268,23 @@ func (s *ToolboxService) processFanyi(ctx context.Context, params map[string]int func (s *ToolboxService) processHoliday(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { reqParams := map[string]interface{}{} - // 可选:年份 (默认当前年份) - if year, ok := params["year"].(string); ok && year != "" { - reqParams["year"] = year + date, ok := params["date"].(string) + if !ok || date == "" { + date = time.Now().Format("2006-01-02") + } + reqParams["date"] = date + + if typ, ok := params["type"].(float64); ok { + reqParams["type"] = int(typ) + } else { + reqParams["type"] = 0 } - // 可选:月份 - if month, ok := params["month"].(string); ok && month != "" { - reqParams["month"] = month + if mode, ok := params["mode"].(float64); ok { + reqParams["mode"] = int(mode) } - // 可选:日期 - if date, ok := params["date"].(string); ok && date != "" { - reqParams["date"] = date - } - - resp, err := s.tianxingjuheClient.Get("holiday/index", reqParams) + resp, err := s.tianxingjuheClient.Get("jiejiari/index", reqParams) if err != nil { return nil, xerr.NewErrMsg(fmt.Sprintf("请求节假日查询API失败: %v", err)) } @@ -5296,7 +5298,30 @@ func (s *ToolboxService) processHoliday(ctx context.Context, params map[string]i return nil, xerr.NewErrMsg("解析节假日数据失败") } - return resultMap, nil + rawList, ok := resultMap["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("节假日列表数据异常") + } + + list := make([]map[string]interface{}, 0, len(rawList)) + for _, item := range rawList { + raw, ok := item.(map[string]interface{}) + if !ok { + continue + } + clean := map[string]interface{}{} + for _, k := range []string{"date", "name", "info", "tip", "cnweekday", "lunaryear", "lunarmonth", "lunarday", "wage", "isnotwork", "daycode"} { + if v, ok := raw[k]; ok { + clean[k] = v + } + } + list = append(list, clean) + } + + return map[string]interface{}{ + "count": len(list), + "list": list, + }, nil } // processGarbage 垃圾分类查询 @@ -5365,375 +5390,8 @@ func (s *ToolboxService) processGarbage(ctx context.Context, params map[string]i }, nil } -// processZone 地区编码查询 -func (s *ToolboxService) processZone(ctx context.Context, params map[string]interface{}) (map[string]interface{}, error) { - reqParams := map[string]interface{}{} - - // 可选:省份 - if province, ok := params["province"].(string); ok && province != "" { - reqParams["province"] = province - } - - // 可选:城市 - if city, ok := params["city"].(string); ok && city != "" { - reqParams["city"] = city - } - - // 可选:区县 - if district, ok := params["district"].(string); ok && district != "" { - reqParams["district"] = district - } - - resp, err := s.tianxingjuheClient.Get("zone/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求地区编码查询API失败: %v", err)) - } - - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("地区编码查询接口返回异常: %s", resp.Msg)) - } - - resultMap, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析地区编码数据失败") - } - - return resultMap, nil -} - -// processTimeZone 国际时区查询 -func (s *ToolboxService) processTimeZone( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - - reqParams := map[string]interface{}{} - - // 国家/地区(必填) - word, ok := params["word"].(string) - if !ok || word == "" { - return nil, xerr.NewErrMsg("国际时区查询缺少必填参数:word") - } - reqParams["word"] = word - - // 调用天行 API - resp, err := s.tianxingjuheClient.Get("timezone/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求国际时区接口失败: %v", err)) - } - - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("国际时区接口异常: %s", resp.Msg)) - } - - // 解析 result - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析国际时区数据失败") - } - - // 解析 list - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("国际时区列表数据异常") - } - - list := make([]map[string]interface{}, 0, len(rawList)) - - for _, item := range rawList { - raw, ok := item.(map[string]interface{}) - if !ok { - continue - } - - clean := map[string]interface{}{} - if country, ok := raw["country"]; ok { - clean["country"] = country - } - if areaname, ok := raw["areaname"]; ok { - clean["areaname"] = areaname - } - if timezone, ok := raw["timezone"]; ok { - clean["timezone"] = timezone - } - if continent, ok := raw["continent"]; ok { - clean["continent"] = continent - } - if countryen, ok := raw["countryen"]; ok { - clean["countryen"] = countryen - } - if countryezm, ok := raw["countryezm"]; ok { - clean["countryezm"] = countryezm - } - if countryszm, ok := raw["countryszm"]; ok { - clean["countryszm"] = countryszm - } - - list = append(list, clean) - } - - return map[string]interface{}{ - "count": len(list), - "list": list, - }, nil -} - -// processDuoYinZi 多音字查询 -func (s *ToolboxService) processDuoYinZi( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - - reqParams := map[string]interface{}{} - - // 多音字(必填) - word, ok := params["word"].(string) - if !ok || word == "" { - return nil, xerr.NewErrMsg("多音字查询缺少必填参数:word") - } - reqParams["word"] = word - - // 调用天行 API - resp, err := s.tianxingjuheClient.Get("duoyinzi/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求多音字接口失败: %v", err)) - } - - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("多音字接口异常: %s", resp.Msg)) - } - - // 解析 result - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析多音字数据失败") - } - - // 解析 list - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("多音字列表数据异常") - } - - list := make([]string, 0, len(rawList)) - for _, item := range rawList { - if s, ok := item.(string); ok { - list = append(list, s) - } - } - - return map[string]interface{}{ - "hanzi": result["hanzi"], - "count": len(list), - "list": list, - }, nil -} - -// processDailyTel 全国常用电话查询 -func (s *ToolboxService) processDailyTel( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - - reqParams := map[string]interface{}{} - - // 机构名称或电话(必填) - word, ok := params["word"].(string) - if !ok || word == "" { - return nil, xerr.NewErrMsg("全国常用电话查询缺少必填参数:word") - } - reqParams["word"] = word - - // 调用天行 API - resp, err := s.tianxingjuheClient.Get("dailytel/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求全国常用电话接口失败: %v", err)) - } - - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("全国常用电话接口异常: %s", resp.Msg)) - } - - // 解析 result - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析全国常用电话数据失败") - } - - // 解析 list - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("全国常用电话列表数据异常") - } - - list := make([]map[string]interface{}, 0, len(rawList)) - - for _, item := range rawList { - raw, ok := item.(map[string]interface{}) - if !ok { - continue - } - - clean := map[string]interface{}{} - if name, ok := raw["name"]; ok { - clean["name"] = name - } - if cate, ok := raw["cate"]; ok { - clean["cate"] = cate - } - if tel, ok := raw["tel"]; ok { - clean["tel"] = tel - } - - list = append(list, clean) - } - - return map[string]interface{}{ - "count": len(list), - "list": list, - }, nil -} - -// processObdCode 汽车 OBD 故障码查询 -func (s *ToolboxService) processObdCode( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - - reqParams := map[string]interface{}{} - - // OBD 故障码(必填) - code, ok := params["code"].(string) - if !ok || code == "" { - return nil, xerr.NewErrMsg("汽车OBD查询缺少必填参数:code") - } - reqParams["code"] = code - - // 调用天行 API - resp, err := s.tianxingjuheClient.Get("obdcode/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求汽车OBD接口失败: %v", err)) - } - - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("汽车OBD接口异常: %s", resp.Msg)) - } - - // 解析 result - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析汽车OBD数据失败") - } - - // 解析 list - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("汽车OBD列表数据异常") - } - - list := make([]map[string]interface{}, 0, len(rawList)) - - for _, item := range rawList { - raw, ok := item.(map[string]interface{}) - if !ok { - continue - } - - clean := map[string]interface{}{} - if v, ok := raw["code"]; ok { - clean["code"] = v - } - if v, ok := raw["descr"]; ok { - clean["descr"] = v - } - if v, ok := raw["ennote"]; ok { - clean["ennote"] = v - } - if v, ok := raw["zhnote"]; ok { - clean["zhnote"] = v - } - if v, ok := raw["carmodel"]; ok { - clean["carmodel"] = v - } - if v, ok := raw["category"]; ok { - clean["category"] = v - } - - list = append(list, clean) - } - - return map[string]interface{}{ - "count": len(list), - "list": list, - }, nil -} - -// processChaiZi 汉语拆字查询 -func (s *ToolboxService) processChaiZi( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - - reqParams := map[string]interface{}{} - - // 查询内容(必填) - word, ok := params["word"].(string) - if !ok || word == "" { - return nil, xerr.NewErrMsg("汉语拆字查询缺少必填参数:word") - } - reqParams["word"] = word - - // 查询类型(可选,默认 0) - if typ, ok := params["type"].(float64); ok { - reqParams["type"] = int(typ) - } - - // 调用天行 API - resp, err := s.tianxingjuheClient.Get("chaizi/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求汉语拆字接口失败: %v", err)) - } - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("汉语拆字接口异常: %s", resp.Msg)) - } - - // 解析 result - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析汉语拆字数据失败") - } - - // 解析 list - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("汉语拆字列表数据异常") - } - - list := make([]map[string]interface{}, 0, len(rawList)) - for _, item := range rawList { - raw, ok := item.(map[string]interface{}) - if !ok { - continue - } - clean := map[string]interface{}{} - if texts, ok := raw["texts"]; ok { - clean["texts"] = texts - } - if words, ok := raw["words"]; ok { - clean["words"] = words - } - list = append(list, clean) - } - - return map[string]interface{}{ - "count": len(list), - "list": list, - }, nil -} - -// processCityLookup 地区搜索 -func (s *ToolboxService) processCityLookup( - ctx context.Context, +// processZone 地区搜索查询 +func (s *ToolboxService) processZone(ctx context.Context, params map[string]interface{}, ) (map[string]interface{}, error) { @@ -6074,6 +5732,336 @@ func (s *ToolboxService) processMsdl( }, nil } +// processTimeZone 国际时区查询 +func (s *ToolboxService) processTimeZone( + ctx context.Context, + params map[string]interface{}, +) (map[string]interface{}, error) { + + reqParams := map[string]interface{}{} + + // 国家/地区(必填) + word, ok := params["word"].(string) + if !ok || word == "" { + return nil, xerr.NewErrMsg("国际时区查询缺少必填参数:word") + } + reqParams["word"] = word + + // 调用天行 API + resp, err := s.tianxingjuheClient.Get("timezone/index", reqParams) + if err != nil { + return nil, xerr.NewErrMsg(fmt.Sprintf("请求国际时区接口失败: %v", err)) + } + + if resp.Code != 200 { + return nil, xerr.NewErrMsg(fmt.Sprintf("国际时区接口异常: %s", resp.Msg)) + } + + // 解析 result + result, ok := resp.Result.(map[string]interface{}) + if !ok { + return nil, xerr.NewErrMsg("解析国际时区数据失败") + } + + // 解析 list + rawList, ok := result["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("国际时区列表数据异常") + } + + list := make([]map[string]interface{}, 0, len(rawList)) + + for _, item := range rawList { + raw, ok := item.(map[string]interface{}) + if !ok { + continue + } + + clean := map[string]interface{}{} + if country, ok := raw["country"]; ok { + clean["country"] = country + } + if areaname, ok := raw["areaname"]; ok { + clean["areaname"] = areaname + } + if timezone, ok := raw["timezone"]; ok { + clean["timezone"] = timezone + } + if continent, ok := raw["continent"]; ok { + clean["continent"] = continent + } + if countryen, ok := raw["countryen"]; ok { + clean["countryen"] = countryen + } + if countryezm, ok := raw["countryezm"]; ok { + clean["countryezm"] = countryezm + } + if countryszm, ok := raw["countryszm"]; ok { + clean["countryszm"] = countryszm + } + + list = append(list, clean) + } + + return map[string]interface{}{ + "count": len(list), + "list": list, + }, nil +} + +// processDuoYinZi 多音字查询 +func (s *ToolboxService) processDuoYinZi( + ctx context.Context, + params map[string]interface{}, +) (map[string]interface{}, error) { + + reqParams := map[string]interface{}{} + + // 多音字(必填) + word, ok := params["word"].(string) + if !ok || word == "" { + return nil, xerr.NewErrMsg("多音字查询缺少必填参数:word") + } + reqParams["word"] = word + + // 调用天行 API + resp, err := s.tianxingjuheClient.Get("duoyinzi/index", reqParams) + if err != nil { + return nil, xerr.NewErrMsg(fmt.Sprintf("请求多音字接口失败: %v", err)) + } + + if resp.Code != 200 { + return nil, xerr.NewErrMsg(fmt.Sprintf("多音字接口异常: %s", resp.Msg)) + } + + // 解析 result + result, ok := resp.Result.(map[string]interface{}) + if !ok { + return nil, xerr.NewErrMsg("解析多音字数据失败") + } + + // 解析 list + rawList, ok := result["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("多音字列表数据异常") + } + + list := make([]string, 0, len(rawList)) + for _, item := range rawList { + if s, ok := item.(string); ok { + list = append(list, s) + } + } + + return map[string]interface{}{ + "hanzi": result["hanzi"], + "count": len(list), + "list": list, + }, nil +} + +// processDailyTel 全国常用电话查询 +func (s *ToolboxService) processDailyTel( + ctx context.Context, + params map[string]interface{}, +) (map[string]interface{}, error) { + + reqParams := map[string]interface{}{} + + // 机构名称或电话(必填) + word, ok := params["word"].(string) + if !ok || word == "" { + return nil, xerr.NewErrMsg("全国常用电话查询缺少必填参数:word") + } + reqParams["word"] = word + + // 调用天行 API + resp, err := s.tianxingjuheClient.Get("dailytel/index", reqParams) + if err != nil { + return nil, xerr.NewErrMsg(fmt.Sprintf("请求全国常用电话接口失败: %v", err)) + } + + if resp.Code != 200 { + return nil, xerr.NewErrMsg(fmt.Sprintf("全国常用电话接口异常: %s", resp.Msg)) + } + + // 解析 result + result, ok := resp.Result.(map[string]interface{}) + if !ok { + return nil, xerr.NewErrMsg("解析全国常用电话数据失败") + } + + // 解析 list + rawList, ok := result["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("全国常用电话列表数据异常") + } + + list := make([]map[string]interface{}, 0, len(rawList)) + + for _, item := range rawList { + raw, ok := item.(map[string]interface{}) + if !ok { + continue + } + + clean := map[string]interface{}{} + if name, ok := raw["name"]; ok { + clean["name"] = name + } + if cate, ok := raw["cate"]; ok { + clean["cate"] = cate + } + if tel, ok := raw["tel"]; ok { + clean["tel"] = tel + } + + list = append(list, clean) + } + + return map[string]interface{}{ + "count": len(list), + "list": list, + }, nil +} + +// processObdCode 汽车 OBD 故障码查询 +func (s *ToolboxService) processObdCode( + ctx context.Context, + params map[string]interface{}, +) (map[string]interface{}, error) { + + reqParams := map[string]interface{}{} + + // OBD 故障码(必填) + code, ok := params["code"].(string) + if !ok || code == "" { + return nil, xerr.NewErrMsg("汽车OBD查询缺少必填参数:code") + } + reqParams["code"] = code + + // 调用天行 API + resp, err := s.tianxingjuheClient.Get("obdcode/index", reqParams) + if err != nil { + return nil, xerr.NewErrMsg(fmt.Sprintf("请求汽车OBD接口失败: %v", err)) + } + + if resp.Code != 200 { + return nil, xerr.NewErrMsg(fmt.Sprintf("汽车OBD接口异常: %s", resp.Msg)) + } + + // 解析 result + result, ok := resp.Result.(map[string]interface{}) + if !ok { + return nil, xerr.NewErrMsg("解析汽车OBD数据失败") + } + + // 解析 list + rawList, ok := result["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("汽车OBD列表数据异常") + } + + list := make([]map[string]interface{}, 0, len(rawList)) + + for _, item := range rawList { + raw, ok := item.(map[string]interface{}) + if !ok { + continue + } + + clean := map[string]interface{}{} + if v, ok := raw["code"]; ok { + clean["code"] = v + } + if v, ok := raw["descr"]; ok { + clean["descr"] = v + } + if v, ok := raw["ennote"]; ok { + clean["ennote"] = v + } + if v, ok := raw["zhnote"]; ok { + clean["zhnote"] = v + } + if v, ok := raw["carmodel"]; ok { + clean["carmodel"] = v + } + if v, ok := raw["category"]; ok { + clean["category"] = v + } + + list = append(list, clean) + } + + return map[string]interface{}{ + "count": len(list), + "list": list, + }, nil +} + +// processChaiZi 汉语拆字查询 +func (s *ToolboxService) processChaiZi( + ctx context.Context, + params map[string]interface{}, +) (map[string]interface{}, error) { + + reqParams := map[string]interface{}{} + + // 查询内容(必填) + word, ok := params["word"].(string) + if !ok || word == "" { + return nil, xerr.NewErrMsg("汉语拆字查询缺少必填参数:word") + } + reqParams["word"] = word + + // 查询类型(可选,默认 0) + if typ, ok := params["type"].(float64); ok { + reqParams["type"] = int(typ) + } + + // 调用天行 API + resp, err := s.tianxingjuheClient.Get("chaizi/index", reqParams) + if err != nil { + return nil, xerr.NewErrMsg(fmt.Sprintf("请求汉语拆字接口失败: %v", err)) + } + if resp.Code != 200 { + return nil, xerr.NewErrMsg(fmt.Sprintf("汉语拆字接口异常: %s", resp.Msg)) + } + + // 解析 result + result, ok := resp.Result.(map[string]interface{}) + if !ok { + return nil, xerr.NewErrMsg("解析汉语拆字数据失败") + } + + // 解析 list + rawList, ok := result["list"].([]interface{}) + if !ok { + return nil, xerr.NewErrMsg("汉语拆字列表数据异常") + } + + list := make([]map[string]interface{}, 0, len(rawList)) + for _, item := range rawList { + raw, ok := item.(map[string]interface{}) + if !ok { + continue + } + clean := map[string]interface{}{} + if texts, ok := raw["texts"]; ok { + clean["texts"] = texts + } + if words, ok := raw["words"]; ok { + clean["words"] = words + } + list = append(list, clean) + } + + return map[string]interface{}{ + "count": len(list), + "list": list, + }, nil +} + // processShiJing 诗经大全查询 func (s *ToolboxService) processShiJing( ctx context.Context, @@ -6290,7 +6278,7 @@ func (s *ToolboxService) processXhZd( }, nil } -// processTeleCode 标准电码查询 +// processTeleCode 标准电码查询 //改 func (s *ToolboxService) processTeleCode( ctx context.Context, params map[string]interface{}, @@ -6299,11 +6287,11 @@ func (s *ToolboxService) processTeleCode( reqParams := map[string]interface{}{} // 查询内容(必填) - text, ok := params["text"].(string) - if !ok || text == "" { - return nil, xerr.NewErrMsg("标准电码查询缺少必填参数:text") + city, ok := params["city"].(string) + if !ok || city == "" { + return nil, xerr.NewErrMsg("标准电码查询缺少必填参数:city") } - reqParams["text"] = text + reqParams["text"] = city // 返回类型(可选,默认 0) if str, ok := params["str"].(float64); ok && (str == 0 || str == 1) { @@ -6928,11 +6916,11 @@ func (s *ToolboxService) processAddressParse( reqParams := map[string]interface{}{} // 待解析文本(必填) - text, ok := params["text"].(string) - if !ok || text == "" { - return nil, xerr.NewErrMsg("物流地址解析缺少必填参数:text") + address, ok := params["address"].(string) + if !ok || address == "" { + return nil, xerr.NewErrMsg("物流地址解析缺少必填参数:address") } - reqParams["text"] = text + reqParams["text"] = address // 调用天行 API resp, err := s.tianxingjuheClient.Get("addressparse/index", reqParams) @@ -7787,51 +7775,6 @@ func (s *ToolboxService) processLaJiFenLei( }, nil } -// processDomainParse 域名DNS解析查询 -func (s *ToolboxService) processDomainParse( - ctx context.Context, - params map[string]interface{}, -) (map[string]interface{}, error) { - domain, ok := params["domain"].(string) - if !ok || domain == "" { - return nil, xerr.NewErrMsg("缺少必填参数:domain 域名") - } - - reqParams := map[string]interface{}{ - "domain": domain, - } - - resp, err := s.tianxingjuheClient.Get("domain/index", reqParams) - if err != nil { - return nil, xerr.NewErrMsg(fmt.Sprintf("请求域名解析接口失败: %v", err)) - } - if resp.Code != 200 { - return nil, xerr.NewErrMsg(fmt.Sprintf("域名解析接口异常: %s", resp.Msg)) - } - - result, ok := resp.Result.(map[string]interface{}) - if !ok { - return nil, xerr.NewErrMsg("解析域名数据失败") - } - - rawList, ok := result["list"].([]interface{}) - if !ok { - return nil, xerr.NewErrMsg("无解析记录数据") - } - - var dnsList []map[string]interface{} - for _, item := range rawList { - d, _ := item.(map[string]interface{}) - dnsList = append(dnsList, d) - } - - return map[string]interface{}{ - "domain": domain, - "count": len(dnsList), - "records": dnsList, - }, nil -} - // processHanZiPinYin 汉字转拼音 func (s *ToolboxService) processHanZiPinYin( ctx context.Context, @@ -8000,14 +7943,13 @@ func (s *ToolboxService) ListTools() []ToolInfo { {Key: "fanyi", Name: "在线翻译", Desc: "支持多语种互译,自动识别源语言"}, {Key: "holiday", Name: "节假日查询", Desc: "查询指定年份公历、农历、节假日信息"}, {Key: "garbage", Name: "垃圾分类查询", Desc: "输入垃圾名称查询分类及投放说明"}, - {Key: "zone", Name: "地区编码查询", Desc: "查询省市区三级行政区划代码及名称"}, + {Key: "zone", Name: "地区搜索查询", Desc: "查询省市区三级行政区划代码及名称"}, // ─── 第二批新增工具 ─── {Key: "timezone", Name: "时区查询", Desc: "查询全球各时区的当前时间"}, {Key: "duoyinzi", Name: "多音字查询", Desc: "查询汉字的多音字及不同读音"}, {Key: "dailytel", Name: "每日一句", Desc: "每日一句励志语录"}, {Key: "obdcode", Name: "OBD故障码", Desc: "查询汽车OBD故障码含义及解决方案"}, {Key: "chaizi", Name: "汉字拆解", Desc: "查询汉字的拆字结构及含义"}, - {Key: "citylookup", Name: "城市查询", Desc: "查询城市基本信息及归属"}, {Key: "huayu", Name: "华语句子", Desc: "随机返回优美华语句子"}, {Key: "moodpoetry", Name: "心情诗词", Desc: "根据心情推荐古诗词"}, {Key: "pcterm", Name: "电脑术语", Desc: "查询电脑相关术语解释"}, @@ -8046,7 +7988,6 @@ func (s *ToolboxService) ListTools() []ToolInfo { {Key: "story", Name: "故事大全", Desc: "各类故事集锦"}, {Key: "qingshi", Name: "情诗", Desc: "经典情诗词句"}, {Key: "lajifenlei", Name: "垃圾分类", Desc: "垃圾分类查询指南"}, - {Key: "domainparse", Name: "域名解析", Desc: "域名Whois信息查询"}, {Key: "hanzipinyin", Name: "汉字拼音", Desc: "汉字拼音查询"}, {Key: "shorthistory", Name: "简明历史", Desc: "历史事件简明介绍"}, }