128 lines
3.3 KiB
Go
128 lines
3.3 KiB
Go
package sports
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
|
|
"go-common/app/interface/main/activity/conf"
|
|
"go-common/app/interface/main/activity/model/sports"
|
|
"go-common/library/cache/memcache"
|
|
"go-common/library/ecode"
|
|
xecocde "go-common/library/ecode"
|
|
"go-common/library/log"
|
|
xhttp "go-common/library/net/http/blademaster"
|
|
"go-common/library/net/metadata"
|
|
"go-common/library/stat/prom"
|
|
)
|
|
|
|
const (
|
|
_qqAppID = "9"
|
|
_qqAppKey = "TWF0Y2hVbmlvbjpBUFBLRVk6OQ=="
|
|
_newsAppID = "openapi_for_bilibili"
|
|
_newsAppKey = "d2c0d130c49baadc3d43fc731caecd43"
|
|
)
|
|
|
|
// PromError stat and log.
|
|
func PromError(name string, format string, args ...interface{}) {
|
|
prom.BusinessErrCount.Incr(name)
|
|
log.Error(format, args...)
|
|
}
|
|
|
|
// Dao dao.
|
|
type Dao struct {
|
|
// http
|
|
httpSports *xhttp.Client
|
|
dClient *http.Client
|
|
// sports api
|
|
sportsURI, newsURI string
|
|
mc *memcache.Pool
|
|
mcQqExpire int32
|
|
}
|
|
|
|
// New dao new.
|
|
func New(c *conf.Config) (d *Dao) {
|
|
d = &Dao{
|
|
httpSports: xhttp.NewClient(c.HTTPClientSports),
|
|
dClient: http.DefaultClient,
|
|
sportsURI: c.Host.Sports,
|
|
newsURI: c.Host.QqNews,
|
|
mc: memcache.NewPool(c.Memcache.Like),
|
|
mcQqExpire: int32(time.Duration(c.Memcache.QqExpire) / time.Second),
|
|
}
|
|
return
|
|
}
|
|
|
|
// Qq get qq.
|
|
func (d *Dao) Qq(c context.Context, params url.Values, route string) (rs *json.RawMessage, err error) {
|
|
ip := metadata.String(c, metadata.RemoteIP)
|
|
var res struct {
|
|
Code int `json:"code"`
|
|
Data json.RawMessage `json:"data"`
|
|
}
|
|
params.Del("route")
|
|
params.Set("appId", _qqAppID)
|
|
params.Set("appKey", _qqAppKey)
|
|
if err = d.httpSports.Get(c, d.sportsURI+"/"+route, ip, params, &res); err != nil {
|
|
log.Error("d.httpSports.Get(%s) err(%v)", d.sportsURI+"/"+route+"?"+params.Encode(), err)
|
|
return
|
|
}
|
|
if res.Code != ecode.OK.Code() {
|
|
log.Error("d.httpSports.Get(%s) param(%v) ecode err(%d)", d.sportsURI, params, res.Code)
|
|
err = ecode.Int(res.Code)
|
|
return
|
|
}
|
|
rs = &res.Data
|
|
return
|
|
}
|
|
|
|
// QqNews get qq news.
|
|
func (d *Dao) QqNews(c context.Context, params url.Values, route string) (rs *sports.QqRes, err error) {
|
|
var (
|
|
req *http.Request
|
|
resp *http.Response
|
|
cancel func()
|
|
)
|
|
params.Set("chlid", "news_news_football")
|
|
params.Set("appkey", _newsAppKey)
|
|
params.Set("appid", _newsAppID)
|
|
if req, err = http.NewRequest("GET", d.newsURI+"/"+route+"?"+params.Encode(), nil); err != nil {
|
|
log.Error("QqNews http.NewRequest(%s) error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
|
|
return
|
|
}
|
|
c, cancel = context.WithTimeout(c, time.Duration(conf.Conf.Rule.DTimeout))
|
|
defer cancel()
|
|
req = req.WithContext(c)
|
|
if resp, err = d.dClient.Do(req); err != nil {
|
|
log.Error("QqNews httpClient.Do(%s) error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
if resp.StatusCode >= http.StatusBadRequest {
|
|
log.Error("QqNews url(%s) resp.StatusCode error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
|
|
return
|
|
}
|
|
bs, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Error("QqNews ioutil.ReadAll() error(%v)", err)
|
|
return
|
|
} else if len(bs) == 0 {
|
|
return
|
|
}
|
|
if e := json.Unmarshal(bs, &rs); e != nil {
|
|
if e != io.EOF {
|
|
log.Error("json decode body(%s) error(%v)", string(bs), e)
|
|
}
|
|
}
|
|
if rs.Ret != 0 {
|
|
err = xecocde.ActivityServerTimeout
|
|
rs = nil
|
|
return
|
|
}
|
|
return
|
|
}
|