From 83dcc0b7b54b42a7a817a52b2c89537804b87ae5 Mon Sep 17 00:00:00 2001 From: huangguancheng Date: Wed, 8 Jan 2025 20:54:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=87=E9=9B=86google=E7=9A=84campaign?= =?UTF-8?q?=E3=80=81ad=5Fgroup=E3=80=81ad=E6=95=B0=E6=8D=AE=E5=88=B0?= =?UTF-8?q?=E6=96=B0=E8=A1=A8bps=5Fads=5Fcampaign=E3=80=81bps=5Fads=5Fset?= =?UTF-8?q?=E3=80=81bps=5Fads=5Fad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/GoogleAdsAdService.php | 147 ++++++++++++++++++++++- app/service/GoogleAdsCampaignService.php | 89 +++++++++++++- app/service/GoogleAdsGroupService.php | 77 +++++++++++- app/service/GoogleOAuthService.php | 4 +- 4 files changed, 306 insertions(+), 11 deletions(-) diff --git a/app/service/GoogleAdsAdService.php b/app/service/GoogleAdsAdService.php index cf01c47..1cc317f 100644 --- a/app/service/GoogleAdsAdService.php +++ b/app/service/GoogleAdsAdService.php @@ -70,23 +70,69 @@ class GoogleAdsAdService extends BaseService * @return mixed * @throws ApiException */ - public function runListAds(int $customerId,$options): mixed + public function runListAds(int $customerId, $options): mixed { // $googleAdsClient = $this->googleAdsClient; - $googleAdsClient = new GoogleAdsClientService($options['refresh_token'], $options['login_customer_id']); + $googleAdsClient = new GoogleAdsClientService($options['refresh_token'], $options['login_customer_id']); // Creates a single shared budget to be used by the campaigns added below. - $groupAdsResourceName = self::getAds($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); +// $groupAdsResourceName = self::getAds($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); + $groupAdsResourceName = self::getAdsNew($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); // dump(json_encode($groupAdsResourceName)); if (is_array($groupAdsResourceName)) { - self::saveAds($groupAdsResourceName); +// self::saveAds($groupAdsResourceName); + self::saveAdsNew($groupAdsResourceName); } return $groupAdsResourceName; } + /** + * 在数据库中保存广告信息 + * @param $groupadsResourceName + * @return void + */ + public static function saveAdsNew($groupadsResourceName) + { + $tableName = 'bps_ads_ad'; + $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'public' . $tableName; + foreach ($groupadsResourceName as $data) { + // 构建 SQL 语句,添加 ad_type 和 metadata + $sql = "INSERT INTO {$tableName} + (ad_id, ad_set_id, campaign_id, account_id, name, status, metadata,platform_type, last_sync_time, update_at) + VALUES + (:ad_id, :ad_group_id, :campaign_id, :customer_id, :ad_name, :status, :metadata, 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) + ON CONFLICT (platform_type,ad_id) + DO UPDATE SET + ad_set_id = EXCLUDED.ad_set_id, + campaign_id = EXCLUDED.campaign_id, + account_id = EXCLUDED.account_id, + name = EXCLUDED.name, + status = EXCLUDED.status, + metadata = EXCLUDED.metadata, + last_sync_time = CURRENT_TIMESTAMP, -- 使用当前时间戳 + update_at = CURRENT_TIMESTAMP -- 使用当前时间戳 + WHERE {$tableName}.platform_type = 2"; + + // 绑定数据 + $bindData = [ + 'ad_id' => $data['ad_id'], + 'ad_group_id' => $data['ad_group_id'], + 'campaign_id' => $data['campaign_id'], + 'customer_id' => $data['customer_id'], + 'ad_name' => $data['ad_name'], + 'status' => $data['status'], + 'metadata' => $data['metadata'], + ]; + + // 执行 SQL 插入语句 + ThinkDb::execute($sql, $bindData); + } + + } + /** * 在数据库中保存广告信息 * @param $groupadsResourceName @@ -231,6 +277,97 @@ class GoogleAdsAdService extends BaseService return $resourceNames; } + public + static function getAdsNew(GoogleAdsClient $googleAdsClient, int $customerId) + { + $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); + // Creates a query that retrieves all groups. + +// $response = $googleAdsServiceClient->search($customerId, $query); + $query = "SELECT + ad_group_ad.ad.id, + ad_group.id, + campaign.id, + customer.id, + ad_group_ad.ad.name, + ad_group_ad.status, + ad_group_ad.ad.resource_name, + ad_group_ad.ad.type, + ad_group_ad.ad.responsive_display_ad.logo_images, + ad_group_ad.ad.responsive_display_ad.square_logo_images, + ad_group_ad.ad.responsive_display_ad.marketing_images, + ad_group_ad.ad.responsive_display_ad.square_marketing_images, + ad_group_ad.ad.responsive_display_ad.youtube_videos + FROM ad_group_ad + WHERE + ad_group_ad.status != 'REMOVED' "; + // Issues a search stream request. + /** @var GoogleAdsServerStreamDecorator $stream */ + $stream = $googleAdsServiceClient->searchStream( + SearchGoogleAdsStreamRequest::build($customerId, $query) + ); + $resourceNames = []; + // Iterates over all rows in all messages and prints the requested field values for + // the campaign in each row. + foreach ($stream->iterateAllElements() as $googleAdsRow) { + /** @var GoogleAdsRow $googleAdsRow */ + // 假设 $googleAdsRow 是从 Google Ads API 中获取的对象 +// $finalUrlsList = $googleAdsRow->getAdGroupAd()->getAd()->getFinalUrls(); + // 将最终的 URL 列表转换为 PHP 数组 +// $finalUrlsArray = iterator_to_array($finalUrlsList); + $resourceName = []; + $resourceName['ad_id'] = $googleAdsRow->getAdGroupAd()->getAd()->getId(); + $resourceName['ad_name'] = $googleAdsRow->getAdGroupAd()->getAd()->getName(); + $resourceName['ad_group_id'] = $googleAdsRow->getAdGroup()->getId(); + $resourceName['campaign_id'] = $googleAdsRow->getCampaign()->getId(); + $resourceName['customer_id'] = $googleAdsRow->getCustomer()->getId(); +// $resourceName['final_urls'] = $finalUrlsArray; + $resourceName['status'] = $googleAdsRow->getAdGroupAd()->getStatus(); +// $resourceName['resource_name'] = $googleAdsRow->getAdGroupAd()->getAd()->getResourceName(); + $adType = $googleAdsRow->getAdGroupAd()->getAd()->getType(); + //ad_type 19=> RESPONSIVE_DISPLAY_AD 自适应展示广告 详细看model定义 + if ($adType === 19) { + // 获取 squareMarketingImages 中的每个 asset + $squareMarketingImages = $googleAdsRow->getAdGroupAd()->getAd()->getResponsiveDisplayAd()->getSquareMarketingImages(); + $squareMarketingAssets = []; + foreach ($squareMarketingImages as $image) { + $squareMarketingAssets[] = $image->getAsset(); + } + // 获取 logoImages 中的每个 asset + $logoImages = $googleAdsRow->getAdGroupAd()->getAd()->getResponsiveDisplayAd()->getLogoImages(); + $logoAssets = []; + foreach ($logoImages as $logo) { + $logoAssets[] = $logo->getAsset(); + } + // 获取 marketingImages 中的每个 asset + $marketingImages = $googleAdsRow->getAdGroupAd()->getAd()->getResponsiveDisplayAd()->getMarketingImages(); + $marketingAssets = []; + foreach ($marketingImages as $marketing) { + $marketingAssets[] = $marketing->getAsset(); + } + // 获取 youtubeVideos 中的每个 asset + $youtubeVideos = $googleAdsRow->getAdGroupAd()->getAd()->getResponsiveDisplayAd()->getYoutubeVideos(); + $youtubeAssets = []; + foreach ($youtubeVideos as $video) { + $youtubeAssets[] = $video->getAsset(); + } + // 将提取的资产保存到 metadata 数组 + $resourceName['metadata']['square_marketing_images'] = $squareMarketingAssets; + $resourceName['metadata']['logo_images'] = $logoAssets; + $resourceName['metadata']['marketing_images'] = $marketingAssets; + $resourceName['metadata']['youtube_videos'] = $youtubeAssets; + + // 将 metadata 转换为 JSON 格式 + $resourceName['metadata'] = json_encode($resourceName['metadata']); // 存储为 JSONB 格式 + } else { + $resourceName['metadata'] = null; + } + $resourceNames[] = $resourceName; + + } + return $resourceNames; + } + /** * This example updates the CPC bid and status for a given ad group. To get ad groups, run @@ -246,7 +383,7 @@ class GoogleAdsAdService extends BaseService { // dump($options); // $googleAdsClient = $this->googleAdsClient; - $googleAdsClient = new GoogleAdsClientService($options['refresh_token'],$options['login_customer_id']); + $googleAdsClient = new GoogleAdsClientService($options['refresh_token'], $options['login_customer_id']); // Creates a single shared budget to be used by the campaigns added below. $resourceNames = self::updateAd($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $options['customer_id'], $options['group_id'], $options['ad_id'], $options['status']); diff --git a/app/service/GoogleAdsCampaignService.php b/app/service/GoogleAdsCampaignService.php index 7f0ffcf..f677a1e 100644 --- a/app/service/GoogleAdsCampaignService.php +++ b/app/service/GoogleAdsCampaignService.php @@ -204,10 +204,12 @@ class GoogleAdsCampaignService extends BaseService { $googleAdsClient = new GoogleAdsClientService($options['refresh_token'], $options['login_customer_id']); - $campaignsResourceName = self::getCampaigns($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); +// $campaignsResourceName = self::getCampaigns($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); + $campaignsResourceName = self::getCampaignsNew($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); // dump(json_encode($campaignsResourceName)); if (is_array($campaignsResourceName)) { - self::saveCampaigns($campaignsResourceName); +// self::saveCampaigns($campaignsResourceName); + self::saveCampaignsNew($campaignsResourceName); } return $campaignsResourceName; @@ -234,6 +236,60 @@ class GoogleAdsCampaignService extends BaseService } + /** + * Runs the example. + * + * @param GoogleAdsClient $googleAdsClient the Google Ads API client + * @param int $customerId the customer ID + */ + // [START get_campaigns] + + public static function getCampaignsNew(GoogleAdsClient $googleAdsClient, int $customerId) + { + $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); + // Creates a query that retrieves all campaigns. +// $query = 'SELECT campaign.id,campaign.name,campaign.status,campaign.campaign_budget,campaign_budget.id,campaign_budget.name,campaign_budget.amount_micros FROM campaign ORDER BY campaign.id'; + $query = "SELECT + campaign.id, + campaign.name, + campaign.status, + campaign.advertising_channel_type, + campaign.start_date, + campaign.end_date, + campaign_budget.amount_micros, + customer.id + FROM campaign + WHERE + campaign.status != 'REMOVED' "; + // Issues a search stream request. + /** @var GoogleAdsServerStreamDecorator $stream */ + $stream = $googleAdsServiceClient->searchStream( + SearchGoogleAdsStreamRequest::build($customerId, $query) + ); + $resourceNames = []; + // Iterates over all rows in all messages and prints the requested field values for + // the campaign in each row. + foreach ($stream->iterateAllElements() as $googleAdsRow) { + /** @var GoogleAdsRow $googleAdsRow */ +// printf( +// "Campaign with ID %d and name '%s' was found.BudgetID %s: %d %s", +// $googleAdsRow->getCampaign()->getId(), +// $googleAdsRow->getCampaign()->getName(), +// $googleAdsRow->getCampaignBudget()->getName(), +// $googleAdsRow->getCampaignBudget()->getAmountMicros(), +// +// $googleAdsRow->getCampaignBudget()->getName(), +// PHP_EOL +// ); + $resourceName['campaign_id'] = $googleAdsRow->getCampaign()->getId(); + $resourceName['campaign_name'] = $googleAdsRow->getCampaign()->getName(); + $resourceName['status'] = $googleAdsRow->getCampaign()->getStatus(); + $resourceName['customer_id'] = $googleAdsRow->getCustomer()->getId(); + $resourceNames[] = $resourceName; + } + return $resourceNames; + } + /** * Runs the example. * @@ -423,6 +479,35 @@ class GoogleAdsCampaignService extends BaseService ThinkDb::execute($sql, $data); } } + /** + * 在数据库中保存广告系列信息 + * @param $campaignsResourceName + * @return void + */ + public static function saveCampaignsNew($campaignsResourceName) + { + $tableName = 'bps_ads_campaign'; + $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'public' . $tableName; + + foreach ($campaignsResourceName as $data) { + + $sql = "INSERT INTO {$tableName} + (campaign_id, account_id, name, status, platform_type, last_sync_time, update_at) + VALUES (:campaign_id, :customer_id, :campaign_name, :status, 2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) + ON CONFLICT (platform_type,campaign_id) + DO UPDATE SET + account_id = EXCLUDED.account_id, + name = EXCLUDED.name, + status = EXCLUDED.status, + last_sync_time = CURRENT_TIMESTAMP, -- 使用当前时间戳 + update_at = CURRENT_TIMESTAMP -- 使用当前时间戳 + WHERE {$tableName}.platform_type = 2"; + + ThinkDb::execute($sql, $data); + // 打印最后执行的 SQL 语句 +// dump(ThinkDb::getLastSql()); + } + } /** diff --git a/app/service/GoogleAdsGroupService.php b/app/service/GoogleAdsGroupService.php index d90da14..bf00abe 100644 --- a/app/service/GoogleAdsGroupService.php +++ b/app/service/GoogleAdsGroupService.php @@ -65,10 +65,12 @@ class GoogleAdsGroupService extends BaseService // dump($customerId,$options['refresh_token']); $googleAdsClient = new GoogleAdsClientService($options['refresh_token'],$options['login_customer_id']); // Creates a single shared budget to be used by the campaigns added below. - $groupsResourceName = self::getGroups($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); +// $groupsResourceName = self::getGroups($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); + $groupsResourceName = self::getGroupsNew($googleAdsClient->getGoogleAdsClientWithloginCustomerId(), $customerId); // dump(json_encode($groupsResourceName)); if (is_array($groupsResourceName)) { - self::saveGroups($groupsResourceName); +// self::saveGroups($groupsResourceName); + self::saveGroupsNew($groupsResourceName); } return $groupsResourceName; @@ -101,6 +103,32 @@ class GoogleAdsGroupService extends BaseService } } + /** + * 在数据库中保存广告系列信息 + * @param $groupsResourceName + * @return void + */ + public static function saveGroupsNew($groupsResourceName) + { + $tableName = 'bps_ads_set'; + $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'public' . $tableName; + foreach ($groupsResourceName as $data) { + $sql = "INSERT INTO {$tableName} + (ad_set_id, campaign_id, account_id, name, status,platform_type, last_sync_time, update_at) + VALUES (:ad_group_id, :campaign_id, :customer_id, :ad_group_name, :status,2, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) + ON CONFLICT (platform_type,ad_set_id) + DO UPDATE SET + campaign_id = EXCLUDED.campaign_id, + account_id = EXCLUDED.account_id, + name = EXCLUDED.name, + status = EXCLUDED.status, + last_sync_time = CURRENT_TIMESTAMP, -- 使用当前时间戳 + update_at = CURRENT_TIMESTAMP + WHERE {$tableName}.platform_type = 2"; + ThinkDb::execute($sql, $data); + } + } + /** * Runs the example. @@ -110,6 +138,51 @@ class GoogleAdsGroupService extends BaseService */ // [START get_campaigns] + public static function getGroupsNew(GoogleAdsClient $googleAdsClient, int $customerId) + { + $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); + // Creates a query that retrieves all groups. + +// $response = $googleAdsServiceClient->search($customerId, $query); + $query = "SELECT + ad_group.id, + ad_group.name, + campaign.id, + customer.id, + ad_group.status, + ad_group.cpc_bid_micros + FROM ad_group + WHERE + ad_group.status != 'REMOVED' "; + // Issues a search stream request. + /** @var GoogleAdsServerStreamDecorator $stream */ + $stream = $googleAdsServiceClient->searchStream( + SearchGoogleAdsStreamRequest::build($customerId, $query) + ); + $resourceNames = []; + // Iterates over all rows in all messages and prints the requested field values for + // the campaign in each row. + foreach ($stream->iterateAllElements() as $googleAdsRow) { + /** @var GoogleAdsRow $googleAdsRow */ +// printf( +// "Campaign with ID %d and name '%s' was found.BudgetID %s: %d %s", +// $googleAdsRow->getCampaign()->getId(), +// $googleAdsRow->getCampaign()->getName(), +// $googleAdsRow->getCampaignBudget()->getName(), +// $googleAdsRow->getCampaignBudget()->getAmountMicros(), +// +// $googleAdsRow->getCampaignBudget()->getName(), +// PHP_EOL +// ); + $resourceName['ad_group_id'] = $googleAdsRow->getAdGroup()->getId(); + $resourceName['ad_group_name'] = $googleAdsRow->getAdGroup()->getName(); + $resourceName['status'] = $googleAdsRow->getAdGroup()->getStatus(); + $resourceName['campaign_id'] = $googleAdsRow->getCampaign()->getId(); + $resourceName['customer_id'] = $googleAdsRow->getCustomer()->getId(); + $resourceNames[] = $resourceName; + } + return $resourceNames; + } public static function getGroups(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); diff --git a/app/service/GoogleOAuthService.php b/app/service/GoogleOAuthService.php index cb073be..e2a5cbc 100644 --- a/app/service/GoogleOAuthService.php +++ b/app/service/GoogleOAuthService.php @@ -210,7 +210,7 @@ class GoogleOAuthService ThinkDb::execute($sql, $data); $options = []; - $options['data'] = $refreshToken; + $options['refresh_token'] = $refreshToken; $this->queue($options); } @@ -316,7 +316,7 @@ class GoogleOAuthService // $options = ['to' => 'tom@gmail.com', 'content' => 'hello']; // 投递消息 // Redis::send($queue, $options['data']); - QueueClient::send($queue, $options['data'],10); //异步投递 延后15秒 + QueueClient::send($queue, $options,10); //异步投递 延后15秒 // 投递延迟消息,消息会在60秒后处理 // Redis::send($queue, $options['data'], 60);