utils模块代码如下:
package utils
const GUIYIN_TOKEN_URL = "https://appleid.apple.com/auth/oauth2/token?client_secret=%s&client_id=%s&grant_type=%s&scope=%s"
const CAMPAIN_KEYWORD_URL = "https://api.searchads.apple.com/api/v4/reports/campaigns/%s/keywords"
const CAMPAIN_URL = "https://api.searchads.apple.com/api/v4/reports/campaigns"
type GuiYinKeywordRule struct {
Data ReportingDataResponseRule `json:"data",omitempty`
Pagination interface{} `json:"pagination",omitempty`
Error interface{} `json:"error",omitempty`
}
type GuiYinCampaignRule struct {
Data ReportingDataResponseRule `json:"data",omitempty`
Pagination interface{} `json:"pagination",omitempty`
Error interface{} `json:"error",omitempty`
}
type ReportingDataResponseRule struct {
ReportingDataResponse GrandTotalsRowRule `json:"reportingDataResponse",omitempty`
}
type GrandTotalsRowRule struct {
GrandTotals interface{} `json:"grandTotals",omitempty`
Row []RowRule `json:"row",omitempty`
}
type RowRule struct {
Other bool `json:"other",omitempty`
Granularity interface{} `json:"granularity",omitempty`
Total interface{} `json:"total",omitempty`
Metadata interface{} `json:"metadata",omitempty`
Insights interface{} `json:"insights",omitempty`
}
type GuiYinTokenRule struct {
AccessToken string `json:"access_token",omitempty`
ExpiresIn int `json:"expires_in",omitempty`
TokenType string `json:"token_type",omitempty`
Error string `json:"error",omitempty`
}
func GetGuiYinKeywordData(campaignId, orgId, timeStr string) GuiYinKeywordRule {
if len(campaignId) == 0 || len(orgId) == 0 {
log.WithFields(log.Fields{"campaignId": campaignId, "orgId": orgId}).Warn("GetGuiYinKeywordData")
return GuiYinKeywordRule{}
}
accessToken := GetGuiYinToken()
if len(accessToken) == 0 {
log.WithFields(log.Fields{"accessToken": accessToken}).Warn("GetGuiYinKeywordData")
return GuiYinKeywordRule{}
}
url := fmt.Sprintf(CAMPAIN_KEYWORD_URL, campaignId)
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
},
}
requestJson, _ := json.Marshal(map[string]interface{}{
"returnRowTotals": true,
"granularity": "DAILY",
"timeZone": "UTC",
"returnGrandTotals": true,
"returnRecordsWithNoMetrics": true,
"startTime": timeStr,
"endTime": timeStr,
"selector": map[string]interface{}{
"orderBy": []map[string]interface{}{
{
"field": "localSpend",
"sortOrder": "ASCENDING",
},
},
"conditions": []map[string]interface{}{
{
"field": "deleted",
"operator": "IN",
"values": []string{"false", "true"},
},
},
"pagination": map[string]interface{}{
"offset": 0,
"limit": 1000,
},
},
})
reqest, reqestErr := http.NewRequest("POST", url, strings.NewReader(string(requestJson)))
reqest.Header.Add("Host", &