<?php
require_once __DIR__ . '/../../vendor/autoload.php'; // change path as needed
use TencentAds\TencentAds;
use TencentAds\Exception\TencentAdsResponseException;
use TencentAds\Exception\TencentAdsSDKException;
/*****
* 本文件提供了一个创建一个动态商品广告的示例
*/
class AddDynamicProductAds
{
public static $tads;
public static $ACCESS_TOKEN = 'YOUR ACCESS TOKEN';
public static $ACCOUNT_ID = 'YOUR ACCOUNT ID';
public static $ADCREATIVE_TEMPLATE_ID = 725; // 大图随心互动
public static $IOS_APP_ID = 'YOUR APP ID';
public static $IMAGE_PATH = 'YOUR AD IMAGE PATH'; // 广告主图文件路径,725规格要求:1280x720, <140K, png/jpg
public static $BRAND_IMAGE_PATH = 'YOUR BRAND AD IMAGE PATH'; // 广告品牌图文件路径,725规格要求:512x512, <50K, png/jpg
public static $AD_PAGE_URL = 'YOUR AD PAGE URL';
public static $PRODUCT_CATALOG_ID = 'YOUR PRODUCT CATALOG ID'; // 商品库ID
public static $PRODUCT_SOURCE = 'YOUR PRODUCT SOURCE'; // 商品ID 或者商品系列ID
public static $AD_TITLE = 'YOUR AD TEXT'; // 广告文案,725规格要求:字数:1~40
public function init()
{
$tads = TencentAds::init([
'access_token' => static::$ACCESS_TOKEN,
'is_debug' => true,
]);
$tads->useSandbox(); // 默认访问沙箱环境,如访问正式环境,请切换为$tads->useProduction()
static::$tads = $tads;
return $tads;
}
public function main()
{
try {
/* @var TencentAds $tads */
$tads = static::$tads;
// 第一步,创建推广计划
$campaignType = 'CAMPAIGN_TYPE_NORMAL'; // 普通展示广告
$promotedObjectType = 'PROMOTED_OBJECT_TYPE_APP_IOS'; // 应用推广IOS
$campaignId = $this->AddCampaign($tads, $campaignType, $promotedObjectType);
// echo 'Campaign ID: ' . $campaignId . PHP_EOL;
// 第二步,创建推广目标
$promotedObjectId = $this->AddPromotedObject($tads, $promotedObjectType, static::$IOS_APP_ID);
// echo 'Promoted object ID: ' . $promotedObjectId . PHP_EOL;
// 第三步,创建广告组,不允许使用定向包,因此在广告组里创建定向
$siteSet = ['SITE_SET_MOBILE_INNER']; // 投放腾讯移动流量
$adgroupId = $this->AddAdgroup($tads, $campaignId, $promotedObjectType, $promotedObjectId,
$siteSet, static::$PRODUCT_CATALOG_ID);
// echo 'Adgroup ID: ' . $adgroupId . PHP_EOL;
// 第四步,上传素材
$imageId = $this->AddImage($tads, static::$IMAGE_PATH);
// echo 'Image ID: ' . implode(', ', $imageIdList) . PHP_EOL;
$imageIdBrand = $this->AddImage($tads, static::$BRAND_IMAGE_PATH);
// echo 'Image ID: ' . $imageIdBrand . PHP_EOL;
// 第五步,创建创意
$adcreativeId = $this->AddAdcreative($tads, static::$ADCREATIVE_TEMPLATE_ID, $campaignId,
$promotedObjectType, $promotedObjectId, $siteSet, $imageId, $imageIdBrand, static::$AD_TITLE,
static::$AD_PAGE_URL, static::$PRODUCT_CATALOG_ID, static::$PRODUCT_SOURCE);
// echo 'Adcreative ID: ' . $adcreativeId . PHP_EOL;
// 第六步,创建广告
$adId = $this->AddAd($tads, $adgroupId, $adcreativeId);
// echo 'Ad ID: ' . $adId . PHP_EOL;
return $adId;
} catch (TencentAdsResponseException $e) {
// When Api returns an error
echo 'Tencent ads returned an error: ' . $e->getMessage() . PHP_EOL;
throw $e;
} catch (TencentAdsSDKException $e) {
// When validation fails or other local issues
echo 'Tencent ads SDK returned an error: ' . $e->getMessage() . PHP_EOL;
throw $e;
} catch (Exception $e) {
echo 'Other exception: ' . $e->getMessage() . PHP_EOL;
throw $e;
}
}
// 创建朋友圈推广计划
private function AddCampaign(TencentAds $tads, $campaignType, $promotedObjectType)
{
$campaignName = 'SDK计划' . uniqid();
$campaignDailyBudget = 0; // 不限日预算
$campaign = $tads->campaigns()
->add([
'account_id' => static::$ACCOUNT_ID,
'campaign_name' => $campaignName,
'campaign_type' => $campaignType,
'promoted_object_type' => $promotedObjectType,
'daily_budget' => $campaignDailyBudget,
]);
$campaignId = $campaign->getCampaignId();
return $campaignId;
}
// 创建iOS App推广目标
private function AddPromotedObject(TencentAds $tads, $promotedObjectType, $promotedObjectId)
{
$promotedObjects = $tads->promotedObjects()
->get([
'account_id' => static::$ACCOUNT_ID,
'filtering' => [
[
'field' => 'promoted_object_id',
'operator' => 'EQUALS',
'values' => [$promotedObjectId],
],
],
]);
if (count($promotedObjects->getList()) > 0) {
// 从App Store更新推广目标的信息
$promotedObjects = $tads->promotedObjects()
->update([
'account_id' => static::$ACCOUNT_ID,
'promoted_object_type' => $promotedObjectType,
'promoted_object_id' => $promotedObjectId,
]);
} else {
// 创建推广目标
$promotedObjects = $tads->promotedObjects()
->add([
'account_id' => static::$ACCOUNT_ID,
'promoted_object_type' => $promotedObjectType,
'promoted_object_id' => $promotedObjectId,
]);
}
return $promotedObjectId;
}
// 创建广告组
private function AddAdgroup(
TencentAds $tads,
$campaignId,
$promotedObjectType,
$promotedObjectId,
$siteSet,
$productCatalogId
) {
$adgroupName = 'SDK sample adgroup ' . uniqid();
$beginDate = date('Y-m-d', strtotime('+1 day')); // 开始投放日期
$endDate = date('Y-m-d', strtotime('+10 day')); // 结束投放日期
$billingEvent = 'BILLINGEVENT_IMPRESSION'; // CPM
$bidAmount = 150; // 1.5元(单位为分)
$optimizationGoal = 'OPTIMIZATIONGOAL_ECOMMERCE_ORDER'; // 优化下单
$timeSeries = str_repeat('1', 48 * 7); // 全天投放
$adgroupDailyBudget = 1000000; // 日预算10000元(单位为分)
$regionIds = ['440300'];
$targeting = [
'age' => [
[ // 年龄定向,14~60岁
'min' => 14,
'max' => 60,
],
],
'gender' => ['MALE'], // 性别定向,男性
'geo_location' => [ // 地域定向
'location_types' => ['LIVE_IN'],
'regions' => $regionIds,
],
];
$dynamicAdSpec = [
'product_catalog_id' => $productCatalogId,
'product_mode' => 'SINGLE',
];
$adgroup = $tads->adgroups()
->add([
'account_id' => static::$ACCOUNT_ID,
'campaign_id' => $campaignId,
'adgroup_name' => $adgroupName,
'promoted_object_type' => $promotedObjectType,
'begin_date' => $beginDate,
'end_date' => $endDate,
'billing_event' => $billingEvent,
'bid_amount' => $bidAmount,
'optimization_goal' => $optimizationGoal,
'time_series' => $timeSeries,
'site_set' => $siteSet,
'daily_budget' => $adgroupDailyBudget,
'promoted_object_id' => $promotedObjectId,
'targeting' => $targeting,
'dynamic_ad_spec' => $dynamicAdSpec,
]);
$adgroupId = $adgroup->getAdgroupId();
return $adgroupId;
}
// 上传素材
private function AddImage(TencentAds $tads, $imageFile)
{
$imageSignature = md5_file($imageFile);
$uploadType = 'UPLOAD_TYPE_FILE';
$image = $tads->images()
->add([
'account_id' => static::$ACCOUNT_ID,
'upload_type' => $uploadType,
'file' => $imageFile,
'signature' => $imageSignature,
]);
$imageId = $image->getImageId();
return $imageId;
}
// 创建创意
private function AddAdcreative(
TencentAds $tads,
$adcreativeTemplateId,
$campaignId,
$promotedObjectType,
$promotedObjectId,
$siteSet,
$imageId,
$imageIdBrand,
$adTitle,
$adPageUrl,
$productCatalogId,
$productSource
) {
$adcreativeName = 'SDK sample adcreative ' . uniqid();
$pageType = 'PAGE_TYPE_DEFAULT';
$adcreativeElements = [
'image' => $imageId,
'brand' => [
'brand_img' => $imageIdBrand,
'brand_name' => 'SDK sample brand ' . uniqid(),
],
'title' => $adTitle,
'animation_effect' => 'ANIMATION_EFFECT_CIRCLE_TRANSFER',
'element_story' => [
['image' => $imageId],
['image' => $imageId],
],
'button_text' => '点击咨询',
];
$dynamicAdcreativeSpec = [
'product_catalog_id' => $productCatalogId,
'product_mode' => 'SINGLE',
'product_source' => $productSource,
];
$adcreative = $tads->adcreatives()
->add([
'account_id' => static::$ACCOUNT_ID,
'campaign_id' => $campaignId,
'adcreative_name' => $adcreativeName,
'adcreative_template_id' => $adcreativeTemplateId,
'adcreative_elements' => $adcreativeElements,
'promoted_object_type' => $promotedObjectType,
'page_type' => $pageType,
'page_spec' => [
'page_url' => $adPageUrl,
],
'site_set' => $siteSet,
'promoted_object_id' => $promotedObjectId,
'dynamic_adcreative_spec' => $dynamicAdcreativeSpec,
]);
$adcreativeId = $adcreative->getAdcreativeId();
return $adcreativeId;
}
// 创建广告
private function AddAd(TencentAds $tads, $adgroupId, $adcreativeId)
{
$adName = 'SDK sample ad ' . uniqid();
$ad = $tads->ads()
->add([
'account_id' => static::$ACCOUNT_ID,
'adgroup_id' => $adgroupId,
'adcreative_id' => $adcreativeId,
'ad_name' => $adName,
]);
$adId = $ad->getAdId();
return $adId;
}
}
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
try {
$example = new AddDynamicProductAds();
$example->init();
$example->main();
} catch (\Exception $e) {
exit(-1);
}
}
package com.tencent.ads.examples.MoreAds;
import com.tencent.ads.ApiContextConfig;
import com.tencent.ads.ApiException;
import com.tencent.ads.TencentAds;
import com.tencent.ads.exception.TencentAdsResponseException;
import com.tencent.ads.exception.TencentAdsSDKException;
import com.tencent.ads.model.AdCreativeBrand;
import com.tencent.ads.model.AdNum;
import com.tencent.ads.model.AdcreativeCreativeElementsMp;
import com.tencent.ads.model.AdcreativeElementStoryArrayItem;
import com.tencent.ads.model.AdcreativesAddRequest;
import com.tencent.ads.model.AdcreativesAddResponseData;
import com.tencent.ads.model.AdgroupsAddRequest;
import com.tencent.ads.model.AdgroupsAddResponseData;
import com.tencent.ads.model.AdsAddRequest;
import com.tencent.ads.model.AdsAddResponseData;
import com.tencent.ads.model.AgeStruct;
import com.tencent.ads.model.BillingEvent;
import com.tencent.ads.model.CampaignType;
import com.tencent.ads.model.CampaignsAddRequest;
import com.tencent.ads.model.CampaignsAddResponseData;
import com.tencent.ads.model.DestinationType;
import com.tencent.ads.model.DynamicAdSpec;
import com.tencent.ads.model.DynamicAdcreativeSpec;
import com.tencent.ads.model.FilteringStruct;
import com.tencent.ads.model.GeoLocations;
import com.tencent.ads.model.ImagesAddResponseData;
import com.tencent.ads.model.LinkNameType;
import com.tencent.ads.model.OptimizationGoal;
import com.tencent.ads.model.PageSpec;
import com.tencent.ads.model.PromotedObjectType;
import com.tencent.ads.model.PromotedObjectsAddRequest;
import com.tencent.ads.model.PromotedObjectsGetResponseData;
import com.tencent.ads.model.PromotedObjectsUpdateRequest;
import com.tencent.ads.model.WriteTargetingSettingForAdgroup;
import com.tencent.ads.utils.SignatureUtils;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;
/** 本文件提供了一个创建一个动态商品广告的示例 */
public class AddDynamicProductAds {
/** YOUR ACCESS TOKEN */
public String ACCESS_TOKEN = "YOUR ACCESS TOKEN";
/** YOUR ACCOUNT ID */
public Long ACCOUNT_ID = 0L;
/** YOUR IOS_APP_ID */
public String IOS_APP_ID = "IOS_APP_ID"; // 这里放被推广的iOS App的ID,即App Store的数字ID
/** YOUR AD IMAGE PATH */
public String IMAGE_PATH = "YOUR AD IMAGE PATH"; // 广告主图文件路径,
/** YOUR BRAND AD IMAGE PATH */
public String BRAND_IMAGE_PATH = "YOUR BRAND AD IMAGE PATH"; // 广告Brand图文件路径
/** YOUR AD PAGE URL */
public String AD_PAGE_URL = "YOUR AD PAGE URL";
/** YOUR PRODUCT CATALOG ID */
public Long PRODUCT_CATALOG_ID = 0L; // 商品库ID
/** YOUR PRODUCT SOURCE */
public String PRODUCT_SOURCE = "YOUR PRODUCT SOURCE"; // 商品ID 或者商品系列ID
/** YOUR ADCREATIVE_TEMPLATE_ID */
public static Long ADCREATIVE_TEMPLATE_ID = 725L; // 大图随心互动
/** YOUR AD TEXT */
public static String AD_TITLE = "YOUR AD TEXT"; // 广告文案
/** TencentAds */
public TencentAds tencentAds;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public void init() {
this.tencentAds = TencentAds.getInstance();
this.tencentAds.init(
new ApiContextConfig().accessToken(ACCESS_TOKEN).isDebug(true)); // debug==true 会打印请求详细信息
this.tencentAds.useSandbox(); // 默认使用沙箱环境,如果要请求线上,这里需要设为线上环境
}
public Long addDynamicProductAds() throws Exception {
PromotedObjectType promotedObjectType = PromotedObjectType.APP_IOS;
// 第一步,创建推广计划
Long campaignId = addCampaign(CampaignType.NORMAL, promotedObjectType);
// 第二步,创建推广目标
String promotedObjectId = addPromotedObject(promotedObjectType, IOS_APP_ID);
// 第三步,创建广告组,不允许使用定向包,因此在广告组里创建定向
List<String> siteSet = Arrays.asList("SITE_SET_MOBILE_INNER"); // 投放腾讯移动流量
Long adgroupId = addAdgroup(campaignId, promotedObjectType, promotedObjectId, siteSet);
// 第四步,上传素材
String imageId = addDynamicImage(IMAGE_PATH);
String brandImageId = addDynamicImage(BRAND_IMAGE_PATH);
// 第五步,创建广告创意
Long adcreativeId =
addAdcreative(
ADCREATIVE_TEMPLATE_ID,
campaignId,
promotedObjectType,
promotedObjectId,
siteSet,
imageId,
brandImageId,
AD_TITLE);
// 第六步,创建广告
Long adId = addAd(adgroupId, adcreativeId);
return adId;
}
// 创建朋友圈推广计划
private Long addCampaign(CampaignType campaignType, PromotedObjectType promotedObjectType)
throws ApiException {
String campaignName = "SDK计划" + UUID.randomUUID().toString().substring(0, 10);
Long campaignDailyBudget = 100001L; // 日预算
CampaignsAddResponseData response =
tencentAds
.campaigns()
.campaignsAdd(
new CampaignsAddRequest()
.accountId(ACCOUNT_ID)
.campaignName(campaignName)
.campaignType(campaignType)
.promotedObjectType(promotedObjectType)
.dailyBudget(campaignDailyBudget));
return response.getCampaignId();
}
// 创建iOS App推广目标
private String addPromotedObject(PromotedObjectType promotedObjectType, String promotedObjectId)
throws ApiException {
PromotedObjectsGetResponseData getResponseData =
tencentAds
.promotedObjects()
.promotedObjectsGet(
ACCOUNT_ID,
Arrays.asList(
new FilteringStruct()
.field("promoted_object_id")
.operator("EQUALS")
.values(Arrays.asList(String.valueOf(promotedObjectId)))),
null,
null,
null);
if (getResponseData != null && getResponseData.getList().size() > 0) {
tencentAds
.promotedObjects()
.promotedObjectsUpdate(
new PromotedObjectsUpdateRequest()
.accountId(ACCOUNT_ID)
.promotedObjectType(promotedObjectType)
.promotedObjectId(promotedObjectId));
} else {
tencentAds
.promotedObjects()
.promotedObjectsAdd(
new PromotedObjectsAddRequest()
.accountId(ACCOUNT_ID)
.promotedObjectType(promotedObjectType)
.promotedObjectId(promotedObjectId));
}
return promotedObjectId;
}
// 创建广告组
private Long addAdgroup(
Long campaignId,
PromotedObjectType promotedObjectType,
String promotedObjectId,
List<String> siteSet)
throws ApiException {
String adgroupName = "SDK sample adgroup " + UUID.randomUUID().toString().substring(0, 10);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
String beginDate = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String endDate = sdf.format(calendar.getTime());
BillingEvent billingEvent = BillingEvent.IMPRESSION; // CPM
Long bidAmount = 150L; // 单位为分
OptimizationGoal optimizationGoal = OptimizationGoal.ECOMMERCE_ORDER; // 优化下单
String timeSeries =
"11111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111"
+ "1111111111111111111111111111111111111111111111111111111"; // 全天投放
Long adgroupDailyBudget = 1000000L; // 日预算10000元(单位为分)
List<Long> regionIds = Arrays.asList(440300L);
AdgroupsAddResponseData responseData =
tencentAds
.adgroups()
.adgroupsAdd(
new AdgroupsAddRequest()
.accountId(ACCOUNT_ID)
.campaignId(campaignId)
.adgroupName(adgroupName)
.promotedObjectType(promotedObjectType)
.beginDate(beginDate)
.endDate(endDate)
.billingEvent(billingEvent)
.bidAmount(bidAmount)
.optimizationGoal(optimizationGoal)
.timeSeries(timeSeries)
.siteSet(siteSet)
.dailyBudget(adgroupDailyBudget)
.promotedObjectId(promotedObjectId)
.targeting(
new WriteTargetingSettingForAdgroup()
.age(Arrays.asList(new AgeStruct().max(60L).min(14L)))
.gender(Arrays.asList("MALE"))
.geoLocation(
new GeoLocations()
.locationTypes(Arrays.asList("LIVE_IN"))
.regions(regionIds)))
.dynamicAdSpec(
new DynamicAdSpec()
.productCatalogId(PRODUCT_CATALOG_ID)
.productMode(AdNum.SINGLE)));
return responseData.getAdgroupId();
}
// 上传素材
private String addDynamicImage(String imageFile) throws Exception {
String imageSignature = SignatureUtils.getMD5Checksum(imageFile);
String uploadType = "UPLOAD_TYPE_FILE";
ImagesAddResponseData responseData =
tencentAds
.images()
.imagesAdd(
ACCOUNT_ID,
uploadType,
imageSignature,
new File(imageFile),
null,
null,
null,
null,
null,
null);
return responseData.getImageId();
}
// 创建创意
private Long addAdcreative(
Long adcreativeTemplateId,
Long campaignId,
PromotedObjectType promotedObjectType,
String promotedObjectId,
List<String> siteSet,
String imageId,
String brandImageId,
String adTitle)
throws ApiException {
String adcreativeName = "SDK sample adcreative " + UUID.randomUUID().toString();
LinkNameType linkNameType = LinkNameType.VIEW_DETAILS;
DestinationType pageType = DestinationType.DEFAULT;
AdcreativesAddResponseData responseData =
tencentAds
.adcreatives()
.adcreativesAdd(
new AdcreativesAddRequest()
.accountId(ACCOUNT_ID)
.campaignId(campaignId)
.adcreativeName(adcreativeName)
.adcreativeTemplateId(adcreativeTemplateId)
.adcreativeElements(
new AdcreativeCreativeElementsMp()
.image(imageId)
.brand(
new AdCreativeBrand()
.brandImg(brandImageId)
.brandName(
"sdk 725" + UUID.randomUUID().toString().substring(0, 10)))
.title(adTitle)
.animationEffect("ANIMATION_EFFECT_CIRCLE_TRANSFER")
.elementStory(
Arrays.asList(
new AdcreativeElementStoryArrayItem().image(imageId),
new AdcreativeElementStoryArrayItem().image(imageId)))
.buttonText("点击咨询"))
.promotedObjectType(promotedObjectType)
.pageType(pageType)
.pageSpec(new PageSpec().pageUrl(AD_PAGE_URL))
.siteSet(siteSet)
.promotedObjectId(promotedObjectId)
.dynamicAdcreativeSpec(
new DynamicAdcreativeSpec()
.productCatalogId(PRODUCT_CATALOG_ID)
.productMode(AdNum.SINGLE)
.productSource(PRODUCT_SOURCE))
.promotedObjectId(promotedObjectId));
return responseData.getAdcreativeId();
}
// 创建创意
private Long addAd(Long adgroupId, Long adcreativeId) throws ApiException {
String adName = "SDK sample ad " + UUID.randomUUID().toString().substring(0, 10);
AdsAddResponseData responseData =
tencentAds
.ads()
.adsAdd(
new AdsAddRequest()
.accountId(ACCOUNT_ID)
.adgroupId(adgroupId)
.adcreativeId(adcreativeId)
.adName(adName));
return responseData.getAdId();
}
public static void main(String[] args) {
AddDynamicProductAds addDynamicProductAds = new AddDynamicProductAds();
addDynamicProductAds.init();
try {
Long adId = addDynamicProductAds.addDynamicProductAds();
} catch (TencentAdsResponseException e) {
e.printStackTrace();
} catch (TencentAdsSDKException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}