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