|
@@ -19,7 +19,7 @@ import (
|
|
|
var tokenRedisKey = `THS_SERVER_ACCESS_TOKEN`
|
|
|
|
|
|
// getEdbDataFromThsHttp 通过url获取同花顺的普通数据
|
|
|
-func getEdbDataFromThsHttp(edbCode, startDate, endDate string) (item models.EdbDataFromThs, err error) {
|
|
|
+func getEdbDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token string) (item models.EdbDataFromThs, err error) {
|
|
|
thsUrl := `https://quantapi.51ifind.com/api/v1/edb_service`
|
|
|
//indicators 是 半角逗号分隔的所有指标,宏观指标过多,推荐使用Windows超级命令生成。 "indicators":"M001620326,M002822183"
|
|
|
//functionpara 否 key-value格式,省略时不进行更新时间筛选。两个时间控件更新起始时间(startrtime)和更新结束时间(endrtime),不勾选时省略见下方代码块
|
|
@@ -32,7 +32,7 @@ func getEdbDataFromThsHttp(edbCode, startDate, endDate string) (item models.EdbD
|
|
|
"enddate": endDate,
|
|
|
}
|
|
|
|
|
|
- body, err, _ := postCurl(thsUrl, dataMap, 0)
|
|
|
+ body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -97,7 +97,7 @@ func getEdbDataFromThsHttp(edbCode, startDate, endDate string) (item models.EdbD
|
|
|
}
|
|
|
|
|
|
// getFutureGoodDataFromThsHttp 通过url获取同花顺的商品数据
|
|
|
-func getFutureGoodDataFromThsHttp(edbCode, startDate, endDate string) (item future_good.FutureGoodDataFromThs, err error) {
|
|
|
+func getFutureGoodDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token string) (item future_good.FutureGoodDataFromThs, err error) {
|
|
|
thsUrl := `https://quantapi.51ifind.com/api/v1/cmd_history_quotation`
|
|
|
|
|
|
//codes 是 半角逗号分隔的所有代码 "codes":"300033.SZ,600030.SH"
|
|
@@ -114,7 +114,7 @@ func getFutureGoodDataFromThsHttp(edbCode, startDate, endDate string) (item futu
|
|
|
"enddate": endDate,
|
|
|
}
|
|
|
|
|
|
- body, err, _ := postCurl(thsUrl, dataMap, 0)
|
|
|
+ body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -162,7 +162,7 @@ type BaseThsInterface struct {
|
|
|
}
|
|
|
|
|
|
// postCurl post请求同花顺接口
|
|
|
-func postCurl(urlStr string, dataMap map[string]interface{}, num int) (body []byte, err error, errMsg string) {
|
|
|
+func postCurl(urlStr string, dataMap map[string]interface{}, num int, thsRefreshToken, token string) (body []byte, err error, errMsg string) {
|
|
|
logMsg := ``
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
@@ -172,11 +172,6 @@ func postCurl(urlStr string, dataMap map[string]interface{}, num int) (body []by
|
|
|
}
|
|
|
}
|
|
|
}()
|
|
|
- token, err := GetAccessToken(false)
|
|
|
- if err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
jsonStrByte, err := json.Marshal(dataMap)
|
|
|
if err != nil {
|
|
|
return
|
|
@@ -215,12 +210,12 @@ func postCurl(urlStr string, dataMap map[string]interface{}, num int) (body []by
|
|
|
//如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
|
|
|
if utils.InArrayByInt([]int{-1010, -1302}, int(response.ErrorCode)) && num <= 0 {
|
|
|
//token失效
|
|
|
- _, tmpErr := refreshAccessToken()
|
|
|
- if tmpErr != nil {
|
|
|
- err = tmpErr
|
|
|
+ token, err = refreshAccessToken(thsRefreshToken)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
num++
|
|
|
- return postCurl(urlStr, dataMap, num)
|
|
|
+ return postCurl(urlStr, dataMap, num, thsRefreshToken, token)
|
|
|
} else if response.ErrorCode != 0 {
|
|
|
utils.FileLog.Info(fmt.Sprint("post data err:", response.ErrMsg, ";url:", urlStr, ";params:", reqStr, ";response:", string(body)))
|
|
|
err = errors.New(response.ErrMsg)
|
|
@@ -231,7 +226,7 @@ func postCurl(urlStr string, dataMap map[string]interface{}, num int) (body []by
|
|
|
}
|
|
|
|
|
|
// GetAccessToken 获取accessToken
|
|
|
-func GetAccessToken(isRefresh bool) (token string, err error) {
|
|
|
+func GetAccessToken(isRefresh bool, thsRefreshToken string) (token string, err error) {
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
|
go alarm_msg.SendAlarmMsg("获取同花顺的token失败,ERR:"+err.Error(), 3)
|
|
@@ -240,19 +235,22 @@ func GetAccessToken(isRefresh bool) (token string, err error) {
|
|
|
token, redisErr := utils.Rc.RedisString(tokenRedisKey)
|
|
|
//如果从redis中accessToken 获取失败或者token为空了,再或者需要强制刷新了,那么重新获取accessToken
|
|
|
if redisErr != nil || token == `` || isRefresh {
|
|
|
- return refreshAccessToken()
|
|
|
+ // todo 上线后 有可能直接从redis中获取token,导致terminalCode 为空
|
|
|
+ token, _ = refreshAccessToken(thsRefreshToken)
|
|
|
+ return
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// refreshAccessToken 强制刷新获取accessToken
|
|
|
-func refreshAccessToken() (token string, err error) {
|
|
|
+func refreshAccessToken(thsRefreshToken string) (token string, err error) {
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
|
go alarm_msg.SendAlarmMsg("刷新同花顺的token失败;ERR:"+err.Error(), 3)
|
|
|
}
|
|
|
}()
|
|
|
- tokenInfo, tmpErr := getAccessToken()
|
|
|
+ // todo 刷新后的token容易和缓存中的不一致,导致保存了错误的终端信息
|
|
|
+ tokenInfo, tmpErr := getAccessToken(thsRefreshToken)
|
|
|
if tmpErr != nil {
|
|
|
err = tmpErr
|
|
|
return
|
|
@@ -261,7 +259,7 @@ func refreshAccessToken() (token string, err error) {
|
|
|
|
|
|
expireTime, err := time.ParseInLocation(utils.FormatDateTime, tokenInfo.ExpiredTime, time.Local)
|
|
|
if err != nil {
|
|
|
- go alarm_msg.SendAlarmMsg("获取同花顺的token失败;同花顺token截止日期转换失败,ERR:"+err.Error(), 3)
|
|
|
+ err = fmt.Errorf("获取同花顺的token失败;同花顺token截止日期转换失败,ERR:%s", err.Error())
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -270,8 +268,10 @@ func refreshAccessToken() (token string, err error) {
|
|
|
// 本来是要设置下600s的过期时间,但因为不是强制刷新token,就不获取了
|
|
|
err = utils.Rc.Put(tokenRedisKey, token, time.Duration(expireTime.Unix())*time.Second)
|
|
|
if err != nil {
|
|
|
- go alarm_msg.SendAlarmMsg("获取同花顺的token成功;同花顺token存入redis失败,ERR:"+err.Error(), 3)
|
|
|
+ err = fmt.Errorf("获取同花顺的token成功;同花顺token存入redis失败,ERR:%s", err.Error())
|
|
|
+ return
|
|
|
}
|
|
|
+
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -288,22 +288,28 @@ type TokenData struct {
|
|
|
}
|
|
|
|
|
|
// getAccessToken token内部请求接口
|
|
|
-func getAccessToken() (tokenData TokenData, err error) {
|
|
|
- if utils.ThsRefreshToken == `` {
|
|
|
+func getAccessToken(thsRefreshToken string) (tokenData TokenData, err error) {
|
|
|
+ /*if utils.ThsRefreshToken == `` {
|
|
|
err = errors.New("同花顺token未配置")
|
|
|
return
|
|
|
- }
|
|
|
+ }*/
|
|
|
defer func() {
|
|
|
if err != nil {
|
|
|
go alarm_msg.SendAlarmMsg("更新同花顺的token失败;ERR:"+err.Error(), 3)
|
|
|
}
|
|
|
}()
|
|
|
+
|
|
|
+ if thsRefreshToken == "" {
|
|
|
+ err = errors.New("同花顺token未配置")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
//getUrl := `https://quantapi.51ifind.com/api/v1/update_access_token` // 强制刷新token;目前因为生产和测试都是使用的一个账号,所以token不能因为环境的不同而改变
|
|
|
getUrl := `https://quantapi.51ifind.com/api/v1/get_access_token` // 获取当前token
|
|
|
|
|
|
req, _ := netHttp.NewRequest("GET", getUrl, nil)
|
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
- req.Header.Add("refresh_token", utils.ThsRefreshToken)
|
|
|
+ req.Header.Add("refresh_token", thsRefreshToken)
|
|
|
|
|
|
res, err := netHttp.DefaultClient.Do(req)
|
|
|
if err != nil {
|
|
@@ -329,5 +335,6 @@ func getAccessToken() (tokenData TokenData, err error) {
|
|
|
return
|
|
|
}
|
|
|
tokenData = tokenResp.Data
|
|
|
+
|
|
|
return
|
|
|
}
|