package crawler import ( "bytes" "encoding/json" "fmt" "net/url" "pcgamedb/cache" "pcgamedb/db" "regexp" "strconv" "time" "pcgamedb/constant" "pcgamedb/model" "pcgamedb/utils" "github.com/PuerkitoBio/goquery" ) func GetSteam250(URL string) ([]*model.GameInfo, error) { key := "steam250:" + url.QueryEscape(URL) if val, ok := cache.Get(key); ok { var infos []*model.GameInfo err := json.Unmarshal([]byte(val), &infos) if err != nil { return nil, err } return infos, nil } resp, err := utils.Request().Get(URL) if err != nil { return nil, err } doc, err := goquery.NewDocumentFromReader(bytes.NewReader(resp.Body())) if err != nil { return nil, err } var rank []model.Steam250Item var item model.Steam250Item steamIDs := make([]int, 0) doc.Find(".appline").Each(func(i int, s *goquery.Selection) { item.Name = s.Find(".title>a").First().Text() idStr := s.Find(".store").AttrOr("href", "") idSlice := regexp.MustCompile(`app/(\d+)/`).FindStringSubmatch(idStr) if len(idSlice) < 2 { return } item.SteamID, _ = strconv.Atoi(idSlice[1]) rank = append(rank, item) steamIDs = append(steamIDs, item.SteamID) }) infos, err := db.GetGameInfosByPlatformIDs("steam", steamIDs) if err != nil { return nil, err } if len(infos) > 10 { return infos[:10], nil } jsonBytes, err := json.Marshal(infos) if err == nil { _ = cache.SetWithExpire(key, string(jsonBytes), 12*time.Hour) } return infos, nil } func GetSteam250Top250() ([]*model.GameInfo, error) { return GetSteam250(constant.Steam250Top250URL) } func GetSteam250BestOfTheYear() ([]*model.GameInfo, error) { return GetSteam250(fmt.Sprintf(constant.Steam250BestOfTheYearURL, time.Now().UTC().Year())) } func GetSteam250WeekTop50() ([]*model.GameInfo, error) { return GetSteam250(constant.Steam250WeekTop50URL) } func GetSteam250MonthTop50() ([]*model.GameInfo, error) { return GetSteam250(constant.Steam250MonthTop50URL) } func GetSteam250MostPlayed() ([]*model.GameInfo, error) { return GetSteam250(constant.Steam250MostPlayedURL) }