Coder Social home page Coder Social logo

marketing-api-go-sdk's Introduction

Marketing Go SDK

概述

腾讯广告 Marketing API(以下简称API) SDK 提供了Token获取、请求封装、响应解释等功能,以本地化方式轻松完成API的调用和结果的获取,旨在帮助开发者快速搭建投放管理系统。 未来还会基于常用的广告投放场景,提供场景化的接口组合及调用封装。

使用条件

  1. 使用SDK需要首先注册成为腾讯广告开发者,请参考开发者快速入门文档
  2. 使用SDK需要先拥有API的访问权限,所有SDK的使用与应用拥有的权限组相关联
  3. Go SDK 需要依赖 1.11 版本及以上

如何安装

推荐使用 go mod 的方式获取

使用 go mod 获取

其中的 ${VERSION} 需要替换成要使用的版本,如v1.0.0,具体版本号可查看相应的tag

go mod edit -require="github.com/tencentad/marketing-api-go-sdk@${VERSION}"
go mod download

使用 go get 获取

go get github.com/tencentad/marketing-api-go-sdk

如何使用

SDK数组参数调用的方法名与API接口一一对应,如campaigns/get接口就对应tads.Campaigns().Get()方法

注意:model中的所有基本数据类型均为指针类型, 例如:*string, *bool, *int64, *float64

获取Access Token

注:本示例适用于授权时通过Authorization Code获取Access Token和Refresh Token,如需更新Access Token请参考 ./examples/Authentication/RefreshAccessToken.go 示例
package main

import (
	"encoding/json"
	"fmt"
	"github.com/antihax/optional"
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/api"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
	"github.com/tencentad/marketing-api-go-sdk/pkg/errors"
)

func main() {
	tads := ads.Init(&config.SDKConfig{})
	// your client id
	clientId := int64(0)
	clientSecret := "your client secret"
	grantType := "authorization_code"
	oauthTokenOpts := &api.OauthTokenOpts{
		AuthorizationCode: optional.NewString("your authorization code"),
		RedirectUri: optional.NewString("your authorization code"),
	}
	ctx := *tads.Ctx
	// oauth/token接口即对应Oauth().Token()方法
	response, _, err := tads.Oauth().Token(ctx, clientId, clientSecret, grantType, oauthTokenOpts)

	if err != nil {
		if resErr, ok := err.(errors.ResponseError); ok {
			errStr, _ := json.Marshal(resErr)
			// TODO for api error
			fmt.Println("Response error:", string(errStr))
		} else {
			// TODO for other error
			fmt.Println("Error:", err)
		}
	}
	tads.SetAccessToken(response.AccessToken)
}

设置调用环境、Access Token

package main

import (
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
)

func main() {
	accessToken := "YOUR ACCESS TOKEN"
	tads := ads.Init(&config.SDKConfig{
		AccessToken: accessToken,
	})
	// 默认访问沙箱环境,如访问正式环境,请调用tads.UseProduction()
	tads.UseSandbox()
}

调用API接口

package main

import (
	"encoding/json"
	"fmt"
	"github.com/antihax/optional"
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/api"
	"github.com/tencentad/marketing-api-go-sdk/pkg/model"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
	"github.com/tencentad/marketing-api-go-sdk/pkg/errors"
)

func main() {
	accessToken := "YOUR ACCESS TOKEN"
	tads := ads.Init(&config.SDKConfig{
		AccessToken: accessToken,
	})
	// your account id
	accountId := int64(0)
    field := "promoted_object_type"
    operator := "EQUALS"
	campaignsGetOpts := &api.CampaignsGetOpts{
		Filtering: optional.NewInterface([]model.FilteringStruct{model.FilteringStruct{
			Field:&field,
			Operator:&operator,
			Values:[]string{"PROMOTED_OBJECT_TYPE_APP_IOS"},
		}}),
	}
	ctx := *tads.Ctx
	// oauth/token接口即对应Campaigns().Get()方法
	response, _, err := tads.Campaigns().Get(ctx, accountId, campaignsGetOpts)

	if err != nil {
		if resErr, ok := err.(errors.ResponseError); ok {
			// When Api returns an error
			errStr, _ := json.Marshal(resErr)
			// TODO for api error
			fmt.Println("Response error:", string(errStr))
		} else {
			// When validation fails or other local issues
			// TODO for other error
			fmt.Println("Error:", err)
		}
	}
	fmt.Println(response)
}

