578 lines
22 KiB
Go
578 lines
22 KiB
Go
package datadao
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"go-common/app/interface/main/mcn/dao/cache"
|
|
"go-common/app/interface/main/mcn/dao/global"
|
|
"go-common/app/interface/main/mcn/model/datamodel"
|
|
"go-common/app/interface/main/mcn/model/mcnmodel"
|
|
"go-common/app/interface/main/mcn/tool/datacenter"
|
|
tagmdl "go-common/app/interface/main/tag/api"
|
|
"go-common/library/log"
|
|
"go-common/library/sync/errgroup"
|
|
)
|
|
|
|
// const url for api
|
|
const (
|
|
APIMcnSummary = "http://berserker.bilibili.co/avenger/api/155/query" // 7 see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690
|
|
APIIndexInc = "http://berserker.bilibili.co/avenger/api/156/query" // 3.1
|
|
APIIndexSource = "http://berserker.bilibili.co/avenger/api/159/query" // 3.2
|
|
APIPlaySource = "http://berserker.bilibili.co/avenger/api/161/query" // 3.3
|
|
APIMcnFans = "http://berserker.bilibili.co/avenger/api/168/query" // 3.4
|
|
APIMcnFansInc = "http://berserker.bilibili.co/avenger/api/171/query" // 3.5
|
|
APIMcnFansDec = "http://berserker.bilibili.co/avenger/api/169/query" // 3.6
|
|
APIMcnFansAttentionWay = "http://berserker.bilibili.co/avenger/api/170/query" // 3.7
|
|
APIMcnFansSex = "http://berserker.bilibili.co/avenger/api/162/query" // 3.8
|
|
APIMcnFansAge = "http://berserker.bilibili.co/avenger/api/163/query" // 3.8
|
|
APIMcnFansPlayWay = "http://berserker.bilibili.co/avenger/api/164/query" // 3.8
|
|
APIMcnFansArea = "http://berserker.bilibili.co/avenger/api/165/query" // 3.9
|
|
APIMcnFansType = "http://berserker.bilibili.co/avenger/api/166/query" // 3.10
|
|
APIMcnFansTag = "http://berserker.bilibili.co/avenger/api/167/query" // 3.11
|
|
)
|
|
|
|
func (d *Dao) callDataAPI(c context.Context, api string, query *datacenter.Query, res interface{}) (err error) {
|
|
var response = &datacenter.Response{
|
|
Result: res,
|
|
}
|
|
if query.Error() != nil {
|
|
err = query.Error()
|
|
log.Error("query error, err=%s", err)
|
|
return
|
|
}
|
|
var params = url.Values{}
|
|
params.Add("query", query.String())
|
|
|
|
if err = d.Client.Get(c, api, params, response); err != nil {
|
|
log.Error("fail to get response, err=%+v", err)
|
|
return
|
|
}
|
|
|
|
if response.Code != http.StatusOK {
|
|
err = fmt.Errorf("code:%d, msg:%s", response.Code, response.Msg)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// GetMcnSummary 7
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-7.mcn获取概要数据
|
|
func (d *Dao) GetMcnSummary(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetDataSummaryReply, err error) {
|
|
res = new(mcnmodel.McnGetDataSummaryReply)
|
|
var tmp []*datamodel.DmConMcnArchiveD
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var api = APIMcnSummary
|
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res.CopyFromDmConMcnArchiveD(tmp[0])
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0])
|
|
return
|
|
}
|
|
|
|
//GetMcnSummaryCache GetMcnSummary with cache
|
|
func (d *Dao) GetMcnSummaryCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetDataSummaryReply, err error) {
|
|
res = new(mcnmodel.McnGetDataSummaryReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetDataSummaryReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetMcnSummary(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetIndexInc 3.1
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.1.查询MCN增量趋势
|
|
func (d *Dao) GetIndexInc(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexIncReply, err error) {
|
|
res = new(mcnmodel.McnGetIndexIncReply)
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
).Limit(30, 0).Order("log_date desc")
|
|
var api = APIIndexInc
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetIndexIncCache GetIndexInc with cache
|
|
func (d *Dao) GetIndexIncCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexIncReply, err error) {
|
|
res = new(mcnmodel.McnGetIndexIncReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetIndexIncReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetIndexInc(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetIndexSource 3.2
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.2.查询MCN下播放稿件来源所在分区
|
|
func (d *Dao) GetIndexSource(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexSourceReply, err error) {
|
|
res = new(mcnmodel.McnGetIndexSourceReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
)
|
|
var api = APIIndexSource
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
|
|
var tids []int64
|
|
for _, v := range res.Result {
|
|
tids = append(tids, v.TypeID)
|
|
}
|
|
|
|
tpNames := cache.GetTidNames(tids)
|
|
for _, v := range res.Result {
|
|
if tpName, ok := tpNames[v.TypeID]; ok {
|
|
v.TypeName = tpName
|
|
}
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetIndexSourceCache GetIndexSource with cache
|
|
func (d *Dao) GetIndexSourceCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetIndexSourceReply, err error) {
|
|
res = new(mcnmodel.McnGetIndexSourceReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetIndexSourceReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetIndexSource(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetPlaySource 3.3
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.3.查询MCN播放设备占比
|
|
func (d *Dao) GetPlaySource(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetPlaySourceReply, err error) {
|
|
res = new(mcnmodel.McnGetPlaySourceReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var api = APIPlaySource
|
|
var tmp []*mcnmodel.McnGetPlaySourceReply
|
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp)
|
|
return
|
|
}
|
|
|
|
//GetPlaySourceCache GetPlaySource with cache
|
|
func (d *Dao) GetPlaySourceCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetPlaySourceReply, err error) {
|
|
res = new(mcnmodel.McnGetPlaySourceReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetPlaySourceReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetPlaySource(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetMcnFans 3.4
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.4.查询MCN粉丝数与活跃度
|
|
func (d *Dao) GetMcnFans(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var tmp []*mcnmodel.McnGetMcnFansReply
|
|
var api = APIMcnFans
|
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0])
|
|
return
|
|
}
|
|
|
|
//GetMcnFansCache GetMcnFans with cache
|
|
func (d *Dao) GetMcnFansCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetMcnFans(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetMcnFansInc 3.5
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.5.查询MCN粉丝按天增量
|
|
func (d *Dao) GetMcnFansInc(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansIncReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansIncReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(30, 0).Order("log_date desc")
|
|
|
|
var api = APIMcnFansInc
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetMcnFansIncCache GetMcnFansInc with cache
|
|
func (d *Dao) GetMcnFansIncCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansIncReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansIncReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansIncReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetMcnFansInc(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetMcnFansDec 3.6
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.6.查询MCN粉丝取关数按天
|
|
func (d *Dao) GetMcnFansDec(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansDecReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansDecReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(30, 0).Order("log_date desc")
|
|
|
|
var api = APIMcnFansDec
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetMcnFansDecCache GetMcnFansDec with cache
|
|
func (d *Dao) GetMcnFansDecCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansDecReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansDecReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansDecReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetMcnFansDec(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetMcnFansAttentionWay 3.7
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.7.查询MCN粉丝关注渠道
|
|
func (d *Dao) GetMcnFansAttentionWay(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansAttentionWayReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansAttentionWayReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var tmp []*mcnmodel.McnGetMcnFansAttentionWayReply
|
|
var api = APIMcnFansAttentionWay
|
|
if err = d.callDataAPI(c, api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v) res(%+v)", api, signID, date, tmp[0])
|
|
return
|
|
}
|
|
|
|
//GetMcnFansAttentionWayCache GetMcnFansAttentionWay with cache
|
|
func (d *Dao) GetMcnFansAttentionWayCache(c context.Context, signID int64, date time.Time) (res *mcnmodel.McnGetMcnFansAttentionWayReply, err error) {
|
|
res = new(mcnmodel.McnGetMcnFansAttentionWayReply)
|
|
var cache = NewCacheMcnDataSignID(signID, date, res, "McnGetMcnFansAttentionWayReply", func(c context.Context, signID int64, date time.Time) (res interface{}, err error) {
|
|
return d.GetMcnFansAttentionWay(c, signID, date)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetFansBaseFansAttr 3.8
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.8.查询MCN粉丝/游客基本属性分析(性别占比 观众年龄 观看途径)
|
|
func (d *Dao) GetFansBaseFansAttr(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetBaseFansAttrReply, err error) {
|
|
res = new(mcnmodel.McnGetBaseFansAttrReply)
|
|
|
|
var group, _ = errgroup.WithContext(c)
|
|
group.Go(func() (err error) {
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var api = APIMcnFansSex
|
|
var tmp []*datamodel.DmConMcnFansSexW
|
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res.FansSex = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0])
|
|
return
|
|
})
|
|
group.Go(func() (err error) {
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var tmp []*datamodel.DmConMcnFansAgeW
|
|
var api = APIMcnFansAge
|
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res.FansAge = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0])
|
|
return
|
|
})
|
|
group.Go(func() (err error) {
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionLte(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
).Limit(1, 0).Order("log_date desc")
|
|
var tmp []*datamodel.DmConMcnFansPlayWayW
|
|
var api = APIMcnFansPlayWay
|
|
if err = d.callDataAPI(context.Background(), api, q, &tmp); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
if len(tmp) > 0 {
|
|
res.FansPlayWay = tmp[0]
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, tmp[0])
|
|
return
|
|
})
|
|
err = group.Wait()
|
|
if err != nil {
|
|
log.Error("fail to get data, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
//GetFansBaseFansAttrCache GetFansBaseFansAttr with cache
|
|
func (d *Dao) GetFansBaseFansAttrCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetBaseFansAttrReply, err error) {
|
|
res = new(mcnmodel.McnGetBaseFansAttrReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetBaseFansAttrReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetFansBaseFansAttr(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetFansArea 3.9
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.9.查询MCN粉丝/游客地区分布分析
|
|
func (d *Dao) GetFansArea(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansAreaReply, err error) {
|
|
res = new(mcnmodel.McnGetFansAreaReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
)
|
|
|
|
var api = APIMcnFansArea
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetFansAreaCache GetFansArea with cache
|
|
func (d *Dao) GetFansAreaCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansAreaReply, err error) {
|
|
res = new(mcnmodel.McnGetFansAreaReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansAreaReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetFansArea(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetFansType 3.10
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.10.查询MCN粉丝/游客内容倾向分析
|
|
func (d *Dao) GetFansType(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTypeReply, err error) {
|
|
res = new(mcnmodel.McnGetFansTypeReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
)
|
|
|
|
var api = APIMcnFansType
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
|
|
var tids []int64
|
|
for _, v := range res.Result {
|
|
tids = append(tids, v.TypeID)
|
|
}
|
|
|
|
tpNames := cache.GetTidNames(tids)
|
|
for _, v := range res.Result {
|
|
if tpName, ok := tpNames[v.TypeID]; ok {
|
|
v.TypeName = tpName
|
|
}
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetFansTypeCache GetFansType with cache
|
|
func (d *Dao) GetFansTypeCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTypeReply, err error) {
|
|
res = new(mcnmodel.McnGetFansTypeReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansTypeReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetFansType(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetFansTag 3.11
|
|
// see doc http://info.bilibili.co/pages/viewpage.action?pageId=11545690#id-对外接口文档-3.11.查询MCN粉丝/游客标签地图分析
|
|
func (d *Dao) GetFansTag(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTagReply, err error) {
|
|
res = new(mcnmodel.McnGetFansTagReply)
|
|
|
|
var q = &datacenter.Query{}
|
|
q.Select("*").Where(
|
|
datacenter.ConditionMapType{"log_date": datacenter.ConditionIn(date)},
|
|
datacenter.ConditionMapType{"sign_id": datacenter.ConditionIn(signID)},
|
|
datacenter.ConditionMapType{"type": datacenter.ConditionIn(tp)},
|
|
)
|
|
|
|
var api = APIMcnFansTag
|
|
if err = d.callDataAPI(c, api, q, &res.Result); err != nil {
|
|
log.Error("call data api fail, api=%s, err=%s", api, err)
|
|
return
|
|
}
|
|
|
|
var tagIDs []int64
|
|
for _, v := range res.Result {
|
|
tagIDs = append(tagIDs, v.TagID)
|
|
}
|
|
|
|
var tagsReply *tagmdl.TagsReply
|
|
if tagsReply, err = global.GetTagGRPC().Tags(c, &tagmdl.TagsReq{Tids: tagIDs}); err != nil {
|
|
log.Error("tag(%+v) grpc client fail, err=%s", tagIDs, err)
|
|
err = nil
|
|
}
|
|
|
|
for _, v := range res.Result {
|
|
if tagsReply == nil {
|
|
continue
|
|
}
|
|
if tag, ok := tagsReply.Tags[v.TagID]; ok {
|
|
v.TagName = tag.Name
|
|
}
|
|
}
|
|
//log.Info("%s query arg(%d,%+v,%s) res(%+v)", api, signID, date, tp, res.Result[0])
|
|
return
|
|
}
|
|
|
|
//GetFansTagCache GetFansTag with cache
|
|
func (d *Dao) GetFansTagCache(c context.Context, signID int64, date time.Time, tp string) (res *mcnmodel.McnGetFansTagReply, err error) {
|
|
res = new(mcnmodel.McnGetFansTagReply)
|
|
var cache = NewCacheMcnDataWithTp(signID, date, tp, res, "McnGetFansTagReply", func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error) {
|
|
return d.GetFansTag(c, signID, date, tp)
|
|
})
|
|
if err = d.McWrapper.GetOrLoad(c, cache); err != nil {
|
|
log.Error("cache get err, err=%v", err)
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|