diff --git a/api/native/photo_list.go b/api/native/photo_list.go new file mode 100644 index 0000000..b22da98 --- /dev/null +++ b/api/native/photo_list.go @@ -0,0 +1,15 @@ +package native + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/native" +) + +func PhotoList(clt *core.SDKClient, accessToken string, req *native.PhotoListRequest) (*native.PhotoListResponse, error) { + var resp native.PhotoListResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/native/upload.go b/api/native/upload.go new file mode 100644 index 0000000..e6fe286 --- /dev/null +++ b/api/native/upload.go @@ -0,0 +1,15 @@ +package native + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/native" +) + +func Upload(clt *core.SDKClient, accessToken string, req *native.UploadRequest) (*native.UploadResponse, error) { + var resp native.UploadResponse + err := clt.Upload(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/native/user_list.go b/api/native/user_list.go new file mode 100644 index 0000000..b84729b --- /dev/null +++ b/api/native/user_list.go @@ -0,0 +1,15 @@ +package native + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/native" +) + +func UserList(clt *core.SDKClient, accessToken string, req *native.UserListRequest) (*native.UserListResponse, error) { + var resp native.UserListResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/target_v2/template_list.go b/api/target_v2/template_list.go new file mode 100644 index 0000000..3dbfb86 --- /dev/null +++ b/api/target_v2/template_list.go @@ -0,0 +1,16 @@ +package target_v2 + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/target_v2" +) + +// TemplateList 查询定向模板接口 +func TemplateDetails(clt *core.SDKClient, accessToken string, req *target_v2.TemplateDetailsRequest) (*target_v2.TemplateDetailsResponse, error) { + var resp target_v2.TemplateDetailsResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/v2.2/appcenter/app/list.go b/api/v2.2/appcenter/app/list.go new file mode 100644 index 0000000..2eb1caa --- /dev/null +++ b/api/v2.2/appcenter/app/list.go @@ -0,0 +1,16 @@ +package app + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/appcenter/app" +) + +func List(clt *core.SDKClient, accessToken string, req *app.ListRequest) (*app.ListResponse, error) { + var resp app.ListResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} + diff --git a/api/v2.2/appcenter/subpkg/create.go b/api/v2.2/appcenter/subpkg/create.go new file mode 100644 index 0000000..64c280c --- /dev/null +++ b/api/v2.2/appcenter/subpkg/create.go @@ -0,0 +1,15 @@ +package subpkg + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/appcenter/subpkg" +) + +func Create(clt *core.SDKClient, accessToken string, req *subpkg.CreateRequest) (*subpkg.CreateResponse, error) { + var resp subpkg.CreateResponse + err := clt.Post(accessToken, req, &resp.Item) + if err != nil { + return &resp, err + } + return &resp, nil +} diff --git a/api/v2.2/appcenter/subpkg/list.go b/api/v2.2/appcenter/subpkg/list.go new file mode 100644 index 0000000..601ea1a --- /dev/null +++ b/api/v2.2/appcenter/subpkg/list.go @@ -0,0 +1,15 @@ +package subpkg + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/appcenter/subpkg" +) + +func List(clt *core.SDKClient, accessToken string, req *subpkg.ListRequest) (*subpkg.ListResponse, error) { + var resp subpkg.ListResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/v2.2/appcenter/subpkg/update.go b/api/v2.2/appcenter/subpkg/update.go new file mode 100644 index 0000000..0a33971 --- /dev/null +++ b/api/v2.2/appcenter/subpkg/update.go @@ -0,0 +1,15 @@ +package subpkg + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/appcenter/subpkg" +) + +func Update(clt *core.SDKClient, accessToken string, req *subpkg.UpdateRequest) (*subpkg.UpdateResponse, error) { + var resp subpkg.UpdateResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return &resp, err + } + return &resp, nil +} \ No newline at end of file diff --git a/api/v2.2/unit/bid_updte.go b/api/v2.2/unit/bid_updte.go new file mode 100644 index 0000000..f5a4095 --- /dev/null +++ b/api/v2.2/unit/bid_updte.go @@ -0,0 +1,15 @@ +package unit + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/unit" +) + +func BidUpdate(clt *core.SDKClient, accessToken string, req *unit.BidUpdateRequest) ([]uint64, error) { + var resp unit.BidUpdateResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return resp.UnitIds, nil +} diff --git a/api/v2.2/unit/budget_update.go b/api/v2.2/unit/budget_update.go new file mode 100644 index 0000000..7a94a5e --- /dev/null +++ b/api/v2.2/unit/budget_update.go @@ -0,0 +1,16 @@ +package unit + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/unit" +) + +// 更新广告组预算 +func BudgetUpdate(clt *core.SDKClient, accessToken string, req *unit.BudgetUpdateRequest) ([]uint64,error) { + var resp unit.BudgetUpdateResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return resp.UnitIds, nil +} diff --git a/api/v2.2/unit/status_update.go b/api/v2.2/unit/status_update.go new file mode 100644 index 0000000..529ad91 --- /dev/null +++ b/api/v2.2/unit/status_update.go @@ -0,0 +1,17 @@ +package unit + + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/v2.2/unit" +) + +// Create 创建广告组 +func StatusUpdate(clt *core.SDKClient, accessToken string, req *unit.StatusUpdateRequest) ([]uint64, error) { + var resp unit.StatusUpdateResponse + err := clt.Post(accessToken, req, &resp) + if err != nil { + return nil, err + } + return resp.UnitIds, nil +} diff --git a/go.mod b/go.mod index 2c1dfac..0ee0b96 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/bububa/kwai-marketing-api -go 1.20 +go 1.19 + + diff --git a/model/file/video.go b/model/file/video.go index 6127d87..45f27ef 100644 --- a/model/file/video.go +++ b/model/file/video.go @@ -25,5 +25,16 @@ type Video struct { // Duration 视频时长; 单位毫秒 Duration int64 `json:"duration,omitempty"` // Source 视频来源; 0:自上传,1:开眼,2:素造,7:聚星视频 - Source int `json:"source,omitempty"` + Source int `json:"source,omitempty"` + AdPhotoValuateInfo AdPhotoValuateInfoItem `json:"adPhotoValuateInfo"` +} +type AdPhotoValuateInfoItem struct { + SimLabel string `json:"simLabel"` + QualityLabel string `json:"qualityLabel"` + QuotaMsg string `json:"quotaMsg"` + IsDupPhoto bool `json:"isDupPhoto"` + IsDelayReview interface{} `json:"isDelayReview"` + OptimizationSuggestions string `json:"optimizationSuggestions"` + RunningScore int `json:"runningScore"` + HitTagCombination int `json:"hitTagCombination"` } diff --git a/model/native/photo_list_request.go b/model/native/photo_list_request.go new file mode 100644 index 0000000..81df369 --- /dev/null +++ b/model/native/photo_list_request.go @@ -0,0 +1,24 @@ +package native + +import "encoding/json" + +type PhotoListRequest struct { + AuthorID uint64 `json:"author_id"` // 达人用户id + AdvertiserID uint64 `json:"advertiser_id"` // 广告主ID + PCursor string `json:"pcursor"` // 游标,第一次不传,后续滑动获取时根据结果返回的pcursor填取 + Count int `json:"count"` // 每次获取的个数,最大不超过50个 + KOLUserType int `json:"kol_user_type"` // 原生达人类型,1普通快手号(备注:需要在“普通快手号原生白名单”中才能返回列表),2服务号原生,3聚星达人原生 + CampaignType int `json:"campaign_type"` // 计划类型,原生场景下仅支持部分计划类型,2提升应用安装,5收集销售线索,7提升应用活跃,19小程序推广 + TabType int `json:"tab_type"` // 0代表profile页非隐藏视频,1代表profile页隐藏视频 +} + +// Url implement PostRequest interface +func (r PhotoListRequest) Url() string { + return "gw/dsp/v1/native/photo/list" +} + +// Encode implement PostRequest interface +func (r PhotoListRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/native/photo_list_response.go b/model/native/photo_list_response.go new file mode 100644 index 0000000..45943cf --- /dev/null +++ b/model/native/photo_list_response.go @@ -0,0 +1,23 @@ +package native + +type PhotoListResponse struct { + Photos []*KwaiOrdePhotoViewSnake `json:"photos"` // 视频列表 + PCursor string `json:"pcursor"` // 下标,如果后面无更多视频则返回 no_more; 如果后续有更多视频需用此返回填到拉取视频接口的入参上 +} + +type CdnUrlInfo struct { + Cdn string `json:"cdn"` // cdn信息 + Url string `json:"url"` // url信息 +} + +type KwaiOrdePhotoViewSnake struct { + PhotoID string `json:"photo_id"` // 加密后的photoId + Caption string `json:"caption"` // 视频标题 + CoverURL []CdnUrlInfo `json:"cover_url"` // 封面url + MovieURL []CdnUrlInfo `json:"movie_url"` // 视频url + Duration int64 `json:"duration"` // 视频时长,单位毫秒 + Height int `json:"height"` // 视频高度 + Width int `json:"width"` // 视频宽度 + CreativeMaterialType int `json:"creative_material_type"` // 视频横竖版: 1竖版,2横版 + AdSocialOrderID int `json:"ad_socail_order_id,omitempty"` // 聚星订单id +} diff --git a/model/native/upload_request.go b/model/native/upload_request.go new file mode 100644 index 0000000..f07f34d --- /dev/null +++ b/model/native/upload_request.go @@ -0,0 +1,63 @@ +package native + +import ( + "github.com/bububa/kwai-marketing-api/model" + "strconv" +) + +type UploadRequest struct { + AdvertiserId uint64 `json:"advertiser_id"` + Photo *model.UploadField `json:"photo"` // 视频file + ShieldBackwardSwitch bool `json:"shieldBackwardSwitch"` // 上传视频后是否自动同步至快手个人主页,false表示屏蔽,视频不可在个人主页可见,true表示不屏蔽 + AuthorID uint64 `json:"authorId"` // 原生上传至达人的快手号 + NativePlcSwitch bool `json:"nativePlcSwitch"` + PhotoCaption string `json:"photoCaption"` +} + +// Url implement UploadRequest interface +func (r UploadRequest) Url() string { + return "gw/dsp/v1/photo/upload" +} + +// Encode implenent UploadRequest interface +func (r UploadRequest) Encode() []model.UploadField { + fileName := r.Photo.Value + if fileName == "" { + fileName = "file" + } + shieldBackwardSwitch := "false" + if r.ShieldBackwardSwitch { + shieldBackwardSwitch = "true" + } + nativePlcSwitch := "false" + if r.NativePlcSwitch { + nativePlcSwitch = "true" + } + return []model.UploadField{ + { + Key: "advertiser_id", + Value: strconv.FormatUint(r.AdvertiserId, 10), + }, + { + Key: "authorId", + Value: strconv.FormatUint(r.AuthorID, 10), + }, + { + Key: "shieldBackwardSwitch", + Value: shieldBackwardSwitch, + }, + { + Key: "photo", + Value: fileName, + Reader: r.Photo.Reader, + }, + { + Key: "nativePlcSwitch", + Value: nativePlcSwitch, + }, + { + Key: "photoCaption", + Value: r.PhotoCaption, + }, + } +} diff --git a/model/native/upload_response.go b/model/native/upload_response.go new file mode 100644 index 0000000..951b5de --- /dev/null +++ b/model/native/upload_response.go @@ -0,0 +1,5 @@ +package native + +type UploadResponse struct { + PhotoID uint64 `json:"photo_id"` +} diff --git a/model/native/user_list_request.go b/model/native/user_list_request.go new file mode 100644 index 0000000..d12b13e --- /dev/null +++ b/model/native/user_list_request.go @@ -0,0 +1,19 @@ +package native + +import "encoding/json" + +type UserListRequest struct { + AdvertiserID uint64 `json:"advertiser_id"` // 广告主ID + KOLUserType []int `json:"kol_user_type"` // 达人原生类型,1代表普通快手号(备注:需要在“普通快手号原生白名单”中才能返回列表),2服务号原生达人,3聚星原生达人 +} + +// Url implement PostRequest interface +func (r UserListRequest) Url() string { + return "gw/dsp/v1/native/user/list" +} + +// Encode implement PostRequest interface +func (r UserListRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/native/user_list_response.go b/model/native/user_list_response.go new file mode 100644 index 0000000..a1a1434 --- /dev/null +++ b/model/native/user_list_response.go @@ -0,0 +1,13 @@ +package native + +type UserListResponse struct { + UserList []*UserProfileViewSnake `json:"user_list"` //用户列表 +} + +type UserProfileViewSnake struct { + UserID int64 `json:"user_id"` // 用户id + UserName string `json:"user_name"` // 用户名称 + UserSex string `json:"user_sex"` // 用户性别,男性M,女性F + HeadURL string `json:"head_url"` // 用户头像 + KOLUserType int `json:"kol_user_type"` // 达人用户类型,2服务号达人,3聚星达人 +} diff --git a/model/target_v2/behavior_interest.go b/model/target_v2/behavior_interest.go new file mode 100644 index 0000000..76cde14 --- /dev/null +++ b/model/target_v2/behavior_interest.go @@ -0,0 +1,39 @@ +package target_v2 + +// BehaviorInterest 行为兴趣定向 +type BehaviorInterest struct { + // Behavior 行为定向 + Behavior *Behavior `json:"behavior,omitempty"` + // Interest 兴趣定向 + Interest *Interest `json:"interest,omitempty"` +} + +// Behavior 行为定向 +type Behavior struct { + // Keyword 行为定向关键词 + Keyword []Keyword `json:"keyword,omitempty"` + // Label 行为定向,类目词 + Label []string `json:"label,omitempty"` + // TimeType 在多少天内发生行为的用户; 0:7天 1:15天 2:30天 3:90天4:180天 + TimeType int `json:"time_type,omitempty"` + // StrengthType 行为强度; 0:不限 1:高强度 + StrengthType int `json:"strength_type,omitempty"` + // SceneType 行为场景; 1:社区 2:APP 4:推广 + SceneType []int `json:"scene_type,omitempty"` +} + +// Interest 兴趣定向 +type Interest struct { + // Label 兴趣定向类目词; 根据/rest/openapi/v1/tool/label/behavior_interest接口获取。将兴趣类目id从最高层类目id开始,以“-”连接起来,假如有一个类目id为80202,父类目id为802,最高层类目id为8,则此时应该写"8-802-80202";如果想全选最高层类目"8"底下的所有子类目,填"8" + Label []string `json:"label,omitempty"` + // StrengthType 兴趣标签强度; 0:不限 1:高强度 + StrengthType int `json:"strength_type,omitempty"` +} + +// Keyword 行为定向关键词 +type Keyword struct { + // ID 关键词id + ID uint64 `json:"id,omitempty"` + // Name 关键词名称 + Name string `json:"name,omitempty"` +} diff --git a/model/target_v2/target.go b/model/target_v2/target.go new file mode 100644 index 0000000..b440498 --- /dev/null +++ b/model/target_v2/target.go @@ -0,0 +1,65 @@ +package target_v2 + +type Target struct { + Region []int64 `json:"region,omitempty"` // 地域,传值为 [] 表示不限,传递上一级 id 时,children id 可以不传,不允许同时传 parent id 和 children id,地域信息可通过 /region/list 接口获取 + DistrictIDs []int64 `json:"district_ids,omitempty"` // 商圈定向,与 region 字段不能同时传、白名单控制,最多选 100 个,可以通过 /rest/openapi/v1/region/district/list 接口获取商圈信息 + BehaviorInterest BehaviorInterest `json:"behavior_interest,omitempty"` // 行为兴趣定向 + UserType int `json:"user_type,omitempty"` // 用户类型,0:实时,1:常驻,2:不限 + AgesRange []int `json:"ages_range,omitempty"` // 可选年龄段,18:18-23 岁,24:24-30 岁,31:31-40 岁,41:41-49 岁,50:50-100 岁 + Age Age `json:"age,omitempty"` + Gender int `json:"gender,omitempty"` // 性别,1:女性,2:男性,0 表示不限 + PlatformOS int `json:"platform_os,omitempty"` // 定向的 os 版本,应用安装类计划以 app_id 中的 platform_os 为准,1:Android,2:iOS,0 表示不限 + AndroidOSV int `json:"android_osv,omitempty"` // Android 版本,3:不限,4:4.x+,5:5.x+,6:6.x+,7:7.x+ + IOSOSV int `json:"ios_osv,omitempty"` // iOS 版本,6:不限,7:7.x+,8:8.x+,9:9.x+,10:10.x+ + Network int `json:"network,omitempty"` // 网络环境,1:WI-FI,2:移动网络,0:表示不限 + FilterConvertedLevel int `json:"filter_converted_level,omitempty"` // 过滤已转化人群纬度,0:不限,1:广告组,2:广告计划,3:本账户,4:公司主体,5:APP + DeviceBrand []int `json:"device_brand,omitempty"` // 设备品牌,传值为 [] 表示不限,当 platform 为 iOS 定向时,没有设备品牌定向,1:苹果(platform 字段为空时可选),2:VIVO,3:OPPO + DevicePrice []int `json:"device_price"` // 设备价格 + AppInterestIds []int64 `json:"app_interest_ids"` // APP 行为-按分类 + AppIds []int64 `json:"app_ids"` // APP 行为-按 APP 名称 + Population []int64 `json:"population"` // 定向人群包 + PaidAudience []int64 `json:"paid_audience"` // 付费人群包 + ExcludePopulation []int64 `json:"exclude_population"` // 排除人群包 + IntelliExtendOption int `json:"intelli_extend_option"` // 智能定向开关 + BehaviorType int `json:"behavior_type"` // 行为兴趣类型 + Celebrity Celebrity `json:"celebrity,omitempty"` // 快手网红 + MediaSourceType int `json:"media_source_type"` // 媒体包来源 + Media []int64 `json:"media,omitempty"` // 媒体定向包 + ExcludeMedia []int64 `json:"exclude_media,omitempty"` // 媒体定向排除包 + SeedPopulation []int64 `json:"seed_population,omitempty"` // 种子人群包 + IpType int `json:"ip_type,omitempty"` //地域IP类型 白名单可用,0-默认IP、1-广协IP + +} + +// Age 自定义年龄段 +type Age struct { + // Min 年龄最小限制 + Min int `json:"min,omitempty"` + // Max 年龄最大限制 + Max int `json:"max,omitempty"` +} + +type Celebrity struct { + //Behaviors 该字段为平台对应快手网红功能中的行为类型,可多选,但不可不选,不选会导致快手网红定向失效,定义如下 0:关注、1:视频互动、2:直播互动 + Behaviors []int `json:"behaviors"` + //FansStars 该字段包括平台对应快手网红功能中的网红分类和快手网红两项,数据保证录入顺序,可从【快手网红-网红分类】和【快手网红-搜索快手网红】接口获取对应数据 + FansStars FansStar `json:"fans_stars"` +} + +type FansStar struct { + // ID 如使用该功能则必填此项,该字段有两种含义 1、当是网红分类,即type=1时,该字段传入对应网红分类对应的父ID与当前ID的拼接字符串, + //如传入"33-177"表示一级网红分类"游戏"下的二级网红分类"沙盒游戏",如选中的是一级网红分类,则直接传入当前ID如"33" + //2、当是快手网红,即type=2时,该字段传入对应快手网红的author_id,如传入"1151465119"表示快手网红小脑斧来自N次元 + ID string `json:"id"` + //Type 如使用该功能则必填此项,该字段为平台对应快手网红功能中的网红分类和快手网红两项,可从【快手网红-网红分类】和【快手网红-搜索快手网红】 + //接口获取对应数据 1:网红分类、2:快手网红 + Type int `json:"type"` + //Name 如使用该功能则必填此项,该字段有两种含义 1、当是网红分类,即type=1时,该字段传入对应网红分类对应的父name与当前name的拼接字符串, + //如传入"游戏-沙盒游戏"表示一级网红分类"游戏"下的二级网红分类"沙盒游戏",如选中的是一级网红分类,则直接传入当前ID如"游戏",保证传入的值 + //与传入id对应网红标签name(拼接)一致 2、当是快手网红,即type=2时,该字段传入对应快手网红的kwai_id,如传入"小脑斧来自N次元"表示快手 + //网红小脑斧来自N次元,保证传入的值与传入id对应的快手网红的kwai_id保持一致 + Name string `json:"name"` + //Category 当是快手网红,即type=2时,该字段传值有效,对应当前快手网红的分类,格式为first_label_id,second_label_id, + //如果second_label_id不存在,则只传入first_label_id,如传入32, 241表示当前快手网红属于影视-影视分类二级网红分类 + Category []int `json:"category"` +} diff --git a/model/target_v2/template_details_request.go b/model/target_v2/template_details_request.go new file mode 100644 index 0000000..020d50b --- /dev/null +++ b/model/target_v2/template_details_request.go @@ -0,0 +1,28 @@ +package target_v2 + +import ( + "encoding/json" +) + +// TemplateDetailsRequest 查询定向模板接口 API Request +type TemplateDetailsRequest struct { + // AdvertiserID 广告主 ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // 模板ID列表(默认ID和分页参数二选一必传) + TemplateID []uint64 `json:"template_id"` + // Page 请求的页码,默认为 1(page和page_size要么都传,要么都不传;都不传时需要传模板ID) + Page int `json:"page,omitempty"` + // PageSize 每页行数,默认 20 + PageSize int `json:"page_size,omitempty"` +} + +// Url implement GetRequest interface +func (r TemplateDetailsRequest) Url() string { + return "gw/dsp/target/template/details" +} + +// Encode implement GetRequest interface +func (r TemplateDetailsRequest) Encode() []byte { + bs, _ := json.Marshal(r) + return bs +} diff --git a/model/target_v2/template_details_response.go b/model/target_v2/template_details_response.go new file mode 100644 index 0000000..b5664e1 --- /dev/null +++ b/model/target_v2/template_details_response.go @@ -0,0 +1,26 @@ +package target_v2 + +// TemplateDetailsResponse 查询定向模板接口 API Response +type TemplateDetailsResponse struct { + // TotalCount 总数 + TotalCount int `json:"total_count,omitempty"` + CurrentPage int `json:"current_page"` + PageSize int `json:"page_size"` + Details []Template `json:"details,omitempty"` +} + +// Template 定向模板 +type Template struct { + // TemplateID 定向模板 ID + TemplateID uint64 `json:"template_id,omitempty"` + // TemplateName 定向模板名称 + TemplateName string `json:"template_name,omitempty"` + // CreateTime 定向模板创建时间,"2019-06-11 15:17:25" + CreateTime string `json:"create_time,omitempty"` + // UpdateTime 定向模板最近修改时间 + UpdateTime string `json:"update_time,omitempty"` + // Target 定向信息 + Target *Target `json:"target,omitempty"` + // UnitCount 绑定unit个数 + UnitCount int `json:"unit_count,omitempty"` +} diff --git a/model/v2.2/appcenter/app/list_request.go b/model/v2.2/appcenter/app/list_request.go new file mode 100644 index 0000000..d4d3d97 --- /dev/null +++ b/model/v2.2/appcenter/app/list_request.go @@ -0,0 +1,29 @@ +package app +import "encoding/json" + +type ListRequest struct { + //advertiser_id Long 必填 广告主id + AdvertiserId int64 `json:"advertiser_id"` + //list_type Integer 可选 列表类型 不传-全部, 1-我创建的, 2-共享给我的 + ListType int `json:"list_type,omitempty"` + //platform String "ios" 可选 android或ios + Platform string `json:"platform,omitempty"` + //app_ids Long[] 可选 批量应用id查询 最多支持查询100个 + AppIds []int64 `json:"app_ids,omitempty"` + //key_word String 可选 关键词 支持应用ID或应用名称搜索 + KeyWord string `json:"key_word,omitempty"` + //page Integer 可选 当前页 页码,默认1 + Page int `json:"page,omitempty"` + //page_size Integer 可选 分页大小 个数,默认10 + PageSize int `json:"page_size,omitempty"` +} + +func (r ListRequest) Url() string { + return "gw/dsp/appcenter/app/release/list" +} + +// Encode implement PostRequest interface +func (r ListRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} \ No newline at end of file diff --git a/model/v2.2/appcenter/app/list_response.go b/model/v2.2/appcenter/app/list_response.go new file mode 100644 index 0000000..322cc91 --- /dev/null +++ b/model/v2.2/appcenter/app/list_response.go @@ -0,0 +1,49 @@ +package app + +type ListResponse struct { + CurrentPage int `json:"current_page"` + PageSize int `json:"page_size"` + TotalCount int `json:"total_count"` + List []Item `json:"list"` +} + +type Item struct { + //account_id Long 账号ID + AccountId int64 `json:"account_id"` + //app_detail_img String 应用详情图片 + AppDetailImg string `json:"app_detail_img"` + //app_icon_url String 应用图标链接 + AppIconUrl string `json:"app_icon_url"` + //app_id Long 应用ID + AppId int64 `json:"app_id"` + //app_privacy_url String 应用隐私政策链接 + AppPrivacyUrl string `json:"app_privacy_url"` + //ios_app_id String 解析出的iosAppID + IosAppId string `json:"ios_app_id"` + //offline_app_stores String 下架的应用商店 "huawei","oppo","vivo","xiaomi","meizu","smartisan" + OfflineAppStores string `json:"offline_app_stores"` + //package_id Long 应用包ID + PackageId int64 `json:"package_id"` + //package_name String 应用包名 + PackageName string `json:"package_name"` + //package_size Long 应用包大小 + PackageSize int64 `json:"package_size"` + //permission_information int[] 权限信息ID列表 + PermissionInformation []int `json:"permission_information"` + //platform String android或ios + Platform string `json:"platform"` + //real_app_name String 应用名称 + RealAppName string `json:"real_app_name"` + //real_app_version String 应用版本信息 + RealAppVersion string `json:"real_app_version"` + //source_type Integer 应用来源 1-我创建的 2-共享给我的 + SourceType int `json:"source_type"` + //update_time Long 更新时间 单位:毫秒 + UpdateTime int64 `json:"update_time"` + //url String 应用下载地址 + Url string `json:"url"` + //use_sdk Integer 是否接入快手广告监测SDK 0-未接入,1-已接入 + UseSdk int `json:"use_sdk"` + //version_code + VersionCode int `json:"version_code"` +} diff --git a/model/v2.2/appcenter/subpkg/create_request.go b/model/v2.2/appcenter/subpkg/create_request.go new file mode 100644 index 0000000..561b49f --- /dev/null +++ b/model/v2.2/appcenter/subpkg/create_request.go @@ -0,0 +1,27 @@ +package subpkg + +import "encoding/json" + +// CreateRequest 创建分包 API Request +type CreateRequest struct { + // AdvertiserID 广告主ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + //parent_package_id Long 必填 应用(母)包id 仅支持android应用的包id新建分包 + ParentPackageID uint64 `json:"parent_package_id,omitempty"` + //type Integer 必填 分包方式 1-系统自动分包,2-上传渠道号列表 + Type int `json:"type,omitempty"` + //count Integer 可选 分包数量 当type=1时填写,单次最多100 + Count int `json:"count,omitempty"` + //channel_id String[] 可选 上传的渠道号列表 当type=2时填写,单次最多填写100个。同一应用包下填写的渠道号不可重复 + ChannelID []string `json:"channel_id,omitempty"` +} + +func (r CreateRequest) Url() string { + return "gw/dsp/appcenter/subpkg/add" +} + +// Encode implement PostRequest interface +func (r CreateRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/v2.2/appcenter/subpkg/create_response.go b/model/v2.2/appcenter/subpkg/create_response.go new file mode 100644 index 0000000..edbbace --- /dev/null +++ b/model/v2.2/appcenter/subpkg/create_response.go @@ -0,0 +1,14 @@ +package subpkg + +type CreateResponse struct { + // CreativeID 创意ID + Item []Item +} + +type Item struct { + PackageId int64 `json:"package_id"` + BuildStatus int `json:"build_status"` + ParentPackageId int64 `json:"parent_package_id"` + ChannelId string `json:"channel_id"` +} + diff --git a/model/v2.2/appcenter/subpkg/list_request.go b/model/v2.2/appcenter/subpkg/list_request.go new file mode 100644 index 0000000..2d8c443 --- /dev/null +++ b/model/v2.2/appcenter/subpkg/list_request.go @@ -0,0 +1,22 @@ +package subpkg + +import "encoding/json" + +type ListRequest struct { + // AdvertiserID 广告主ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + AppId int64 `json:"app_id"` + KeyWord string `json:"key_word"` + Page int `json:"page"` + PageSize int `json:"page_size"` +} + +func (r ListRequest) Url() string { + return "gw/dsp/appcenter/subPackage/release/list" +} + +// Encode implement PostRequest interface +func (r ListRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/v2.2/appcenter/subpkg/list_response.go b/model/v2.2/appcenter/subpkg/list_response.go new file mode 100644 index 0000000..8728a41 --- /dev/null +++ b/model/v2.2/appcenter/subpkg/list_response.go @@ -0,0 +1,49 @@ +package subpkg + +type ListResponse struct { + CurrentPage int `json:"current_page"` + PageSize int `json:"page_size"` + TotalCount int `json:"total_count"` + List []SubpkgItem `json:"list"` +} + +type SubpkgItem struct { + //account_id Long 账号ID + AccountId int64 `json:"account_id"` + //app_detail_img String 应用详情图片 + AppDetailImg string `json:"app_detail_img"` + //app_icon_url String 应用图标链接 + AppIconUrl string `json:"app_icon_url"` + //app_id Long 应用ID + AppId int64 `json:"app_id"` + //app_privacy_url String 应用隐私政策链接 + AppPrivacyUrl string `json:"app_privacy_url"` + //ios_app_id String 解析出的iosAppID + IosAppId string `json:"ios_app_id"` + //offline_app_stores String 下架的应用商店 "huawei","oppo","vivo","xiaomi","meizu","smartisan" + OfflineAppStores string `json:"offline_app_stores"` + //package_id Long 应用包ID + PackageId int64 `json:"package_id"` + //package_name String 应用包名 + PackageName string `json:"package_name"` + //package_size Long 应用包大小 + PackageSize int64 `json:"package_size"` + //permission_information int[] 权限信息ID列表 + PermissionInformation []int `json:"permission_information"` + //platform String android或ios + Platform string `json:"platform"` + //real_app_name String 应用名称 + RealAppName string `json:"real_app_name"` + //real_app_version String 应用版本信息 + RealAppVersion string `json:"real_app_version"` + //source_type Integer 应用来源 1-我创建的 2-共享给我的 + SourceType int `json:"source_type"` + //update_time Long 更新时间 单位:毫秒 + UpdateTime int64 `json:"update_time"` + //url String 应用下载地址 + Url string `json:"url"` + //use_sdk Integer 是否接入快手广告监测SDK 0-未接入,1-已接入 + UseSdk int `json:"use_sdk"` + //version_code + VersionCode int `json:"version_code"` +} diff --git a/model/v2.2/appcenter/subpkg/update_request.go b/model/v2.2/appcenter/subpkg/update_request.go new file mode 100644 index 0000000..bca229f --- /dev/null +++ b/model/v2.2/appcenter/subpkg/update_request.go @@ -0,0 +1,20 @@ +package subpkg + +import "encoding/json" + +type UpdateRequest struct { + AdvertiserId int64 `json:"advertiser_id,omitempty"` + PackageId []int64 `json:"package_id,omitempty"` + PutStatus int `json:"put_status,omitempty"` +} + + +func (r UpdateRequest) Url() string { + return "gw/dsp/appcenter/subpkg/mod" +} + +// Encode implement PostRequest interface +func (r UpdateRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} \ No newline at end of file diff --git a/model/v2.2/appcenter/subpkg/update_response.go b/model/v2.2/appcenter/subpkg/update_response.go new file mode 100644 index 0000000..5c50211 --- /dev/null +++ b/model/v2.2/appcenter/subpkg/update_response.go @@ -0,0 +1,5 @@ +package subpkg + +type UpdateResponse struct { + Result bool `json:"result"` +} diff --git a/model/v2.2/creative/advanced_creative.go b/model/v2.2/creative/advanced_creative.go index 23c94bb..2bcbbab 100644 --- a/model/v2.2/creative/advanced_creative.go +++ b/model/v2.2/creative/advanced_creative.go @@ -18,7 +18,7 @@ type AdvancedCreative struct { ViewStatusReason string `json:"view_status_reason"` // 程序化创意状态描述 CreateTime string `json:"create_time"` // 创建时间,格式样例:"2019-06-11 15:17:25" UpdateTime string `json:"update_time"` // 更新时间,格式样例:"2019-06-11 15:17:25" - Creatives []int64 `json:"creatives"` // 创建后生成的程序化创意 ID + Creatives []Creatives `json:"creatives"` // 创建后生成的程序化创意 ID PicIDs []string `json:"pic_ids"` // 图片库图片ID AppGradeType int `json:"app_grade_type"` // 审核分级类型,0:默认;1:审核降级(当创意发生降级时,会限制部分流量无法投放) PicList []string `json:"pic_list"` // 联盟图片(横版/竖版),联盟图片imageToken @@ -38,3 +38,8 @@ type Photo struct { type ExposeTag struct { Text string `json:"text"` } + +type Creatives struct { + UnitID int64 `json:"unit_id"` // 广告组 ID + CreativeID int64 `json:"creative_id"` // 创意 ID +} diff --git a/model/v2.2/unit/bid_update_request.go b/model/v2.2/unit/bid_update_request.go new file mode 100644 index 0000000..9062f7c --- /dev/null +++ b/model/v2.2/unit/bid_update_request.go @@ -0,0 +1,23 @@ +package unit + +import "encoding/json" + +type BidUpdateRequest struct { + //advertiser_id long 必填 广告主 ID 在获取 access_token 的时候返回 + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + //unit_ids long 必填 广告计划 ID + UnitIds []uint64 `json:"unit_ids"` + //广告组 bid_type 为 CPC 和 eCPC 时:不得低于 0.2 元,不得高于 100 元,单位:厘;广告组 bid_type 为 OCPC 时:行为出价不得低于 1 元;激活出价不得低于 5 元(白名单用户不得低于 2 元),单位:厘 + Bid uint64 `json:"bid"` +} + +// Url implement PostRequest interface +func (r BidUpdateRequest) Url() string { + return "v1/ad_unit/update/bid" +} + +// Encode implement PostRequest interface +func (r BidUpdateRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/v2.2/unit/bid_update_response.go b/model/v2.2/unit/bid_update_response.go new file mode 100644 index 0000000..6843307 --- /dev/null +++ b/model/v2.2/unit/bid_update_response.go @@ -0,0 +1,5 @@ +package unit + +type BidUpdateResponse struct { + UnitIds []uint64 `json:"unit_ids"` // 所有修改状态成功的广告组 id +} diff --git a/model/v2.2/unit/budget_update_request.go b/model/v2.2/unit/budget_update_request.go new file mode 100644 index 0000000..471f3ec --- /dev/null +++ b/model/v2.2/unit/budget_update_request.go @@ -0,0 +1,23 @@ +package unit + +import "encoding/json" + +type BudgetUpdateRequest struct { + //advertiser_id long 必填 广告主 ID 在获取 access_token 的时候返回 + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + //unit_ids long 必填 广告计划 ID + UnitIds []uint64 `json:"unit_ids"` + //广告组 bid_type 为 CPC 和 eCPC 时:不得低于 0.2 元,不得高于 100 元,单位:厘;广告组 bid_type 为 OCPC 时:行为出价不得低于 1 元;激活出价不得低于 5 元(白名单用户不得低于 2 元),单位:厘 + DayBudget uint64 `json:"day_budget"` +} + +// Url implement PostRequest interface +func (r BudgetUpdateRequest) Url() string { + return "v1/ad_unit/update/day_budget" +} + +// Encode implement PostRequest interface +func (r BudgetUpdateRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/v2.2/unit/budget_update_response.go b/model/v2.2/unit/budget_update_response.go new file mode 100644 index 0000000..4fc3924 --- /dev/null +++ b/model/v2.2/unit/budget_update_response.go @@ -0,0 +1,5 @@ +package unit + +type BudgetUpdateResponse struct { + UnitIds []uint64 `json:"unit_ids"` // 所有修改状态成功的广告组 id +} diff --git a/model/v2.2/unit/status_update_request.go b/model/v2.2/unit/status_update_request.go new file mode 100644 index 0000000..0f82bdf --- /dev/null +++ b/model/v2.2/unit/status_update_request.go @@ -0,0 +1,23 @@ +package unit + +import "encoding/json" + +type StatusUpdateRequest struct { + //advertiser_id long 必填 广告主 ID 在获取 access_token 的时候返回 + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + //unit_ids long 必填 广告计划 ID + UnitIds []uint64 `json:"unit_ids"` + //1-投放、2-暂停、3-删除,传其他数字非法 + PutStatus int `json:"put_status"` +} + +// Url implement PostRequest interface +func (r StatusUpdateRequest) Url() string { + return "v1/ad_unit/update/status" +} + +// Encode implement PostRequest interface +func (r StatusUpdateRequest) Encode() []byte { + ret, _ := json.Marshal(r) + return ret +} diff --git a/model/v2.2/unit/status_update_response.go b/model/v2.2/unit/status_update_response.go new file mode 100644 index 0000000..b484706 --- /dev/null +++ b/model/v2.2/unit/status_update_response.go @@ -0,0 +1,5 @@ +package unit + +type StatusUpdateResponse struct { + UnitIds []uint64 `json:"unit_ids"` // 所有修改状态成功的广告组 id +}