| 102 | } |
| 103 | |
| 104 | func geiAPIdata(s string) (*idiomJSON, error) { |
| 105 | url := "https://hanyuapp.baidu.com/dictapp/swan/termdetail?wd=" + url.QueryEscape(s) + "&client=pc&source_tag=2&lesson_from=xiaodu" |
| 106 | logrus.Debugln(url) |
| 107 | data, err := web.GetData(url) |
| 108 | if err != nil { |
| 109 | return nil, err |
| 110 | } |
| 111 | |
| 112 | var apiData baiduAPIData |
| 113 | err = json.Unmarshal(data, &apiData) |
| 114 | if err != nil { |
| 115 | return nil, err |
| 116 | } |
| 117 | if apiData.Data.Name == "" { |
| 118 | return nil, errors.New("未找到该成语") |
| 119 | } |
| 120 | derivation := "" |
| 121 | for _, v := range apiData.Data.ChuChu { |
| 122 | if derivation != "" { |
| 123 | derivation += "\n" |
| 124 | } |
| 125 | derivation += v.Dynasty + "·" + v.Author + " " + v.Source + ":" + v.CiteOriginalText |
| 126 | } |
| 127 | |
| 128 | explanation := apiData.Data.DefinitionInfo.Definition + apiData.Data.DefinitionInfo.ModernDefinition |
| 129 | if derivation == "" && explanation == "" { |
| 130 | return nil, errors.New("无法获取成语词源和解释") |
| 131 | } |
| 132 | synonyms := make([]string, len(apiData.Data.Synonyms)) |
| 133 | for i, synonym := range apiData.Data.Synonyms { |
| 134 | synonyms[i] = synonym.Name |
| 135 | } |
| 136 | for i, synonym := range apiData.Data.Synonym { |
| 137 | if !slices.Contains(synonyms, synonym) { |
| 138 | synonyms[i] = synonym |
| 139 | } |
| 140 | } |
| 141 | liju := "" |
| 142 | if len(apiData.Data.Liju) > 0 { |
| 143 | liju = apiData.Data.Liju[0].Name |
| 144 | } |
| 145 | |
| 146 | // 生成字符切片 |
| 147 | chars := make([]string, 0, len(s)) |
| 148 | for _, r := range s { |
| 149 | chars = append(chars, string(r)) |
| 150 | } |
| 151 | // 分割拼音 |
| 152 | pinyinSlice := strings.Split(apiData.Data.Pinyin, " ") |
| 153 | if len(pinyinSlice) != len(chars) { |
| 154 | pinyinSlice = strings.Split(apiData.Data.Definition[0].Pinyin, " ") |
| 155 | } |
| 156 | |
| 157 | newIdiom := idiomJSON{ |
| 158 | Word: apiData.Data.Name, |
| 159 | Chars: chars, |
| 160 | Pinyin: pinyinSlice, |
| 161 | Baobian: apiData.Data.Baobian, |