diff --git a/README.md b/README.md index d3efdf9..142cb7e 100644 --- a/README.md +++ b/README.md @@ -218,6 +218,17 @@ - 修改应用分包备注 [ subpkg.Description(clt *core.SDKClient, accessToken string, req *subpkg.DescriptionRequest) error ] - 获取分包管理/回收站列表 [ subpkg.List(clt *core.SDKClient, accessToken string, req *subpkg.ListRequest) (*subpkg.ListResponse, error) ] - 分包失败重新构建 [ app.RetryBuildSubPackage(clt *core.SDKClient, accessToken string, req *app.RetryBuildSubPackageRequest) (int, error) ] +- 商品库 (api/dsp/dpa) + - 查询 DPA 模板信息 [ TemplateList(clt *core.SDKClient, accessToken string, req *dpa.TemplateListRequest) (*dpa.TemplateListResponse, error) ] + - 获取商品库类目树 [ CategoryList(clt *core.SDKClient, accessToken string, req *dpa.CategoryListRequest) (*dpa.CategoryListResponse, error) ] + - 获取商品库列表 [ LibraryList(clt *core.SDKClient, accessToken string, req *dpa.LibraryListRequest) (*dpa.LibraryListResponse, error) ] + - 创建商品 [ ProductBatchCreate(clt *core.SDKClient, accessToken string, req *dpa.ProductBatchCreateRequest) ([]dpa.ProductUpdateResult, error) ] + - 更新商品 [ ProductBatchUpdate(clt *core.SDKClient, accessToken string, req *dpa.ProductBatchUpdateRequest) ([]dpa.ProductUpdateResult, error) ] + - 获取商品列表 [ ProductBatchQuery(clt *core.SDKClient, accessToken string, req *dpa.ProductBatchQueryRequest) (*dpa.ProductBatchQueryResponse, error) ] + - 获取商品列表(游标) [ ProductCursorQuery(clt *core.SDKClient, accessToken string, req *dpa.ProductCursorQueryRequest) (*dpa.ProductCursorQueryResponse, error) ] + - 获取SDPA创意视频模板 [ CreativeTemplateList(clt *core.SDKClient, accessToken string, req *dpa.CreativeTemplateListRequest) (*dpa.CreativeTemplateListResponse, error) ] + - 批量模板合成SDPA创意视频 [ CreativeVideoGenerate(clt *core.SDKClient, accessToken string, req *dpa.CreativeVideoGenerateRequest) ([]dpa.GenerateVideoResult, error) ] + - CID服务商投放SDPA接口 [ SecretCidLink(clt *core.SDKClient, accessToken string, req *dpa.SecretCidLinkRequest) error ] - 数据上报管理 (api/track) - 转化回传 [ Activate(req *track.ActivateRequest) error ] - 点击检测链接 [ Click(baseUrl string, fields []string) string ] diff --git a/api/dsp/dpa/category_list.go b/api/dsp/dpa/category_list.go new file mode 100644 index 0000000..75f6249 --- /dev/null +++ b/api/dsp/dpa/category_list.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// CategoryList 获取商品库类目树 +func CategoryList(clt *core.SDKClient, accessToken string, req *dpa.CategoryListRequest) (*dpa.CategoryListResponse, error) { + var resp dpa.CategoryListResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/dsp/dpa/creative_template_list.go b/api/dsp/dpa/creative_template_list.go new file mode 100644 index 0000000..ee3653a --- /dev/null +++ b/api/dsp/dpa/creative_template_list.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// CreativeTemplateList 获取SDPA创意视频模板 +func CreativeTemplateList(clt *core.SDKClient, accessToken string, req *dpa.CreativeTemplateListRequest) (*dpa.CreativeTemplateListResponse, error) { + var resp dpa.CreativeTemplateListResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/dsp/dpa/creative_video_generate.go b/api/dsp/dpa/creative_video_generate.go new file mode 100644 index 0000000..034fa32 --- /dev/null +++ b/api/dsp/dpa/creative_video_generate.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// CreativeVideoGenerate 批量模板合成SDPA创意视频 +func CreativeVideoGenerate(clt *core.SDKClient, accessToken string, req *dpa.CreativeVideoGenerateRequest) ([]dpa.GenerateVideoResult, error) { + var resp dpa.CreativeVideoGenerateResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return resp.VideoInfos, nil +} diff --git a/api/dsp/dpa/product_batch_create.go b/api/dsp/dpa/product_batch_create.go new file mode 100644 index 0000000..5061ca7 --- /dev/null +++ b/api/dsp/dpa/product_batch_create.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// ProductBatchCreate 创建商品 +func ProductBatchCreate(clt *core.SDKClient, accessToken string, req *dpa.ProductBatchCreateRequest) ([]dpa.ProductUpdateResult, error) { + var resp dpa.ProductBatchUpdateResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return resp.ProductEditResponses, nil +} diff --git a/api/dsp/dpa/product_batch_update.go b/api/dsp/dpa/product_batch_update.go new file mode 100644 index 0000000..c53818b --- /dev/null +++ b/api/dsp/dpa/product_batch_update.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// ProductBatchUpdate 更新商品 +func ProductBatchUpdate(clt *core.SDKClient, accessToken string, req *dpa.ProductBatchUpdateRequest) ([]dpa.ProductUpdateResult, error) { + var resp dpa.ProductBatchUpdateResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return resp.ProductEditResponses, nil +} diff --git a/api/dsp/dpa/product_cursor_query.go b/api/dsp/dpa/product_cursor_query.go new file mode 100644 index 0000000..84150db --- /dev/null +++ b/api/dsp/dpa/product_cursor_query.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// ProductCursorQuery 获取商品列表(游标) +func ProductCursorQuery(clt *core.SDKClient, accessToken string, req *dpa.ProductCursorQueryRequest) (*dpa.ProductCursorQueryResponse, error) { + var resp dpa.ProductCursorQueryResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return &resp, nil +} diff --git a/api/dsp/dpa/secret_cid_link.go b/api/dsp/dpa/secret_cid_link.go new file mode 100644 index 0000000..50a1993 --- /dev/null +++ b/api/dsp/dpa/secret_cid_link.go @@ -0,0 +1,11 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// SecretCidLink CID服务商投放SDPA接口 +func SecretCidLink(clt *core.SDKClient, accessToken string, req *dpa.SecretCidLinkRequest) error { + return clt.Post(accessToken, req, nil) +} diff --git a/api/dsp/dpa/template_list.go b/api/dsp/dpa/template_list.go new file mode 100644 index 0000000..2697cdd --- /dev/null +++ b/api/dsp/dpa/template_list.go @@ -0,0 +1,15 @@ +package dpa + +import ( + "github.com/bububa/kwai-marketing-api/core" + "github.com/bububa/kwai-marketing-api/model/dsp/dpa" +) + +// TemplateList 查询 DPA 模板信息 +func TemplateList(clt *core.SDKClient, accessToken string, req *dpa.TemplateListRequest) (*dpa.TemplateListResponse, error) { + var resp dpa.TemplateListResponse + if err := clt.Post(accessToken, req, &resp); err != nil { + return nil, err + } + return &resp, nil +} diff --git a/model/dsp/dpa/category_list.go b/model/dsp/dpa/category_list.go new file mode 100644 index 0000000..08a1c23 --- /dev/null +++ b/model/dsp/dpa/category_list.go @@ -0,0 +1,37 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// CategoryListRequest 获取商品库类目树 API Request +type CategoryListRequest struct { + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` +} + +// Url implements PostRequest interface +func (r CategoryListRequest) Url() string { + return "gw/dsp/v1/dpa/category/list" +} + +// Encode implements PostRequest interface +func (r CategoryListRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// CategoryListResponse 获取商品库类目树 API Response +type CategoryListResponse struct { + // Details 类目信息列表 + Details []Category `json:"details,omitempty"` +} + +// Category 类目信息 +type Category struct { + // Label 类目名称 + Label string `json:"label,omitempty"` + // Children 子类目 + Children []Category `json:"children,omitempty"` + // Value 类目ID + Value uint64 `json:"value,omitempty"` +} diff --git a/model/dsp/dpa/creative_template_list.go b/model/dsp/dpa/creative_template_list.go new file mode 100644 index 0000000..b555904 --- /dev/null +++ b/model/dsp/dpa/creative_template_list.go @@ -0,0 +1,54 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// CreativeTemplateListRequest 获取SDPA创意视频模板 API Request +type CreativeTemplateListRequest struct { + // PageInfo 分页信息 + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // OuterID 商品外部ID + // 填写则返回"canSelect" + OuterID string `json:"outer_id,omitempty"` + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` + // ProductID 商品ID + // 填写则返回"canSelect",优先于"outer_id"生效 + ProductID uint64 `json:"product_id,omitempty"` +} + +// Url implements PostRequest interface +func (r CreativeTemplateListRequest) Url() string { + return "gw/dsp/v1/dpa/creative/template/list" +} + +// Encode implements PostRequest interface +func (r CreativeTemplateListRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// CreativeTemplateListResponse 获取SDPA创意视频模板 API Response +type CreativeTemplateListResponse struct { + // PageInfo 分页信息 + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // TemplateList 创意模板列表 + TemplateList []CreativeTemplate `json:"template_list,omitempty"` +} + +// CreativeTemplate 创意模板 +type CreativeTemplate struct { + // Image 封面图URL + Image string `json:"image,omitempty"` + // DemoURL 样例视频URL + DemoURL string `json:"demo_url,omitempty"` + // TemplateID 模板ID + TemplateID uint64 `json:"template_id,omitempty"` + // PackageID 配置包ID + PackageID uint64 `json:"package_id,omitempty"` + // TemplateType 模板类型 + // 1-图片模板, 2-视频模板, 3-图片视频模板 + TemplateType int `json:"template_type,omitempty"` + // CanSelect 是否可选 + CanSelect bool `json:"can_select,omitempty"` +} diff --git a/model/dsp/dpa/creative_video_generate.go b/model/dsp/dpa/creative_video_generate.go new file mode 100644 index 0000000..353d6b5 --- /dev/null +++ b/model/dsp/dpa/creative_video_generate.go @@ -0,0 +1,68 @@ +package dpa + +import ( + "fmt" + + "github.com/bububa/kwai-marketing-api/model" +) + +// CreativeVideoGenerateRequest 批量模板合成SDPA创意视频 API Request +type CreativeVideoGenerateRequest struct { + // OuterID 商品外部ID + OuterID string `json:"outer_id,omitempty"` + // Templates 视频模板信息 + Templates []CreativeTemplate `json:"templates,omitempty"` + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` + // ProductID 商品ID + // 优先于"outer_id"生效 + ProductID uint64 `json:"product_id,omitempty"` +} + +// Url implements PostRequest interface +func (r CreativeVideoGenerateRequest) Url() string { + return "gw/dsp/v1/dpa/creative/video/generate" +} + +// Encode implements PostRequest interface +func (r CreativeVideoGenerateRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// CreativeVideoGenerateResponse 批量模板合成SDPA创意视频 API Response +type CreativeVideoGenerateResponse struct { + // VideoInfos 视频信息列表 + VideoInfos []GenerateVideoResult `json:"video_infos,omitempty"` +} + +// GenerateVideoResult 合成视频信息 +type GenerateVideoResult struct { + // OuterID 商品第三方ID + OuterID string `json:"outer_id,omitempty"` + // ProductName 商品名称 + ProductName string `json:"product_name,omitempty"` + // VideoURL 视频URL + VideoURL string `json:"video_url,omitempty"` + // Code 失败状态码 + Code string `json:"code,omitempty"` + // Message 失败信息 + Message string `json:"message,omitempty"` + // PhotoID Photo ID + PhotoID uint64 `json:"photo_id,omitempty"` + // TemplateID 模板ID + TemplateID uint64 `json:"template_id,omitempty"` + // ProductID 商品ID + ProductID uint64 `json:"product_id,omitempty"` +} + +// IsError check generated video is failed +func (r GenerateVideoResult) IsError() bool { + return r.Code != "" +} + +// Error implements error interface +func (r GenerateVideoResult) Error() string { + return fmt.Sprintf("code:%s, msg:%s", r.Code, r.Message) +} diff --git a/model/dsp/dpa/library_list.go b/model/dsp/dpa/library_list.go index 2890dc4..f96cf9e 100644 --- a/model/dsp/dpa/library_list.go +++ b/model/dsp/dpa/library_list.go @@ -4,20 +4,20 @@ import "github.com/bububa/kwai-marketing-api/model" // LibraryListRequest 获取商品库列表 API Request type LibraryListRequest struct { + // PageInfo 分页信息 + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // Name 商品库名称 + Name string `json:"name,omitempty"` + // BizID 商品库业务类型 1-主站, 2-联盟, 3-通用 + BizID []int `json:"biz_id,omitempty"` // AdvertiserID 广告主ID AdvertiserID uint64 `json:"advertiser_id,omitempty"` // LibraryID 商品库ID LibraryID uint64 `json:"library_id,omitempty"` - // Name 商品库名称 - Name string `json:"name,omitempty"` // Status 商品库状态 1-审核中, 2-使用中, 3-审核失败, 4-暂停使用, 5-XML初始化中, 6-XML初始化失败 Status int `json:"status,omitempty"` // QueryType 商品库权限类型 1-使用权限, 2-编辑权限(含使用权限) QueryType int `json:"query_type,omitempty"` - // BizID 商品库业务类型 1-主站, 2-联盟, 3-通用 - BizID []int `json:"biz_id,omitempty"` - // PageInfo 分页信息 - PageInfo *PageInfoSneak `json:"page_info,omitempty"` } // Url implement PostRequest interface @@ -33,25 +33,18 @@ func (r LibraryListRequest) Encode() []byte { // LibraryListResponse 获取商品库列表 API Response type LibraryListResponse struct { // PageInfo 列表页参数 - PageInfo struct { - // CurrentPage 当前页码, 第一页是1 - CurrentPage int `json:"current_page,omitempty"` - // PageSize 分页大小 - PageSize int `json:"page_size,omitempty"` - // TotalCount 数据总数 - TotalCount int `json:"total_count,omitempty"` - } `json:"page_info,omitempty"` - Data []AdDpaLibraryViewSneak `json:"data,omitempty"` + PageInfo *model.PageInfo `json:"page_info,omitempty"` + Data []AdDpaLibraryViewSneak `json:"data,omitempty"` } // AdDpaLibraryViewSneak 商品库信息 type AdDpaLibraryViewSneak struct { - // LibraryID 商品库ID - LibraryID uint64 `json:"library_id,omitempty"` // Name 商品库名称 Name string `json:"name,omitempty"` // LibraryDesc 商品库描述 LibraryDesc string `json:"library_desc,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` // Status 商品库状态 1-审核中, 2-使用中, 3-审核失败, 4-暂停使用, 5-XML初始化中, 6-XML初始化失败 Status int `json:"status,omitempty"` // CreateTime 商品库创建时间 毫秒时间戳 diff --git a/model/dsp/dpa/page_info_sneak.go b/model/dsp/dpa/page_info_sneak.go deleted file mode 100644 index 0757f67..0000000 --- a/model/dsp/dpa/page_info_sneak.go +++ /dev/null @@ -1,9 +0,0 @@ -package dpa - -// PageInfoSneak 分页信息 -type PageInfoSneak struct { - // PageSize 页大小 - PageSize int `json:"page_size,omitempty"` - // CurrentPage 当前页码 - CurrentPage int `json:"current_page,omitempty"` -} diff --git a/model/dsp/dpa/product.go b/model/dsp/dpa/product.go index a215852..856c212 100644 --- a/model/dsp/dpa/product.go +++ b/model/dsp/dpa/product.go @@ -2,17 +2,21 @@ package dpa // ProductInfo 商品信息 type ProductInfo struct { - // IndustryID 商品所属行业ID 1-电商, 3-保险, 5-书库, 8-音视频, 9-医药, 10-招聘, 11-区域服务, 12-通信 + // IndustryID 商品所属行业ID + // 1-电商, 3-保险, 5-书库, 8-音视频, 9-医药, 10-招聘, 11-区域服务, 12-通信 IndustryID int `json:"industry_id,omitempty"` // SubIndustryID 商品类型ID(所属二级行业ID) + // 书库: 1-网络小说, 2-漫画, 3-有声读物, 4-网赚; 音视频: 电影, 动漫, 纪录片, 综艺, 电视剧, 短剧, 音乐, 直播, 网赚, 其他 SubIndustryID string `json:"sub_industry_id,omitempty"` // IndustryName 商品行业名称 1-电商, 3-保险, 5-书库, 8-音视频, 9-医药, 10-招聘, 11-区域服务, 12-通信 IndustryName string `json:"industry_name,omitempty"` // SubIndustryName 商品类型名称(所属二级行业名称) 小说: 1-网络小说, 2-漫画, 3-有声读物, 4-网赚; 音视频: 电影, 动漫, 纪录片, 综艺, 电视剧, 短剧, 音乐, 直播, 网赚, 其他 SubIndustryName string `json:"sub_industry_name,omitempty"` // LibraryID 商品库ID + // 非XML商品库,商品库所属行业与商品所属行业需保持一致 LibraryID uint64 `json:"library_id,omitempty"` // OuterID 商品第三方ID + // 在商品库中保证唯一不可重复,长度小于48 OuterID string `json:"outer_id,omitempty"` // ProductID 商品ID 快手生成商品唯一标识 ProductID uint64 `json:"product_id,omitempty"` @@ -27,9 +31,9 @@ type ProductInfo struct { // ImageURLs 商品副图URLs ImageURLs []string `json:"image_urls,omitempty"` // Video 商品视频信息 - Video VideoInfo `json:"video,omitempty"` + Video *VideoInfo `json:"video,omitempty"` // TargetURLs 商品链接信息 - TargetURLs UrlParamSneak `json:"target_urls,omitempty"` + TargetURLs *UrlParamSneak `json:"target_urls,omitempty"` // Condition 商品新旧情况 全新, 翻新, 二手 Condition string `json:"condition,omitempty"` // Label 商品标签 @@ -56,13 +60,17 @@ type ProductInfo struct { BrandName string `json:"brand_name,omitempty"` // EnBrandName 商品英文品牌名 EnBrandName string `json:"en_brand_name,omitempty"` - // Value 商品原价 最小精度小数点后3位 + // Value 商品原价 + // 最小精度小数点后3位 Value float64 `json:"value,omitempty"` - // Price 商品现价 最小精度小数点后3位 + // Price 商品现价 + // 最小精度小数点后3位 Price float64 `json:"price,omitempty"` - // Saving 商品优惠价格 最小精度小数点后3位 + // Saving 商品优惠价格 + // 最小精度小数点后3位 Saving float64 `json:"saving,omitempty"` - // Discount 商品折扣 最小精度小数点后3位 + // Discount 商品折扣 + // 最小精度小数点后3位 Discount float64 `json:"discount,omitempty"` // Comments 商品评论数 Comments int `json:"comments,omitempty"` @@ -72,48 +80,57 @@ type ProductInfo struct { Feature string `json:"feature,omitempty"` // SalesPromotion 商品促销活动信息 SalesPromotion string `json:"sales_promotion,omitempty"` - // AgeV2 商品定向年龄 18-23, 24-30, 31-40, 41-49, 50+ + // AgeV2 商品定向年龄 + // 18-23, 24-30, 31-40, 41-49, 50+ AgeV2 []string `json:"age_v2,omitempty"` - // Gender 商品定向性别 0-不限, 1-男, 2-女 + // Gender 商品定向性别 + // 0-不限, 1-男, 2-女 Gender int `json:"gender,omitempty"` // ProvinceV2 商品定向省份 ProvinceV2 []string `json:"province_v2,omitempty"` // CityV2 商品定向城市 CityV2 []string `json:"city_v2,omitempty"` - // Stock 商品库存状态 0-无, 1-有 + // Stock 商品库存状态 + // 0-无, 1-有 Stock int `json:"stock,omitempty"` - // Status 商品投放状态 0-不可投放, 1-可投放 + // Status 商品投放状态 + // 0-不可投放, 1-可投放 Status int `json:"status,omitempty"` - // CheckStatus 商品校验(接入)状态 0-成功, 1-失败 + // CheckStatus + // 商品校验(接入)状态 0-成功, 1-失败 CheckStatus int `json:"check_status,omitempty"` // CheckError 商品校验失败原因 CheckError []string `json:"check_error,omitempty"` - // OnlineTime 商品上线时间 毫秒时间戳 + // OnlineTime 商品上线时间 + // 毫秒时间戳 OnlineTime int64 `json:"online_time,omitempty"` - // OfflineTime 商品下线时间 毫秒时间戳 + // OfflineTime 商品下线时间 + // 毫秒时间戳 OfflineTime int64 `json:"offline_time,omitempty"` - // CreateTime 商品创建时间 毫秒时间戳 + // CreateTime 商品创建时间 + // 毫秒时间戳 CreateTime int64 `json:"create_time,omitempty"` - // UpdateTime 商品更新时间 毫秒时间戳 + // UpdateTime 商品更新时间 + // 毫秒时间戳 UpdateTime int64 `json:"update_time,omitempty"` // Slogan 商品广告语 Slogan string `json:"slogan,omitempty"` // EcomProductInfo 电商行业商品特殊信息 - EcomProductInfo EcomProductInfoSneak `json:"ecom_product_info,omitempty"` + EcomProductInfo *EcomProductInfoSneak `json:"ecom_product_info,omitempty"` // InsuranceProductInfo 保险行业商品特殊信息 - InsuranceProductInfo InsuranceProductInfoSneak `json:"insurance_product_info,omitempty"` + InsuranceProductInfo *InsuranceProductInfoSneak `json:"insurance_product_info,omitempty"` // StackRoomProductInfo 小说行业商品特殊信息 - StackRoomProductInfo StackRoomProductInfoSneak `json:"stack_room_product_info,omitempty"` + StackRoomProductInfo *StackRoomProductInfoSneak `json:"stack_room_product_info,omitempty"` // AuVideoProductInfo 音视频行业商品特殊信息 - AuVideoProductInfo AuVideoProductInfoSneak `json:"au_video_product_info,omitempty"` + AuVideoProductInfo *AuVideoProductInfoSneak `json:"au_video_product_info,omitempty"` // PharmaceuticalProductInfo 医药行业商品特殊信息 - PharmaceuticalProductInfo PharmaceuticalProductInfoSneak `json:"pharmaceutical_product_info,omitempty"` + PharmaceuticalProductInfo *PharmaceuticalProductInfoSneak `json:"pharmaceutical_product_info,omitempty"` // RecruitmentProductInfo 招聘行业商品特殊信息 - RecruitmentProductInfo RecruitmentProductInfoSneak `json:"recruitment_product_info,omitempty"` + RecruitmentProductInfo *RecruitmentProductInfoSneak `json:"recruitment_product_info,omitempty"` // RegionalServiceProductInfo 区域服务行业商品特殊信息 - RegionalServiceProductInfo RegionalServiceProductInfoSneak `json:"regional_service_product_info,omitempty"` + RegionalServiceProductInfo *RegionalServiceProductInfoSneak `json:"regional_service_product_info,omitempty"` // CommunicationProductInfo 通信行业商品特殊信息 - CommunicationProductInfo CommunicationProductInfoSneak `json:"communication_product_info,omitempty"` + CommunicationProductInfo *CommunicationProductInfoSneak `json:"communication_product_info,omitempty"` } // VideoInfo 商品视频信息 @@ -148,102 +165,409 @@ type UrlParamSneak struct { type EcomProductInfoSneak struct { // SpuID 标准商品单位ID SpuID string `json:"spu_id,omitempty"` + // Condition 商品新旧情况 全新, 翻新, 二手 + Condition string `json:"condition,omitempty"` + // Mark 商品评分 + Mark float64 `json:"mark,omitempty"` // Bought 商品销量 Bought int `json:"bought,omitempty"` // Comments 商品评论数 Comments int `json:"comments,omitempty"` - // Mark 商品评分 - Mark float64 `json:"mark,omitempty"` - // Condition 商品新旧情况 全新, 翻新, 二手 - Condition string `json:"condition,omitempty"` } // InsuranceProductInfoSneak 保险行业商品特殊信息 type InsuranceProductInfoSneak struct { + // SpecialPayOut XXX医疗保险金 + SpecialPayOut *InsuranceSpecialPayOutInfoSneak `json:"special_pay_out,omitempty"` // Insurer 保险公司 Insurer string `json:"insurer,omitempty"` // InsurerType 承保公司性质 InsurerType string `json:"insurer_type,omitempty"` + // HosAddress 医院范围 + HosAddress string `json:"hos_address,omitempty"` + // StartTime 生效时间 + StartTime string `json:"start_time,omitempty"` + // FreeAmount 免赔额 + FreeAmount string `json:"free_amount,omitempty"` // Spokesperson 投放保险公司代言人 Spokesperson string `json:"spokesperson,omitempty"` - // InsuredMinAge 投保最小年龄 - InsuredMinAge int `json:"insured_min_age,omitempty"` - // InsuredMaxAge 投保最大年龄 - InsuredMaxAge int `json:"insured_max_age,omitempty"` + // InAddress 保障地区 + InAddress string `json:"in_address,omitempty"` + // HighestProtectionCost 最高保额 + HighestProtectionCost string `json:"highest_protection_cost,omitempty"` + // PaymentTerm 缴费年限 + PaymentTerm string `json:"payment_term,omitempty"` + // ComplimentaryInsurance 赠险 + // 有, 无 + ComplimentaryInsurance string `json:"complimentary_insurance,omitempty"` + // PaymentMethod 缴费方式 + // 月缴, 年缴 + PaymentMethod string `json:"payment_method,omitempty"` + // PaymentChannel 支付渠道 + // 支付宝, 微信, 支付宝或微信 + PaymentChannel string `json:"payment_channel,omitempty"` + // Upgraded 链路中是否包含升级 + // 是, 否 + Upgraded string `json:"upgraded,omitempty"` // PayoutAmount 保险金额 PayoutAmount float64 `json:"payout_amount,omitempty"` // PayoutRatio 保险费率 PayoutRatio float64 `json:"payout_ratio,omitempty"` + // TotalPrice 一次缴费价格 + TotalPrice float64 `json:"total_price,omitempty"` + // FirstMonthPrice 首月价格 + FirstMonthPrice float64 `json:"first_month_price,omitempty"` + // MonthPrice 次月价格 + MonthPrice float64 `json:"month_price,omitempty"` + // NormalPayout 一般医疗保险金 + NormalPayout float64 `json:"normal_payout,omitempty"` + // DiseasePayout 重疾保险金 + DiseasePayout float64 `json:"disease_payout,omitempty"` + // InsuredMinAge 投保最小年龄 + InsuredMinAge int `json:"insured_min_age,omitempty"` + // InsuredMaxAge 投保最大年龄 + InsuredMaxAge int `json:"insured_max_age,omitempty"` + // Staging 是否分期 + // 1 - 分期 2- 不分期 + Staging int `json:"staging,omitempty"` + // SocialIndemnity 是否有社保 + // 1-有社保, 2-无社保 + SocialIndemnity int `json:"social_indemnity,omitempty"` + // AutoDeduction 是否自动扣费 + // 1-是, 2-否 + AutoDeduction int `json:"auto_deduction,omitempty"` + // AutoRenew 是否自动续保 + // 1-是, 2-否 + AutoRenew int `json:"auto_renew,omitempty"` + // Green 是否包含绿色就医服务 + // 1-是, 2-否 + Green int `json:"green,omitempty"` + // InsurerTime 保障期限:单位(天) + InsurerTime int `json:"insurer_time,omitempty"` +} + +// InsuranceSpecialPayOutInfoSneak XXX医疗保险金 +type InsuranceSpecialPayOutInfoSneak struct { + // Name 保险金种类 + Name string `json:"name,omitempty"` + // Payout 赔付金额(单位元) + Payout float64 `json:"payout,omitempty"` + // Wait 单位(天) + Wait int `json:"wait,omitempty"` } // StackRoomProductInfoSneak 小说行业商品特殊信息 type StackRoomProductInfoSneak struct { - // AuthorID 作者ID - AuthorID string `json:"author_id,omitempty"` - // AuthorName 作者名 - AuthorName string `json:"author_name,omitempty"` - // Words 字数 - Words int `json:"words,omitempty"` - // Series 是否为连载书籍 0-否, 1-是 - Series int `json:"series,omitempty"` - // Status 书籍状态 连载, 完本 - Status string `json:"status,omitempty"` + // Author 作者 + Author string `json:"author,omitempty"` + // ExtraTags 作品标签 + ExtraTags string `json:"extra_tags,omitempty"` + // ChapterName1 章节一名称 + ChapterName1 string `json:"chapter_name1,omitempty"` + // ChapterContent1 章节一内容 + ChapterContent1 string `json:"chapter_content1,omitempty"` + // ChapterName2 章节二名称 + ChapterName2 string `json:"chapter_name2,omitempty"` + // ChapterContent2 章节二内容 + ChapterContent2 string `json:"chapter_content2,omitempty"` + // ChapterName3 章节三名称 + ChapterName3 string `json:"chapter_name3,omitempty"` + // ChapterContent3 章节三内容 + ChapterContent3 string `json:"chapter_content3,omitempty"` + // LongAndShortStories 书籍长短篇 + // 长篇书, 短篇书 + LongAndShortStories string `json:"long_and_short_stories,omitempty"` + // BookCity 所属书城 + // 阅文,番茄, 点众, 阳光书城, 中文在线, 快看漫画, 网易, 掌中云, 悠书阁, 七猫, 番薯, 其他 + BookCity string `json:"book_city,omitempty"` + // StartPaidChapter 起始付费章节 + StartPaidChapter string `json:"start_paid_chapter,omitempty"` + // Theme 书籍分类 + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + Theme int `json:"theme,omitempty"` + // Plot 题材 + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + Plot int `json:"plot,omitempty"` + // Role 作品角色ID + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + Role int `json:"role,omitempty"` + // FictionStyle 作品风格ID + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + FictionStyle int `json:"fiction_style,omitempty"` + // Channel 作品频道ID + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + Channel int `json:"channel,omitempty"` + // OriginNation 作品地域ID + // 详见https://docs.qingque.cn/s/home/eZQDJOM3GV-qQ4vNsEpaQ0qy2?identityId=F0DVUl94Gc + OriginNation int `json:"origin_nation,omitempty"` + // FirstStatus 作品完结状态 + // 1-未完结, 2-已完结 + FirstStatus int `json:"first_status,omitempty"` + // PayStatus 作品付费类型 + // 1-付费, 2-免费 + PayStatus int `json:"pay_status,omitempty"` + // IsAudioNovel 作品是否为有声小说 + // 1-有声, 2-非有声 + IsAudioNovel int `json:"is_audio_novel,omitempty"` + // MinPayAmount 最低付费金额 + MinPayAmount int64 `json:"min_pay_amount,omitempty"` + // FavoriteCount 书籍收藏数 + FavoriteCount int `json:"favorite_count,omitempty"` } // AuVideoProductInfoSneak 音视频行业商品特殊信息 type AuVideoProductInfoSneak struct { - // Category 视频类型 - Category string `json:"category,omitempty"` - // Definition 视频清晰度 - Definition string `json:"definition,omitempty"` - // Subtitles 视频字幕 0-无, 1-有 - Subtitles int `json:"subtitles,omitempty"` + // Theme 作品题材 + // 详见https://docs.qingque.cn/s/home/eZQDk3ey4uwts_6HeBYVoxzTG?identityId=F0DVUl94Gc + Theme string `json:"theme,omitempty"` + // OriginNation 作品地域 + // 详见https://docs.qingque.cn/s/home/eZQDk3ey4uwts_6HeBYVoxzTG?identityId=F0DVUl94Gc + OriginNation string `json:"origin_nation,omitempty"` + // AlbumName 作品辑名称 + AlbumName string `json:"album_name,omitempty"` + // PlatformAttributes 作品所处平台类型 + // 长视频, 短视频 + PlatformAttributes string `json:"platform_attributes,omitempty"` + // Channel 作品男女频道 男频, 女频, 不限 (短剧类型音视频商品使用该字段) + Channel string `json:"channel,omitempty"` + // Plot 作品情节 + // 详见https://docs.qingque.cn/s/home/eZQDk3ey4uwts_6HeBYVoxzTG?identityId=F0DVUl94Gc (短剧类型音视频商品使用该字段) + Plot string `json:"plot,omitempty"` + // Copyright 版权方 自有版权请填写【主体名称】,分销请填写代投【主体名称】(短剧类型音视频商品使用该字段) + Copyright string `json:"copyright,omitempty"` + // Author 作品作者/导演 + Author []string `json:"author,omitempty"` + // Starring 作品主角/主演 + Starring []string `json:"starring,omitempty"` + // TalentID 作品达人ID + // 短剧类型音视频商品使用该字段 + TalentID []string `json:"talent_id,omitempty"` + // ReleaseDate 作品发布日期 + // 毫秒时间戳 + ReleaseDate int64 `json:"release_date,omitempty"` + // AuthorFans 作者粉丝数 + AuthorFans int64 `json:"author_fans,omitempty"` + // ImpressionNums 作品曝光量 + ImpressionNums int64 `json:"impression_nums,omitempty"` + // PlayNums 作品播放量 + PlayNums int64 `json:"play_nums,omitempty"` + // LikesNums 作品被喜欢/点赞次数 + LikesNums int64 `json:"likes_nums,omitempty"` + // FavoriteUserNums 收藏作品用户数 + FavoriteUserNums int64 `json:"favorite_user_nums,omitempty"` + // ForwardNums 作品转发数 + ForwardNums int64 `json:"forward_nums,omitempty"` + // CommentNums 作品评论数 + CommentNums int64 `json:"comment_nums,omitempty"` + // Score 作品评分 + Score float64 `json:"score,omitempty"` + // AlbumSort 所处作品辑顺序 + AlbumSort int `json:"album_sort,omitempty"` + // IsOnlineEarning 作品是否属于网赚 + // 1-是, 2-否 (非网赚类型音视频商品使用该字段) + IsOnlineEarning int `json:"is_online_earning,omitempty"` + // Episodes 剧类集数 + // 短剧类型音视频商品使用该字段 + Episodes int `json:"episodes,omitempty"` + // EpisodeDuration 单集剧集分钟时长 + // 短剧类型音视频商品使用该字段 + EpisodeDuration int64 `json:"episode_duration,omitempty"` + // PaidEpisodes 起始付费集数 + // 从第几集开始需要付费 (短剧类型音视频商品使用该字段) + PaidEpisodes int `json:"paid_episodes,omitempty"` + // UnitPrice 单集价格 + // 单位:元 (短剧类型音视频商品使用该字段) + UnitPrice float64 `json:"unit_price,omitempty"` + // AnnualVIPType 是否有年度会员 + // 1-有, 2-无 (短剧类型音视频商品使用该字段) + AnnualVIPType int `json:"annual_vip_type,omitempty"` + // SemiannualVIPType 是否有半年度会员 + // 1-有, 2-无 (短剧类型音视频商品使用该字段) + SemiannualVIPType int `json:"semiannual_vip_type,omitempty"` + // MaxCharge 最高充值档位 + // 单位:元 (短剧类型音视频商品使用该字段) + MaxCharge float64 `json:"max_charge,omitempty"` + // MinCharge 最低充值档位 + // 单位:元 (短剧类型音视频商品使用该字段) + MinCharge float64 `json:"min_charge,omitempty"` + // RecommendCharge 推荐充值档位 + // 单位:元 (短剧类型音视频商品使用该字段) + RecommendCharge float64 `json:"recommend_charge,omitempty"` } // PharmaceuticalProductInfoSneak 医药行业商品特殊信息 type PharmaceuticalProductInfoSneak struct { - // ApprovalNumber 药品批准文号 - ApprovalNumber string `json:"approval_number,omitempty"` - // GenericName 通用名 - GenericName string `json:"generic_name,omitempty"` - // Form 剂型 - Form string `json:"form,omitempty"` - // DrugClass 药品类别 - DrugClass string `json:"drug_class,omitempty"` + // SpuID 标准商品单位ID + SpuID string `json:"spu_id,omitempty"` + // Tel 联系电话 + Tel string `json:"tel,omitempty"` + // Nationality 所在国家 + Nationality string `json:"nationality,omitempty"` + // Province 所在省份 + Province string `json:"province,omitempty"` + // City 所在城市 + City string `json:"city,omitempty"` + // District 所在区县 + District string `json:"district,omitempty"` + // Region 所在商圈区域 + Region []string `json:"region,omitempty"` + // ValueMin 商品原价区间最小值 + ValueMin float64 `json:"value_min,omitempty"` + // ValueMax 商品原价区间最大值 + ValueMax float64 `json:"value_max,omitempty"` + // PriceMin 商品现价区间最小值 + PriceMin float64 `json:"price_min,omitempty"` + // PriceMax 商品现价区间最大值 + PriceMax float64 `json:"price_max,omitempty"` + // SavingStartTime 减价开始时间 + // 毫秒时间戳 + SavingStartTime int64 `json:"saving_start_time,omitempty"` + // SavingEndTime 减价结束时间 + // 毫秒时间戳 + SavingEndTime int64 `json:"saving_end_time,omitempty"` + // ProductViewCount 商品详情页被打开次数 + ProductViewCount int64 `json:"product_view_count,omitempty"` + // FavoriteCount 收藏商品用户数 + FavoriteCount int64 `json:"favorite_count,omitempty"` + // FavourableCommentRate 商品好评率 + FavourableCommentRate int64 `json:"favourable_comment_rate,omitempty"` + // Bought 商品销量 + Bought int `json:"bought,omitempty"` + // Mark 商品评分 + Mark float64 `json:"mark,omitempty"` } // RecruitmentProductInfoSneak 招聘行业商品特殊信息 type RecruitmentProductInfoSneak struct { - // Recruiter 招聘公司 - Recruiter string `json:"recruiter,omitempty"` - // Position 招聘岗位 - Position string `json:"position,omitempty"` - // Requirement 招聘要求 - Requirement string `json:"requirement,omitempty"` - // Salary 薪资 + // JobType 工作类型 + // 全职, 兼职, 实习 + JobType string `json:"job_type,omitempty"` + // PostType 岗位类型 + PostType string `json:"post_type,omitempty"` + // SalaryOfYear 年薪 + SalaryOfYear string `json:"salary_of_year,omitempty"` + // Salary 月薪 Salary string `json:"salary,omitempty"` - // Benefits 福利 + // Education 学历要求 + // 高中及以上, 技校及以上, 中专及以上, 大专及以上, 本科及以上, 硕士及以上, 博士及以上 + Education string `json:"education,omitempty"` + // ServiceYear 工作年限要求 + // 1年以下, 1-2年, 3-5年, 6-7年, 8-10年, 10年以上 + ServiceYear string `json:"service_year,omitempty"` + // Tel 联系电话 + Tel string `json:"tel,omitempty"` + // Mail 联系邮箱 + Mail string `json:"mail,omitempty"` + // Nationality 所在国家 + Nationality string `json:"nationality,omitempty"` + // Province 所在省份 + Province string `json:"province,omitempty"` + // City 所在城市 + City string `json:"city,omitempty"` + // District 所在区县 + District string `json:"district,omitempty"` + // Region 所在商圈区域 + Region []string `json:"region,omitempty"` + // Benefits 福利待遇 + // 八险一金, 带薪休假, 包吃, 包住, 年底双薪, 周末双休, 交通补助, 加班补助, 饭补, 话补, 房补, 其他 Benefits []string `json:"benefits,omitempty"` + // HeadCount 招聘人数 + HeadCount int `json:"head_count,omitempty"` } // RegionalServiceProductInfoSneak 区域服务行业商品特殊信息 type RegionalServiceProductInfoSneak struct { - // ServiceProvider 服务提供商 - ServiceProvider string `json:"service_provider,omitempty"` - // ServiceArea 服务区域 - ServiceArea []string `json:"service_area,omitempty"` - // ServiceTime 服务时间 - ServiceTime string `json:"service_time,omitempty"` - // Price 价格 - Price float64 `json:"price,omitempty"` + // SpuID 外部商品附加ID + SpuID string `json:"spu_id,omitempty"` + // Tel 联系电话 + Tel string `json:"tel,omitempty"` + // ProvinceID 所在省份ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + ProvinceID string `json:"province_id,omitempty"` + // CityID 所在城市ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + CityID string `json:"city_id,omitempty"` + // DistrictID 所在区县ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + DistrictID string `json:"district_id,omitempty"` + // NationalityID 所在国家 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + NationalityID string `json:"nationality_id,omitempty"` + // Province 所在省份 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + Province string `json:"province,omitempty"` + // City 所在城市 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + City string `json:"city,omitempty"` + // District 所在地区 + District string `json:"district,omitempty"` + // Region 所在商圈区域 + Region []string `json:"region,omitempty"` + // SavingStartTime 减价开始时间 + // 毫秒时间戳 + SavingStartTime int64 `json:"saving_start_time,omitempty"` + // SavingEndTime 减价结束时间 + // 毫秒时间戳 + SavingEndTime int64 `json:"saving_end_time,omitempty"` + // ProductViewCount 商品详情页被打开次数 + ProductViewCount int64 `json:"product_view_count,omitempty"` + // FavoriteCount 收藏商品用户数 + FavoriteCount int64 `json:"favorite_count,omitempty"` + // FavourableCommentRate 商品好评率 + FavourableCommentRate int64 `json:"favourable_comment_rate,omitempty"` + // Bought 商品销量 + Bought int `json:"bought,omitempty"` + // Mark 商品评分 + Mark float64 `json:"mark,omitempty"` } // CommunicationProductInfoSneak 通信行业商品特殊信息 type CommunicationProductInfoSneak struct { - // Operator 运营商 - Operator string `json:"operator,omitempty"` - // Plan 套餐 - Plan string `json:"plan,omitempty"` - // MonthlyFee 月费用 - MonthlyFee float64 `json:"monthly_fee,omitempty"` + // TotalTraffic 总流量(单位GB) + // 数字字符串 + TotalTraffic string `json:"total_traffic,omitempty"` + // DirectionalTraffic 定向流量(单位GB) + // 数字字符串 + DirectionalTraffic string `json:"directional_traffic,omitempty"` + // GeneralTraffic 通用流量(单位GB) + // 数字字符串 + GeneralTraffic string `json:"general_traffic,omitempty"` + // ProvinceID 所在省份ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + ProvinceID string `json:"province_id,omitempty"` + // CityID 所在城市ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + CityID string `json:"city_id,omitempty"` + // DistrictID 所在区县ID + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + DistrictID string `json:"district_id,omitempty"` + // NationalityID 所在国家 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + NationalityID string `json:"nationality_id,omitempty"` + // Province 所在省份 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + Province string `json:"province,omitempty"` + // City 所在城市 + // 详见接口https://ad.e.kuaishou.com/rest/openapi/v1/region/list + City string `json:"city,omitempty"` + // District 所在地区 + District string `json:"district,omitempty"` + // Region 所在商圈区域 + Region []string `json:"region,omitempty"` + // SavingStartTime 减价开始时间 + // 毫秒时间戳 + SavingStartTime int64 `json:"saving_start_time,omitempty"` + // SavingStartTime 减价结束时间 + // 毫秒时间戳 + SavingEndTime int64 `json:"saving_end_time,omitempty"` + // ProductViewCount 商品详情页被打开次数 + ProductViewCount int64 `json:"product_view_count,omitempty"` + // FavoriteCount 收藏商品用户数 + FavoriteCount int64 `json:"favorite_count,omitempty"` + // FavourableCommentRate 商品好评率 + FavourableCommentRate int64 `json:"favourable_comment_rate,omitempty"` + // Bought 商品销量 + Bought int `json:"bought,omitempty"` + // Mark 商品评分 + Mark float64 `json:"mark,omitempty"` } diff --git a/model/dsp/dpa/product_batch_create.go b/model/dsp/dpa/product_batch_create.go new file mode 100644 index 0000000..e8cdcd6 --- /dev/null +++ b/model/dsp/dpa/product_batch_create.go @@ -0,0 +1,41 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// ProductBatchCreateRequest 创建商品 API Request +type ProductBatchCreateRequest struct { + // DpaProductEditParams 批量创建商品数据 + // 单次请求最大数据量20 + DpaProductEditParams []ProductInfo `json:"dpa_product_edit_params,omitempty"` + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` +} + +// Url implements PostRequest interface +func (r ProductBatchCreateRequest) Url() string { + return "gw/dsp/v1/dpa/product/batch/create" +} + +// Encode implements PostRequest interface +func (r ProductBatchCreateRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// ProductBatchUpdateResponse 创建/编辑商品 API Response +type ProductBatchUpdateResponse struct { + ProductEditResponses []ProductUpdateResult `json:"product_edit_responses,omitempty"` +} + +type ProductUpdateResult struct { + // OuterID 商品外部ID + OuterID string `json:"outer_id,omitempty"` + // Success 创建/编辑结果 + // true-成功, false-失败 + // ErrorMsg 错误信息 + ErrorMsg string `json:"error_msg,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` + // ProductID 商品ID + // 快手生成商品唯一标识 + ProductID uint64 `json:"product_id,omitempty"` +} diff --git a/model/dsp/dpa/product_batct_query.go b/model/dsp/dpa/product_batch_query.go similarity index 80% rename from model/dsp/dpa/product_batct_query.go rename to model/dsp/dpa/product_batch_query.go index d337a5a..c1c6577 100644 --- a/model/dsp/dpa/product_batct_query.go +++ b/model/dsp/dpa/product_batch_query.go @@ -4,12 +4,12 @@ import "github.com/bububa/kwai-marketing-api/model" // ProductBatchQueryRequest 获取商品列表 API Request type ProductBatchQueryRequest struct { - // AdvertiserID 广告主ID - AdvertiserID uint64 `json:"advertiser_id,omitempty"` // AdDpaProductBatchQueryParamSneak 商品批量查询条件 AdDpaProductBatchQueryParamSneak *AdDpaProductBatchQueryParamSneak `json:"dpa_product_query_param,omitempty"` // PageInfo 分页信息 - PageInfo *PageInfoSneak `json:"page_info,omitempty"` + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // AdvertiserID 广告主ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` } // Url implement PostRequest interface @@ -24,12 +24,12 @@ func (r ProductBatchQueryRequest) Encode() []byte { // AdDpaProductBatchQueryParamSneak 商品批量查询条件 type AdDpaProductBatchQueryParamSneak struct { - // LibraryID 商品库ID - LibraryID uint64 `json:"library_id,omitempty"` - // 商品第三方IDs - OuterIDs []string `json:"outer_ids,omitempty"` // Name 商品名称 Name string `json:"name,omitempty"` + // 商品第三方IDs + OuterIDs []string `json:"outer_ids,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` // Status 商品投放状态 0-不可投放, 1-可投放 Status int `json:"status,omitempty"` // CheckStatus 商品接入(校验)状态 0-成功, 1-失败 @@ -39,14 +39,7 @@ type AdDpaProductBatchQueryParamSneak struct { // ProductBatchQueryResponse 获取商品库列表 API Response type ProductBatchQueryResponse struct { // PageInfo 列表页参数 - PageInfo struct { - // CurrentPage 当前页码, 第一页是1 - CurrentPage int `json:"current_page,omitempty"` - // PageSize 分页大小 - PageSize int `json:"page_size,omitempty"` - // TotalCount 数据总数 - TotalCount int `json:"total_count,omitempty"` - } `json:"page_info,omitempty"` + PageInfo *model.PageInfo `json:"page_info,omitempty"` // ProductInfo 商品信息 ProductInfo []ProductInfo `json:"product_info,omitempty"` } diff --git a/model/dsp/dpa/product_batch_update.go b/model/dsp/dpa/product_batch_update.go new file mode 100644 index 0000000..a041bfd --- /dev/null +++ b/model/dsp/dpa/product_batch_update.go @@ -0,0 +1,22 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// ProductBatchUpdateRequest 更新商品 API Request +type ProductBatchUpdateRequest struct { + // DpaProductEditParams 批量创建商品数据 + // 单次请求最大数据量20 + DpaProductEditParams []ProductInfo `json:"dpa_product_edit_params,omitempty"` + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` +} + +// Url implements PostRequest interface +func (r ProductBatchUpdateRequest) Url() string { + return "gw/dsp/v1/dpa/product/batch/update" +} + +// Encode implements PostRequest interface +func (r ProductBatchUpdateRequest) Encode() []byte { + return model.JSONMarshal(r) +} diff --git a/model/dsp/dpa/product_cursor_query.go b/model/dsp/dpa/product_cursor_query.go new file mode 100644 index 0000000..d91fb75 --- /dev/null +++ b/model/dsp/dpa/product_cursor_query.go @@ -0,0 +1,33 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// ProductCursorQueryRequest 获取商品列表(游标) API Request +type ProductCursorQueryRequest struct { + // Cursor 游标 首次查询后返回,后续滚动查询必填,有效期3分钟 + Cursor string `json:"cursor,omitempty"` + // AdvertiserID 广告主ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // LibraryID 商品库ID + LibraryID uint64 `json:"library_id,omitempty"` + // Limit 查询最大数据量 最大值500,无cursor时必填,有cursor时非必填且不生效 + Limit int `json:"limit,omitempty"` +} + +// Url implement PostRequest interface +func (r ProductCursorQueryRequest) Url() string { + return "gw/dsp/dpa/product/cursor_query" +} + +// Encode implement PostRequest interface +func (r ProductCursorQueryRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// ProductCursorQueryResponse 获取商品列表(游标) API Response +type ProductCursorQueryResponse struct { + // Cursor 游标 + Cursor string `json:"cursor,omitempty"` + // ProductInfo 商品信息集 + ProductInfo []ProductInfo `json:"product_info,omitempty"` +} diff --git a/model/dsp/dpa/secret_cid_link.go b/model/dsp/dpa/secret_cid_link.go new file mode 100644 index 0000000..dbbd5f3 --- /dev/null +++ b/model/dsp/dpa/secret_cid_link.go @@ -0,0 +1,138 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// SecretCidLinkRequest CID服务商投放SDPA接口 API Request +type SecretCidLinkRequest struct { + // AdvertiserID 广告主账号ID + AdvertiserID uint64 `json:"advertiser_id,omitempty"` + // UnitID 广告单元ID + UnitID uint64 `json:"unit_id,omitempty"` + // ProductName 商品名称 + ProductName string `json:"product_name,omitempty"` + // OuterID 商品ID + OuterID string `json:"outer_id,omitempty"` + // Title 商品标题 + Title string `json:"title,omitempty"` + // Description 商品描述 + Description string `json:"description,omitempty"` + // MainImage 商品主图URL + // 数组最大有效长度:1 + MainImage []string `json:"main_image,omitempty"` + // ImageURLs 商品副图URLs + ImageURLs []string `json:"image_urls,omitempty"` + // VideoURL 商品视频 + VideoURL *VideoInfo `json:"video_url,omitempty"` + // EnBrand 商品英文品牌名称 + EnBrand string `json:"en_brand,omitempty"` + // Value 商品原价(元) + // 至多精确至“厘”(小数点后三位) + Value string `json:"value,omitempty"` + // Saving 商品减价(元) + // 至多精确至“厘”(小数点后三位) + Saving string `json:"saving,omitempty"` + // Discount 商品折扣 0.001~0.999(至多精确至小数点后三位) + Discount string `json:"discount,omitempty"` + // Price 商品现价(元) + // 至多精确至“厘”(小数点后三位) + Price string `json:"price,omitempty"` + // SalesPromotion 商品促销活动 + SalesPromotion string `json:"sales_promotion,omitempty"` + // DownPayment 商品首付 + DownPayment string `json:"down_payment,omitempty"` + // Mortgage 商品月付 + Mortgage string `json:"mortgage,omitempty"` + // DailyMortgage 商品日付 + DailyMortgage string `json:"daily_mortgage,omitempty"` + // Address 商品销售地址 + Address string `json:"address,omitempty"` + // Feature 商品特色卖点 + Feature string `json:"feature,omitempty"` + // AgeV2 商品定向年龄段 + // 1表示18-23|2表示24-30|3表示31-40|4表示41-49|5表示50+ + AgeV2 []string `json:"age_v2,omitempty"` + // Gender 商品定向性别 + // 0表示不限|1表示男|2表示女 + Gender int `json:"gender,omitempty"` + // ProvinceV2 商品定向省份 + ProvinceV2 []string `json:"province_v2,omitempty"` + // CityV2 商品定向城市 + CityV2 []string `json:"city_v2,omitempty"` + // TargetURL 商品详情页链接 + TargetURL *UrlParamSneak `json:"target_url,omitempty"` + // BrandURL 商品品牌页链接 + BrandURL *UrlParamSneak `json:"brand_url,omitempty"` + // ScheduleURL 商品活动页链接 + ScheduleURL *UrlParamSneak `json:"schedule_url,omitempty"` + // ShopKeeperURL 商品店铺页链接 + ShopKeeperURL *UrlParamSneak `json:"shop_keeper_url,omitempty"` + // CategoryURL 商品类目页链接 + CategoryURL *UrlParamSneak `json:"category_url,omitempty"` + // Slogan 商品广告语 + Slogan string `json:"slogan,omitempty"` + // EcomProductInfo 其它商品信息 + EcomProductInfo *EcomProductInfo `json:"ecom_product_info,omitempty"` + // Condition 商品新旧情况 + Condition string `json:"condition,omitempty"` + // Comments 商品评论数 + Comments int `json:"comments,omitempty"` + // Mark 商品评分 + // 至多精确至小数点后三位 + Mark string `json:"mark,omitempty"` +} + +// EcomProductInfo 其它商品信息 +type EcomProductInfo struct { + // SpuID 标准商品单位ID + SpuID string `json:"spu_id,omitempty"` + // ServiceProviderName 服务商名称 + ServiceProviderName string `json:"service_provider_name,omitempty"` + // CorporationName 商品所属营业执照 + CorporationName string `json:"corporation_name,omitempty"` + // EcomPlatformFromService 商品来源平台 + EcomPlatformFromService string `json:"ecom_platform_from_service,omitempty"` + // ShopNameFromService 三方平台店铺名称 + ShopNameFromService string `json:"shopF_name_from_service,omitempty"` + // BrandNameFromService 三方平台品牌名称 + BrandNameFromService string `json:"brand_name_from_service,omitempty"` + // FirstProductCategoryFromService 三方平台商品一级类目 + FirstProductCategoryFromService string `json:"first_product_category_from_service,omitempty"` + // SecondProductCategoryFromService 三方平台商品二级类目 + SecondProductCategoryFromService string `json:"second_product_category_from_service,omitempty"` + // ThirdProductCategoryFromService 三方平台商品三级类目 + ThirdProductCategoryFromService string `json:"third_product_category_from_service,omitempty"` + // FourthProductCategoryFromService 三方平台商品四级类目 + FourthProductCategoryFromService string `json:"fourth_product_category_from_service,omitempty"` + // ProductLabel 商品标签 + ProductLabel string `json:"product_label,omitempty"` + // CommentTags 商品评价标签 + CommentTags string `json:"comment_tags,omitempty"` + // ServiceTags 商品服务标签 + ServiceTags string `json:"service_tags,omitempty"` + // AttributeTags 商品属性标签 + AttributeTags string `json:"attribute_tags,omitempty"` + // ShopIDromService 三方平台店铺id + ShopIDromService uint64 `json:"shop_id_from_service,omitempty"` + // BrandIDromService 三方平台品牌id + BrandIDromService uint64 `json:"brand_id_from_service,omitempty"` + // FirstProductCategoryIDFromService 三方平台商品一级类目id + FirstProductCategoryIDFromService uint64 `json:"first_product_category_id_from_service,omitempty"` + // SecondProductCategoryIDFromService 三方平台商品二级类目id + SecondProductCategoryIDFromService uint64 `json:"second_product_category_id_from_service,omitempty"` + // ThirdProductCategoryIDFromService 三方平台商品三级类目id + ThirdProductCategoryIDFromService uint64 `json:"third_product_category_id_from_service,omitempty"` + // FourthProductCategoryIDFromService 三方平台商品四级类目id + FourthProductCategoryIDFromService uint64 `json:"fourth_product_category_id_from_service,omitempty"` + // Bought 商品销售量 + Bought int `json:"bought,omitempty"` +} + +// Url implement PostRequest interface +func (r SecretCidLinkRequest) Url() string { + return "gw/dsp/dpa/secret/cid/link" +} + +// Encode implement PostRequest interface +func (r SecretCidLinkRequest) Encode() []byte { + return model.JSONMarshal(r) +} diff --git a/model/dsp/dpa/template.go b/model/dsp/dpa/template.go new file mode 100644 index 0000000..c7e4769 --- /dev/null +++ b/model/dsp/dpa/template.go @@ -0,0 +1,23 @@ +package dpa + +// Template DPA 创意模板 +type Template struct { + // CoverURL 模板图片url。图片类模板表示图片地址;视频类模板表示视频对应的封面地址 + CoverURL string `json:"cover_url,omitempty"` + // EditableAreaCoverURL 图片类模板的可编辑区域图片url + EditableAreaCoverURL string `json:"editable_area_cover_url,omitempty"` + // VideoURL 视频地址 + VideoURL string `json:"video_url,omitempty"` + // Name 模板名称 + Name string `json:"name,omitempty"` + // ID DPA 创意模板 id + ID uint64 `json:"id,omitempty"` + // VideoDuration 视频播放时长 + VideoDuration int64 `json:"video_duration,omitempty"` + // Height 衍生物料的高 + Height int `json:"height,omitempty"` + // Width 衍生物料的宽 + Width int `json:"width,omitempty"` + // TemplateType 模板类型1:竖版图片、2:横版图片3:横版视频、4:竖版视频 + TemplateType int `json:"template_type,omitempty"` +} diff --git a/model/dsp/dpa/template_list.go b/model/dsp/dpa/template_list.go new file mode 100644 index 0000000..be661a4 --- /dev/null +++ b/model/dsp/dpa/template_list.go @@ -0,0 +1,32 @@ +package dpa + +import "github.com/bububa/kwai-marketing-api/model" + +// TemplateListRequest 查询 DPA 模板信息 API Request +type TemplateListRequest struct { + // PageInfo 分页信息 + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // TemplateTypes 模板类型 + // 模板类型:1:竖版图片、2:横版图片3:横版视频、4:竖版视频 + TemplateTypes []int `json:"template_types,omitempty"` + // AdvertiserID 广告主id + AdvertiserID uint64 `json:"advertiser_id,omitempty"` +} + +// Url implements PostRequest interface +func (r TemplateListRequest) Url() string { + return "gw/dsp/dpa/template/list" +} + +// Encode implement PostRequest interface +func (r TemplateListRequest) Encode() []byte { + return model.JSONMarshal(r) +} + +// TemplateListResponse 查询 DPA 模板信息 API Response +type TemplateListResponse struct { + // PageInfo 分页信息 + PageInfo *model.PageInfo `json:"page_info,omitempty"` + // TemplateList 模板列表 + TemplateList []*Template `json:"template_list,omitempty"` +} diff --git a/model/request.go b/model/request.go index ec1cacf..032c6f7 100644 --- a/model/request.go +++ b/model/request.go @@ -16,12 +16,12 @@ type GetRequest interface { // UploadField multipart/form-data post request field struct type UploadField struct { + // Reader upload file reader + Reader io.Reader // Key field key Key string // Value field value Value string - // Reader upload file reader - Reader io.Reader } // UploadRequest multipart/form-data reqeust interface diff --git a/model/response.go b/model/response.go index 67bc3d6..639a461 100644 --- a/model/response.go +++ b/model/response.go @@ -10,10 +10,10 @@ type Response interface { // BaseResponse shared response data struct type BaseResponse struct { - Code int `json:"code,omitempty"` // 返回码 Message string `json:"message,omitempty"` // 返回信息 - Data json.RawMessage `json:"data,omitempty"` // JSON返回值 RequestId string `json:"request_id,omitempty"` // 请求id + Data json.RawMessage `json:"data,omitempty"` // JSON返回值 + Code int `json:"code,omitempty"` // 返回码 } // IsError detect if the response is an error diff --git a/model/types.go b/model/types.go index dc98712..2847acd 100644 --- a/model/types.go +++ b/model/types.go @@ -157,3 +157,13 @@ func (m *MatchType) UnmarshalCSV(b string) (err error) { func (m MatchType) Value() int { return int(m) } + +// PageInfo 分页信息 +type PageInfo struct { + // PageSize 页大小 + PageSize int `json:"page_size,omitempty"` + // CurrentPage 当前页码 + CurrentPage int `json:"current_page,omitempty"` + // TotalCount 总记录数 + TotalCount int `json:"total_count,omitempty"` +}