调试和查看API接口日志

package main

import (
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
)

func main() {
	accessToken := "YOUR ACCESS TOKEN"
	ads.Init(&config.SDKConfig{
		AccessToken: accessToken,
		IsDebug: true,
		DebugFile: "YOUR LOG FILE PATH",
	})
}

对于返回的Json取严格模式校验

package main

import (
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
)

func main() {
	accessToken := "YOUR ACCESS TOKEN"
	ads.Init(&config.SDKConfig{
		AccessToken: accessToken,
		IsStrictMode: true
	})
}

如果返回值中包含不认识的属性,会抛ResponseStrictError

关闭SDK上报

目前SDK上报信息为您的服务器版本和 Go 版本信息,为了帮助您更好地定位使用上的问题,建议开启上报,如需关闭请参考如下配置。
package main

import (
	"github.com/tencentad/marketing-api-go-sdk/pkg/ads"
	"github.com/tencentad/marketing-api-go-sdk/pkg/config"
)

func main() {
	accessToken := "YOUR ACCESS TOKEN"
	ads.Init(&config.SDKConfig{
		AccessToken: accessToken,
		SkipMonitor: true,
	})
}

问题建议与反馈

如果您在使用SDK过程中有任何问题与建议,请随时登录开发者官网,点击右下角的"咨询"按钮,与我们的客服支持人员联系

后续计划

  1. 丰富各类场景示例
  2. 推出其他语言的SDK

marketing-api-go-sdk's People

Contributors

craryprimitiveman avatar kylinhuang7 avatar tencentaddeveloper avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

marketing-api-go-sdk's Issues

添加图片文件接口报错:file should be *os.File

版本:v1.4.4,升级到最新也一样
描述:
直接使用文档中示例请求上传图片会报错 file should be *os.File,
文档提示填 “YOUR IMAGE FILE PATH”,看源码后面有个地方会校验类型 localVarOptionals.File.Value().(os.File),
如果使用
os.File类型作为参数后请求又会报错如下:
{"code":18001,"message":"Your request is missing a required parameter. The required parameter is 'file'. trace_id: a1b15e41384ac176f53d99c41080ae35","message_cn":"\u7f3a\u5931\u5fc5\u586b\u53c2\u6570file\uff0c\u8bf7\u4f20\u5165\u5fc5\u586b\u53c2\u6570 trace_id: a1b15e41384ac176f53d99c41080ae35"}

并发调用会发生accecc_token出错情况

https://github.com/TencentAd/marketing-api-go-sdk/blob/master/pkg/ads/middleware_auth.go#L16-L32

func (a *AuthMiddleware) Handle(req *http.Request, next func(req *http.Request) (rsp *http.Response, err error)) (rsp *http.Response, err error) {
	nonce := uuid.NewV4().String()
	apiKey := config.APIKey{
		//AccessToken: a.tads.GetAccessToken(),
		AccessToken: req.Context().Value(config.ContextAPIKey).(config.APIKey).AccessToken,
		Timestamp:   strconv.FormatInt(time.Now().Unix(), 10),
		Nonce:       nonce[0:8] + nonce[9:13] + nonce[14:18],
	}
	query := req.URL.Query()
	query.Set("access_token", apiKey.AccessToken)
	query.Set("timestamp", apiKey.Timestamp)
	query.Set("nonce", apiKey.Nonce)
	req.URL.RawQuery = query.Encode()
	ctx := context.WithValue(*a.tads.Ctx, config.ContextAPIKey, apiKey)
	req = req.WithContext(ctx)
	rsp, err = next(req)
	return rsp, err
}

我改成这样好像可以解决这个问题 @CraryPrimitiveMan

model.DailyReportsGetResponseData MarterialId类型错误

model.DailyReportsGetResponseData中定义MaterialId为int64, API返回结果为string, 建议定义为json.Number

