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.
127 lines
3.3 KiB
127 lines
3.3 KiB
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 |
|
}
|
|
|