webman_ad/app/service/GoogleAdsCampaignService.php

175 lines
6.8 KiB
PHP

<?php
namespace app\service;
use app\util\Helper;
use app\util\ArgumentNames;
use app\util\ArgumentParser;
use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V18\GoogleAdsException;
use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\V18\Common\ManualCpc;
use Google\Ads\GoogleAds\V18\Enums\AdvertisingChannelTypeEnum\AdvertisingChannelType;
use Google\Ads\GoogleAds\V18\Enums\BudgetDeliveryMethodEnum\BudgetDeliveryMethod;
use Google\Ads\GoogleAds\V18\Enums\CampaignStatusEnum\CampaignStatus;
use Google\Ads\GoogleAds\V18\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V18\Resources\Campaign;
use Google\Ads\GoogleAds\V18\Resources\Campaign\NetworkSettings;
use Google\Ads\GoogleAds\V18\Resources\CampaignBudget;
use Google\Ads\GoogleAds\V18\Services\CampaignBudgetOperation;
use Google\Ads\GoogleAds\V18\Services\CampaignOperation;
use Google\Ads\GoogleAds\V18\Services\MutateCampaignsRequest;
use Google\Ads\GoogleAds\V18\Services\MutateCampaignBudgetsRequest;
use Google\ApiCore\ApiException;
class GoogleAdsCampaignService
{
private $googleAdsClient;
private $customerId;
private const NUMBER_OF_CAMPAIGNS_TO_ADD = 1;
public function __construct()
{
$this->customerId = getenv('GOOGLE_ADS_CUSTOMER_ID');
// OAuth2 Token Authentication
$oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build();
// Google Ads Client initialization
$this->googleAdsClient = (new GoogleAdsClientBuilder())
->fromFile()
->withOAuth2Credential($oAuth2Credential)
->build();
}
/**
* Runs the example.
*
* @param int $customerId the customer ID
* @param $options
* @return mixed
* @throws ApiException
*/
public function runAddCampaign(int $customerId, $options): mixed
{
$googleAdsClient = $this->googleAdsClient;
// Creates a single shared budget to be used by the campaigns added below.
$budgetResourceName = self::addCampaignBudget($googleAdsClient, $customerId,$options);
// Configures the campaign network options.
$networkSettings = new NetworkSettings([
'target_google_search' => true,
'target_search_network' => true,
// Enables Display Expansion on Search campaigns. See
// https://support.google.com/google-ads/answer/7193800 to learn more.
'target_content_network' => true,
'target_partner_search_network' => false
]);
$campaignOperations = [];
for ($i = 0; $i < self::NUMBER_OF_CAMPAIGNS_TO_ADD; $i++) {
// Creates a campaign.
// [START add_campaigns_1]
$campaign = new Campaign([
// 'name' => 'Interplanetary Cruise #' . Helper::getPrintableDatetime(),
'name' => $options['campaign_name'].rand(10,99).' #'. Helper::getPrintableDatetime(),
'advertising_channel_type' => AdvertisingChannelType::SEARCH,
// Recommendation: Set the campaign to PAUSED when creating it to prevent
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
'status' => CampaignStatus::PAUSED,
// Sets the bidding strategy and budget.
'manual_cpc' => new ManualCpc(),
'campaign_budget' => $budgetResourceName,
// Adds the network settings configured above.
'network_settings' => $networkSettings,
// Optional: Sets the start and end dates.
'start_date' => date('Ymd', strtotime('+1 day')),
'end_date' => date('Ymd', strtotime('+1 month'))
]);
// [END add_campaigns_1]
// Creates a campaign operation.
$campaignOperation = new CampaignOperation();
$campaignOperation->setCreate($campaign);
$campaignOperations[] = $campaignOperation;
}
// Issues a mutate request to add campaigns.
$campaignServiceClient = $googleAdsClient->getCampaignServiceClient();
$response = $campaignServiceClient->mutateCampaigns(
MutateCampaignsRequest::build($customerId, $campaignOperations)
);
// printf("Added %d campaigns:%s", $response->getResults()->count(), PHP_EOL);
//
foreach ($response->getResults() as $addedCampaign) {
/** @var Campaign $addedCampaign */
// print "{$addedCampaign->getResourceName()}" . PHP_EOL;
$resourceNames[] = $addedCampaign->getResourceName();
}
return $resourceNames;
}
/**
* Runs the example.
*
* @param int $customerId the customer ID
* @param $options
* @return mixed
* @throws ApiException
*/
public function runAddCampaignBudget(int $customerId, $options): mixed
{
if(!$customerId){
$customerId = $this->customerId;
}
$googleAdsClient = $this->googleAdsClient;
// Creates a single shared budget to be used by the campaigns added below.
$budgetResourceName = self::addCampaignBudget($googleAdsClient, $customerId,$options);
return $budgetResourceName;
}
/**
* Creates a new campaign budget in the specified client account.
*
* @param GoogleAdsClient $googleAdsClient the Google Ads API client
* @param int $customerId the customer ID
* @return string the resource name of the newly created budget
* @throws ApiException
*/
// [START add_campaigns]
private static function addCampaignBudget(GoogleAdsClient $googleAdsClient, int $customerId,$options)
{
// Creates a campaign budget.
$budget = new CampaignBudget([
// 'name' => 'Interplanetary Cruise Budget #' . Helper::getPrintableDatetime(),
'name' => $options['name'].rand(10,99).' #' . Helper::getPrintableDatetime(),
// 'delivery_method' => BudgetDeliveryMethod::STANDARD,
'amount_micros' => $options['amount'] * 1000000
]);
// Creates a campaign budget operation.
$campaignBudgetOperation = new CampaignBudgetOperation();
$campaignBudgetOperation->setCreate($budget);
// Issues a mutate request.
$campaignBudgetServiceClient = $googleAdsClient->getCampaignBudgetServiceClient();
$response = $campaignBudgetServiceClient->mutateCampaignBudgets(
MutateCampaignBudgetsRequest::build($customerId, [$campaignBudgetOperation])
);
/** @var CampaignBudget $addedBudget */
$addedBudget = $response->getResults()[0];
// printf("Added budget named '%s'%s", $addedBudget->getResourceName(), PHP_EOL);
return $addedBudget->getResourceName();
}
// [END add_campaigns]
}