您可以使用三種 API,透過程式與授權買家互動:
- Marketplace API:管理交易、競價套裝方案和客戶存取權。
- 即時出價 API:管理出價,包括 QPS 配額、指定目標和廣告素材。
- (已淘汰)Ad Exchange Buyer API II:這個 API 已淘汰。除了與即時出價疑難排解相關的資源之外,所有資源均已停用。
以下是您可以使用授權買家 API 完成的作業範例:
- 存取即時出價帳戶資訊。
- 提交及管理正在審查中的廣告素材。
- 擷取即時出價疑難排解指標。
- 管理授權買家使用者名單。
- 管理預先指定設定。
- 設定 Marketplace 的用戶端存取權。
- 在市集中發掘及管理交易提案。
如果您不熟悉授權買家,請參閱授權買家說明中心和使用者介面,進一步瞭解相關資訊。
快速連結
設定驗證方法
Google API 使用 OAuth 2.0 通訊協定進行驗證及授權。以下說明如何使用 OAuth 2.0 設定即時出價 API 的驗證機制。
本範例使用服務帳戶。如要進一步瞭解存取權控管,請參閱 Google Cloud Identity Access Management 說明文件。
在專案下拉式選單中選取專案,或建立新專案。
在「已啟用的 API」清單中,確認「即時出價 API」已列出。如果未列出這個 API,請按一下「Google API」分頁,搜尋並選取「Real-time Bidding API」,然後按一下「Enable API」。
接著,在左側欄中選取「憑證」。
選取「Create credentials」下拉式選單,然後選擇「Service account key」。
在「Service account」下拉式選單中,選擇「New service account」。
輸入服務帳戶的「名稱」。系統會根據名稱和專案名稱自動產生服務帳戶 ID。
請記下服務帳戶 ID:您需要這組 ID,才能在步驟 11 中透過「授權買方」使用者介面,將存取權授予新服務帳戶。
選擇建議的 JSON 檔案做為「金鑰類型」。
按一下「建立」,系統會將含有帳戶公開/私密金鑰組的 JSON 檔案儲存至「下載」資料夾。將產生的 JSON 檔案保存在安全的地方。
您必須在 Authorized Buyers UI 中授予服務帳戶存取權,才能使用該服務。依序選取「設定」>「帳戶設定」,然後選擇「使用者管理」>「帳戶使用者」,然後按一下「+Service Account」。輸入您在步驟 8 中記下的服務帳戶 ID。這會建立具備服務帳戶角色的新使用者。
請確認有多位使用者擁有雲端專案的管理員存取權,以便您在需要變更權限時使用。
要求 API 存取權
逐步執行 OAuth 2.0 授權流程時,應用程式可以指定範圍,代表其他 Google 帳戶要求存取特定功能。使用下列權限範圍,代表 Authorized Buyers 帳戶取得任何 Authorized Buyers API 的讀取/寫入權限:
- Marketplace API:https://www.googleapis.com/auth/authorized-buyers-marketplace
- 即時出價 API:https://www.googleapis.com/auth/realtime-bidding
- Ad Exchange Buyer API II:https://www.googleapis.com/auth/adexchange.buyer
發出 API 呼叫
以下列出一些範例,協助您使用我們支援的語言開始使用:
Marketplace API
Java
/* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.api.services.samples.authorizedbuyers.marketplace.v1; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace; import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplaceScopes; import com.google.api.services.authorizedbuyersmarketplace.v1.model.Client; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import com.google.auth.oauth2.ServiceAccountCredentials; import java.io.FileInputStream; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; /** * A sample application that authenticates and runs a request against the Authorized Buyers * Marketplace API. */ public class FirstApiRequest { /** * Be sure to specify the name of your application. If the application name is {@code null} or * blank, the application will log a warning. Suggested format is "MyCompany-ProductName/1.0". */ private static final String APPLICATION_NAME = "APPLICATION_NAME_HERE"; // Full path to JSON Key file - include file name. private static final java.io.File JSON_FILE = new java.io.File("INSERT_PATH_TO_JSON_FILE"); // Name of the buyer resource for which the API call is being made. private static final String BUYER_NAME = "INSERT_BUYER_RESOURCE_NAME"; // Global instance of the HTTP transport. private static HttpTransport httpTransport; // Global instance of the JSON factory. private static final JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); public static void main(String[] args) throws Exception { // Create credentials using the JSON key file. GoogleCredentials credentials = null; try (FileInputStream serviceAccountStream = new FileInputStream((JSON_FILE))) { Set<String> scopes = new HashSet<>(AuthorizedBuyersMarketplaceScopes.all()); credentials = ServiceAccountCredentials.fromStream(serviceAccountStream).createScoped(scopes); } catch (IOException ex) { System.out.println("Can't complete authorization step. Did you specify a JSON key file?"); System.out.println(ex); System.exit(1); } HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); httpTransport = GoogleNetHttpTransport.newTrustedTransport(); // Use the credentials to create a client for the API service. AuthorizedBuyersMarketplace marketplaceClient = new AuthorizedBuyersMarketplace.Builder(httpTransport, jsonFactory, requestInitializer) .setApplicationName(APPLICATION_NAME) .build(); // Call the buyers.clients.list method to get a list of clients for the given buyer. List<Client> clients = marketplaceClient.buyers().clients().list(BUYER_NAME).execute().getClients(); if (clients != null && clients.size() > 0) { System.out.printf("Listing of clients associated with buyer \"%s\"%n", BUYER_NAME); for (Client client : clients) { System.out.printf("* Client name: %s\n", client.getName()); } } else { System.out.printf( "No clients were found that were associated with buyer \"%s\"%n.", BUYER_NAME); } } }
Python
#!/usr/bin/python # # Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Sample application that authenticates and makes an API request.""" import pprint from googleapiclient.discovery import build from google.oauth2 import service_account # A Service Account key file can be generated via the Google Developers # Console. KEY_FILE = 'PATH_TO_JSON_KEY_FILE' # Path to Service Account JSON key file. # Authorized Buyers Marketplace API authorization scope. SCOPE = 'https://www.googleapis.com/auth/authorized-buyers-marketplace' VERSION = 'v1' # Version of Authorized Buyers Marketplace API to use. # Name of the buyer resource for which the API call is being made. BUYER_NAME = 'BUYER_RESOURCE_NAME' def main(): # Create credentials using the Service Account JSON key file. credentials = service_account.Credentials.from_service_account_file( KEY_FILE, scopes=[SCOPE]) # Build a client for the authorizedbuyersmarketplace API service. marketplace = build('authorizedbuyersmarketplace', VERSION, credentials=credentials) # Call the buyers.clients.list method to get a list of clients for the # given buyer. request = marketplace.buyers().clients().list(parent=BUYER_NAME) pprint.pprint(request.execute()) if __name__ == '__main__': main()
.NET
/* Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied * See the License for the specific language governing permissions and * limitations under the License. */ using Google.Apis.AuthorizedBuyersMarketplace.v1; using Google.Apis.AuthorizedBuyersMarketplace.v1.Data; using Google.Apis.Auth.OAuth2; using Google.Apis.Json; using Google.Apis.Services; using System; using System.Collections.Generic; namespace Google.Apis.AuthorizedBuyersMarketplace.Examples.v1 { /// <summary> /// Self contained sample to return a list of clients for a given buyer account. /// Primarily used by the Getting Started guide: /// https://developers.google.com/authorized-buyers/apis/getting_started /// /// Note: To run this sample, you will need to configure it as the StartupObject in /// Google.Apis.AuthorizedBuyersMarketplace.Examples.csproj. /// </summary> internal class FirstApiRequest { private static void Main(string[] args) { // See the README.md for details of these fields. // Retrieved from https://console.developers.google.com var ServiceKeyFilePath = "PATH TO JSON KEY FILE HERE"; // Name of the buyer resource for which the API call is being made. var buyerName = "INSERT_BUYER_RESOURCE_NAME_HERE"; // Retrieve credential parameters from the key JSON file. var credentialParameters = NewtonsoftJsonSerializer.Instance .Deserialize<JsonCredentialParameters>( System.IO.File.ReadAllText(ServiceKeyFilePath)); // Create the credentials. var credentialInitializer = new ServiceAccountCredential.Initializer( credentialParameters.ClientEmail) { Scopes = new[] { AuthorizedBuyersMarketplaceService.Scope.AuthorizedBuyersMarketplace } }.FromPrivateKey(credentialParameters.PrivateKey); var oAuth2Credentials = new ServiceAccountCredential(credentialInitializer); // Use the credentials to create a client for the API service. var serviceInitializer = new BaseClientService.Initializer { HttpClientInitializer = oAuth2Credentials, ApplicationName = "FirstAPICall" }; var mkService = new AuthorizedBuyersMarketplaceService(serviceInitializer); // Call the buyers.clients.list method to list clients for the given buyer. BuyersResource.ClientsResource.ListRequest request = mkService.Buyers.Clients.List(buyerName); IList<Client> clients = request.Execute().Clients; foreach (Client client in clients) { Console.WriteLine("* Client name: {0}", client.Name); } Console.ReadLine(); } } }
PHP
<?php /** * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Sample application that authenticates and makes an API request. */ namespace Google\Ads\AuthorizedBuyers\Marketplace\Examples\V1; /** * Provide path to client library. See README.md for details. */ require_once __DIR__ . '/../../vendor/autoload.php'; use Google_Client; use Google_Service_AuthorizedBuyersMarketplace; session_start(); /** * You can retrieve this file from the Google Developers Console. * * See README.md for details. */ $keyFileLocation = "INSERT_PATH_TO_JSON_KEYFILE"; /** * Name of the buyer resource for which the API call is being made. */ $buyerName = "INSERT_BUYER_RESOURCE_NAME"; if ($keyFileLocation === 'INSERT_PATH_TO_JSON_KEYFILE') { print "WARNING: Authorization details not provided!\n"; exit(1); } $client = new Google_Client(); $client->setApplicationName('Authorized Buyers Marketplace API PHP Samples'); $service = new Google_Service_AuthorizedBuyersMarketplace($client); $client->setAuthConfig($keyFileLocation); $client->addScope('https://www.googleapis.com/auth/authorized-buyers-marketplace'); if ($client->isAccessTokenExpired()) { $client->refreshTokenWithAssertion(); } if ($client->getAccessToken()) { // Call the buyers.clients.list method to get a list of clients for the given buyer. $result = $service->buyers_clients->listBuyersClients($buyerName); print "Clients associated with buyer account\n"; if (empty($result['clients'])) { print "No clients found\n"; return; } else { foreach ($result['clients'] as $client) { print_r($client); } } }
小茹
#!/usr/bin/env ruby # Encoding: utf-8 # # Copyright:: Copyright 2022 Google LLC # # License:: Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # # Sample application that authenticates and makes an API request. require 'google/apis/authorizedbuyersmarketplace_v1' require 'googleauth/service_account' # You can download the JSON keyfile used for authentication from the Google # Developers Console. KEY_FILE = 'path_to_key' # Path to JSON file containing your private key. # Name of the buyer resource for which the API call is being made. BUYER_NAME = 'insert_buyer_resource_name' def first_api_request() # Create credentials using the JSON key file. auth_options = { :json_key_io => File.open(KEY_FILE, "r"), :scope => 'https://www.googleapis.com/auth/authorized-buyers-marketplace' } oauth_credentials = Google::Auth::ServiceAccountCredentials.make_creds( options=auth_options ) # Create the service and set credentials marketplace = ( Google::Apis::AuthorizedbuyersmarketplaceV1::AuthorizedBuyersMarketplaceService.new ) marketplace.authorization = oauth_credentials marketplace.authorization.fetch_access_token! begin # Call the buyers.clients.list method to get list of clients for given buyer. clients_list = marketplace.list_buyer_clients(BUYER_NAME) if clients_list.clients.any? puts "Found the following clients for buyer '%s':" % BUYER_NAME clients_list.clients.each do |client| puts "* Client name: #{client.name}" end else puts "No clients were found that were associated with buyer '%s'" % BUYER_NAME end rescue Google::Apis::ServerError => e raise "The following server error occured:\n%s" % e.message rescue Google::Apis::ClientError => e raise "Invalid client request:\n%s" % e.message rescue Google::Apis::AuthorizationError => e raise "Authorization error occured:\n%s" % e.message end end if __FILE__ == $0 begin first_api_request() end end
Real-time Bidding API
Java
以下是使用 Java 使用即時出價 API 的基本範例。
- 建立 Maven 專案
開啟 pom.xml 並新增以下依附元件:
<dependencies> <dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client</artifactId> <version>1.32.2</version> </dependency> <dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-pubsub</artifactId> <version>v1-rev452-1.25.0</version> </dependency> <dependency> <groupId>com.google.apis</groupId> <artifactId>google-api-services-realtimebidding</artifactId> <version>v1-rev20220503-1.32.1</version> </dependency> <dependency> <groupId>com.google.auth</groupId> <artifactId>google-auth-library-oauth2-http</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.9</version> </dependency> <dependency> <groupId>com.google.http-client</groupId> <artifactId>google-http-client-jackson2</artifactId> <version>1.40.1</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.13</version> </dependency> <dependency> <groupId>net.sourceforge.argparse4j</groupId> <artifactId>argparse4j</artifactId> <version>0.9.0</version> </dependency> </dependencies>
- 設定憑證
所有對 API 的呼叫都需要驗證;請使用上述的服務帳戶 JSON 金鑰檔案建立
Credential
。GoogleCredentials credentials = null; try (FileInputStream serviceAccountStream = new FileInputStream((JSON_FILE))) { Set<String> scopes = new HashSet<>(RealTimeBiddingScopes.all()); credentials = ServiceAccountCredentials.fromStream(serviceAccountStream).createScoped(scopes); } catch (IOException ex) { System.out.println("Can't complete authorization step. Did you specify a JSON key file?"); System.out.println(ex); System.exit(1); }
- 建構即時出價 API 的用戶端
接著,您可以使用建構工具模式建立即時出價 API 用戶端:
HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); httpTransport = GoogleNetHttpTransport.newTrustedTransport(); // Use the credentials to create a client for the API service. RealTimeBidding realtimeBidding = new RealTimeBidding.Builder(httpTransport, jsonFactory, requestInitializer) .setApplicationName(APPLICATION_NAME) .build();
- 執行作業
將用戶端例項化並連線至 API 後,即可執行作業。以下程式碼會傳回指定買方的所有廣告素材。
List<Creative> creatives = realtimeBidding .buyers() .creatives() .list(BUYER_NAME) .setView("FULL") .execute() .getCreatives(); if (creatives != null && creatives.size() > 0) { System.out.printf("Listing of creatives associated with buyer '%s'%n", BUYER_NAME); for (Creative creative : creatives) { System.out.printf("* Creative name: %s\n", creative.getName()); } } else { System.out.printf( "No creatives were found that were associated with buyer '%s'%n.", BUYER_NAME); }
如要進一步瞭解如何使用 Java 搭配即時出價 API,請參閱「即時出價 API 範例」中的 README 檔案。
Python
以下舉個簡單的例子,說明如何搭配使用即時出價 API 和 Python。
- 下載並安裝 Google API Python 用戶端
使用 pip 的範例:
$ pip install --upgrade google-api-python-client
- 設定憑證
所有對 API 的呼叫都需要驗證;請使用上述的服務帳戶 JSON 金鑰檔案,將
service_account.Credentials
例項化為例項。credentials = service_account.Credentials.from_service_account_file( KEY_FILE, scopes=[SCOPE])
- 建構即時出價 API 的用戶端
接著,您可以使用已授權的
service_account.Credentials
執行個體建立即時出價 API 用戶端:realtimebidding = build('realtimebidding', VERSION, credentials=credentials)
- 執行作業
將用戶端例項化並連線至 API 後,即可執行作業。下列程式碼會傳回特定買方的所有 廣告素材。
request = realtimebidding.buyers().creatives().list(parent=BUYER_NAME) pprint.pprint(request.execute())
如要進一步瞭解如何使用 Python 搭配 Ad Exchange Buyer API,請參閱 即時出價 API 範例中的 README 檔案。
PHP
以下是基本範例,說明如何使用 PHP 搭配即時出價 API。
- 設定依附元件
如果您尚未安裝,請下載並安裝 Composer,然後建立含有以下內容的 composer.json:
{ "description": "Authorized Buyers Real-Time Bidding API PHP Samples", "require": { "php": ">=7.2", "google/apiclient": "^2.0" }, "require-dev": { "squizlabs/php_codesniffer": "3.*" }, "type": "project", "homepage": "https://github.com/googleads/authorized-buyers-rtb-api-samples/tree/master/php", "license": "Apache-2.0", "authors": [ { "name": "Google", "homepage": "https://github.com/googleads/authorized-buyers-rtb-api-samples/graphs/contributors" } ] }
最後,執行下列指令安裝依附元件程式庫:
composer install
- 設定用戶端
建立
Google_Client
,並使用該物件將Google_Service_RealTimeBidding
例項化。$client = new Google_Client(); $client->setApplicationName('Authorized Buyers Real-time Bidding API PHP Samples'); $service = new Google_Service_RealTimeBidding($client);
- 設定憑證
所有對 API 的呼叫都需要有效的存取權杖。設定用戶端,以便逐步完成 OAuth 2.0 流程。
$client->setAuthConfig($keyFileLocation); $client->addScope('https://www.googleapis.com/auth/realtime-bidding'); if ($client->isAccessTokenExpired()) { $client->refreshTokenWithAssertion(); }
- 執行作業
將用戶端執行個體化並連線至 API 並設定 OAuth 2.0 之後,即可用它來發出 API 呼叫。以下程式碼會傳回特定買方的所有廣告素材:
$result = $service->buyers_creatives->listBuyersCreatives($buyerName, $queryParams); print "Creatives associated with buyer account\n"; if (empty($result['creatives'])) { print "No creatives found\n"; return; } else { foreach ($result['creatives'] as $creative) { print_r($creative); } }
如要進一步瞭解如何使用 Ad Exchange Buyer API 和 PHP,請參閱 即時出價 API 範例中的 README 檔案。
.NET
以下是基本範例,說明如何使用 C# 使用即時出價 API。
- 建立新專案
開啟 Visual Studio Code 並建立新專案。
- 在專案中加入必要的程式庫參照
在專案的 *.csproj 檔案中,為
Google.Apis
、Google.Apis.Auth
、Google.Apis.Core
、Google.Apis.Oauth2.v2
和Google.Apis.RealTimeBidding.v1
新增PackageReference
項目。例如,這可能會如下所示:<ItemGroup> <PackageReference Include="Google.Apis" Version="1.57.0" /> <PackageReference Include="Google.Apis.Auth" Version="1.57.0" /> <PackageReference Include="Google.Apis.Core" Version="1.57.0" /> <PackageReference Include="Google.Apis.Oauth2.v2" Version="1.57.0.1869" /> <PackageReference Include="Google.Apis.Pubsub.v1" Version="1.57.0.2667" /> <PackageReference Condition="!Exists('./Google.Apis.RealTimeBidding.v1.csproj')" Include="Google.Apis.RealTimeBidding.v1" Version="1.57.0.2680" /> <PackageReference Include="log4net" Version="2.0.13" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4" /> <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference> <PackageReference Include="Mono.Options" Version="6.12.0.148" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> </ItemGroup>
如要進一步瞭解這些依附元件,請前往:https://www.nuget.org/packages/。
- 設定憑證
所有 API 呼叫都需要驗證;請使用上述的服務帳戶電子郵件和 JSON 檔案建立
Credential
。var credentialParameters = NewtonsoftJsonSerializer.Instance .Deserialize<JsonCredentialParameters>( System.IO.File.ReadAllText(ServiceKeyFilePath)); // Create the credentials. var credentialInitializer = new ServiceAccountCredential.Initializer( credentialParameters.ClientEmail) { Scopes = new[] { RealTimeBiddingService.Scope.RealtimeBidding } }.FromPrivateKey(credentialParameters.PrivateKey); var oAuth2Credentials = new ServiceAccountCredential(credentialInitializer);
- 建構即時出價 API 的用戶端
然後您可以建立
RealTimeBiddingService
:var serviceInitializer = new BaseClientService.Initializer { HttpClientInitializer = oAuth2Credentials, ApplicationName = "FirstAPICall" }; var realtimebidding = new RealTimeBiddingService(serviceInitializer);
- 執行作業
將用戶端例項化以連線至 API 後,您就可以執行作業。下列程式碼會列出與您的憑證相關聯的特定授權買方買方帳戶的廣告素材。
BuyersResource.CreativesResource.ListRequest request = realtimebidding.Buyers.Creatives.List(buyerName); request.View = BuyersResource.CreativesResource.ListRequest.ViewEnum.FULL; IList<Creative> creatives = request.Execute().Creatives; foreach (Creative creative in creatives) { Console.WriteLine("* Creative name: {0}", creative.Name); }
如要進一步瞭解如何使用 C# 搭配即時出價 API,請參閱 即時出價 API 範例中的 README 檔案。
小茹
以下是基本範例,說明如何使用 Ruby 搭配即時出價 API。
- 下載並安裝 Google API Ruby 用戶端
如果您尚未安裝 Bundler,請下載並安裝該工具,然後建立 Gemfile,並加入以下內容:
source "https://rubygems.org" ruby "2.6.0" gem 'google-apis-pubsub_v1', '0.10.0' gem 'google-apis-realtimebidding_v1', '~> 0.14.0'
最後,執行下列指令安裝依附元件程式庫:
bundle
- 設定憑證
所有 API 呼叫都需要驗證;請使用上述服務帳戶電子郵件和 JSON 檔案建立憑證。
# Create credentials using the JSON key file. auth_options = { :json_key_io => File.open(KEY_FILE, "r"), :scope => 'https://www.googleapis.com/auth/realtime-bidding' } oauth_credentials = Google::Auth::ServiceAccountCredentials.make_creds( options=auth_options )
- 建立 AdExchangeBuyer 的用戶端
接著,您可以使用憑證建立授權的 AdExchange Buyer 用戶端:
# Create the service and set credentials realtimebidding = ( Google::Apis::RealtimebiddingV1::RealtimeBiddingService.new ) realtimebidding.authorization = oauth_credentials realtimebidding.authorization.fetch_access_token!
- 執行作業
將用戶端例項化並連線至 API 後,即可執行作業。以下程式碼會傳回指定買方的所有廣告素材。
# Call the buyers.creatives.list method to get list of creatives for given buyer. creatives_list = realtimebidding.list_buyer_creatives( BUYER_NAME, view: 'FULL') if creatives_list.creatives.any? puts "Found the following creatives for buyer '%s':" % BUYER_NAME creatives_list.creatives.each do |creative| puts "* Creative name: #{creative.name}" end else puts "No creatives were found that were associated with buyer '%s'" % BUYER_NAME end
如要進一步瞭解如何使用 Ruby 搭配即時出價 API,請參閱 即時出價 API 範例中的 README 檔案。
Ad Exchange Buyer API II
Java
/* * Copyright (c) 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.api.services.samples.adexchangebuyer.cmdline.v2_x; import com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient; import com.google.api.services.adexchangebuyer2.v2beta1.AdExchangeBuyerII; import com.google.api.services.adexchangebuyer2.v2beta1.model.AbsoluteDateRange; import com.google.api.services.adexchangebuyer2.v2beta1.model.Client; import com.google.api.services.adexchangebuyer2.v2beta1.model.Date; import com.google.api.services.adexchangebuyer2.v2beta1.model.FilterSet; import com.google.api.services.adexchangebuyer2.v2beta1.model.RealtimeTimeRange; import com.google.api.services.adexchangebuyer2.v2beta1.model.RelativeDateRange; import com.google.api.services.samples.adexchangebuyer.cmdline.BaseSample; import java.io.IOException; import java.util.List; /** * This sample illustrates how to retrieve all Bidder-level Filter Sets. */ public class GetAllBidderLevelFilterSets extends BaseSample { @Override public ClientType getClientType() { return ClientType.ADEXCHANGEBUYERII; } @Override public String getName() { return "Get All Bidder-level Filter Sets."; } @Override public String getDescription() { return "Lists Filter Sets associated with the given Bidder."; } @Override public void execute(AbstractGoogleJsonClient client) throws IOException { AdExchangeBuyerII adXClient = (AdExchangeBuyerII) client; String bidderResourceId = getStringInput("bidderResourceId", "Enter the Bidder's resource ID"); String ownerName = String.format("bidders/%s", bidderResourceId); List<FilterSet> allFilterSets = adXClient.bidders().filterSets().list(ownerName).execute() .getFilterSets(); if (allFilterSets != null && allFilterSets.size() > 0) { System.out.println("========================================"); System.out.printf("Listing of Filter Sets associated with Bidder \"%s\"%n", ownerName); System.out.println("========================================"); for (FilterSet filterSet : allFilterSets) { System.out.printf("* Filter Set name: %s%n", filterSet.getName()); AbsoluteDateRange absDateRange = filterSet.getAbsoluteDateRange(); if(absDateRange != null) { System.out.println("AbsoluteDateRange"); System.out.printf("\tStart date: %s%n", convertDateToString(absDateRange.getStartDate())); System.out.printf("\tEnd date: %s%n", convertDateToString(absDateRange.getEndDate())); } RelativeDateRange relDateRange = filterSet.getRelativeDateRange(); if(relDateRange != null) { Integer offset = relDateRange.getOffsetDays(); System.out.println("RelativeDateRange"); System.out.printf("\tOffset days: %s%n", offset != null ? offset : 0); System.out.printf("\tDuration days: %s%n", relDateRange.getDurationDays()); } RealtimeTimeRange rtTimeRange = filterSet.getRealtimeTimeRange(); if(rtTimeRange != null) { System.out.println("RealtimeTimeRange"); System.out.printf("\tStart timestamp: %s%n", rtTimeRange.getStartTimestamp()); } String timeSeriesGranularity = filterSet.getTimeSeriesGranularity(); if(timeSeriesGranularity != null) { System.out.printf("Time series granularity: %s%n", timeSeriesGranularity); } String format = filterSet.getFormat(); if(format != null) { System.out.printf("\tFormat: %s%n", format); } String environment = filterSet.getEnvironment(); if(environment != null) { System.out.printf("Environment: %s%n", environment); } List<String> platforms = filterSet.getPlatforms(); if(platforms != null) { System.out.println("Platforms:"); for(String platform : platforms) { System.out.printf("\t%s%n", platform); } } List<Integer> sellerNetworkIds = filterSet.getSellerNetworkIds(); if(filterSet.getSellerNetworkIds() != null) { System.out.println("Seller network IDS:"); for(Integer sellerNetworkId : sellerNetworkIds) { System.out.printf("\t%d%n", sellerNetworkId); } } } } else { System.out.printf("No Filter Sets were found associated with Bidder \"%s\"%n", ownerName); } } private String convertDateToString(Date date) { return String.format("%d%02d%02d", date.getYear(), date.getMonth(), date.getDay()); } }
Python
#!/usr/bin/python # # Copyright 2017 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This example lists bidder-level filter sets.""" import argparse import os import pprint import sys sys.path.insert(0, os.path.abspath('..')) from googleapiclient.errors import HttpError import samples_util _OWNER_NAME_TEMPLATE = 'bidders/{bidders_resource_id}' DEFAULT_BIDDER_RESOURCE_ID = 'ENTER_BIDDER_RESOURCE_ID_HERE' def main(ad_exchange_buyer, owner_name): try: # Construct and execute the request. filter_sets = ad_exchange_buyer.bidders().filterSets().list( ownerName=owner_name).execute() print(f'Listing FilterSets for bidder: "{owner_name}".') pprint.pprint(filter_sets) except HttpError as e: print(e) if __name__ == '__main__': parser = argparse.ArgumentParser( description='Creates a bidder-level filter set with the specified options' ) # Required fields. parser.add_argument( '-b', '--bidder_resource_id', default=DEFAULT_BIDDER_RESOURCE_ID, help=('The resource ID of the bidders resource for which the filter ' 'sets were created. This will be used to construct the ownerName ' 'used as a path parameter for filter set requests. For additional ' 'information on how to configure the ownerName path parameter, ' 'see: https://developers.google.com/authorized-buyers/apis/' 'reference/rest/v2beta1/bidders.filterSets/list' '#body.PATH_PARAMETERS.owner_name')) args = parser.parse_args() try: service = samples_util.GetService('v2beta1') except IOError as ex: print(f'Unable to create adexchangebuyer service - {ex}') print('Did you specify the key file in samples_util.py?') sys.exit(1) main(service, _OWNER_NAME_TEMPLATE.format( bidders_resource_id=args.bidder_resource_id))
PHP
<?php /** * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ require_once __DIR__ . '/../../BaseExample.php'; /** * This example illustrates how to retrieve all Bidder-level Filter Sets. */ class ListBidderLevelFilterSets extends BaseExample { /** * @see BaseExample::getInputParameters() */ protected function getInputParameters() { return [ [ 'name' => 'bidderResourceId', 'display' => 'Bidder Resource ID', 'required' => true ] ]; } /** * @see BaseExample::run() */ public function run() { $values = $this->formValues; $ownerName = sprintf( 'bidders/%s', $values['bidderResourceId'] ); $result = $this->service->bidders_filterSets ->listBiddersFilterSets($ownerName); print sprintf( '<h2>Listing Bidder-level Filter Sets for ownerName "%s"</h2>', $ownerName ); if (empty($result['filterSets'])) { print '<p>No Bidder-level Filter Sets found.</p>'; } else { foreach ($result['filterSets'] as $filterSets) { $this->printResult($filterSets); } } } /** * @see BaseExample::getClientType() */ public function getClientType() { return ClientType::AdExchangeBuyerII; } /** * @see BaseExample::getName() */ public function getName() { return 'RTB Troubleshooting: List Bidder-level Filter Sets'; } }
.NET
/* Copyright 2017, Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied * See the License for the specific language governing permissions and * limitations under the License. */ using Google.Apis.AdExchangeBuyerII.v2beta1; using Google.Apis.AdExchangeBuyerII.v2beta1.Data; using Google.Apis.Services; using System; using System.Collections.Generic; namespace Google.Apis.AdExchangeBuyer.Examples.v2_x { /// <summary> /// Retrieves the bidder-level filter sets for the given bidder resource ID. /// </summary> public class ListBidderLevelFilterSets : ExampleBase { /// <summary> /// Main method, to run this code example as a standalone application. /// </summary> /// <param name="args">The command line arguments</param> public static void Main(string[] args) { AdExchangeBuyerIIService service = Utilities.GetV2Service(); ExampleBase example = new ListBidderLevelFilterSets(); Console.WriteLine(example.Description); example.Run(service); } /// <summary> /// Returns a description about the code example. /// </summary> public override string Description { get { return "This code example lists all bidder-level filter sets for the given " + "bidder resource ID."; } } /// <summary> /// Runs the code example. /// </summary> /// <param name="service">An authenticated AdExchangeBuyerIIService</param> public override void Run(BaseClientService service) { AdExchangeBuyerIIService adXService = (AdExchangeBuyerIIService)service; string bidderResourceId = "INSERT_BIDDER_RESOURCE_ID_HERE"; string ownerName = String.Format("bidders/{0}", bidderResourceId); ListFilterSetsResponse response = adXService.Bidders.FilterSets.List(ownerName) .Execute(); Console.WriteLine("========================================\n"); Console.WriteLine("Listing of filter sets associated with owner name \"{0}\"", ownerName); Console.WriteLine("========================================\n"); if (response.FilterSets.Count == 0) { Console.WriteLine("No filter sets found."); } else { foreach (FilterSet filterSet in response.FilterSets) { Console.WriteLine("* Name: {0}", filterSet.Name); AbsoluteDateRange absDateRange = filterSet.AbsoluteDateRange; if (absDateRange != null) { Console.WriteLine("\tAbsoluteDateRange:"); Date startDate = absDateRange.StartDate; Console.WriteLine("\t\tStartDate:"); Console.WriteLine("\t\t\tYear: {0}", startDate.Year); Console.WriteLine("\t\t\tMonth: {0}", startDate.Month); Console.WriteLine("\t\t\tDay: {0}", startDate.Day); Date endDate = absDateRange.EndDate; Console.WriteLine("\t\tEndDate:"); Console.WriteLine("\t\t\tYear: {0}", endDate.Year); Console.WriteLine("\t\t\tMonth: {0}", endDate.Month); Console.WriteLine("\t\t\tDay: {0}", endDate.Day); } RelativeDateRange relDateRange = filterSet.RelativeDateRange; if (relDateRange != null) { Console.WriteLine("\tRelativeDateRange:"); Console.WriteLine("\t\tOffsetDays: {0}", relDateRange.OffsetDays); Console.WriteLine("\t\tDurationDays: {0}", relDateRange.DurationDays); } RealtimeTimeRange rtTimeRange = filterSet.RealtimeTimeRange; if (rtTimeRange != null) { Console.WriteLine("\tRealtimeTimeRange:"); Console.WriteLine("\t\tStartTimestamp: {0}", rtTimeRange.StartTimestamp); } String timeSeriesGranularity = filterSet.TimeSeriesGranularity; if (timeSeriesGranularity != null) { Console.WriteLine("\tTimeSeriesGranularity: {0}", timeSeriesGranularity); } IList<String> formats = filterSet.Formats; if (formats != null) { Console.WriteLine("\tFormats:"); foreach (string format in formats) { Console.WriteLine("\t\t{0}", format); } } String environment = filterSet.Environment; if (environment != null) { Console.WriteLine("\tEnvironment: {0}", environment); } IList<string> platforms = filterSet.Platforms; if (platforms != null) { Console.WriteLine("\tPlatforms:"); foreach (string platform in platforms) { Console.WriteLine("\t\t{0}", platform); } } IList<int?> sellerNetworkIds = filterSet.SellerNetworkIds; if (sellerNetworkIds != null) { Console.WriteLine("\tSellerNetworkIds:"); foreach (int? sellerNetworkId in sellerNetworkIds) { Console.WriteLine("\t\t{0}", sellerNetworkId); } } } } } public override ClientType getClientType() { return ClientType.ADEXCHANGEBUYERII; } } }
小茹
#!/usr/bin/env ruby # Encoding: utf-8 # # Copyright:: Copyright 2017, Google Inc. All Rights Reserved. # # License:: Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # # Lists the filter sets for a given bidder. # # Tags: Bidders.FilterSets.list require 'optparse' require_relative '../samples_util' def list_bidder_level_filter_sets(ad_exchange_buyer, owner_name, page_size) begin response = ad_exchange_buyer.list_bidder_filter_sets( owner_name, page_size: page_size ) unless response.filter_sets.nil? puts 'Found the following filter sets for bidder %s:' % owner_name response.filter_sets.each do |filter_set| puts '* Filter set name: %s' % filter_set.name if !filter_set.absolute_date_range.nil? abs_date_range = filter_set.absolute_date_range start_date = abs_date_range.start_date end_date = abs_date_range.end_date puts "\tAbsolute date range:" puts "\t\tStart date: %s-%s-%s" % [start_date.year, start_date.month, start_date.day] puts "\t\tEnd date: %s-%s-%s" % [end_date.year, end_date.month, end_date.day] end unless filter_set.realtime_time_range.nil? realtime_time_range = filter_set.realtime_time_range puts "\tRealtime time range:" puts "\t\tStart timestamp: %s" % realtime_time_range.start_timestamp end unless filter_set.relative_date_range.nil? relative_date_range = filter_set.relative_date_range puts "\tRelative date range:" puts "\t\tOffset days: %s" % relative_date_range.offset_days puts "\t\tDuration days: %s" % relative_date_range.duration_days end unless filter_set.time_series_granularity.nil? puts "\tTime series granularity: %s" % filter_set.time_series_granularity end unless filter_set.format.nil? puts "\tFormat: %s" % filter_set.format end unless filter_set.environment.nil? puts "\tEnvironment: %s" % filter_set.environment end unless filter_set.platforms.nil? puts "\tPlatforms: %s" % filter_set.platforms.inspect end unless filter_set.seller_network_ids.nil? puts "\tSeller network IDs: %s" % filter_set.seller_network_ids.inspect end end else puts 'No filter sets found for bidder %s.' % owner_name end rescue Google::Apis::ServerError => e raise "The following server error occured:\n%s" % e.message rescue Google::Apis::ClientError => e raise "Invalid client request:\n%s" % e.message rescue Google::Apis::AuthorizationError => e raise "Authorization error occured:\n%s" % e.message end end if __FILE__ == $0 begin # Retrieve the service used to make API requests. service = get_service(ADEXCHANGEBUYER_V2BETA1) rescue ArgumentError => e raise 'Unable to create service, with error message: %s' % e.message rescue Signet::AuthorizationError => e raise ('Unable to create service, was the KEY_FILE in samples_util.rb ' + 'set? Error message: %s') % e.message end # Set options and default values for fields used in this example. options = [ Option.new( 'bidder_resource_id', ('The resource ID of the bidders resource for which the filter ' + 'sets were created. This will be used to construct the ownerName ' + 'used as a path parameter for filter set requests. For additional ' + 'information on how to configure the ownerName path parameter, ' + 'see: https://developers.google.com/authorized-buyers/apis/reference/' + 'rest/v2beta1/bidders.filterSets/list#body.PATH_PARAMETERS.owner_name'), :short_alias => 'b', :required => true, :default_value => nil # Insert default value here. ), Option.new( 'max_page_size', 'The maximum number of entries returned on one result page.', :type => Integer, :short_alias => 'm', :required => true, :default_value => MAX_PAGE_SIZE ) ] # Parse options. parser = Parser.new(options) opts = parser.parse(ARGV) owner_name = 'bidders/%s' % opts['bidder_resource_id'] list_bidder_level_filter_sets(service, owner_name, opts['max_page_size']) end
後續步驟
請參閱背景指南,進一步瞭解範例,以及開發解決方案的可用選項。
設定用戶端程式庫後,請嘗試擴充程式碼範例以符合您的需求。
如要進一步瞭解 API,請參閱您使用的版本的參考說明文件。
如需協助,請前往論壇。
如果應用程式預計要執行即時出價,請參閱 RTB 通訊協定說明文件。
參閱效能提示。
參與問卷調查
請填寫簡短問卷,協助我們改善這份說明文件:告訴我們哪些內容有效,哪些內容遺漏。