Bạn có thể sử dụng 3 API để tương tác theo cách có lập trình với Người mua được uỷ quyền:
- Marketplace API: Quản lý giao dịch, gói đấu giá và quyền truy cập của ứng dụng khách.
- API đặt giá thầu theo thời gian thực: Quản lý hoạt động đặt giá thầu, bao gồm cả hạn mức QPS, nhắm mục tiêu và mẫu quảng cáo.
- (Không dùng nữa)Ad Exchange Buyer API II: API này không dùng nữa. Tất cả tài nguyên, ngoại trừ những tài nguyên liên quan đến Khắc phục sự cố RTB, đều đã ngừng hoạt động.
Sau đây là một số ví dụ về các tác vụ mà bạn có thể hoàn thành bằng cách sử dụng API Authorized Buyers:
- Truy cập vào thông tin tài khoản đặt giá thầu theo thời gian thực.
- Gửi và quản lý mẫu quảng cáo đang được xem xét.
- Truy xuất các chỉ số khắc phục sự cố đặt giá thầu theo thời gian thực.
- Quản lý danh sách người dùng Authorized Buyers.
- Quản lý cấu hình nhắm mục tiêu trước.
- Định cấu hình quyền truy cập của ứng dụng cho Marketplace.
- Khám phá và quản lý đề xuất về giao dịch trong Marketplace.
Nếu bạn chưa biết về Authorized Buyers, hãy xem Trung tâm trợ giúp của Authorized Buyers và giao diện người dùng để tìm hiểu thêm.
Đường liên kết nhanh
Thiết lập phương thức xác thực
API của Google sử dụng giao thức OAuth 2.0 để xác thực và uỷ quyền. Sau đây là cách thiết lập quy trình xác thực cho API Đặt giá thầu theo thời gian thực bằng OAuth 2.0.
Ví dụ này sử dụng một tài khoản dịch vụ. Hãy xem tài liệu Quản lý danh tính và quyền truy cập của Google Cloud để biết thêm thông tin chi tiết về chế độ kiểm soát quyền truy cập.
Chuyển đến trang API đã bật của Google API Console.
Trong trình đơn thả xuống dự án, hãy chọn một dự án hoặc tạo một dự án mới.
Trong danh sách API đã bật, hãy đảm bảo Real-time Bidding API có trong danh sách. Nếu không thấy API này, hãy nhấp vào thẻ API của Google, tìm kiếm và chọn API Đặt giá thầu theo thời gian thực, rồi nhấp vào Bật API.
Tiếp theo, trong thanh bên ở bên trái, hãy chọn Credentials (Thông tin xác thực).
Chọn trình đơn thả xuống Tạo thông tin xác thực, rồi chọn Khoá tài khoản dịch vụ.
Trong trình đơn thả xuống Tài khoản dịch vụ, hãy chọn Tài khoản dịch vụ mới.
Nhập Tên cho tài khoản dịch vụ. Mã tài khoản dịch vụ được tự động tạo từ tên và tên dự án.
Ghi lại mã tài khoản dịch vụ: bạn cần mã này để cấp quyền truy cập cho tài khoản dịch vụ mới trong giao diện người dùng Authorized Buyers ở bước 11.
Chọn tệp JSON được đề xuất làm Loại khoá.
Nhấp vào Tạo. Tệp JSON chứa cặp khoá công khai/khoá riêng tư của tài khoản sẽ được lưu vào thư mục Tải xuống. Lưu giữ tệp JSON đã tạo ở một nơi an toàn.
Bạn phải cấp quyền truy cập cho tài khoản dịch vụ trong giao diện người dùng Authorized Buyers thì tài khoản đó mới hoạt động. Chọn Cài đặt > Cài đặt tài khoản, sau đó chọn Quản lý người dùng > Người dùng tài khoản rồi nhấp vào +Tài khoản dịch vụ. Nhập mã tài khoản dịch vụ mà bạn đã ghi lại ở bước 8. Thao tác này sẽ tạo một người dùng mới có vai trò tài khoản dịch vụ.
Đảm bảo nhiều người có quyền Quản trị đối với dự án trên đám mây của bạn, trong trường hợp bạn cần thay đổi các quyền.
Yêu cầu quyền truy cập API
Khi thực hiện quy trình cấp phép OAuth 2.0, ứng dụng của bạn có thể chỉ định phạm vi để yêu cầu quyền truy cập vào một số tính năng thay cho các Tài khoản Google khác. Sử dụng các phạm vi sau để có quyền đọc/ghi đối với bất kỳ API Authorized Buyers nào thay mặt cho tài khoản Authorized Buyers:
- Marketplace API: https://www.googleapis.com/auth/authorized-buyers-marketplace
- Real-time Bidding API: https://www.googleapis.com/auth/realtime-bidding
- Ad Exchange Buyer API II: https://www.googleapis.com/auth/adexchange.buyer
Thực hiện lệnh gọi API
Sau đây là một số mẫu mà bạn có thể sử dụng để bắt đầu bằng các ngôn ngữ được hỗ trợ:
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); } } }
Real-time Bidding API
Java
Dưới đây là một ví dụ cơ bản minh hoạ cách sử dụng API Đặt giá thầu theo thời gian thực với Java.
- Tạo một dự án Maven
Mở pom.xml rồi thêm các phần phụ thuộc sau:
<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>
- Thiết lập thông tin đăng nhập
Tất cả lệnh gọi đến API đều yêu cầu xác thực; hãy tạo một
Credentialbằng cách sử dụng Tệp khoá JSON của tài khoản dịch vụ mà chúng ta đã thảo luận ở trên.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); }
- Xây dựng ứng dụng cho API Đặt giá thầu theo thời gian thực
Sau đó, bạn có thể tạo ứng dụng Real-time Bidding API bằng mẫu Trình tạo:
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();
- Thực hiện một thao tác
Sau khi tạo một phiên bản ứng dụng để kết nối với API, bạn có thể thực hiện một thao tác. Đoạn mã sau đây trả về tất cả mẫu quảng cáo của một Người mua nhất định.
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); }
Để biết thêm thông tin chi tiết về cách sử dụng API đặt giá thầu theo thời gian thực với Java, hãy tham khảo tệp README trong các ví dụ về API đặt giá thầu theo thời gian thực.
Python
Sau đây là một ví dụ cơ bản cho thấy cách sử dụng API Đặt giá thầu theo thời gian thực bằng Python.
- Tải xuống và cài đặt Ứng dụng Google API Python
Ví dụ sử dụng pip:
$ pip install --upgrade google-api-python-client
- Thiết lập thông tin đăng nhập
Tất cả lệnh gọi đến API đều yêu cầu xác thực; hãy tạo một thực thể
service_account.Credentialsbằng cách sử dụng tệp khoá JSON của Tài khoản dịch vụ như đã thảo luận ở trên.credentials = service_account.Credentials.from_service_account_file( KEY_FILE, scopes=[SCOPE])
- Tạo một ứng dụng cho Real-time Bidding API
Sau đó, bạn có thể tạo ứng dụng API Đặt giá thầu theo thời gian thực bằng phiên bản
service_account.Credentialsđược uỷ quyền:realtimebidding = build('realtimebidding', VERSION, credentials=credentials)
- Thực hiện một thao tác
Sau khi tạo một phiên bản ứng dụng để kết nối với API, bạn có thể thực hiện một thao tác. Đoạn mã sau đây trả về tất cả mẫu quảng cáo của một Người mua nhất định.
request = realtimebidding.buyers().creatives().list(parent=BUYER_NAME) pprint.pprint(request.execute())
Để biết thêm thông tin chi tiết về cách sử dụng Ad Exchange Buyer API với Python, hãy tham khảo tệp README trong Ví dụ về API đặt giá thầu theo thời gian thực.
PHP
Dưới đây là một ví dụ cơ bản cho thấy cách sử dụng Real-time Bidding API với PHP.
- Thiết lập phần phụ thuộc
Nếu bạn chưa cài đặt, hãy tải xuống và cài đặt Composer, sau đó tạo một composer.json có nội dung như sau:
{ "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" } ] }
Cuối cùng, hãy chạy lệnh sau để cài đặt các thư viện phần phụ thuộc:
composer install - Thiết lập một ứng dụng
Tạo một
Google_Clientvà dùngGoogle_Clientđó để khởi tạoGoogle_Service_RealTimeBidding.$client = new Google_Client(); $client->setApplicationName('Authorized Buyers Real-time Bidding API PHP Samples'); $service = new Google_Service_RealTimeBidding($client);
- Thiết lập thông tin đăng nhập
Tất cả các lệnh gọi đến API đều yêu cầu mã truy cập hợp lệ. Định cấu hình ứng dụng của bạn để thực hiện quy trình OAuth 2.0.
$client->setAuthConfig($keyFileLocation); $client->addScope('https://www.googleapis.com/auth/realtime-bidding'); if ($client->isAccessTokenExpired()) { $client->refreshTokenWithAssertion(); }
- Thực hiện một thao tác
Sau khi tạo một thực thể của ứng dụng để kết nối với API và định cấu hình OAuth 2.0, bạn có thể dùng ứng dụng đó để thực hiện một lệnh gọi API. Đoạn mã sau đây trả về tất cả mẫu quảng cáo của một Người mua nhất định:
$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); } }
Để biết thêm thông tin chi tiết về cách sử dụng Ad Exchange Buyer API với PHP, hãy tham khảo tệp README trong Ví dụ về API đặt giá thầu theo thời gian thực.
.NET
Dưới đây là một ví dụ cơ bản minh hoạ cách sử dụng API Đặt giá thầu theo thời gian thực với C#.
- Tạo dự án mới
Mở Visual Studio Code rồi tạo một dự án mới.
- Thêm các tham chiếu thư viện bắt buộc vào dự án của bạn
Trong tệp *.csproj của dự án, hãy thêm một mục
PackageReferencechoGoogle.Apis,Google.Apis.Auth,Google.Apis.Core,Google.Apis.Oauth2.v2vàGoogle.Apis.RealTimeBidding.v1. Ví dụ: mã này có thể như sau:<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>Bạn có thể tìm thêm thông tin về các phần phụ thuộc này tại: https://www.nuget.org/packages/.
- Thiết lập thông tin đăng nhập
Tất cả các lệnh gọi đến API đều yêu cầu xác thực; hãy tạo một
Credentialbằng cách sử dụng email của Tài khoản dịch vụ và Tệp JSON đã thảo luận ở trên.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);
- Tạo một ứng dụng cho Real-time Bidding API
Sau đó, bạn có thể tạo
RealTimeBiddingService:var serviceInitializer = new BaseClientService.Initializer { HttpClientInitializer = oAuth2Credentials, ApplicationName = "FirstAPICall" }; var realtimebidding = new RealTimeBiddingService(serviceInitializer);
- Thực hiện một thao tác
Sau khi tạo một phiên bản ứng dụng để kết nối với API, bạn có thể thực hiện một thao tác. Đoạn mã sau đây liệt kê các mẫu quảng cáo cho một tài khoản người mua Authorized Buyers được chỉ định liên kết với thông tin đăng nhập của bạn.
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); }
Để biết thêm thông tin chi tiết về cách sử dụng API Đặt giá thầu theo thời gian thực với C#, hãy tham khảo tệp README trong các ví dụ về API Đặt giá thầu theo thời gian thực.
Ruby
Dưới đây là một ví dụ cơ bản cho thấy cách sử dụng Real-time Bidding API với Ruby.
- Tải xuống và cài đặt Ứng dụng Google API Ruby
Nếu bạn chưa cài đặt, hãy tải xuống và cài đặt Bundler, sau đó tạo một Gemfile có nội dung như sau:
source "https://rubygems.org" ruby "2.6.0" gem 'google-apis-pubsub_v1', '0.10.0' gem 'google-apis-realtimebidding_v1', '~> 0.14.0'
Cuối cùng, hãy chạy lệnh sau để cài đặt các thư viện phần phụ thuộc:
bundle - Thiết lập thông tin đăng nhập
Tất cả các lệnh gọi đến API đều yêu cầu xác thực; hãy tạo thông tin đăng nhập bằng cách sử dụng email của Tài khoản dịch vụ và tệp JSON đã thảo luận ở trên.
# 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 )
- Tạo một ứng dụng cho AdExchangeBuyer
Sau đó, bạn có thể tạo ứng dụng AdExchange Buyer được uỷ quyền bằng cách sử dụng thông tin đăng nhập:
# Create the service and set credentials realtimebidding = ( Google::Apis::RealtimebiddingV1::RealtimeBiddingService.new ) realtimebidding.authorization = oauth_credentials realtimebidding.authorization.fetch_access_token!
- Thực hiện một thao tác
Sau khi tạo một phiên bản ứng dụng để kết nối với API, bạn có thể thực hiện một thao tác. Đoạn mã sau đây trả về tất cả mẫu quảng cáo của một Người mua nhất định.
# 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
Để biết thêm thông tin chi tiết về cách sử dụng API Đặt giá thầu theo thời gian thực với Ruby, hãy tham khảo tệp README trong các ví dụ về API Đặt giá thầu theo thời gian thực.
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; } } }
Ruby
#!/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
Các bước tiếp theo
Đọc hướng dẫn cơ bản để tìm hiểu thêm về các mẫu và các lựa chọn có sẵn để phát triển giải pháp của bạn.
Sau khi thiết lập một thư viện ứng dụng, hãy thử mở rộng các mã mẫu để đáp ứng nhu cầu của bạn.
Hãy xem tài liệu tham khảo cho phiên bản mà bạn đang sử dụng để tìm hiểu thêm về API.
Nếu bạn cần trợ giúp, hãy truy cập vào diễn đàn.
Nếu ứng dụng của bạn dự kiến sẽ thực hiện hoạt động đặt giá thầu theo thời gian thực, hãy đọc tài liệu về giao thức RTB.
Xem các mẹo về hiệu suất.
Tham gia cuộc khảo sát
Giúp chúng tôi cải thiện tài liệu này: cho chúng tôi biết những điểm chúng tôi làm tốt và những điểm còn thiếu bằng cách điền thông tin vào bản khảo sát nhanh.