返回结果示例:
{"code":0,"message":"","message_cn":"","data":{"list":[{"ctr":0.0185,"material_id":"260137953","date":"2021-01-05"},{"ctr":0.0151,"material_id":"260137953","date":"2021-01-06"},{"ctr":0.0225,"material_id":"260137953","date":"2021-01-07"},{"ctr":0.0147,"material_id":"260137953","date":"2021-01-08"},{"ctr":0.0167,"material_id":"260137953","date":"2021-01-09"},{"ctr":0.0175,"material_id":"260137953","date":"2021-01-10"},{"ctr":0.0157,"material_id":"260137953","date":"2021-01-11"},{"ctr":0.0182,"material_id":"260137953","date":"2021-01-12"},{"ctr":0.0171,"material_id":"260137953","date":"2021-01-13"},{"ctr":0.0145,"material_id":"260137953","date":"2021-01-14"}],"unfold_query":[],"page_info":{"page":1,"page_size":10,"total_number":601,"total_page":61}},"trace_id":"b9caabfbc48457a4ac556bf80c52ca0e"}

Error Message
json: cannot unmarshal string into Go struct field DailyReportsGetListStruct.data.list.material_id of type int64

client.decode 错误没有处理。

// If we succeed, return the data, otherwise pass on to decode error.
err = a.client.decode(&localVarResponse, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err == nil {
	if localVarResponse.Code > 0 {
		err = errors.NewError(localVarResponse.Code, localVarResponse.Message, localVarResponse.MessageCn, localVarResponse.Errors)
		return localVarReturnValue, localVarHttpResponse, err
	}
	return localVarResponse.Data, localVarHttpResponse, err
}

希望在3.0广告组接口新增监测链接feedback_id字段

文件 model_adgroups_get_list_struct.go

{
                "adgroup_id": 18324613088,
                "configured_status": "AD_STATUS_NORMAL",
                "created_time": 1721121645,
                "last_modified_time": 1721180673,
                "is_deleted": false,
                "system_status": "ADGROUP_STATUS_NOT_IN_DELIVERY_TIME",
                "adgroup_name": "视频-测试-1",
                "begin_date": "2024-07-17",
                "end_date": "2025-07-17",
                "first_day_begin_time": "00:00:00",
                "bid_amount": 80900,
                "optimization_goal": "",
                "daily_budget": 0,
                "feedback_id": 44717,
                "total_budget": 0
            }

interactiveType 参数错误

在1.3 版本 调用 蹊径-创建互动落地页 接口
提示:interactiveType: data should be string, data should be equal to one of the allowed values

文档的请求参数是 interactive_page_type ,请求接口也是传了 interactive_page_type。最后把 interactive_page_type 改成 interactive_type 接口就正常了。
所以是文档错了?还是接口错了?

结构体字段类型定义与接口响应字段类型不一致

merge_fund_type_funds/get API返回结果中的 effect_funds的结构
type T struct {
Amount int json:"amount"
EffectDate string json:"effect_date"
ExpireDate string json:"expire_date"
},但是 model中的MergeFundTypeFundsGetListStruct 的结构
type MergeFundTypeFundsGetListStruct struct {
Balance *int64 json:"balance,omitempty"
FundStatus FundStatus json:"fund_status,omitempty"
EffectFunds *[]string json:"effect_funds,omitempty"
RealtimeCost *int64 json:"realtime_cost,omitempty"
FundType AccountMergeTypeMap json:"fund_type,omitempty"
}

关于限流...

{"code":30104,"message":"Request limit reached. Please retry after one minute. trace_id: faafabb4262fe68edd5673fbbb9e8ea0","message_cn":"已达到请求限制。 请在一分钟后重试。 trace_id: faafabb4262fe68edd5673fbbb9e8ea0"}

自己记录了访问频次,qps很低,远没到访问限制。但是程序访问返回了 30104..反馈中心只会回复让走异步接口,毫无帮助...
请问一下,有没有途径或者联系方式可以推进该问题接下来如何定位的,谢谢🙏

daily_reports接口返回字段不全

  1. daily_reports接口返回字段不全,当level为广告组或者广告计划时,按照接口文档,返回字段应该会更多,比如包含adgroup_id或者campaign_id,当前go sdk返回字段中未包含这些字段。
  2. 另外实际调试daily_reports接口时,level为广告组或者广告计划时,真实返回的结果却不包含adgroup_id或者campaign_id,这与官方接口不一致,又时为什么?

使用官方v1.2.0的版本默认demo报错multiple-value uuid.NewV4() in single-value context

<--代码开始-->
accessToken := "xxx" //跑的时候有替换为正常的token
tads := ads.Init(&config.SDKConfig{
AccessToken: accessToken,
})
// your account id
accountId := int64(00000) //跑的时候有替换为正常的accountId
campaignsGetOpts := &api.CampaignsGetOpts{
Filtering: optional.NewInterface([]model.FilteringStruct{model.FilteringStruct{
Field:"promoted_object_type",
Operator:"EQUALS",
Values:[]string{"PROMOTED_OBJECT_TYPE_APP_IOS"},
}}),
}
ctx := *tads.Ctx
// oauth/token接口即对应Campaigns().Get()方法
response, _, err := tads.Campaigns().Get(ctx, accountId, campaignsGetOpts)

if err != nil {
	if resErr, ok := err.(errors.ResponseError); ok {
		// When Api returns an error
		errStr, _ := json.Marshal(resErr)
		// TODO for api error
		fmt.Println("Response error:", string(errStr))
	} else {
		// When validation fails or other local issues
		// TODO for other error
		fmt.Println("Error:", err)
	}
}
fmt.Println(response)

<--代码结束-->
报错信息如下:
../../github.com/tencentad/marketing-api-go-sdk/pkg/ads/middleware_auth.go:17:21: multiple-value uuid.NewV4() in single-value context
../../github.com/tencentad/marketing-api-go-sdk/pkg/ads/tencentads.go:27:21: multiple-value uuid.NewV4() in single-value context

数据源分发关系获取接口返回值数据结构错误

  • API

GET /v1.1/data_source_dispatch/get

  • SDKVersion

1.7.38

  • Response

{"code":0,"data":{"list":[{"access_way":"SELF_BUILT","name":"tracking_100838841","scenes":[{"scene":"TRANSFORMATION_ATTRIBUTION","switch_type":"SWITCH_ON"},{"scene":"DMP","switch_type":"SWITCH_ON"}],"type":"ANDROID","user_action_set_id":1201746617}]},"message":"","message_cn":"成功","trace_id":"fadc0da68b6ce447fb8cbdd8e1f6f5ac"}

  • Problem

The api response is neigher as same as the document described nor as same as the SDK response struct .

调用 蹊径-创建互动落地页接口报错

使用Go SDK 调用 蹊径-创建互动落地页接口
解析json报错:json: cannot unmarshal array into Go struct field XgPageInteractiveAddResponse.data of type model.XijingPageInteractiveAddResponseData

响应的json数据:{"data":[{"id":"4627685","message":"\u64cd\u4f5c\u6210\u529f","code":0,"landingPageId":3253611}],"code":0,"message":"","message_cn":""}

return *localVarResponse.Data, localVarHttpResponse.Header, err. panic

github.com/tencentad/marketing-api-go-sdk v1.7.6

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x10a8c2b]

