Ví dụ

Hướng dẫn này chứa các ví dụ về việc gọi trực tiếp các điểm cuối REST mà không cần sử dụng thư viện ứng dụng.

Điều kiện tiên quyết

Tất cả các mẫu được trình bày ở đây đều được sao chép và dán vào bash shell bằng lệnh curl.

Bạn cũng cần có mã của nhà phát triển, quyền truy cập vào tài khoản thử nghiệm và một tài khoản người quản lý Google Ads có chứa ít nhất một tài khoản khách hàng.

Biến môi trường

Nhập thông tin đăng nhập và mã nhận dạng tài khoản như minh hoạ, sau đó sao chép và dán vào thiết bị đầu cuối để định cấu hình các biến môi trường được dùng trong các ví dụ tiếp theo. Hướng dẫn Uỷ quyền cung cấp hướng dẫn về cách tạo mã truy cập OAuth 2.0.

API_VERSION="20"
DEVELOPER_TOKEN="DEVELOPER_TOKEN"
OAUTH2_ACCESS_TOKEN="OAUTH_ACCESS_TOKEN"
MANAGER_CUSTOMER_ID="MANAGER_CUSTOMER_ID"
CUSTOMER_ID="CUSTOMER_ID"

Mã đối tượng không bắt buộc khác

Một số ví dụ sau đây áp dụng cho ngân sách hoặc chiến dịch hiện có. Nếu bạn có mã nhận dạng của các đối tượng hiện có để sử dụng với những ví dụ này, hãy nhập mã nhận dạng đó như minh hoạ.

BUDGET_ID=BUDGET_ID
CAMPAIGN_ID=CAMPAIGN_ID

Nếu không, hai Mutates - Creates examples sẽ tạo một ngân sách và chiến dịch mới.

Hướng dẫn Sổ tay truy vấn chứa nhiều mẫu báo cáo tương ứng với một số màn hình mặc định của Google Ads và hoạt động với cùng các biến môi trường được dùng trong hướng dẫn này. Công cụ trình tạo truy vấn tương tác cũng là một nguồn tài nguyên hữu ích để tạo truy vấn tuỳ chỉnh một cách tương tác.

Được phân trang

Phương thức search sử dụng tính năng phân trang, với kích thước trang cố định là 10.000 mục và page_token được chỉ định cùng với query.

curl

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
",
"page_token":"${PAGE_TOKEN}"
}'

GAQL

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'
### Truyền phát trực tiếp Phương thức `searchStream` truyền phát trực tiếp tất cả kết quả trong một phản hồi duy nhất, do đó, trường `pageSize` không được hỗ trợ.

curl

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:searchStream" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
"
}'

GAQL

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'

Thay đổi

Bạn có thể gửi nhiều thao tác sửa đổi (create, update hoặc remove) trong một nội dung yêu cầu JSON duy nhất bằng cách điền vào mảng operations.

Tạo

Ví dụ này tạo ra hai ngân sách chiến dịch dùng chung trong một yêu cầu duy nhất.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaignBudgets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  },
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  }
]
}"

Ví dụ tiếp theo sử dụng BUDGET_ID của ngân sách chiến dịch hiện có; bạn có thể sao chép và dán từ đầu ra của bước trước.

BUDGET_ID=BUDGET_ID

Những tài nguyên tham chiếu đến các tài nguyên khác sẽ thực hiện việc này bằng tên tài nguyên. Chiến dịch được tạo trong ví dụ sau đây tham chiếu đến một campaignBudget theo tên tài nguyên có giá trị chuỗi.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'status': 'PAUSED',
      'advertisingChannelType': 'SEARCH',
      'geoTargetTypeSetting': {
        'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
        'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
      },
      'name': 'My Search campaign #${RANDOM}',
      'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/${BUDGET_ID}',
      'targetSpend': {}
    }
  }
]
}"

Nội dung cập nhật

Cập nhật các thuộc tính của đối tượng hiện có bằng các thao tác update. Ví dụ tiếp theo sử dụng một chiến dịch hiện có; bạn có thể sao chép và dán từ đầu ra của bước trước.

CAMPAIGN_ID=CAMPAIGN_ID

Tất cả các bản cập nhật đều yêu cầu trường updateMask, một danh sách được phân tách bằng dấu phẩy gồm những thuộc tính JSON cần có trong yêu cầu, cần được áp dụng dưới dạng một bản cập nhật. Các thuộc tính được liệt kê trong updateMask nhưng không có trong phần nội dung yêu cầu sẽ bị xoá trên một đối tượng. Các thuộc tính không có trong danh sách trong updateMask nhưng có trong nội dung yêu cầu sẽ bị bỏ qua.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'name': 'A changed campaign name #${RANDOM}',
    },
    'updateMask': 'name'
  }
],
}"

Xóa

Các đối tượng sẽ bị xoá bằng cách chỉ định tên tài nguyên của đối tượng đó dưới dạng một thao tác remove.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}'
  }
],
}"

Không thực hiện được một phần

Khi có nhiều thao tác trong một yêu cầu, bạn có thể chỉ định partialFailure. Nếu true, các thao tác thành công sẽ được thực hiện và các thao tác không hợp lệ sẽ trả về lỗi. Nếu là false, tất cả các thao tác trong yêu cầu sẽ thành công nếu và chỉ nếu tất cả đều hợp lệ.

Ví dụ tiếp theo sử dụng một chiến dịch hiện có; bạn có thể sao chép và dán từ đầu ra của Tạo ví dụ.

CAMPAIGN_ID=CAMPAIGN_ID

