You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
7.3 KiB
271 lines
7.3 KiB
package http |
|
|
|
import ( |
|
"io/ioutil" |
|
"net/http" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/report-click/conf" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/net/metadata" |
|
) |
|
|
|
const ( |
|
_platWeb = "0" |
|
_platH5 = "1" |
|
_platOuter = "2" |
|
_platIos = "3" |
|
_platAndroid = "4" |
|
_platAndroidTV = "5" |
|
) |
|
|
|
var _expireCookie = time.Date(2022, time.November, 10, 23, 0, 0, 0, time.UTC) |
|
|
|
// webClick write the archive data. |
|
func webClick(c *bm.Context) { |
|
err := flashPlay(c, _platWeb, conf.Conf.Click.WebSecret) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// outerClick write the archive data. |
|
func outerClick(c *bm.Context) { |
|
err := flashPlay(c, _platOuter, conf.Conf.Click.OutSecret) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// iosClick write the archive data. |
|
func iosClick(c *bm.Context) { |
|
err := mobilePlay(c, conf.Conf.Click.AesKey, conf.Conf.Click.AesIv, conf.Conf.Click.AesSalt, _platIos) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// androidClick write the archive data. |
|
func androidClick(c *bm.Context) { |
|
err := mobilePlay(c, conf.Conf.Click.AesKey, conf.Conf.Click.AesIv, conf.Conf.Click.AesSalt, _platAndroid) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// android2Click write the archive data. |
|
func android2Click(c *bm.Context) { |
|
err := mobilePlay(c, conf.Conf.Click.AesKey2, conf.Conf.Click.AesIv2, conf.Conf.Click.AesSalt2, _platAndroid) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// androidTV == android2Click write the archive data. |
|
func androidTV(c *bm.Context) { |
|
err := mobilePlay(c, conf.Conf.Click.AesKey2, conf.Conf.Click.AesIv2, conf.Conf.Click.AesSalt2, _platAndroidTV) |
|
c.JSON(nil, err) |
|
} |
|
|
|
// outerClickH5 h5 outer click same to flash plat . |
|
func outerClickH5(c *bm.Context) { |
|
c.JSON(nil, h5Play(c, _platOuter)) |
|
} |
|
|
|
// h5Click write the archive data. |
|
func h5Click(c *bm.Context) { |
|
c.JSON(nil, h5Play(c, _platH5)) |
|
} |
|
|
|
// webH5Click write the archive data. |
|
func webH5Click(c *bm.Context) { |
|
c.JSON(nil, h5Play(c, _platWeb)) |
|
} |
|
|
|
// flashPlay. |
|
func flashPlay(c *bm.Context, plat, secret string) (err error) { |
|
var ( |
|
buvid string |
|
mid int64 |
|
ck *http.Cookie |
|
params = c.Request.Form |
|
unix = time.Now() |
|
) |
|
if midInter, ok := c.Get("mid"); ok { |
|
mid = midInter.(int64) |
|
} |
|
if ck, err = c.Request.Cookie("buvid3"); err == nil { |
|
buvid = ck.Value |
|
} |
|
userAgent := c.Request.Header.Get("User-Agent") |
|
refer := c.Request.Header.Get("Referer") |
|
sign := params.Get("sign") |
|
if err = clickSvr.FlashSigned(params, secret, unix); err != nil { |
|
log.Error("clickSvr.FlashSigned() error(%v)", err) |
|
if err == ecode.ClickQuerySignErr { |
|
log.Warn("click sign error(%s,%s,%s,%s)", sign, refer, userAgent, c.Request.Header.Get("Origin")) |
|
} |
|
return |
|
} |
|
midStr := params.Get("mid") |
|
if mid != 0 && midStr != strconv.FormatInt(mid, 10) { |
|
log.Warn("flashPlay stat mid(%d) not equal stat mid(%s)", mid, midStr) |
|
return |
|
} |
|
midStr = strconv.FormatInt(mid, 10) |
|
aid := params.Get("aid") |
|
var cookieSid string |
|
if ck, err := c.Request.Cookie("sid"); err == nil { |
|
cookieSid = ck.Value |
|
} |
|
typeID := params.Get("type") |
|
subType := params.Get("sub_type") |
|
sid := params.Get("sid") |
|
epid := params.Get("epid") |
|
// service. |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
clickSvr.Play(c, plat, aid, params.Get("cid"), params.Get("part"), |
|
midStr, params.Get("lv"), params.Get("ftime"), params.Get("stime"), |
|
params.Get("did"), ip, userAgent, buvid, cookieSid, refer, typeID, subType, sid, epid, "", "", "", "", "", "") |
|
return |
|
} |
|
|
|
// mobilePlay. |
|
func mobilePlay(c *bm.Context, aesKey, aesIv, aesSalt, plat string) (err error) { |
|
// check params. |
|
req := c.Request |
|
unix := time.Now() |
|
bs, err := ioutil.ReadAll(req.Body) |
|
if err != nil { |
|
log.Error("ioutil.ReadAll error(%v)", err) |
|
err = ecode.ServerErr |
|
return |
|
} |
|
req.Body.Close() |
|
bs, err = clickSvr.Decrypt(bs, aesKey, aesIv) |
|
if err != nil { |
|
log.Error("clickSvr.Decrypt(%s) error(%d)", bs, err) |
|
return |
|
} |
|
p, err := clickSvr.Verify(bs, aesSalt, unix) |
|
if err != nil { |
|
log.Error("clickSvr.Verify(%s) error(%d)", bs, err) |
|
return |
|
} |
|
req.Form = p // for log |
|
typeID := p.Get("type") |
|
subType := p.Get("sub_type") |
|
sid := p.Get("sid") |
|
epid := p.Get("epid") |
|
playMode := p.Get("play_mode") |
|
platform := p.Get("platform") |
|
device := p.Get("device") |
|
mobiAapp := p.Get("mobi_app") |
|
autoPlay := p.Get("auto_play") |
|
ap, _ := strconv.ParseInt(autoPlay, 10, 64) |
|
// service. |
|
aidStr := p.Get("aid") |
|
var ( |
|
accessKey string |
|
midStr = p.Get("mid") |
|
noAccess bool |
|
) |
|
paasMid, _ := strconv.ParseInt(midStr, 10, 64) |
|
accessKey = p.Get("access_key") |
|
if paasMid > 0 && accessKey == "" { |
|
noAccess = true |
|
} |
|
if accessKey != "" { |
|
c.Request.Form.Set("access_key", accessKey) |
|
authSvc.User(c) |
|
mid, ok := c.Get("mid") |
|
if !ok { |
|
log.Warn("idfSvc.Access() access_key", accessKey) |
|
if paasMid > 0 { |
|
noAccess = true |
|
} |
|
} |
|
if mid != nil { |
|
midStr = strconv.FormatInt(mid.(int64), 10) |
|
} |
|
} |
|
refer := c.Request.Header.Get("Referer") |
|
userAgent := c.Request.Header.Get("User-Agent") |
|
if noAccess { |
|
userAgent = userAgent + " (no_accesskey)" |
|
} |
|
if ap == 1 || ap == 2 { // abandon the logic that transforms the plat to 6/7/8/9, keep the plat and modify the UA |
|
userAgent += " (inline_play_begin)" |
|
} |
|
buvid := req.Header.Get("buvid") |
|
var cookieSid string |
|
if ck, err := c.Request.Cookie("sid"); err == nil { |
|
cookieSid = ck.Value |
|
} |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
clickSvr.Play(c, plat, aidStr, p.Get("cid"), p.Get("part"), midStr, p.Get("lv"), |
|
p.Get("ftime"), p.Get("stime"), p.Get("did"), ip, userAgent, buvid, |
|
cookieSid, refer, typeID, subType, sid, epid, playMode, platform, device, mobiAapp, autoPlay, "") |
|
return |
|
} |
|
|
|
func h5Play(c *bm.Context, plat string) (err error) { |
|
var ( |
|
buvid string |
|
mid int64 |
|
ck *http.Cookie |
|
params = c.Request.Form |
|
unix = time.Now() |
|
) |
|
if midInter, ok := c.Get("mid"); ok { |
|
mid = midInter.(int64) |
|
} |
|
if ck, err = c.Request.Cookie("buvid3"); err == nil { |
|
buvid = ck.Value |
|
} |
|
// check params. |
|
st := params.Get("stime") |
|
stime, err := strconv.ParseInt(st, 10, 64) |
|
if err != nil { |
|
err = ecode.ClickQueryFormatErr |
|
return |
|
} |
|
if unix.Unix()-stime > 60 { |
|
err = ecode.ClickServerTimeout |
|
return |
|
} |
|
typeID := params.Get("type") |
|
subType := params.Get("sub_type") |
|
sid := params.Get("sid") |
|
epid := params.Get("epid") |
|
var ft string |
|
// check cookie did |
|
var ( |
|
did string |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
cookie, err := c.Request.Cookie("rpdid") |
|
if err != nil || cookie.Value == "" { |
|
did = clickSvr.GenDid(ip, unix) |
|
http.SetCookie(c.Writer, &http.Cookie{Name: "rpdid", Value: did, Path: "/", Domain: ".bilibili.com", Expires: _expireCookie}) |
|
err = nil |
|
} else { |
|
did = cookie.Value |
|
} |
|
_, ft = clickSvr.CheckDid(did) |
|
if ft == "" { |
|
log.Error("ft null ft:%s,did:%s", ft, did) |
|
return |
|
} |
|
midStr := params.Get("mid") |
|
if mid != 0 && midStr != strconv.FormatInt(mid, 10) { |
|
log.Warn("h5 stat mid(%d) not equal stat mid(%s)", mid, midStr) |
|
return |
|
} |
|
midStr = strconv.FormatInt(mid, 10) |
|
aid := params.Get("aid") |
|
userAgent := c.Request.Header.Get("User-Agent") |
|
var cookieSid string |
|
if ck, err := c.Request.Cookie("sid"); err == nil { |
|
cookieSid = ck.Value |
|
} |
|
refer := c.Request.Header.Get("Referer") |
|
// service. |
|
clickSvr.Play(c, plat, aid, params.Get("cid"), params.Get("part"), |
|
midStr, params.Get("lv"), ft, params.Get("stime"), did, |
|
ip, userAgent, buvid, cookieSid, refer, typeID, subType, sid, epid, "", "", "", "", "", "") |
|
return |
|
}
|
|
|