infoGetter/api/detail.go

132 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)
}
}
}