package api import ( "database/sql/driver" "encoding/json" "fmt" ctxLogger "github.com/luizsuper/ctxLoggers" "go.uber.org/zap" "time" ) type ( DetailReq struct { ScriptId string `json:"scriptId"` CityCode string `json:"cityCode"` } DetailInfo struct { Resp DetailResp `json:"resp" gorm:"column:resp"` ID int `json:"id" gorm:"column:id"` } DetailResp struct { Head struct { Msg string `json:"msg"` Code int `json:"code"` } `json:"head" gorm:"column:head"` Data struct { ScriptId string `json:"scriptId"` ScriptName string `json:"scriptName"` ScriptCoverUrl string `json:"scriptCoverUrl"` ScriptIntro string `json:"scriptIntro"` ScriptCategory int `json:"scriptCategory"` ScriptPlayerLimit int `json:"scriptPlayerLimit"` ScriptMalePlayerLimit int `json:"scriptMalePlayerLimit"` ScriptFemalePlayerLimit int `json:"scriptFemalePlayerLimit"` ScriptTag string `json:"scriptTag"` ScriptScore float64 `json:"scriptScore"` ScriptScoreCount int `json:"scriptScoreCount"` ScriptInferenceScore float64 `json:"scriptInferenceScore"` ScriptPlotScore float64 `json:"scriptPlotScore"` ScriptComplexScore float64 `json:"scriptComplexScore"` ScriptImageContent string `json:"scriptImageContent"` PlayerRoleReversalStatus int `json:"playerRoleReversalStatus"` ScriptTextContent string `json:"scriptTextContent"` ScriptSourceId interface{} `json:"scriptSourceId"` ScriptGroupCount int `json:"scriptGroupCount"` ShopHaveScriptCount int `json:"shopHaveScriptCount"` ScriptWantPlayerCount int `json:"scriptWantPlayerCount"` ScriptPlayedCount int `json:"scriptPlayedCount"` WantPlayStatus int `json:"wantPlayStatus"` UserPlayScriptStatus int `json:"userPlayScriptStatus"` EvaluateStatus int `json:"evaluateStatus"` UserPlayScriptTime interface{} `json:"userPlayScriptTime"` UserScriptScore interface{} `json:"userScriptScore"` UserPlayScriptId interface{} `json:"userPlayScriptId"` ShopScriptReserveCount int `json:"shopScriptReserveCount"` GroupDuration int `json:"groupDuration"` RecommendUrl string `json:"recommendUrl"` RecommendNum int `json:"recommendNum"` ScriptDifficultyDegreeName string `json:"scriptDifficultyDegreeName"` } `json:"data"` } ) const DetailUrl = "https://api.h5.helloaba.cn/script/platformScriptInfo" func (m *DetailInfo) TableName() string { return "detail_info" } // Value 实现gorm针对json数据结构的interface func (p DetailResp) Value() (driver.Value, error) { return json.Marshal(p) } func (p *DetailResp) Scan(input interface{}) error { return json.Unmarshal(input.([]byte), &p) } // DetailMarshal 将http访问之后的[]byte 解析为DetailResp func DetailMarshal(req, body []byte) (resp interface{}, err error) { r := new(DetailResp) err = json.Unmarshal(body, r) if err != nil { ctxLogger.Error(nil, "json UnmarshalError", zap.String("resp body", string(body))) } if r.Head.Code != 200 || r.Head.Msg != "成功" { ctxLogger.Error(nil, "net wrok error", zap.String("resq body", string(req)), zap.String("resp body", string(body))) } return r, err } // DetailKvStr todo:抽象 // DetailKvStr 按照顺序对查询的key排序 func DetailKvStr(body DetailReq) string { //strings := []string{"cityCode", "scriptId"} //sort.Strings(strings) //cityCode scriptId var s = "" s += fmt.Sprintf("%v=%v&", "cityCode", body.CityCode) s += fmt.Sprintf("%v=%v", "scriptId", body.ScriptId) return s } //单点访问 func detail(body DetailReq) { dto, err := Attach(DetailUrl, GetCheckSum(DetailKvStr(body)), body, M, DetailMarshal) if err != nil { ctxLogger.Error(nil, "net error record") } if s, ok := dto.(*DetailResp); !ok { ctxLogger.Error(nil, "assertion error") } else { info := DetailInfo{Resp: *s} DB.Create(&info) ctxLogger.Info(nil, "detailOk", zap.String("sid", s.Data.ScriptId)) time.Sleep(time.Duration(1) * time.Second) } } //todo:页数抽离出来 //从db中拿出 list的item 中的id,进行轮训访问 func multiReq() { var infos []BasicInfo DB.Where("page > 100 and page <= 573").Find(&infos) for _, v := range infos { for _, v := range v.Resp.Data.Items { req := DetailReq{ScriptId: v.ScriptID, CityCode: "310000"} detail(req) } } }