bilibili-backup/library/log/anticheat/anticheat.go
2019-04-22 02:59:20 +00:00

179 lines
4.5 KiB
Go

package anticheat
import (
"context"
"net/http"
"strconv"
"time"
"go-common/library/log"
"go-common/library/log/infoc"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
// AntiCheat send anti-cheating info to berserker.
type AntiCheat struct {
infoc *infoc.Infoc
}
// New new AntiCheat logger.
func New(c *infoc.Config) (a *AntiCheat) {
return &AntiCheat{infoc: infoc.New(c)}
}
// antiCheat 尽可能多的提供信息.
type antiCheat struct {
Buvid string
Build string
Client string // for example ClientWeb
IP string
UID string
Aid string
Mid string
Sid string
Refer string
URL string
From string
ItemID string
ItemType string // for example ItemTypeAv
Action string // for example ActionClick
ActionID string
UA string
TS string
Extra string
}
// anti-cheat const.
const (
ClientWeb = "web"
ClientIphone = "iphone"
ClientIpad = "ipad"
ClientAndroid = "android"
// AntiCheat ItemType
ItemTypeAv = "av"
ItemTypeBangumi = "bangumi"
ItemTypeLive = "live"
ItemTypeTopic = "topic"
ItemTypeRank = "rank"
ItemTypeActivity = "activity"
ItemTypeTag = "tag"
ItemTypeAD = "ad"
ItemTypeLV = "lv"
// AntiCheat Action
ActionClick = "click"
ActionPlay = "play"
ActionFav = "fav"
ActionCoin = "coin"
ActionDM = "dm"
ActionToView = "toview"
ActionShare = "share"
ActionSpace = "space"
Actionfollow = "follow"
ActionHeartbeat = "heartbeat"
ActionAnswer = "answer"
)
func (a *antiCheat) toSlice() (as []interface{}) {
as = make([]interface{}, 0, 18)
as = append(as, a.Buvid, a.Build, a.Client, a.IP, a.UID, a.Aid, a.Mid)
as = append(as, a.Sid, a.Refer, a.URL, a.From, a.ItemID, a.ItemType)
as = append(as, a.Action, a.ActionID, a.UA, a.TS, a.Extra)
return
}
// InfoAntiCheat2 for new http framework(bm).
func (a *AntiCheat) InfoAntiCheat2(ctx *bm.Context, uid, aid, mid, itemID, itemType, action, actionID string) error {
return a.infoAntiCheat(ctx, ctx.Request, metadata.String(ctx, metadata.RemoteIP), uid, aid, mid, itemID, itemType, action, actionID)
}
// infoAntiCheat common logic.
func (a *AntiCheat) infoAntiCheat(ctx context.Context, req *http.Request, IP, uid, aid, mid, itemID, itemType, action, actionID string) error {
params := req.Form
ac := &antiCheat{
UID: uid,
Aid: aid,
Mid: mid,
ItemID: itemID,
ItemType: itemType,
Action: action,
ActionID: actionID,
IP: IP,
URL: req.URL.Path,
Refer: req.Header.Get("Referer"),
UA: req.Header.Get("User-Agent"),
TS: strconv.FormatInt(time.Now().Unix(), 10),
}
ac.From = params.Get("from")
if csid, err := req.Cookie("sid"); err == nil {
ac.Sid = csid.Value
}
var cli string
switch {
case len(params.Get("access_key")) == 0:
cli = ClientWeb
if ck, err := req.Cookie("buvid3"); err == nil {
ac.Buvid = ck.Value
}
case params.Get("platform") == "ios":
cli = ClientIphone
if params.Get("device") == "pad" {
cli = ClientIpad
}
case params.Get("platform") == "android":
cli = ClientAndroid
default:
log.Warn("unkown plat(%s)", params.Get("platform"))
}
ac.Client = cli
if cli != ClientWeb {
ac.Buvid = req.Header.Get("buvid")
ac.Build = params.Get("build")
}
return a.infoc.Infov(ctx, ac.toSlice()...)
}
// ServiceAntiCheat common anti-cheat.
func (a *AntiCheat) ServiceAntiCheat(p map[string]string) error {
return a.infoc.Info(convertBase(p)...)
}
// ServiceAntiCheatBus for answer anti-cheat.
func (a *AntiCheat) ServiceAntiCheatBus(p map[string]string, bus []interface{}) error {
ac := append(convertBase(p), bus...)
return a.infoc.Info(ac...)
}
// ServiceAntiCheatv support mirror request
func (a *AntiCheat) ServiceAntiCheatv(ctx context.Context, p map[string]string) error {
return a.infoc.Infov(ctx, convertBase(p)...)
}
// ServiceAntiCheatBusv support mirror request
func (a *AntiCheat) ServiceAntiCheatBusv(ctx context.Context, p map[string]string, bus []interface{}) error {
ac := append(convertBase(p), bus...)
return a.infoc.Infov(ctx, ac...)
}
func convertBase(p map[string]string) (res []interface{}) {
ac := &antiCheat{
ItemType: p["itemType"],
Action: p["action"],
IP: p["ip"],
Mid: p["mid"],
UID: p["fid"],
Aid: p["aid"],
Sid: p["sid"],
UA: p["ua"],
Buvid: p["buvid"],
Refer: p["refer"],
URL: p["url"],
TS: strconv.FormatInt(time.Now().Unix(), 10),
}
res = ac.toSlice()
return
}