goroutine 244 [running]:
github.com/tencentad/marketing-api-go-sdk/pkg/api.(*AdcreativesApiService).Get(0xc0003ce490, 0x2505680, 0xc000486780, 0x81b6bd, 0xc000114720, 0x0, 0x0, 0x0, 0x0, 0x0)
/root/go/pkg/mod/github.com/tencentad/[email protected]/pkg/api/api_adcreatives.go:338 +0xbfb

sdk v1.7.45 升级到 v1.7.49 后,DynamicCreativesGetListStruct缺少system_status字段

https://github.com/TencentAd/marketing-api-go-sdk/blame/v1.7.49/pkg/model/v3/model_dynamic_creatives_get_list_struct.go

然而接口返回值是有这个字段的

GET /v3.0/dynamic_creatives/get?access_token=xxxxxxxxxx&account_id=xxxxxxxx&fields=%5B%22system_status%22%5D&is_deleted=false&nonce=9a5f002401254fbd&page=1&page_size=100&timestamp=1713510161 HTTP/1.1
Host: api.e.qq.com
Accept: application/json
Content-Type: text/plain
User-Agent: 
X-Sdk-Language: GO
X-Sdk-Language-Version: go1.21.6
X-Sdk-Os: darwin
X-Sdk-Version: 1.7.39

