package main import ( "flag" "fmt" "net/http" "os" "slices" "strconv" "strings" "git.algo.com.cn/public/saasapi" "git.algo.com.cn/public/saasapi/pkg/saashttp" "google.golang.org/protobuf/encoding/protojson" ) type getExpParams struct { saasHttp *saashttp.SaasClient bucketIDs []uint32 beginDay uint64 endDay uint64 target string advertiserIDs []uint64 groupBy []string totalFlag bool extFields []string } func RunExpGet(args ...string) error { fs := flag.NewFlagSet("get", flag.ExitOnError) cfgFile := paramConfig(fs) beginDay := paramWhereBeginDay(fs) endDay := paramWhereEndDay(fs) bucketIDs := paramWhereBucketIds(fs) target := paramWhereTarget(fs) advertiserIDs := paramWhereAdvertiserId(fs) groupBy := paramGroupBy(fs) totalFlag := paramTotalFlag(fs) extFields := paramExtFields(fs) if err := fs.Parse(args); err != nil { fmt.Fprintln(os.Stderr, "command line parse error", "err", err) return err } if fs.NArg() > 0 { fs.PrintDefaults() return nil } bucketIDsNumSlice := []uint32{} if *bucketIDs != "" { expIDsSlice := strings.Split(*bucketIDs, ",") for _, id := range expIDsSlice { idNum, err := strconv.ParseUint(id, 10, 32) if err != nil { fmt.Fprintln(os.Stderr, "expid parse error", "err", err) return err } if idNum == 0 || idNum > 10 { fmt.Fprintln(os.Stderr, "expid range error") return nil } bucketIDsNumSlice = append(bucketIDsNumSlice, uint32(idNum)) } } if *beginDay < 20250101 || *beginDay > 21001231 || *endDay < 20250101 || *endDay > 21001231 { fmt.Fprintln(os.Stderr, "begin/end day error") return nil } if *target == "" { fmt.Fprintln(os.Stderr, "target error") return nil } uidNumSlice := []uint64{} if *advertiserIDs != "" { uidSlice := strings.Split(*advertiserIDs, ",") for _, id := range uidSlice { idNum, err := strconv.ParseUint(id, 10, 64) if err != nil { fmt.Fprintln(os.Stderr, "advertiser id parse error", "err", err) return err } if idNum == 0 { fmt.Fprintln(os.Stderr, "advertiser id error") return nil } uidNumSlice = append(uidNumSlice, idNum) } } groupBySlice := []string{} if *groupBy != "" { validGroupBy := map[string]bool{"advertiser_id": true, "user_weight_factor": true} groupBySlice := strings.Split(*groupBy, ",") for _, group := range groupBySlice { if !validGroupBy[group] { fmt.Fprintln(os.Stderr, "group by error", "group", group) return nil } } } extFieldsSlice := []string{} if *extFields != "" { extFieldsSlice = strings.Split(*extFields, ",") if slices.Contains(extFieldsSlice, "") { fmt.Fprintln(os.Stderr, "ext field error") return nil } } cfg, err := LoadConfigFile(*cfgFile) if err != nil { fmt.Fprintln(os.Stderr, "LoadConfigFile error", "err", err) return err } getExpParams := getExpParams{ saasHttp: &saashttp.SaasClient{ Client: &http.Client{}, ApiUrls: saashttp.InitAPIUrl(&cfg.ApiUrls), Auth: &cfg.Auth, }, bucketIDs: bucketIDsNumSlice, beginDay: *beginDay, endDay: *endDay, target: *target, advertiserIDs: uidNumSlice, groupBy: groupBySlice, totalFlag: *totalFlag, extFields: extFieldsSlice, } return doExpGet(getExpParams) } func doExpGet(getExpParams getExpParams) error { totalFlag := uint32(0) if getExpParams.totalFlag { totalFlag = 1 } saasReq := &saasapi.SaasReq{ Cmd: &saasapi.SaasReq_ExpGet{ ExpGet: &saasapi.ExpGet{ WhereBucketId: getExpParams.bucketIDs, WhereBeginDay: getExpParams.beginDay, WhereEndDay: getExpParams.endDay, WhereTarget: getExpParams.target, WhereAdvertiserId: getExpParams.advertiserIDs, GroupBy: getExpParams.groupBy, TotalFlag: totalFlag, ExtFields: getExpParams.extFields, }, }, } res, err := getExpParams.saasHttp.ExpGet(saasReq) if err != nil { fmt.Fprintln(os.Stderr, "submit GetExp error", "err", err) return err } if res.Code != saasapi.ErrorCode_SUCC { fmt.Fprintln(os.Stderr, "get exp failed", "code", res.Code, "status", res.Status) return nil } getExpRes := res.GetExpGetRes() fmt.Printf("exp res: %v\n", protojson.Format(getExpRes)) return nil }