Tự động Chặn IP Nghi Ngờ Gian Lận Click trên Google Ads bằng CodeIgniter 4 & API
Bảo vệ ngân sách quảng cáo của bạn bằng cách tự động hóa việc loại trừ IP có hành vi click bất thường thông qua Google Ads API.
Việc click liên tục từ cùng một địa chỉ IP vào quảng cáo Google Ads của bạn có thể là dấu hiệu của click không hợp lệ hoặc thậm chí là gian lận click (click fraud), gây lãng phí ngân sách quảng cáo. Giải pháp là tự động chặn các IP này. Bài viết này sẽ hướng dẫn bạn cách xây dựng một chức năng trong ứng dụng CodeIgniter 4 để theo dõi số lượt click và tự động gọi Google Ads API để chặn một địa chỉ IP khi nó vượt quá ngưỡng cho phép (ví dụ: 3 lần click trong vòng 1 phút).
Điểm Nổi Bật
- Sử dụng Google Ads API Client Library: Việc chặn IP không thể thực hiện qua Google Ads REST API. Bạn phải sử dụng thư viện client chính thức (ví dụ: PHP Client Library) hoạt động qua gRPC.
- Theo dõi Tần suất Click: Cần triển khai logic để đếm số lượt click từ mỗi IP trong một khoảng thời gian ngắn (ví dụ: 1 phút) bằng các công cụ như Redis, Memcached hoặc cơ sở dữ liệu.
- Xác thực và API Objects: Yêu cầu xác thực OAuth 2.0 và sử dụng các đối tượng API cụ thể như
CampaignCriterionService,IpBlockInfo, vàNegativeCampaignCriterionđể thực hiện việc chặn.
Điều Kiện Tiên Quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã chuẩn bị đầy đủ:
- Một dự án CodeIgniter 4 đã được cài đặt và cấu hình cơ bản.
- Composer được cài đặt trên máy chủ hoặc môi trường phát triển của bạn.
- Truy cập vào Google Ads API:
- Developer Token: Lấy từ tài khoản Trung tâm API Google Ads của bạn.
- OAuth 2.0 Credentials: Tạo Client ID, Client Secret trong Google Cloud Console và tạo Refresh Token để ứng dụng của bạn có thể xác thực với API.
- Customer ID: ID của tài khoản Google Ads mà bạn muốn quản lý (tài khoản MCC hoặc tài khoản con).
- Campaign ID: ID của chiến dịch cụ thể mà bạn muốn áp dụng việc chặn IP.
Bước 1: Cài Đặt Thư Viện Google Ads API PHP Client
Sử dụng Composer để thêm thư viện Google Ads PHP vào dự án CodeIgniter 4 của bạn. Mở terminal hoặc command prompt, điều hướng đến thư mục gốc của dự án và chạy lệnh sau:
composer require googleads/google-ads-php
Thư viện này cung cấp các lớp và phương thức cần thiết để tương tác với Google Ads API một cách dễ dàng.
Bước 2: Cấu Hình Xác Thực API
Thư viện Google Ads PHP thường sử dụng tệp cấu hình google_ads_php.ini để lưu trữ thông tin xác thực. Bạn cần tạo tệp này và điền các thông tin cần thiết:
developerTokenclientId(OAuth2 Client ID)clientSecret(OAuth2 Client Secret)refreshToken(OAuth2 Refresh Token)loginCustomerId(ID tài khoản MCC hoặc tài khoản quản lý chính, nếu có)
Hãy đảm bảo lưu trữ tệp này ở một vị trí an toàn, không thể truy cập công khai từ web. Bạn có thể tham khảo tài liệu của thư viện Google Ads PHP để biết vị trí đặt tệp cấu hình hoặc cách tải cấu hình theo phương thức khác (ví dụ: từ biến môi trường).
Bước 3: Theo Dõi Tần Suất Click Của IP
Logic Theo Dõi
Để xác định khi nào một IP vượt quá ngưỡng 3 click/phút, bạn cần một cơ chế lưu trữ và truy vấn nhanh chóng. Các bước cơ bản bao gồm:
- Khi người dùng click vào link Google Ads và truy cập trang của bạn, lấy địa chỉ IP của họ bằng cách sử dụng đối tượng Request của CodeIgniter:
$ipAddress = $this->request->getIPAddress(); - Lưu trữ một bản ghi gồm địa chỉ IP và dấu thời gian (timestamp) của lượt click.
- Trước khi lưu lượt click mới, truy vấn số lượng click từ cùng IP đó trong vòng 60 giây gần nhất.
- Nếu số lượng click lớn hơn hoặc bằng 3, kích hoạt hàm chặn IP.
Công Cụ Lưu Trữ
Sử dụng các giải pháp lưu trữ key-value trong bộ nhớ như Redis hoặc Memcached là lựa chọn tối ưu vì tốc độ truy cập nhanh, phù hợp với việc kiểm tra tần suất theo thời gian thực. Bạn có thể lưu danh sách các timestamp cho mỗi IP và tự động xóa các bản ghi cũ.
Ví dụ sử dụng Redis (yêu cầu cài đặt extension Redis cho PHP):
// Mã giả lập logic kiểm tra với Redis
$ip = $this->request->getIPAddress();
$redis = new \Redis(); // Khởi tạo Redis client
$redis->connect('127.0.0.1', 6379); // Kết nối tới Redis server
$key = "click_tracking:" . $ip;
$currentTime = time();
$timeWindow = 60; // 60 giây (1 phút)
// Xóa các timestamp cũ hơn timeWindow giây
$redis->zRemRangeByScore($key, 0, $currentTime - $timeWindow);
// Lấy số lượng click còn lại trong khoảng thời gian
$clickCount = $redis->zCard($key);
if ($clickCount >= 3) {
// Đã vượt ngưỡng -> Gọi hàm chặn IP
log_message('info', "IP {$ip} exceeded click threshold. Triggering block.");
// $this->googleAdsService->blockIpAddress($ip, $campaignId); // Gọi service chặn IP
// Có thể xóa key để không trigger liên tục trong 1 phút
// $redis->del($key);
} else {
// Thêm timestamp hiện tại vào sorted set với score là chính timestamp đó
$redis->zAdd($key, $currentTime, $currentTime);
// Đặt thời gian hết hạn cho key để tự động dọn dẹp
$redis->expire($key, $timeWindow + 10); // Hết hạn sau khoảng thời gian + buffer nhỏ
log_message('debug', "IP {$ip} click recorded. Count in last {$timeWindow}s: " . ($clickCount + 1));
}
Nếu không sử dụng Redis/Memcached, bạn có thể dùng cơ sở dữ liệu, nhưng cần tối ưu hóa truy vấn và có cơ chế dọn dẹp dữ liệu cũ định kỳ.
Bước 4: Tạo Hàm Chặn IP (Sử Dụng CodeIgniter Service)
Tổ chức logic gọi API Google Ads vào một Service trong CodeIgniter giúp mã nguồn rõ ràng và dễ bảo trì hơn. Tạo file app/Services/GoogleAdsService.php.
<?php
namespace App\Services;
use Google\Ads\GoogleAds\Lib\V17\GoogleAdsClient; // Cập nhật version nếu cần
use Google\Ads\GoogleAds\Lib\V17\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V17\GoogleAdsException;
use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\V17\Common\IpBlockInfo;
use Google\Ads\GoogleAds\V17\Enums\CriterionTypeEnum\CriterionType;
use Google\Ads\GoogleAds\V17\Resources\CampaignCriterion;
use Google\Ads\GoogleAds\V17\Services\CampaignCriterionOperation;
use Google\Ads\GoogleAds\V17\Services\MutateCampaignCriteriaRequest; // Sử dụng lớp Request
use Google\ApiCore\ApiException;
use Psr\Log\LoggerInterface; // Để log lỗi
class GoogleAdsService
{
private GoogleAdsClient $googleAdsClient;
private string $loginCustomerId; // Customer ID của tài khoản quản lý (nếu có)
private LoggerInterface $logger;
public function __construct(?string $loginCustomerId = null)
{
$this->logger = service('logger'); // Lấy logger của CodeIgniter
// Khởi tạo GoogleAdsClient từ file cấu hình hoặc biến môi trường
// Đảm bảo bạn đã cấu hình google_ads_php.ini hoặc các biến môi trường tương ứng
try {
$oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build(); // Hoặc fromEnvironment()
$this->googleAdsClient = (new GoogleAdsClientBuilder())
->fromFile() // Hoặc fromEnvironment()
->withOAuth2Credential($oAuth2Credential);
if ($loginCustomerId) {
$this->googleAdsClient = $this->googleAdsClient->withLoginCustomerId($loginCustomerId);
$this->loginCustomerId = $loginCustomerId;
}
$this->googleAdsClient = $this->googleAdsClient->build();
} catch (\Exception $e) {
$this->logger->error("Failed to initialize Google Ads Client: " . $e->getMessage());
// Xử lý lỗi khởi tạo ở đây, có thể throw exception
throw $e;
}
}
/**
* Chặn một địa chỉ IP cho một chiến dịch Google Ads cụ thể.
*
* @param string $customerId ID tài khoản Google Ads chứa chiến dịch.
* @param int $campaignId ID của chiến dịch cần chặn IP.
* @param string $ipAddress Địa chỉ IP cần chặn (IPv4 hoặc IPv6).
* @return bool True nếu thành công, False nếu thất bại.
*/
public function blockIpAddress(string $customerId, int $campaignId, string $ipAddress): bool
{
// Tạo resource name cho chiến dịch
$campaignResourceName = "customers/{$customerId}/campaigns/{$campaignId}";
// Tạo đối tượng IpBlockInfo
$ipBlockInfo = new IpBlockInfo(['ip_address' => $ipAddress]);
// Tạo đối tượng CampaignCriterion là tiêu chí phủ định (NEGATIVE)
$campaignCriterion = new CampaignCriterion([
'campaign' => $campaignResourceName,
'type' => CriterionType::IP_BLOCK, // Loại tiêu chí là chặn IP
'negative' => true, // Đánh dấu là tiêu chí phủ định
'ip_block' => $ipBlockInfo
]);
// Tạo đối tượng Operation để thêm tiêu chí này
$operation = new CampaignCriterionOperation();
$operation->setCreate($campaignCriterion); // Sử dụng setCreate cho thao tác thêm mới
// Lấy service client
$campaignCriterionServiceClient = $this->googleAdsClient->getCampaignCriterionServiceClient();
try {
// Gửi yêu cầu mutate (chỉ chứa 1 operation như yêu cầu)
$request = new MutateCampaignCriteriaRequest([
'customer_id' => $customerId,
'operations' => [$operation]
]);
$response = $campaignCriterionServiceClient->mutateCampaignCriteria($request);
// Kiểm tra kết quả (có thể log chi tiết hơn)
if ($response->getResults()->count() > 0) {
$blockedResourceName = $response->getResults()[0]->getResourceName();
$this->logger->info("Successfully blocked IP {$ipAddress} for campaign {$campaignId}. Resource: {$blockedResourceName}");
return true;
} else {
$this->logger->warning("IP Block operation for {$ipAddress} might not have completed successfully (no results returned).");
return false; // Hoặc xử lý khác nếu không có kết quả
}
} catch (GoogleAdsException $googleAdsException) {
$this->logger->error(sprintf(
"Google Ads API request failed with status %s and includes the following errors:",
$googleAdsException->getStatus()
));
foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) {
$this->logger->error(sprintf(
"\tError with message '%s' located at '%s'.",
$error->getMessage(),
$error->getLocation() ? implode(', ', iterator_to_array($error->getLocation()->getFieldPathElements()->getIterator())) : 'N/A'
));
}
return false;
} catch (ApiException $apiException) {
$this->logger->error(sprintf(
"Google Ads API request failed with status %s and message '%s'.",
$apiException->getStatus(),
$apiException->getBasicMessage()
));
return false;
} catch (\Exception $e) {
$this->logger->error("An unexpected error occurred: " . $e->getMessage());
return false;
}
}
}
Lưu ý:
- Thay thế
V17bằng phiên bản Google Ads API bạn đang sử dụng. - Đảm bảo cấu hình
google_ads_php.inihoặc phương thức tải cấu hình khác hoạt động chính xác. - Xử lý lỗi (try-catch) rất quan trọng để ghi lại và phản hồi khi có vấn đề xảy ra với API (ví dụ: IP không hợp lệ, hết hạn token, lỗi quyền truy cập, vượt giới hạn API).
$customerIdlà ID của tài khoản Google Ads chứa chiến dịch, không phải ID tài khoản MCC (trừ khi bạn đang thao tác trên chính tài khoản MCC).
Bước 5: Tích Hợp Vào Controller CodeIgniter 4
Tạo hoặc sửa một Controller (ví dụ: app/Controllers/AdsHandler.php) để xử lý logic khi có lượt click và gọi Service chặn IP khi cần.
<?php
namespace App\Controllers;
use App\Services\GoogleAdsService; // Import service
use CodeIgniter\Controller;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class AdsHandler extends Controller
{
protected $helpers = []; // Load helpers nếu cần
private LoggerInterface $logger;
private GoogleAdsService $googleAdsService; // Khai báo service
// Thay thế bằng Customer ID và Campaign ID thực tế của bạn
private string $targetCustomerId = 'YOUR_CUSTOMER_ID';
private int $targetCampaignId = YOUR_CAMPAIGN_ID; // Ví dụ: 1234567890
private ?string $loginCustomerId = 'YOUR_LOGIN_CUSTOMER_ID'; // ID tài khoản MCC (nếu có, nếu không thì null)
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->logger = $logger;
// Khởi tạo GoogleAdsService
try {
// Truyền loginCustomerId nếu bạn dùng MCC để quản lý tài khoản con
$this->googleAdsService = new GoogleAdsService($this->loginCustomerId);
} catch (\Exception $e) {
// Xử lý lỗi nghiêm trọng khi không thể khởi tạo service
$this->logger->critical("Failed to initialize GoogleAdsService: " . $e->getMessage());
// Có thể hiển thị trang lỗi hoặc dừng xử lý
// die("Critical error: Could not connect to Google Ads service.");
}
}
/**
* Hàm xử lý khi có lượt click vào link quảng cáo.
*/
public function handleAdClick()
{
$ipAddress = $this->request->getIPAddress();
// --- Logic kiểm tra tần suất click (sử dụng Redis/DB như Bước 3) ---
$isOverThreshold = $this->checkClickFrequency($ipAddress);
// --- Kết thúc logic kiểm tra ---
if ($isOverThreshold) {
$this->logger->info("IP Address {$ipAddress} exceeded click limit. Attempting to block via Google Ads API.");
// Kiểm tra xem service đã khởi tạo thành công chưa
if (!isset($this->googleAdsService)) {
$this->logger->error("GoogleAdsService not initialized. Cannot block IP.");
// Xử lý lỗi (ví dụ: trả về lỗi server)
return $this->response->setStatusCode(500)->setJSON(['status' => 'error', 'message' => 'Service unavailable']);
}
// Gọi hàm chặn IP từ service
$success = $this->googleAdsService->blockIpAddress(
$this->targetCustomerId,
$this->targetCampaignId,
$ipAddress
);
if ($success) {
// Phản hồi thành công (có thể không cần trả về gì cho client)
$this->logger->info("IP {$ipAddress} successfully blocked for campaign {$this->targetCampaignId}.");
// return $this->response->setJSON(['status' => 'success', 'message' => 'IP blocked']);
} else {
// Phản hồi lỗi (có thể không cần trả về gì cho client)
$this->logger->error("Failed to block IP {$ipAddress} for campaign {$this->targetCampaignId}. Check previous logs for details.");
// return $this->response->setStatusCode(500)->setJSON(['status' => 'error', 'message' => 'Failed to block IP']);
}
} else {
$this->logger->debug("IP {$ipAddress} click recorded, within threshold.");
}
// Chuyển hướng người dùng đến trang đích hoặc thực hiện hành động khác
// Ví dụ: return redirect()->to('/landing-page');
// Hoặc chỉ ghi log và không làm gì thêm để không ảnh hưởng trải nghiệm người dùng
return ''; // Trả về response trống nếu không cần hành động gì thêm
}
/**
* Hàm giả lập kiểm tra tần suất click (thay bằng logic thực tế dùng Redis/DB).
* @param string $ipAddress
* @return bool True nếu vượt ngưỡng, False nếu chưa.
*/
private function checkClickFrequency(string $ipAddress): bool
{
// TODO: Implement real click frequency check using Redis or Database (as described in Step 3)
// Ví dụ đơn giản (không dùng trong production):
// $session = session();
// $clicks = $session->get('clicks_' . $ipAddress) ?? [];
// $currentTime = time();
// $clicks = array_filter($clicks, fn($ts) => ($currentTime - $ts) < 60); // Giữ lại click trong 60s
// $clicks[] = $currentTime;
// $session->set('clicks_' . $ipAddress, $clicks);
// return count($clicks) > 3;
$this->logger->debug("Placeholder checkClickFrequency called for IP: {$ipAddress}. Needs implementation.");
// Kết nối Redis và thực hiện logic như trong Bước 3
// ...
return false; // Giả định chưa vượt ngưỡng cho ví dụ
}
}
Bạn cần định tuyến (route) một URL đến phương thức handleAdClick này. URL này nên được sử dụng làm URL đích trong quảng cáo Google Ads của bạn (hoặc là điểm trung gian trước khi chuyển hướng đến trang đích thực tế).
Sơ Đồ Quy Trình Tổng Thể
Mindmap dưới đây tóm tắt luồng hoạt động của giải pháp:
(Request->getIPAddress())"] id2.2["Kiểm tra Tần suất Click (checkClickFrequency)"] id2.2.1["Kết nối Cache/DB (Redis/Memcached/MySQL)"] id2.2.2["Đếm số click của IP trong 1 phút"] id2.2.3["So sánh với ngưỡng (3 lần)"] id2.3["Nếu Vượt Ngưỡng"] id2.3.1["Gọi GoogleAdsService::blockIpAddress()"] id2.3.1.1["Xác thực (OAuth2)"] id2.3.1.2["Khởi tạo GoogleAdsClient"] id2.3.1.3["Tạo IpBlockInfo"] id2.3.1.4["Tạo NegativeCampaignCriterion"] id2.3.1.5["Tạo CampaignCriterionOperation (Create)"] id2.3.1.6["Gọi CampaignCriterionServiceClient->mutateCampaignCriteria()"] id2.3.1.7["Xử lý Kết quả / Lỗi"] id2.3.1.8["Ghi Log (Thành công/Thất bại)"] id2.4["Nếu Chưa Vượt Ngưỡng"] id2.4.1["Ghi nhận lượt click (Cache/DB)"] id2.4.2["Ghi Log (Debug)"] id3["Hoàn tất Xử lý"] id3.1["(Tùy chọn) Chuyển hướng người dùng"] id3.2["(Tùy chọn) Trả về Response"]
Sơ đồ này minh họa các bước chính từ khi người dùng nhấp vào quảng cáo cho đến khi IP có khả năng bị chặn thông qua API nếu tần suất nhấp chuột vượt quá giới hạn.
Đánh Giá Các Khía Cạnh Kỹ Thuật
Biểu đồ radar dưới đây cung cấp đánh giá chủ quan về các khía cạnh khác nhau của giải pháp này. Điểm số càng cao thể hiện mức độ đáp ứng càng tốt.
Giải pháp này đòi hỏi kiến thức về CodeIgniter, Google Ads API và OAuth2 (Độ phức tạp: 6/10). Nó có khả năng mở rộng tốt nếu hạ tầng (Redis/DB) chịu tải được (Khả năng mở rộng: 7/10). Việc sử dụng Redis đảm bảo hiệu năng thời gian thực tốt (Hiệu năng: 8/10). Bảo mật cần được chú trọng, đặc biệt là quản lý credentials (Bảo mật: 7/10). Chi phí liên quan đến việc sử dụng API Google Ads, cần theo dõi quota (Chi phí: 7/10). Việc tách logic vào Service giúp dễ bảo trì (Khả năng bảo trì: 8/10).
Video Hướng Dẫn Loại Trừ IP Thủ Công
Video dưới đây minh họa cách loại trừ địa chỉ IP theo cách thủ công trong giao diện Google Ads. Mặc dù code chúng ta xây dựng tự động hóa quy trình này thông qua API, việc hiểu cách hoạt động trên giao diện người dùng có thể hữu ích:
Cách áp dụng Loại trừ IP trong Google Ads (Giao diện người dùng)
Chức năng chúng ta xây dựng trong CodeIgniter thực hiện một hành động tương tự (thêm IP vào danh sách loại trừ của chiến dịch) nhưng hoàn toàn tự động dựa trên tần suất click.
Các Thành Phần Chính và Vai Trò
Bảng dưới đây tóm tắt các công nghệ và thành phần chính được sử dụng trong giải pháp này:
| Thành Phần | Vai Trò | Ghi Chú |
|---|---|---|
| CodeIgniter 4 | Framework PHP để xây dựng ứng dụng web. | Cung cấp cấu trúc MVC, routing, request/response handling. |
| Redis / Memcached / DB | Lưu trữ và truy vấn tần suất click của IP. | Redis/Memcached được ưu tiên vì tốc độ nhanh. |
| Google Ads API PHP Client Library | Thư viện để tương tác với Google Ads API. | Cung cấp các lớp và phương thức để gọi API dễ dàng. Yêu cầu Composer. |
| OAuth 2.0 Credentials | Xác thực ứng dụng với Google Ads API. | Bao gồm Client ID, Client Secret, Refresh Token, Developer Token. |
GoogleAdsClient |
Đối tượng chính để khởi tạo kết nối và lấy các service client. | Được cấu hình với thông tin xác thực. |
CampaignCriterionServiceClient |
Service client để quản lý các tiêu chí cấp chiến dịch. | Dùng để thực hiện thao tác `mutateCampaignCriteria`. |
IpBlockInfo |
Đối tượng chứa thông tin địa chỉ IP cần chặn. | Thuộc tính `ip_address`. |
NegativeCampaignCriterion |
Đối tượng đại diện cho tiêu chí phủ định cấp chiến dịch. | Kết hợp `IpBlockInfo` với chiến dịch và đánh dấu là `negative`. |
CampaignCriterionOperation |
Đối tượng định nghĩa hành động cần thực hiện (ví dụ: `create`). | Chứa `NegativeCampaignCriterion` cần tạo. |
| CodeIgniter Service (`GoogleAdsService`) | Đóng gói logic gọi API Google Ads. | Giúp tách biệt logic và tái sử dụng mã. |
| CodeIgniter Controller (`AdsHandler`) | Xử lý request đến, gọi logic kiểm tra tần suất và kích hoạt service chặn IP. | Điểm đầu vào của luồng xử lý. |
Giao diện quản lý loại trừ IP thủ công trong Google Ads.
Những Lưu Ý Quan Trọng
- Giới Hạn API và Quota: Google Ads API có giới hạn về số lượng yêu cầu bạn có thể thực hiện trong một khoảng thời gian. Đảm bảo logic của bạn không gọi API quá thường xuyên. Theo dõi hạn mức sử dụng trong Google Cloud Console.
- Xử Lý Lỗi Toàn Diện: Triển khai cơ chế bắt và ghi log lỗi chi tiết từ API (ví dụ: IP không hợp lệ, lỗi xác thực, lỗi quyền, lỗi do vượt giới hạn).
- Bảo Mật Credentials: Không bao giờ lưu trữ thông tin nhạy cảm (Developer Token, OAuth2 credentials) trực tiếp trong mã nguồn. Sử dụng tệp cấu hình an toàn (như `google_ads_php.ini` đặt ngoài web root) hoặc biến môi trường.
- Định Dạng IP: Đảm bảo địa chỉ IP bạn truyền vào hàm `blockIpAddress` là hợp lệ (định dạng IPv4 hoặc IPv6). API sẽ trả lỗi nếu định dạng sai.
- Kiểm Thử Kỹ Lưỡng: Luôn sử dụng tài khoản thử nghiệm (test account) của Google Ads để phát triển và kiểm thử chức năng này trước khi triển khai trên tài khoản thật. Việc chặn IP sai có thể ảnh hưởng tiêu cực đến hiệu quả chiến dịch.
- Xác Nhận REST API Limitation: Như đã đề cập, việc chặn IP không thể thực hiện qua Google Ads REST API. Chỉ có thể thực hiện qua các thư viện client sử dụng gRPC.
- Số Lượng IP Tối Đa: Mặc dù API có thể cho phép thêm nhiều IP, giao diện Google Ads thường có giới hạn (ví dụ: 500 IP loại trừ mỗi chiến dịch). Hãy xem xét giới hạn này và chiến lược quản lý danh sách chặn nếu số lượng IP cần chặn lớn.
Câu Hỏi Thường Gặp (FAQ)
Tôi có thể chặn IP bằng Google Ads REST API không?
Không. Theo xác nhận từ Google và kinh nghiệm cộng đồng, Google Ads REST API không hỗ trợ thao tác thêm hoặc quản lý danh sách chặn IP (IP Exclusions). Bạn bắt buộc phải sử dụng thư viện client chính thức của Google Ads API (như thư viện PHP) hoạt động dựa trên gRPC.
Tôi cần những thông tin xác thực nào để gọi API?
Bạn cần các thông tin sau:
- Developer Token: Lấy từ tài khoản Trung tâm API Google Ads.
- OAuth 2.0 Client ID và Client Secret: Tạo trong Google Cloud Console.
- OAuth 2.0 Refresh Token: Tạo ra sau khi người dùng ủy quyền cho ứng dụng của bạn lần đầu.
- Customer ID: ID của tài khoản Google Ads bạn muốn thao tác.
- Login Customer ID (Tùy chọn): ID của tài khoản MCC nếu bạn quản lý tài khoản con thông qua MCC.
Có giới hạn số lượng IP tôi có thể chặn không?
Giao diện Google Ads thường giới hạn khoảng 500 địa chỉ IP loại trừ cho mỗi chiến dịch. Mặc dù API có thể cho phép thêm nhiều hơn thông qua các thao tác lặp lại hoặc batch, bạn nên xem xét giới hạn thực tế và hiệu quả của việc duy trì danh sách chặn quá lớn. Tham khảo tài liệu Google Ads API mới nhất để biết các giới hạn hiện hành.
Làm cách nào để quản lý thông tin xác thực một cách an toàn?
Tuyệt đối không lưu trữ credentials trực tiếp trong mã nguồn hoặc đẩy lên kho lưu trữ công khai. Các phương pháp tốt bao gồm:
- Sử dụng tệp cấu hình (ví dụ:
google_ads_php.ini) đặt bên ngoài thư mục gốc của web server (web root). - Sử dụng biến môi trường (environment variables) để lưu trữ thông tin nhạy cảm. CodeIgniter 4 hỗ trợ tốt việc sử dụng tệp
.env. - Quản lý quyền truy cập tệp cấu hình một cách chặt chẽ.
Điều gì xảy ra nếu cuộc gọi API chặn IP thất bại?
Hàm blockIpAddress nên được bao bọc trong khối try-catch để xử lý các ngoại lệ có thể xảy ra (GoogleAdsException, ApiException, hoặc các lỗi khác). Khi lỗi xảy ra:
- Ghi lại thông tin lỗi chi tiết vào log của CodeIgniter (bao gồm mã lỗi, thông báo lỗi, vị trí lỗi nếu có).
- Hàm nên trả về
falsehoặc một trạng thái lỗi để nơi gọi hàm biết thao tác không thành công. - Tùy thuộc vào loại lỗi, bạn có thể cân nhắc thực hiện lại yêu cầu sau một khoảng thời gian chờ (với cơ chế exponential backoff), hoặc thông báo cho quản trị viên.
- Không nên hiển thị thông báo lỗi chi tiết của API cho người dùng cuối.
Đề Xuất Tìm Kiếm Liên Quan
- Cách tối ưu hóa các lệnh gọi Google Ads API để tránh vượt giới hạn quota?
- Quản lý thông tin xác thực API an toàn trong ứng dụng CodeIgniter 4 như thế nào?
- Các phương pháp thay thế chặn IP để chống gian lận click trong Google Ads?
- Sử dụng Redis với CodeIgniter 4 để theo dõi sự kiện theo thời gian thực?
Tài liệu tham khảo
Last updated May 5, 2025