Golang 获取应用在 apple app store 排名

94 阅读1分钟

效果如下

image.png

代码如下:

package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"

	"github.com/olekukonko/tablewriter"
	"github.com/tidwall/gjson"
)

var words = flag.String("words", "", "搜索词汇, 多个使用英文逗号隔开, 如 实验室,NB实验室,化学实验")
var limit = flag.Int("limit", 8, "每个关键词搜索结果打印行数")

func main() {
	flag.Parse()

	if *words == "" {
		fmt.Println("请指定words, 格式如下 -words 实验室,NB实验室,化学实验")
		return
	}

	wordArr := strings.Split(*words, ",")

	var summary [][]string

	for _, word := range wordArr {
		url := fmt.Sprintf("https://itunes.apple.com/search?term=%s&country=cn&media=software&entity=software&genreId=&limit=100&offset=0&sort=aaa", word)

		resp, err := http.Get(url)
		if err != nil {
			panic(err)
		}

		body, err := io.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}
		resp.Body.Close()

		namesRaw := gjson.GetBytes(body, "results.#.trackName")
		rateCntRaw := gjson.GetBytes(body, "results.#.userRatingCount")
		// fmt.Println(value.String())
		var names []string
		err = json.Unmarshal([]byte(namesRaw.String()), &names)
		if err != nil {
			panic(err)
		}

		var rateRates []int32
		err = json.Unmarshal([]byte(rateCntRaw.String()), &rateRates)
		if err != nil {
			panic(err)
		}

		var data [][]string
		index := 0
		nbRank := 0
		for i, name := range names {
			index++
			if index <= *limit || name == "NB实验室" {
				data = append(data, []string{
					fmt.Sprintf("%d", index),
					name,
					fmt.Sprintf("%d", rateRates[i]),
				})
				if name == "NB实验室" {
					nbRank = index
				}
			}
		}
		table := tablewriter.NewWriter(os.Stdout)
		table.SetHeader([]string{"排名", word, "评分人数"})

		if nbRank == 0 {
			table.SetFooter([]string{"", "NB实验室", "未上榜"})
			summary = append(summary, []string{
				word,
				"未上榜",
			})
		} else {
			table.SetFooter([]string{"", "NB实验室", fmt.Sprintf("%d", nbRank)})
			summary = append(summary, []string{
				word,
				fmt.Sprintf("%d", nbRank),
			})
		}

		for _, v := range data {
			table.Append(v)
		}
		table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiGreenColor},
			tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiGreenColor},
			tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiGreenColor})
		table.Render()
		fmt.Println()
	}

	fmt.Println("===============结果汇总===============\n")
	summaryTable := tablewriter.NewWriter(os.Stdout)
	summaryTable.SetHeader([]string{"关键词", "名次"})

	for _, v := range summary {
		summaryTable.Append(v)
	}

	summaryTable.Render()

}