Yêu cầu sau đây chứa 2 thao tác. Lần đầu tiên, bạn cố gắng thay đổi chiến lược giá thầu của chiến dịch được cung cấp và lần tiếp theo, bạn cố gắng xoá một chiến dịch có mã nhận dạng không hợp lệ. Vì thao tác thứ hai dẫn đến lỗi (mã chiến dịch không hợp lệ) và vì partialFailure được đặt thành false, nên thao tác đầu tiên cũng không thành công và chiến lược giá thầu của chiến dịch hiện tại không được cập nhật.

curl --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'partialFailure': false,
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'manualCpc': {
        'enhancedCpcEnabled': false
      }
    },
    'updateMask': 'manual_cpc.enhanced_cpc_enabled'
  },
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/INVALID_CAMPAIGN_ID'
  }
]
}"

Các thao tác được nhóm

Phương thức googleAds:mutate hỗ trợ gửi các nhóm thao tác với nhiều loại tài nguyên. Bạn có thể gửi nhiều thao tác thuộc nhiều loại để xâu chuỗi một chuỗi các thao tác cần được thực hiện theo nhóm. Tập hợp các thao tác sẽ thành công nếu không có thao tác nào không thành công hoặc tất cả đều không thành công nếu có bất kỳ thao tác đơn lẻ nào không thành công.

Ví dụ này minh hoạ cách tạo ngân sách chiến dịch, chiến dịch, nhóm quảng cáo và quảng cáo cùng nhau dưới dạng một nhóm hành động duy nhất. Mỗi thao tác tiếp theo đều phụ thuộc vào thao tác trước đó. Nếu một thao tác không thành công, thì toàn bộ nhóm thao tác sẽ không thành công.

Các số nguyên âm (-1, -2, -3) được dùng làm phần giữ chỗ trong tên tài nguyên và được điền động trong thời gian chạy bằng kết quả từ chuỗi thao tác.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'mutateOperations': [
  {
    'campaignBudgetOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'name': 'My Campaign Budget #${RANDOM}',
        'deliveryMethod': 'STANDARD',
        'amountMicros': 500000,
        'explicitlyShared': false
      }
    }
  },
  {
    'campaignOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'geoTargetTypeSetting': {
          'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
          'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
        },
        'name': 'My Search campaign #${RANDOM}',
        'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'targetSpend': {}
      }
    }
  },
  {
    'adGroupOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'campaign': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'name': 'My ad group #${RANDOM}',
        'status': 'PAUSED',
        'type': 'SEARCH_STANDARD'
      }
    }
  },
  {
    'adGroupAdOperation': {
      'create': {
        'adGroup': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'status': 'PAUSED',
        'ad': {
          'responsiveSearchAd': {
            'headlines': [
              {
                'pinned_field': 'HEADLINE_1',
                'text': 'An example headline'
              },
              {
                'text': 'Another example headline'
              },
              {
                'text': 'Yet another headline'
              }
            ],
            'descriptions': [
              {
                'text': 'An example description'
              },
              {
                'text': 'Another example description'
              }
            ],
            'path1': 'all-inclusive',
            'path2': 'deals'
          },
          'finalUrls': ['https://www.example.com']
        }
      }
    }
  }
]
}"

Quản lý tài khoản

Bạn có thể tạo tài khoản, liệt kê các tài khoản có thể truy cập và tải tài sản nhị phân lên.

Tạo tài khoản

Tạo tài khoản mới bằng phương thức createCustomerClient. Xin lưu ý rằng URL này yêu cầu mã tài khoản người quản lý thay vì mã tài khoản khách hàng. Một tài khoản khách hàng mới được tạo trong tài khoản người quản lý.

curl f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${MANAGER_CUSTOMER_ID}:createCustomerClient" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'customerClient': {
  'descriptiveName': 'My Client #${RANDOM}',
  'currencyCode': 'USD',
  'timeZone': 'America/New_York'
}
}"

Liệt kê các tài khoản có thể truy cập

Sử dụng một yêu cầu GET đơn giản đối với phương thức listAccessibleCustomers để nhận danh sách các tài khoản Google Ads có thể truy cập bằng mã truy cập OAuth 2.0 đã cho. Không được sử dụng mã tài khoản người quản lý hoặc tài khoản khách hàng trong yêu cầu này.

curl -f --request GET "https://googleads.googleapis.com/v${API_VERSION}/customers:listAccessibleCustomers" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \

Tải nội dung nhị phân lên

Phương thức assets:mutate được dùng để tải lên và quản lý Tài sản. Dữ liệu nhị phân (chẳng hạn như hình ảnh) được mã hoá dưới dạng một chuỗi bằng cách sử dụng phương thức mã hoá base64 tiêu chuẩn có khoảng đệm. Bạn có thể sử dụng phương thức mã hoá base64 tiêu chuẩn hoặc an toàn cho URL, có hoặc không có khoảng đệm.

Ví dụ này mã hoá một GIF 1 pixel để giữ cho mẫu ngắn gọn. Trên thực tế, tải trọng data lớn hơn nhiều.

Sử dụng tiện ích dòng lệnh base64 (một phần của tiện ích cốt lõi GNU) để mã hoá hình ảnh GIF 1 pixel.

base64 1pixel.gif

Giá trị được mã hoá base64 được chỉ định làm thuộc tính data trong một yêu cầu API.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My image asset #${RANDOM}',
      'type': 'IMAGE',
      'imageAsset': {
        'data': 'R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIA'
      }
    }
  }
]
}"