package tencentNlu import ( "encoding/json" "io/ioutil" "net/http" "speech-nlu-parse/global" "speech-nlu-parse/model" "speech-nlu-parse/pkg/logger" "strings" "time" ) // 压力测试标志 var isTest = false // 腾讯NLU func GetTencentNLUData(data *model.SemanticReq, bot *model.DingDangBot) ([]byte, *model.TokenSearchResponse, error) { // 获取botkey 和 botsecret var botKey, botSecret string botKey = bot.Key botSecret = bot.Secret url := global.TencentSetting.DingDangNluUrl // errLogFile := errorLogfile + time.Now().Format("200601") // auth, dsn, appkey, accessToken, err := GetAuthorization(data.MacWifi, data.RequestId) // if err != nil { // auth = "" // dsn = "" // global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"data.MacWifi": data.MacWifi}, "requestId": data.RequestId}).Error("GetTencentNLUData: GetAuthorization error" + err.Error()) // } var auth, dsn string // 获取授权信息 tokenSearchResponse, err := GetAuthorizationByGRPC(data.MacWifi, data.RequestId, data.Mid, data.Vender) if err != nil { global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"data.MacWifi": data.MacWifi}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: GetAuthorizationByGRPC error." + err.Error()) } else { if tokenSearchResponse.Status.Code == 200 { // 200: 成功; 405: 设备未激活 // if tokenSearchResponse.Data.Status != 0 { // 未分配 的情况下无AppKey AccessToken // if tokenSearchResponse.Data.AppKey != "" && tokenSearchResponse.Data.AccessToken != "" { // botKey = tokenSearchResponse.Data.AppKey // botSecret = tokenSearchResponse.Data.AccessToken // } // } // Status == 0 未分配 的情况下也存在AppKey AccessToken if tokenSearchResponse.Data.AppKey != "" && tokenSearchResponse.Data.AccessToken != "" { botKey = tokenSearchResponse.Data.AppKey botSecret = tokenSearchResponse.Data.AccessToken } else { global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"tokenSearchResponse": tokenSearchResponse}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: appkey accessToken is not exist.") } if tokenSearchResponse.Data.Status == 2 { // 已授权,使用中 auth = tokenSearchResponse.Data.Authorization dsn = tokenSearchResponse.Data.Dsn } if tokenSearchResponse.Data.Dsn != "" { dsn = tokenSearchResponse.Data.Dsn } } else if tokenSearchResponse.Status.Code == 405 { // 未分配 // } else { // 错误码 global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"tokenSearchResponse": tokenSearchResponse}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: GetAuthorizationByGRPC error." + tokenSearchResponse.Status.Msg) } } // 2022年9月7日11:45:45 特例 进行排查 // tokenSearchResponse.Data.Status = 2 // botKey = "8d3b6076-3bb4-4c26-89c3-011447996044" // botSecret = "31b62495be9b4ff389ee952a4c4bd2cf" // auth = "BACKEND-ENCRYPT:1000,NywxMTA2MDk4MzczLDc4M0ZGODcyQkJBREMwQTE1OTAyNTNBRjRCRTU5QjU3LEI2ODFDQzMzNzM4QjAyQUNEMUU0RjhFQzYyNjUwODdELDhkM2I2MDc2LTNiYjQtNGMyNi04OWMzLTAxMTQ0Nzk5NjA0NDozMWI2MjQ5NWJlOWI0ZmYzODllZTk1MmE0YzRiZDJjZiw4ZDNiNjA3Ni0zYmI0LTRjMjYtODljMy0wMTE0NDc5OTYwNDRfY2ZhNzFiYzkxNzQxNGEwNWMwMDI5OTBmNmU1MjA4MzEsNDI3ZGZlZWEwMDhmZDQ5Yg==" // dsn = "8d3b6076-3bb4-4c26-89c3-011447996044_cfa71bc917414a05c002990f6e520831" // if appkey != "" && accessToken != "" { // botKey = appkey // botSecret = accessToken // } var richReq model.RicAnswer var jsonStr string if isTest == true { //logfile = "semantic_logfile_" + time.Now().Format("200601") jsonStr = `{ "header": { "guid": "` + data.TestID + `", "qua": "QV=3&PL=ADR&PR=chvoice&VE=7.6&VN=3350&PP=com.geli.mtt&DE=SPEAKER&SP=3", "user": { "user_id": "test" }, "ip": "` + data.Ip + `" }, "payload": { "query":"` + data.Query + `" } }` //fmt.Println(jsonStr) } else { // TODO: 将MacVoice改成MacWifi secretMac := ComputeHmac256(data.MacVoice, global.TencentSetting.TencentSha256Secret) //对mac做sha256加密处理后发送到腾讯NLU //fmt.Println(secretMac) orgins := botKey + ":" + botSecret + ":" + secretMac //fmt.Println(orgins) secretGuid := ComputerMd5(orgins) //fmt.Println(secretGuid) //logfile = "/roobo/logs/gree.service/unisound/semantic_logfile_" + time.Now().Format("200601") if dsn != "" { secretGuid = "" } richReq.Header.Guid = secretGuid richReq.Header.Device.SerialNum = dsn richReq.Header.User.Auth = auth // 参考tapd 81496972 bug, DE字段的使用 richReq.Header.Qua = "QV=3&PL=ADR&PR=chvoice&VE=7.6&VN=3350&PP=com.geli.mtt&DE=SPEAKER&SP=3" // wireless_speaker 无屏设备 // richReq.Header.Qua = "QV=3&PL=ADR&PR=chvoice&VE=7.6&VN=3350&PP=com.geli.mtt&DE=wireless_speaker&SP=3" richReq.Header.Ip = data.Ip // 经纬度 richReq.Header.Lbs = data.Lbs richReq.Payload.Query = data.Query rb, err := json.Marshal(&richReq) if err != nil { //logme.LogtoFile("json marshal error:" + err.Error(), logrus.InfoLevel, "jm-richanswer") // utils.LogErrorToFile(errLogFile, "json.Marshal error:"+err.Error()) global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"richReq": richReq}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: json.Marshal error" + err.Error()) return nil, nil, err } jsonStr = string(rb) //fmt.Println(jsonStr) } // var logReqResp utils.LogData // reqTime := time.Now() // logReqResp.RequestData = utils.RemoveSpaceAndLineBreaks(jsonStr) // logFileName := tencentLogFile + time.Now().Format("20060102") credentialDate := time.Now().Format("20060102T150405Z") //fmt.Println(jsonStr) //fmt.Println(credentialDate) signingContent := jsonStr + credentialDate signature := ComputeHmac256(signingContent, botSecret) authorizationHeader := "TVS-HMAC-SHA256-BASIC" + " " + "CredentialKey=" + botKey + ", " + "Datetime=" + credentialDate + ", " + "Signature=" + signature req, err := http.NewRequest("POST", url, strings.NewReader(jsonStr)) if nil != err { // log.Println("GetSemanticData: create new request hander error") // log.Println(err) global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"jsonStr": jsonStr}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: create new request hander error. " + err.Error()) } req.Close = true //解决POST EOF 问题 req.Header.Set("Content-Type", "application/json;charset=utf-8") req.Header.Add("Authorization", authorizationHeader) client := &http.Client{} client.Timeout = time.Second * 2 // 请求log global.Logger.WithFields(logger.Fields{ "data": map[string]interface{}{"requestBody": jsonStr}, "url": url, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId, }).Info("tencent-nlu-http-post request.") startTime := time.Now() resp, err := client.Do(req) // costTime := time.Now().Sub(reqTime) // logReqResp.CostTime = fmt.Sprint(costTime) if nil != err { // utils.StoreToLogfile(logFileName, logReqResp) //log.Println("GetSemanticData: Get TencentNLU data error") //log.Println(err) // return nil, auth, errors.New(err.Error() + " costTime:" + logReqResp.CostTime) global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"jsonStr": jsonStr}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Error("GetTencentNLUData: Get TencentNLU data error. " + err.Error()) // return nil, nil, errors.New(err.Error() + " costTime:") return nil, nil, err } defer resp.Body.Close() content, err := ioutil.ReadAll(resp.Body) if nil != err { // log.Println("GetSemanticData: Read response data body error") // log.Println(err) global.Logger.WithFields(logger.Fields{"mac": data.MacWifi, "requestId": data.RequestId}).Error("GetTencentNLUData: Read response data body error." + err.Error()) return nil, nil, err } cost := time.Now().Sub(startTime).Milliseconds() // 返回log global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"responseBody": string(content)}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "requestId": data.RequestId}).Info("tencent-nlu-http-post response.") // 只记录关键信息 global.Logger.WithFields(logger.Fields{"data": map[string]interface{}{"sessionId": string(resp.Header.Get("sessionid")), "appkey": data.Appkey}, "mac": data.MacWifi, "mid": data.Mid, "vender": data.Vender, "cost": cost, "requestId": data.RequestId}).Info("tencent-nlu-http-post response main info.") //fmt.Println("content1:", string(content)) // logfile //resTime := time.Now() //costTime := resTime.Sub(reqTime) // logReqResp.CostTime = fmt.Sprint(costTime) // logReqResp.ResponseData = utils.RemoveSpaceAndLineBreaks(string(content)) //recordsop.SaveTentSemantic(logReqResp) //fmt.Println("content2:", string(content)) // utils.StoreToLogfile(logFileName, logReqResp) // log.Println("GetSemanticData: return data", string(content)) //fmt.Println("content3: ", string(content)) return content, tokenSearchResponse, nil }