package util import ( "encoding/json" "fmt" "io" "net/http" "strings" ) func GetSongIdsByHash(hashs []string) (hashToSongId map[string]string, err error) { if len(hashs) == 0 { return nil, nil } //每批最多49个 hashToSongId = make(map[string]string) batchSize := 49 for i := 0; i < len(hashs); i += batchSize { end := i + batchSize if end > len(hashs) { end = len(hashs) } batchHashs := hashs[i:end] queryUrl := "https://api.beatsaver.com/maps/hash/" + strings.Join(batchHashs, ",") resp, err := http.Get(queryUrl) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != 200 { return nil, fmt.Errorf("获取歌曲ID失败,状态码:%d,url:%s", resp.StatusCode, queryUrl) } body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } var response = make(map[string]struct { ID string `json:"id"` }) if len(batchHashs) == 1 { var singleResponse struct { ID string `json:"id"` } err = json.Unmarshal(body, &singleResponse) response[batchHashs[0]] = singleResponse } else { err = json.Unmarshal(body, &response) } if err != nil { return nil, err } for hash, data := range response { hashToSongId[hash] = data.ID } } return hashToSongId, nil }