[英]Facebook Marketing API (php SDK) 'invalid parameter' for AdCreative
我正在嘗試使用PHP SDK來使用Marketing API示例。 我已設法創建廣告系列,設置定位,上傳圖片和創建AdSet。 但是,我在使用AdCreative和Ad本身時遇到了問題。
代碼繼續打破“無效參數”,但我不知道哪一個是無效的。 我已經調試了3天了,我被卡住了。 這是我的代碼:
創建廣告系列:
$campaign = new Campaign(null, 'act_xxxxxxx');
$campaign->setData(array(
CampaignFields::NAME => '#My Campaign#',
CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS,
));
$campaign->create(array(
Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED,
));
創建目標受眾:
$targeting = new Targeting();
$targeting->{TargetingFields::GEO_LOCATIONS} =
array(
'location_types' => array('recent'),
'custom_locations' => array(
array(
'latitude'=> 'xx.xxxxxxx',
'longitude'=> 'xx.xxxxxxx',
'radius'=> 2,
'distance_unit'=> 'kilometer')),
);
創建Adset:
$start_time = (new \DateTime("+1 day"))->format(DateTime::ISO8601);
$end_time = (new \DateTime("+2 day"))->format(DateTime::ISO8601);
$adset = new AdSet(null, 'act_xxxxxxxx');
$adset->setData(array(
AdSetFields::NAME => '#My Adset#',
AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::LINK_CLICKS,
AdSetFields::BILLING_EVENT => AdSetBillingEventValues::LINK_CLICKS,
AdSetFields::BID_AMOUNT => 2,
AdSetFields::DAILY_BUDGET => 500,
AdSetFields::CAMPAIGN_ID => $campaign->id,
AdSetFields::TARGETING => $targeting,
AdSetFields::START_TIME => $start_time,
AdSetFields::END_TIME => $end_time,
));
$adset->create(array(
AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));
上傳圖片:
$image = new AdImage(null, 'act_xxxxxxxx');
$image->{AdImageFields::FILENAME} = 'fb-ad-images/xxxxx.jpeg';
$image->create();
$img_hash=$image->{AdImageFields::HASH}.PHP_EOL;
創建AdCreative:
$link_data = new AdCreativeLinkData();
$link_data->setData(array(
AdCreativeLinkDataFields::MESSAGE => 'try it out',
AdCreativeLinkDataFields::LINK => 'http://example.com',
AdCreativeLinkDataFields::CAPTION => 'My caption',
AdCreativeLinkDataFields::IMAGE_HASH => $img_hash,
));
$object_story_spec = new AdCreativeObjectStorySpec();
$object_story_spec->setData(array(
AdCreativeObjectStorySpecFields::PAGE_ID => xxxxxxxxxxxxxxx,
AdCreativeObjectStorySpecFields::LINK_DATA => $link_data,
));
$creative = new AdCreative(null, 'act_xxxxxxx');
$creative->setData(array(
AdCreativeFields::NAME => 'Sample Creative',
AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec,
));
$creative->create();
制作廣告:
$data = array(
AdFields::NAME => 'My Ad',
AdFields::ADSET_ID => $adset->id,
AdFields::CREATIVE => array(
'creative_id' => $creative->id,
),
);
$ad = new Ad(null, 'act_xxxxxx');
$ad->setData($data);
$ad->create(array(
Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED,
));
我已經檢查了參數的驗證兼容性,一切似乎都沒問題。 錯誤是
Fatal error: Uncaught exception 'FacebookAds\\Http\\Exception\\AuthorizationException' with message 'Invalid parameter'
任何人都可以請求幫助,我真的卡住了。 謝謝。
查看代碼,看起來您沒有在Targeting中指定經度和緯度。 xx.xxx需要替換為文本。 我想出來的方法是啟用代碼登錄並獲取指示錯誤的實際API調用。 請查看更新的代碼段。
<?php
$access_token = '<ACCESS_TOKEN>';
$app_id = <APP_ID>;
$app_secret = '<APP_SECRET>';
// should begin with "act_" (eg: $account_id = 'act_1234567890';)
$account_id = 'act_<Ad_ACCOUNT_ID>';
// Configurations - End
if (is_null($access_token) || is_null($app_id) || is_null($app_secret)) {
throw new \Exception(
'You must set your access token, app id and app secret before executing'
);
}
if (is_null($account_id)) {
throw new \Exception(
'You must set your account id before executing');
}
define('SDK_DIR', __DIR__ . '/..'); // Path to the SDK directory
$loader = include SDK_DIR.'/vendor/autoload.php';
use FacebookAds\Api;
use FacebookAds\Logger\CurlLogger;
Api::init($app_id, $app_secret, $access_token);
// Create the CurlLogger
$logger = new CurlLogger();
// To write to a file pass in a file handler
// $logger = new CurlLogger(fopen('test','w'));
// Attach the logger to the Api instance
Api::instance()->setLogger($logger);
use FacebookAds\Object\Campaign;
use FacebookAds\Object\Fields\CampaignFields;
use FacebookAds\Object\Values\CampaignObjectiveValues;
use FacebookAds\Object\Targeting;
use FacebookAds\Object\Fields\TargetingFields;
use FacebookAds\Object\Fields\AdSetFields;
use FacebookAds\Object\AdSet;
use FacebookAds\Object\Values\AdSetOptimizationGoalValues;
use FacebookAds\Object\Values\AdSetBillingEventValues;
$campaign = new Campaign(null, $account_id);
$campaign->setData(array(
CampaignFields::NAME => '#My Campaign#',
CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS,
));
$campaign->create(array(
Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED,
));
$targeting = new Targeting();
$targeting->{TargetingFields::GEO_LOCATIONS} =
array(
'location_types' => array('recent'),
'custom_locations' => array(
array(
'latitude'=> '47.6062',
'longitude'=> '122.3321',
'radius'=> 2,
'distance_unit'=> 'kilometer')),
);
$start_time = (new \DateTime("+1 day"))->format(DateTime::ISO8601);
$end_time = (new \DateTime("+2 day"))->format(DateTime::ISO8601);
echo $campaign->id."\n";
$adset = new AdSet(null, $account_id);
$adset->setData(array(
AdSetFields::NAME => '#My Adset#',
AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::IMPRESSIONS,
AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS,
AdSetFields::BID_AMOUNT => 2,
AdSetFields::DAILY_BUDGET => 500,
AdSetFields::CAMPAIGN_ID => $campaign->id,
AdSetFields::TARGETING => $targeting,
AdSetFields::START_TIME => $start_time,
AdSetFields::END_TIME => $end_time,
));
$adset->create(array(
AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED,
));
在我看來,指定經度和緯度不是問題。 我建議直接從開發人員工具資源管理器中檢查錯誤消息: https : //developers.facebook.com/tools/explorer
我用相同的參數准備了請求,回復是:
{
"error": {
"message": "Invalid parameter",
"type": "OAuthException",
"code": 100,
"error_subcode": 1885183,
"is_transient": false,
"error_user_title": "Ads creative post was created by an app that is in development mode",
"error_user_msg": "Ads creative post was created by an app that is in development mode. It must be in public to create this ad."
}
}
所以原因很明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.