132 lines
4.7 KiB
Go
132 lines
4.7 KiB
Go
|
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)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|