8

Czytałem dużo o reklamach na Facebooku i podobnych rzeczach, używając graficznego interfejsu użytkownika, który pozwala robić to, co robię iz jakiegoś powodu na sdk nie.Reklamy na Facebooku Sdk nie zezwala na publikowanie reklam przez interfejs API. Subkod: 1487930

Otrzymuję kod podrzędny na subskrypcji podcastów Facebooka subskrypcji pod numer .

Komunikat mówi:

konieczne jest wybranie na celu promocję, komunikat użytkownik mówi: Kampania musi być> jak reklama zestaw z wybranego obiektu do promowania związane swój cel>> (ex: Strona, URL, wydarzenie). Zaktualizuj zestaw reklam, aby kontynuować.

Response zwraca żadnych pól do winy i błąd się dzieje, gdy kreacja jest tworzona: $creative->create();

konfiguracji i moje adset tak:

use Facebook; 
    use FacebookAds\Api; 
    use FacebookAds\Object; 
    use Facebook\Exceptions; 

     $inventory = new Models\AdvertisingInventory(); 
     $item = $inventory->getListing($id)->getAttributes(); 
     $item['properties'] = json_decode($item['properties'], true); 

     /** 
     * Step 1 Instantiate an API 
     * 
     * @link https://developers.facebook.com/docs/marketing-api/sdks#init-sdk 
     */ 

     try { 
      Api::init($this->app_id, $this->app_secret, $this->access_token); 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 2 Query to create campaign 
     * @var $campaign 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-campaign-group 
     * 
     * TODO: Implement ad image widget sizing: https://www.facebook.com/business/help/103816146375741 
     */ 
     try { 

      $account = new Object\AdAccount($this->current_facebook_ads_account); 

      $campaign = new Object\Campaign(null, $this->current_facebook_ads_account); // Getting AdAccount instance 

      $ad_campaigns = $account->getCampaigns($campaign::getFields())->getArrayCopy(); // Checks of there are any campaigns already created 

      $current_campaign = null; 

      if (!empty($ad_campaigns)) { 
       foreach ($ad_campaigns as $ad_campaign) { // loops through campaigns 
        $campaign_data = $ad_campaign->exportAllData(); 
        if ($campaign_data['name'] == 'Sell old inventory') { // If campaign name matches the name given to new campaign, created campaign is then used 
         $current_campaign = $ad_campaign; 
        } 
       } 
      } 

      if (!is_null($current_campaign)) { // Checks if campaign is already assigned if yes, then its used. 
       $campaign = $current_campaign; 
      } else { // else new one is created 
       $campaign->setData(array(
        Object\Fields\CampaignFields::NAME => 'Sell old inventory', 
        Object\Fields\CampaignFields::OBJECTIVE => Object\Values\CampaignObjectiveValues::LINK_CLICKS, 
       )); 

       $campaign->validate()->create(array(
        Object\Campaign::STATUS_PARAM_NAME => Object\Campaign::STATUS_PAUSED 
       )); 
      } 

      //$campaignData = $campaign->getData(); 

      echo 'Campaign ID: ' . $campaign->id . " <br>\n"; 

     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 3 Search for targeting topic 
     * @var $targeting 
     * @link https://developers.facebook.com/docs/marketing-api/targeting-specs/v2.7 
     */ 
     try { 
      $results = Object\TargetingSearch::search(
       Object\Search\TargetingSearchTypes::INTEREST, 
       null, 
       'Automobiles'); 

      $target = (count($results)) ? $results->current() : null; 

      //if (!is_null($target)) { 

      echo "Using target: " . $target->name . "<br/>"; 

      $targeting = new Object\Targeting(); 
      $targeting->{Object\Fields\TargetingFields::GEO_LOCATIONS} = array(
       'countries' => array('NZ') 
      ); 
      $targeting->{Object\Fields\TargetingFields::INTERESTS} = array(
       array(
        'id' => $target->id, 
        'name' => $target->name, 
       ), 
      ); 
      //} 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 4 Create an AdSet 
     * @var $adset 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-campaign 
     */ 
     try { 

      $adset = new Object\AdSet(null, $this->current_facebook_ads_account); 
      //$fields = $adset::getFields(); 

      $available_adsets = $campaign->getAdSets(array(Object\Fields\AdSetFields::NAME,Object\Fields\AdSetFields::ID)); 

      $current_adset = null; 

      if (!empty($available_adsets)) { 
       foreach ($available_adsets as $ad_set) { // loops through adsets 
        if ($adset->name == $item['title']) { // If adset name matches the name given to new campaign, created campaign is then used 
         $current_adset = $ad_set; 
        } 
       } 
      } 

      if (!is_null($current_adset)) { 
       $adset = $current_adset; 
       /*$adset->read(array(
        Object\Fields\AdSetFields::PROMOTED_OBJECT, 
        Object\Fields\AdSetFields::NAME 
       )); 
       echo $adset->name."<br>"; 
       echo $adset->promoted_object."<br>";*/ 
      } else { 

       $start_time = (new \DateTime("+1 week"))->format(\DateTime::ISO8601); 
       $end_time = (new \DateTime("+2 week"))->format(\DateTime::ISO8601); 


       $adset->setData(array(
        Object\Fields\AdSetFields::NAME => $item['title'], 
        Object\Fields\AdSetFields::OPTIMIZATION_GOAL => Object\Values\AdSetOptimizationGoalValues::LINK_CLICKS, 
        Object\Fields\AdSetFields::BILLING_EVENT => Object\Values\AdSetBillingEventValues::LINK_CLICKS, 
        Object\Fields\AdSetFields::BID_AMOUNT => 100, 
        Object\Fields\AdSetFields::DAILY_BUDGET => 500, 
        Object\Fields\AdSetFields::CAMPAIGN_ID => $campaign->id, 
        Object\Fields\AdSetFields::TARGETING => $targeting, 
        Object\Fields\AdSetFields::START_TIME => $start_time, 
        Object\Fields\AdSetFields::END_TIME => $end_time, 
        Object\Fields\AdSetFields::PROMOTED_OBJECT => (object) array(
         Object\Fields\AdPromotedObjectFields::PAGE_ID => '178698438995498', 
        ) 
       )); 
       $adset->create(array(
        Object\AdSet::STATUS_PARAM_NAME => Object\AdSet::STATUS_PAUSED, 
       )); 
      } 
      echo 'Adset ID: ' . $adset->id . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 


     //New method 
     /** 
     * Step 5 Create an AdImage 
     * @var $image 
     * @link https://developers.facebook.com/docs/marketing-api/reference/ad-image 
     */ 
     try { 
      $image = new Object\AdImage(null, $this->current_facebook_ads_account); // Invokes images preparation for Facebook ad instance 
      $target_path = __DIR__ . '/assets/temp/'; // path where images will be streamed to 

      if (!file_exists($target_path)) { 
       mkdir($target_path, 0755); // creating path if one doesn't exist 
      } 

      $files_in_dir = array_diff(scandir($target_path), array('..', '.')); // checking for existing files in target directory 
      $size = getimagesize($item['properties']['images_large'][0]); // getting image details 
      $extension = image_type_to_extension($size[2]); // getting image extension from type 
      $target_file_name = preg_replace(['/\./', '/\\s/', '/\\t/'], "_", strtolower($item['title'])) . $extension; // creating proper file name 
      $target_file = $target_path . $target_file_name; // setting full target directory 

      if (array_search($target_file_name, $files_in_dir) === false) { // checking if target file already exists 

       $image_file = file_get_contents($item['properties']['images_large'][0]); 

       file_put_contents($target_file, $image_file); 
      } 

      $image->{Object\Fields\AdImageFields::FILENAME} = $target_file; // Using target file as ad image 

      $image->create(); 

      echo 'Image Hash: ' . $image->hash . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 

     /** 
     * Step 6 Create an AdCreative 
     */ 
     try { 

      $creative = new Object\AdCreative(null, $this->current_facebook_ads_account); 

      $available_creatives = $adset->getAdCreatives($creative::getFields()); 

      $current_creative = null; 

      if (!empty($available_creatives)) { 
       foreach ($available_creatives as $creative) { // loops through adsets 
        if ($creative->name == 'Creative of '.$item['title']) { // If adset name matches the name given to new campaign, created campaign is then used 
         $current_creative = $creative; 
        } 
       } 
      } 

      if (!is_null($current_creative)) { 
       $creative = $current_creative; 
      } else { 

       $creative = new Object\AdCreative(null, $this->current_facebook_ads_account); 
       $creative->setData(array(
        Object\Fields\AdCreativeFields::NAME => 'Creative of '.$item['title'], 
        Object\Fields\AdCreativeFields::TITLE => $item['title'], 
        Object\Fields\AdCreativeFields::BODY => $item['properties']['description'], 
        Object\Fields\AdCreativeFields::IMAGE_HASH => $image->hash, 
        Object\Fields\AdCreativeFields::LINK_URL => ipConfig()->get('globalPortalUrl'), 
        Object\Fields\AdCreativeFields::OBJECT_URL => ipConfig()->get('globalPortalUrl'), 
       )); 
       **$creative->create();** 
      } 
      echo 'Creative ID: ' . $creative->id . " <br>\n"; 
     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 
     } 


     /** 
     * Step 7 Create an Ad 
     * 
     * Then, use the image hash returned from above. Finally, create your ad along with ad creative. 
     * Please note that the ad creative is not created independently, rather its data structure 
     * is appended to the ad group 
     * 
     * @link https://developers.facebook.com/docs/marketing-api/reference/adgroup 
     */ 
     try { 

      $ad = new Object\Ad(null, $this->current_facebook_ads_account); 

      $last_ad = $adset->getAds($ad::getFields())->end()->exportData(); 

      //var_dump($last_ad); exit(); 

      $ad->setData(array(
       Object\Fields\AdFields::NAME => $item['title'].' #1', 
       Object\Fields\AdFields::ADSET_ID => $adset->id, 
       Object\Fields\AdFields::CREATIVE => array('creative_id' => $creative->id), 
      )); 
      $ad->create(array(
       Object\Ad::STATUS_PARAM_NAME => Object\Ad::STATUS_PAUSED, 
      )); 
      echo 'Ad ID:' . $ad->id . " <br>\n"; 

     } catch (\Exception $e) { 
      return $this->AdvertisingRenderErrorMessage($e); 

     } 

I przypisany tej strony do mojego konta firmowego i że aplikacja, przez którą przechodzi zapytanie, a także użytkownik jest właścicielem konta firmowego, aplikacji i strony.

Co jeszcze jest potrzebne, jeśli podano identyfikator strony? Celem kampanii jest:

Object\Fields\CampaignFields::OBJECTIVE => Object\Values\CampaignObjectiveValues::LINK_CLICKS 

używam ważny page_id. Jestem I brakuje jakieś dodatkowe informacje dla (FYI próbował tego bez (Object) typehint)

Object\Fields\AdSetFields::PROMOTED_OBJECT => (object) array(
    Object\Fields\AdPromotedObjectFields::PAGE_ID => '178698438995498', 
) 

Albo są problemy z aplikacji, stron i kont biznesowych ustawieniami?

Proszę, ktoś odpowiada na moje telefony. Próbowałem prawie wszystko nie może przejść tej kwestii. Wszystkie inne promowane obiekty nie działają z celem kampanii.

P.S. Ktoś, kto ma reputację ponad 1500, powinien utworzyć tag ne facebook-php-ads-sdk.

+1

znalazłeś rozwiązanie tego? – aks

+0

Tak, ale nie pamiętam, myślę, że to z powodu nieprawidłowego stałego ustawienia jako param na obrazie, mam działający kod. Jeśli potrzebujesz mnie pm. :-) P.S. Jeśli planujesz robić ciągłe zautomatyzowane reklamy, a następnie porozmawiać z kontem Google dla firm lub coś podobnego, podniosą ograniczenia na koncie. Ale spróbuję zobaczyć, co teraz jest innego niż przed jutrem, bo jestem teraz bardzo zajęty. – juslintek

Odpowiedz

1

Nie sądzę, aby promowany obiekt był wymagany dla celu LINK_CLICKS. Czy próbowałeś w ogóle jej nie ustawiać?

Facebook docs dla zestawu reklam, sekcja Tworzenie, pole promoted_object mówi

wymagane w niektórych celów kampanii

a celem LINK_CLICKS nie jest tam wymieniony.


Alternatywnie można utworzyć reklamę z pożądanych parametrów poprzez interfejs FB (kierownik reklamy lub zasilania redaktor), a następnie odczytać z powrotem do jego wartości poprzez API, aby zobaczyć, jakie pola są wypełnione i jakie wartości zostały wykorzystane.

+0

Używam celu LINK_CLICKS i widzę to samo "Twoja kampania musi zawierać zestaw reklam z wybranym obiektem do promowania związanych z Twoim celem (np. Strona, URL, wydarzenie). Zaktualizuj zestaw reklam, aby kontynuować. . "Po umieszczeniu mojej nowej reklamy na /reklamach. – Kirby

1

Wystąpił ten błąd, ponieważ podczas tworzenia Adcreative używałem niewłaściwej nazwy parametru.Używałem page_id zamiast object_id.

Mam nadzieję, że może komuś pomóc.