package main import ( "database/sql" "encoding/json" "intimate" "log" "time" "github.com/474420502/gcurl" "github.com/tidwall/gjson" ) // estore 解析存储连接实例 // var estore *intimate.StoreExtractor = intimate.NewStoreExtractor() // Execute 执行 func Execute() { nimoapi := `curl 'https://api.nimo.tv/oversea/nimo/api/v2/liveRoom/liveRoomPage-1-100-/HK/1028/1000' \ -H 'authority: api.nimo.tv' \ -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary3bCA1lzvhj4kBR4Q' \ -H 'accept: */*' \ -H 'origin: https://www.nimo.tv' \ -H 'sec-fetch-site: same-site' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-dest: empty' \ -H 'referer: https://www.nimo.tv/lives' \ -H 'accept-language: zh-CN,zh;q=0.9' \ --data-binary $'------WebKitFormBoundary3bCA1lzvhj4kBR4Q\r\nContent-Disposition: form-data; name="keyType"\r\n\r\n0\r\n------WebKitFormBoundary3bCA1lzvhj4kBR4Q\r\nContent-Disposition: form-data; name="body"\r\n\r\n{"deviceType":7,"requestSource":"WEB","iNetType":5}\r\n------WebKitFormBoundary3bCA1lzvhj4kBR4Q--\r\n' \ --compressed` curl := gcurl.Parse(nimoapi) ses := curl.CreateSession() tp := curl.CreateTemporary(ses) param := tp.PathParam("liveRoomPage-(1)-") ps := intimate.NewPerfectShutdown() for !ps.IsClose() { resp, err := tp.Execute() if err != nil { log.Println(err) time.Sleep(time.Second) continue } result := gjson.ParseBytes(resp.Content()) roomlist := result.Get("data.result.liveRoomViewList") if !roomlist.IsArray() { log.Println("json is error") log.Println(string(resp.Content())) break } rooms := roomlist.Array() log.Println(tp.GetURLRawPath(), "rooms:", len(rooms)) if len(rooms) == 0 { param.IntSet(1) time.Sleep(time.Minute * 15) continue } for _, room := range rooms { streamer := &intimate.Streamer{} streamer.Platform = intimate.PNimo if userid := room.Get("id").String(); userid != "" { streamer.UserId = &userid streamer.LiveUrl = &sql.NullString{String: "https://www.nimo.tv/live/" + userid, Valid: true} channel := room.Get("roomTypeName").String() streamer.Channel = &sql.NullString{String: channel, Valid: channel != ""} username := room.Get("anchorName").String() streamer.UserName = &sql.NullString{String: username, Valid: username != ""} if rtags := room.Get("anchorLabels"); rtags.IsArray() { var tags []string for _, r := range rtags.Array() { tag := r.Get("labelName").String() tags = append(tags, tag) } data, err := json.Marshal(tags) if err != nil { panic(err) } streamer.Tags = data } streamer.UpdateInterval = 120 err = intimate.TStreamer.Insert(streamer) if err != nil { panic(err) } } else { log.Println("userid is null.", room.String()) } } param.IntAdd(1) } }