package main import ( "encoding/json" "fmt" "io/ioutil" "math/rand" "net/http" "os" "strconv" "strings" "time" ) const ( characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" separator = "-" length = 28 ) func generateRandomSid() string { rand.Seed(time.Now().UnixNano()) var sb strings.Builder half := length / 2 for i := 0; i < length; i++ { if i == half { sb.WriteString(separator) } else { sb.WriteByte(characters[rand.Intn(len(characters))]) } } return sb.String() } func rangeFunc(n int) []int { arr := make([]int, n) for i := 0; i < n; i++ { arr[i] = i } return arr } func input(prompt string) (string, error) { fmt.Print(prompt) var input string _, err := fmt.Scanln(&input) return input, err } func sleep(timeout int) { time.Sleep(time.Duration(timeout) * time.Millisecond) } func praise(id int, max int) (int, error) { sid := generateRandomSid() successCount := 0 max = min(max, 1) for _, _ = range rangeFunc(max) { url := fmt.Sprintf("https://shiqu.zhilehuo.com/api/soundRecord/praise?soundRecordId=%d¶Sid=%s", id, sid) req, err := http.NewRequest("GET", url, nil) if err != nil { return 0, err } req.Header.Set("Accept", "application/json, text/plain, */*") req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9") req.Header.Set("Sec-Fetch-Dest", "empty") req.Header.Set("Sec-Fetch-Mode", "cors") req.Header.Set("Sec-Fetch-Site", "same-origin") req.Header.Set("Cookie", fmt.Sprintf("sid=%s", sid)) req.Header.Set("Referer", fmt.Sprintf("https://shiqu.zhilehuo.com/page/record/soundRecordDetail.html?source=share&id=%d&code=011CrS000ZlKxS1qQH300N6Ia90CrS0E&state=sq2019", id)) req.Header.Set("Referrer-Policy", "unsafe-url") client := &http.Client{} resp, err := client.Do(req) if err != nil { return 0, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return 0, err } var result map[string]interface{} err = json.Unmarshal(body, &result) if err != nil { return 0, err } code, ok := result["code"].(float64) if !ok { return 0, fmt.Errorf("无法获取 code") } if int(code) == 0 { successCount++ } } if successCount > 0 { fmt.Printf("帮忙点赞%d次\n", successCount) } return successCount, nil } func getPraiseCount(id int) (int, error) { sid := generateRandomSid() url := fmt.Sprintf("https://shiqu.zhilehuo.com/api/soundRecord/getSoundRecordDetail?id=%d&from=share&startDate=&endDate=&sg=", id) req, err := http.NewRequest("GET", url, nil) if err != nil { return -1, err } req.Header.Set("Accept", "application/json, text/plain, */*") req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9") req.Header.Set("Sec-Fetch-Dest", "empty") req.Header.Set("Sec-Fetch-Mode", "cors") req.Header.Set("Sec-Fetch-Site", "same-origin") req.Header.Set("Cookie", fmt.Sprintf("sid=%s", sid)) req.Header.Set("Referer", fmt.Sprintf("https://shiqu.zhilehuo.com/page/record/soundRecordDetail.html?source=share&id=%d", id)) req.Header.Set("Referrer-Policy", "unsafe-url") client := &http.Client{} resp, err := client.Do(req) if err != nil { return -1, err } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { return -1, err } var result map[string]interface{} err = json.Unmarshal(body, &result) if err != nil { return -1, err } data, ok := result["data"].(map[string]interface{}) if !ok { return -1, fmt.Errorf("无法获取 data") } praiseCount, ok := data["praiseCount"].(float64) if !ok { return -1, fmt.Errorf("无法获取 praiseCount") } return int(praiseCount), nil } func min(a, b int) int { if a < b { return a } return b } func main() { rand.Seed(time.Now().UnixNano()) var id int var praiseCount int inputUrl, err := input("点赞链接=>") if err != nil { fmt.Println("读取输入错误:", err) os.Exit(1) } idMatch0 := strings.Split(inputUrl, "id%3D") if len(idMatch0) > 1 { idStr := strings.Split(idMatch0[1], "%")[0] id, err = strconv.Atoi(idStr) if err != nil { fmt.Println("解析id错误:", err) os.Exit(1) } } else { idMatch1 := strings.Split(inputUrl, "id=") if len(idMatch1) > 1 { idStr := strings.Split(idMatch1[1], "&")[0] id, err = strconv.Atoi(idStr) if err != nil { fmt.Println("解析id错误:", err) os.Exit(1) } } else { fmt.Println("未识别到作品,可能是链接有误,5秒后退出") sleep(5000) os.Exit(1) } } fmt.Printf("id=>%d\n", id) praiseCountStr, err := input("点赞次数=>") if err != nil { fmt.Println("读取输入错误:", err) os.Exit(1) } praiseCount, err = strconv.Atoi(praiseCountStr) if err != nil { fmt.Println("解析点赞次数错误:", err) os.Exit(1) } currentPraise, err := getPraiseCount(id) if err != nil { fmt.Println("获取当前点赞数错误:", err) os.Exit(1) } fmt.Printf("点赞前点赞数=>%d\n", currentPraise) var totalSuccess int for praiseCount > 0 { c := min(praiseCount, 1) success, err := praise(id, c) if err != nil { fmt.Println("点赞失败:", err) break } totalSuccess += success praiseCount -= c // 其他代码 } finalPraise, err := getPraiseCount(id) if err != nil { fmt.Println("获取最终点赞数错误:", err) os.Exit(1) } fmt.Printf("点赞后点赞数=>%d\n", finalPraise) sleep(5000) }