HTTP/1.1 200 OK
Content-Length: 186
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, x-trace-id, x-trans-id, X-From-Client, MP-TK
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, PATCH, OPTIONS
Access-Control-Allow-Origin: https://developers.e.qq.com
Access-Control-Expose-Headers: Access-Control-Allow-Origin
Access-Control-Max-Age: 3600
Connection: keep-alive
Content-Type: application/json;charset=utf-8
Date: Fri, 19 Apr 2024 07:02:41 GMT
Server: openresty
X-Ratelimit-Remaining: 100%,99%
X-Tsa-Trace-Id: cae75ccc2531e145aed79a71fc820bf6

{"code":0, "message":"", "message_cn":"", "data":{"list":[{"system_status":"DYNAMIC_CREATIVE_STATUS_ACTIVE"}], "page_info":{"page":1, "page_size":100, "total_number":1, "total_page":1}}}

创建广告创意报错 'image_id' is invalid

{"code":31034,"message":"Parameter 'image_id' is invalid. trace_id: 791d2acc0b96d55b8dca080672f65e3a","message_cn":"参数image_id无效或者不合法,请检查该参数。 trace_id: 791d2acc0b96d55b8dca080672f65e3a"}
我确认了好几遍,自己的image格式正确无误,希望能帮忙解答下,找了客服,一直没回复,谢谢了。

1.6升级1.7

在我升级SDK版本的时候,需要更新许多字段类型
当然并不是抱怨需要改
而是不太理解为什么基本类型的 tag 已经包含 json:"omitempty"的情况下依然把字段类型改为指针类型
这是出于什么考虑

更新创意时的一个问题

adcreatives/update接口报错
您指定的adcreative_template_id,site_set和promote_object_type不支持参数conversion_data_type/conversion_target_type的值 trace_id:

当选择特定的adcreative_template_id时时不需要conversion_data_type/conversion_target_type这两个参数的,但是github.com/tencentad/marketing-api-go-sdk/pkg/model/model_adcreatives_update_request.go这个结构体初始化后这两个参数永远有值,这个要怎么处理呢

获取广告标签接口返回数据值并不在枚举值内

接口:获取广告标签
地址:ad_label/get
错误字段:label_type
现在是使用枚举结构,但是接口实际数据是返回数字,改成int64测试可以返回结果;
现在报错:json: cannot unmarshal number into Go struct field AdLabelGetListStruct.data.list.label_type of type model.LabelType
// 返回结构
type AdLabelGetListStruct struct {
LabelCategory *string json:"label_category,omitempty"
Label *[]string json:"label,omitempty"
Icon *[]LabelIconItem json:"icon,omitempty"
LabelType LabelType json:"label_type,omitempty"
LabelTypeName *string json:"label_type_name,omitempty"
LabelRemark *[]LabelRemarkItem json:"label_remark,omitempty"
LabelStructs *[]AdLabelStruct json:"label_structs,omitempty"
}

结构体缺少adq_accounts_upgrade_enabled字段

文档中api_hourly_reports接口新增了adq_accounts_upgrade_enabled字段来标识新老指标体系。
我们在对接口升级的过程中发现,之前使用了HourlyReportsGetOpts结构体,但是最新版本中结构体缺少adq_accounts_upgrade_enabled字段,是否有计划增加呢。

go.uuid版本号

github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b
这个库根本就没有1.2.1这个tag,latest release就是1.2.0,而且1.2.1和1.2.0是个break change 会和引用其它库产生冲突,go.mod能不能退回到1.2.0?

errors while installing

go get -u github.com/tencentad/marketing-api-go-sdk
package github.com/tencentad/marketing-api-go-sdk: no Go files in /Users/***/go/src/github.com/tencentad/marketing-api-go-sdk

异步拉取

cannot unmarshal string into Go struct field ReportAdUnionResponseData.data.task_id

videos/add接口报错没有account_id参数

videos/add 接口复制的文档代码,一直报错The required parameter is 'account_id',这account_id不是sdk方法都封装好的吗,已经传了报错是什么意思

希望在报错的返回里加上trace_id

目前的返回:
type ResponseError struct {
error
Code int64 json:"code,omitempty"
Message string json:"message,omitempty"
MessageCn string json:"message_cn,omitempty"
Errors []model.ApiErrorStruct json:"errors,omitempty"
}

希望加上trace_id

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.