From ce93c4cc489ba42c00cfc83700f49b4f68d33bc2 Mon Sep 17 00:00:00 2001 From: hgc Date: Thu, 12 Dec 2024 13:11:15 +0800 Subject: [PATCH] meta code add --- app/controller/Controller.php | 6 +- app/controller/GoogleAdsController.php | 8 +- app/controller/MetaController.php | 77 ++++++++++ ...01_create_meta_business_accounts_table.php | 18 +++ ...4_12_11_02_create_meta_campaigns_table.php | 21 +++ ...4_12_11_03_create_meta_ad_groups_table.php | 20 +++ .../2024_12_11_04_create_meta_ads_table.php | 20 +++ app/model/MetaAd.php | 27 ++++ app/model/MetaAdGroup.php | 27 ++++ app/model/MetaBusinessAccount.php | 21 +++ app/model/MetaCampaign.php | 27 ++++ app/routes.php | 12 ++ app/service/MetaBusinessService.php | 132 ++++++++++++++++++ 13 files changed, 409 insertions(+), 7 deletions(-) create mode 100644 app/controller/MetaController.php create mode 100644 app/migrations/2024_12_11_01_create_meta_business_accounts_table.php create mode 100644 app/migrations/2024_12_11_02_create_meta_campaigns_table.php create mode 100644 app/migrations/2024_12_11_03_create_meta_ad_groups_table.php create mode 100644 app/migrations/2024_12_11_04_create_meta_ads_table.php create mode 100644 app/model/MetaAd.php create mode 100644 app/model/MetaAdGroup.php create mode 100644 app/model/MetaBusinessAccount.php create mode 100644 app/model/MetaCampaign.php create mode 100644 app/service/MetaBusinessService.php diff --git a/app/controller/Controller.php b/app/controller/Controller.php index e957325..0bc6a0d 100644 --- a/app/controller/Controller.php +++ b/app/controller/Controller.php @@ -3,12 +3,12 @@ namespace app\controller; //use Webman\Http\Response; -use support\Request; +use support\Response; class Controller { // 可以加入一些公共方法 - protected function successResponse($data) + protected function successResponse($data): Response { return Json([ 'code' => 200, @@ -17,7 +17,7 @@ class Controller ]); } - protected function errorResponse($message) + protected function errorResponse($message): Response { return Json([ 'code' => 400, diff --git a/app/controller/GoogleAdsController.php b/app/controller/GoogleAdsController.php index d1d75b9..2452fbf 100644 --- a/app/controller/GoogleAdsController.php +++ b/app/controller/GoogleAdsController.php @@ -19,7 +19,7 @@ class GoogleAdsController extends Controller } // 创建广告预算 - public function createCampaignBudget($request) + public function createCampaignBudget($request): \support\Response { $data = $request->post(); $customerId = $data['customer_id']; @@ -40,7 +40,7 @@ class GoogleAdsController extends Controller } // 创建广告系列 - public function createCampaign($request) + public function createCampaign($request): \support\Response { $data = $request->post(); $customerId = $data['customer_id']; @@ -61,7 +61,7 @@ class GoogleAdsController extends Controller } // 创建广告组 - public function createAdGroup($request) + public function createAdGroup($request): \support\Response { $data = $request->post(); $customerId = $data['customer_id']; @@ -84,7 +84,7 @@ class GoogleAdsController extends Controller } // 创建广告 - public function createAd($request) + public function createAd($request): \support\Response { $data = $request->post(); $customerId = $data['customer_id']; diff --git a/app/controller/MetaController.php b/app/controller/MetaController.php new file mode 100644 index 0000000..9ec3c04 --- /dev/null +++ b/app/controller/MetaController.php @@ -0,0 +1,77 @@ +metaBusinessService = new MetaBusinessService(); + } + + // 获取广告账户 + public function getBusinessAccounts(): Response + { + $accounts = $this->metaBusinessService->getBusinessAccounts(); + return $this->successResponse(['data' => $accounts]); + } + + // 保存广告账户 + public function saveBusinessAccounts(): Response + { + $accounts = $this->metaBusinessService->getBusinessAccounts(); + $this->metaBusinessService->saveBusinessAccounts($accounts); + return $this->successResponse(['message' => 'Business accounts saved successfully']); + } + + // 获取广告系列列表 + public function getCampaigns(): Response + { + $campaigns = $this->metaBusinessService->getCampaigns(); + return $this->successResponse(['data' => $campaigns]); + } + + // 创建广告系列 + public function createCampaign($name, $objective, $status): Response + { + $campaign = $this->metaBusinessService->createCampaign($name, $objective, $status); + return $this->successResponse(['data' => $campaign]); + } + + // 获取广告组列表 + public function getAdGroups($campaignId): Response + { + $adGroups = $this->metaBusinessService->getAdGroups($campaignId); + return $this->successResponse(['data' => $adGroups]); + } + + // 创建广告组 + public function createAdGroup($campaignId, $name, $status): Response + { + $adGroup = $this->metaBusinessService->createAdGroup($campaignId, $name, $status); + return $this->successResponse(['data' => $adGroup]); + } + + // 获取广告列表 + public function getAds($adGroupId): Response + { + $ads = $this->metaBusinessService->getAds($adGroupId); + return $this->successResponse(['data' => $ads]); + } + + // 创建广告 + public function createAd($adGroupId, $name, $status): Response + { + $ad = $this->metaBusinessService->createAd($adGroupId, $name, $status); + return $this->successResponse(['data' => $ad]); + } +} diff --git a/app/migrations/2024_12_11_01_create_meta_business_accounts_table.php b/app/migrations/2024_12_11_01_create_meta_business_accounts_table.php new file mode 100644 index 0000000..a9d7188 --- /dev/null +++ b/app/migrations/2024_12_11_01_create_meta_business_accounts_table.php @@ -0,0 +1,18 @@ +table('ad_meta_business_accounts'); + $table->addColumn('account_name', 'string', ['limit' => 255]) + ->addColumn('account_id', 'string', ['limit' => 255, 'unique' => true]) + ->addColumn('status', 'string', ['limit' => 50]) + ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) + ->addColumn('updated_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP']) + ->create(); + } +} diff --git a/app/migrations/2024_12_11_02_create_meta_campaigns_table.php b/app/migrations/2024_12_11_02_create_meta_campaigns_table.php new file mode 100644 index 0000000..2bd42f3 --- /dev/null +++ b/app/migrations/2024_12_11_02_create_meta_campaigns_table.php @@ -0,0 +1,21 @@ +table('ad_meta_campaigns'); + $table->addColumn('campaign_name', 'string', ['limit' => 255]) + ->addColumn('campaign_id', 'string', ['limit' => 255, 'unique' => true]) + ->addColumn('status', 'string', ['limit' => 50]) + ->addColumn('objective', 'string', ['limit' => 100]) + ->addColumn('business_account_id', 'integer') + ->addForeignKey('business_account_id', 'meta_business_accounts', 'id', ['delete' => 'CASCADE']) + ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) + ->addColumn('updated_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP']) + ->create(); + } +} diff --git a/app/migrations/2024_12_11_03_create_meta_ad_groups_table.php b/app/migrations/2024_12_11_03_create_meta_ad_groups_table.php new file mode 100644 index 0000000..c9a9503 --- /dev/null +++ b/app/migrations/2024_12_11_03_create_meta_ad_groups_table.php @@ -0,0 +1,20 @@ +table('ad_meta_ad_groups'); + $table->addColumn('ad_group_name', 'string', ['limit' => 255]) + ->addColumn('ad_group_id', 'string', ['limit' => 255, 'unique' => true]) + ->addColumn('status', 'string', ['limit' => 50]) + ->addColumn('campaign_id', 'integer') + ->addForeignKey('campaign_id', 'meta_campaigns', 'id', ['delete' => 'CASCADE']) + ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) + ->addColumn('updated_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP']) + ->create(); + } +} diff --git a/app/migrations/2024_12_11_04_create_meta_ads_table.php b/app/migrations/2024_12_11_04_create_meta_ads_table.php new file mode 100644 index 0000000..ac30ec1 --- /dev/null +++ b/app/migrations/2024_12_11_04_create_meta_ads_table.php @@ -0,0 +1,20 @@ +table('ad_meta_ads'); + $table->addColumn('ad_name', 'string', ['limit' => 255]) + ->addColumn('ad_id', 'string', ['limit' => 255, 'unique' => true]) + ->addColumn('status', 'string', ['limit' => 50]) + ->addColumn('ad_group_id', 'integer') + ->addForeignKey('ad_group_id', 'meta_ad_groups', 'id', ['delete' => 'CASCADE']) + ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) + ->addColumn('updated_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP']) + ->create(); + } +} diff --git a/app/model/MetaAd.php b/app/model/MetaAd.php new file mode 100644 index 0000000..912d466 --- /dev/null +++ b/app/model/MetaAd.php @@ -0,0 +1,27 @@ +belongsTo('MetaAdGroup', 'ad_group_id'); + } +} diff --git a/app/model/MetaAdGroup.php b/app/model/MetaAdGroup.php new file mode 100644 index 0000000..acce169 --- /dev/null +++ b/app/model/MetaAdGroup.php @@ -0,0 +1,27 @@ +belongsTo('MetaCampaign', 'campaign_id'); + } +} diff --git a/app/model/MetaBusinessAccount.php b/app/model/MetaBusinessAccount.php new file mode 100644 index 0000000..564b955 --- /dev/null +++ b/app/model/MetaBusinessAccount.php @@ -0,0 +1,21 @@ +belongsTo('MetaBusinessAccount', 'business_account_id'); + } +} diff --git a/app/routes.php b/app/routes.php index d2884e0..7961ca0 100644 --- a/app/routes.php +++ b/app/routes.php @@ -1,9 +1,21 @@ [GoogleAdsController::class, 'createCampaignBudget'], 'POST /google-ads/create-campaign' => [GoogleAdsController::class, 'createCampaign'], 'POST /google-ads/create-adgroup' => [GoogleAdsController::class, 'createAdGroup'], 'POST /google-ads/create-ad' => [GoogleAdsController::class, 'createAd'], + + // Meta API Routes + 'POST /meta/business/accounts' => [MetaController::class, 'getBusinessAccounts'], + 'POST /meta/business/accounts/save' => [MetaController::class, 'saveBusinessAccounts'], + 'GET /meta/campaigns' => [MetaController::class, 'getCampaigns'], + 'POST /meta/campaign/create' => [MetaController::class, 'createCampaign'], + 'GET /meta/adgroups' => [MetaController::class, 'getAdGroups'], + 'POST /meta/adgroup/create' => [MetaController::class, 'createAdGroup'], + 'GET /meta/ads' => [MetaController::class, 'getAds'], + 'POST /meta/ad/create' => [MetaController::class, 'createAd'], + ]; diff --git a/app/service/MetaBusinessService.php b/app/service/MetaBusinessService.php new file mode 100644 index 0000000..2cb6be7 --- /dev/null +++ b/app/service/MetaBusinessService.php @@ -0,0 +1,132 @@ +client = new Client(); + $this->accessToken = getenv('META_ACCESS_TOKEN'); + $this->businessId = getenv('META_BUSINESS_ID'); + } + + // 获取广告账户 + public function getBusinessAccounts() + { + $url = "https://graph.facebook.com/v15.0/{$this->businessId}/owned_ad_accounts"; + $response = $this->client->get($url, [ + 'query' => [ + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true)['data'] ?? []; + } + + // 保存广告账户到数据库 + public function saveBusinessAccounts($accounts) + { + foreach ($accounts as $account) { + // 假设你已经定义了 MetaBusinessAccount 模型 + MetaBusinessAccount::create([ + 'account_name' => $account['name'], + 'account_id' => $account['id'], + 'status' => $account['status'], + ]); + } + } + + // 获取广告系列 + public function getCampaigns() + { + $url = "https://graph.facebook.com/v15.0/{$this->businessId}/campaigns"; + $response = $this->client->get($url, [ + 'query' => [ + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true)['data'] ?? []; + } + + // 创建广告系列 + public function createCampaign($name, $objective, $status) + { + $url = "https://graph.facebook.com/v15.0/{$this->businessId}/campaigns"; + $response = $this->client->post($url, [ + 'json' => [ + 'name' => $name, + 'objective' => $objective, + 'status' => $status, + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true); + } + + // 获取广告组 + public function getAdGroups($campaignId) + { + $url = "https://graph.facebook.com/v15.0/{$campaignId}/adsets"; + $response = $this->client->get($url, [ + 'query' => [ + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true)['data'] ?? []; + } + + // 创建广告组 + public function createAdGroup($campaignId, $name, $status) + { + $url = "https://graph.facebook.com/v15.0/{$this->businessId}/adsets"; + $response = $this->client->post($url, [ + 'json' => [ + 'name' => $name, + 'status' => $status, + 'campaign_id' => $campaignId, + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true); + } + + // 获取广告 + public function getAds($adGroupId) + { + $url = "https://graph.facebook.com/v15.0/{$adGroupId}/ads"; + $response = $this->client->get($url, [ + 'query' => [ + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true)['data'] ?? []; + } + + // 创建广告 + public function createAd($adGroupId, $name, $status) + { + $url = "https://graph.facebook.com/v15.0/{$this->businessId}/ads"; + $response = $this->client->post($url, [ + 'json' => [ + 'name' => $name, + 'status' => $status, + 'adset_id' => $adGroupId, + 'access_token' => $this->accessToken, + ] + ]); + + return json_decode($response->getBody()->getContents(), true); + } +}