Questa guida è rivolta agli sviluppatori che hanno completato i passaggi prerequisiti e vogliono utilizzare l'API AdMob per ottenere in modo programmatico informazioni sul proprio account AdMob, nonché per generare report sulla rete e sulla mediazione.
Prerequisiti
发出请求
AdMob API 基于 HTTP 和 JSON 构建,因此任何标准 HTTP 客户端都可以向其发送请求并解析响应。但是,[Google API 客户端库][client_library] 具有更好的语言集成和更高的安全性,并且支持发出经过授权的请求。客户端库支持多种编程语言;使用客户端库可以避免手动设置 HTTP 请求和手动解析响应。
创建 OAuth 2.0 凭据后,您便可以开始使用 AdMob API 了。如需使用 OAuth 2.0 请求访问权限,您的应用还需要提供作用域信息。
以下是 OAuth 2.0 范围信息:
范围 | 含义 |
---|---|
https://www.googleapis.com/auth/admob.readonly |
查看所有 AdMob 数据。这可能包括账号信息、广告资源和中介设置、报告以及其他数据。 此类数据不包括敏感数据,例如付款或广告系列详细信息。 |
https://www.googleapis.com/auth/admob.report |
查看广告效果和收入报告。查看发布商 ID、时区和默认货币代码。 |
下面介绍了几种提交首次申请的方法:
Java 客户端库
使用 Java 客户端库的请求
加载客户端密钥文件并生成授权凭据。
首次执行此步骤时,系统会要求您在浏览器中接受授权提示。接受之前,请务必使用可访问 AdMob API 的 Google 账号登录。您的应用将获得授权,能够代表当前登录的账号访问数据。
/** * Attempts to load user credentials from the provided client secrets file and persists data to * the provided data store. * * @param clientSecretsFile The path to the file containing client secrets. * @param dataStoreFactory he data store to use for caching credential information. * @return A {@link Credential} object initialized with user account credentials. */ private static Credential loadUserCredentials( String clientSecretsFile, @Nonnull DataStoreFactory dataStoreFactory) throws CredentialException, IOException, RuntimeException { // Load client secrets JSON file. GoogleClientSecrets clientSecrets = null; try (Reader reader = Files.newBufferedReader(Paths.get(clientSecretsFile), UTF_8)) { clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, reader); } // Set up the authorization code flow. GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder( HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, ADMOB_READONLY) .setDataStoreFactory(dataStoreFactory) .build(); // Authorize and persist credential information to the data store. return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); } /** * Performs all necessary setup steps for running requests against the API. * * @return An initialized {@link AdMob} service object. */ public static AdMob getInstance() throws Exception { Credential credential = authorize(); // Create AdMob client. return new AdMob.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName("admobapi-java-samples") .build(); }
创建授权的 AdMob 客户端。
// Create an AdMob client instance. AdMob admob = new AdMob.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) .setApplicationName("admobapi-java-samples") .build();
获取账号信息。
/* ACCOUNT_NAME should follow the format "accounts/pub-XXXXXXXXXXXXXXXX" * where "pub-XXXXXXXXXXXXXXXX" is your publisher ID * See https://support.google.com/admob/answer/2784578 * for instructions on how to find your publisher ID. */ private static final String ACCOUNT_NAME = "accounts/pub-XXXXXXXXXXXXXXXX"; public static void runExample(AdMob adMob, String accountName) throws Exception { // Get publisher account. PublisherAccount account = adMob.accounts().get(accountName).execute(); // Display publisher account information. System.out.printf( "Publisher Name: %s, Publisher Id: %s, Currency Code: %s, Reporting Time Zone: %s%n", account.getName(), account.getPublisherId(), account.getCurrencyCode(), account.getReportingTimeZone()); }
生成广告联盟报告。
public static void runExample( AdMob adMob, String accountName, GenerateNetworkReportRequest request) throws Exception { // Get network report. InputStream response = adMob .accounts() .networkReport() .generate(accountName, request) .executeAsInputStream(); List<GenerateNetworkReportResponse> result = Arrays.asList( new JsonObjectParser(Utils.getDefaultJsonFactory()) .parseAndClose( response, StandardCharsets.UTF_8, GenerateNetworkReportResponse[].class)); // Print each record in the response stream. for (GenerateNetworkReportResponse record : result) { System.out.printf("%s%n", record); } } public static GenerateNetworkReportRequest getNetworkReportRequest() { /* AdMob API only supports the account default timezone and "America/Los_Angeles", see * https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.networkReport/generate * for more information. */ String timeZone = "America/Los_Angeles"; Clock clock = Clock.system(ZoneId.of(timeZone)); // Specify date range. Date startDate = DateUtils.daysBeforeNow(clock, 30); Date endDate = DateUtils.today(clock); DateRange dateRange = new DateRange().setStartDate(startDate).setEndDate(endDate); // Specify metrics. ImmutableList<String> metrics = ImmutableList.of("IMPRESSIONS", "MATCH_RATE"); // Specify dimensions. ImmutableList<String> dimensions = ImmutableList.of("FORMAT", "AD_UNIT"); // Create network report specification. NetworkReportSpec reportSpec = new NetworkReportSpec() .setDateRange(dateRange) .setTimeZone(timeZone) .setMetrics(metrics) .setDimensions(dimensions); // Create network report request. return new GenerateNetworkReportRequest().setReportSpec(reportSpec); }
生成中介报告。
public static void runExample( AdMob adMob, String accountName, GenerateMediationReportRequest request) throws Exception { // Get mediation report. InputStream response = adMob .accounts() .mediationReport() .generate(accountName, request) .executeAsInputStream(); List<GenerateMediationReportResponse> result = Arrays.asList( new JsonObjectParser(Utils.getDefaultJsonFactory()) .parseAndClose( response, StandardCharsets.UTF_8, GenerateMediationReportResponse[].class)); // Print each record in the response stream. for (GenerateMediationReportResponse record : result) { System.out.printf("%s%n", record); } } public static GenerateMediationReportRequest getMediationReportRequest() { /* AdMob API only supports the account default timezone and "America/Los_Angeles", see * https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.mediationReport/generate * for more information. */ String timeZone = "America/Los_Angeles"; Clock clock = Clock.system(ZoneId.of(timeZone)); // Specify date range. Date startDate = DateUtils.daysBeforeNow(clock, 30); Date endDate = DateUtils.today(clock); DateRange dateRange = new DateRange().setStartDate(startDate).setEndDate(endDate); // Specify metrics. ImmutableList<String> metrics = ImmutableList.of("CLICKS", "ESTIMATED_EARNINGS"); // Specify dimensions. ImmutableList<String> dimensions = ImmutableList.of("APP", "AD_SOURCE", "COUNTRY"); // Specify sorting conditions. List<MediationReportSpecSortCondition> sortConditions = new ArrayList<MediationReportSpecSortCondition>(); sortConditions.add( new MediationReportSpecSortCondition().setOrder("ASCENDING").setMetric("CLICKS")); // Specify dimension filters. ImmutableList<String> countryList = ImmutableList.of("CA", "US"); StringList dimensionFilterMatches = new StringList().setValues(countryList); List<MediationReportSpecDimensionFilter> dimensionFilters = new ArrayList<>(); dimensionFilters.add( new MediationReportSpecDimensionFilter() .setDimension("COUNTRY") .setMatchesAny(dimensionFilterMatches)); // Create mediation report specification. MediationReportSpec reportSpec = new MediationReportSpec() .setDateRange(dateRange) .setTimeZone(timeZone) .setMetrics(metrics) .setDimensions(dimensions) .setDimensionFilters(dimensionFilters) .setSortConditions(sortConditions); // Create mediation report request. return new GenerateMediationReportRequest().setReportSpec(reportSpec); }
列出应用。
// Defines maximum size page to retrieve. A smaller page size will require more API requests, see // inventory quota limits at https://developers.google.com/admob/api/quotas. private static final Integer PAGE_SIZE = 1000; public static void runExample(AdMob adMob) throws Exception { ListAppsResponse response; String nextPageToken = null; do { // Create and execute the apps list request. response = adMob .accounts() .apps() .list(ACCOUNT_NAME) .setPageSize(PAGE_SIZE) .setPageToken(nextPageToken) .execute(); // Display apps. List<App> apps = response.getApps(); for (App app : apps) { AppLinkedAppInfo linkedAppInfo = app.getLinkedAppInfo(); System.out.printf( "App Name: %s, " + "App ID: %s, " + "App Platform: %s, " + "App Store ID: %s, " + "App Store Display Name: %s, " + "App Manual Info: %s%n", app.getName(), app.getAppId(), app.getPlatform(), linkedAppInfo == null ? "" : linkedAppInfo.getAppStoreId(), linkedAppInfo == null ? "" : linkedAppInfo.getDisplayName(), app.getManualAppInfo().getDisplayName()); } // Update the next page token. nextPageToken = response.getNextPageToken(); } while (nextPageToken != null); }
列出广告单元。
// Defines maximum size page to retrieve. A smaller page size will require more API requests, see // inventory quota limits at https://developers.google.com/admob/api/quotas. private static final Integer PAGE_SIZE = 1000; public static void runExample(AdMob adMob) throws Exception { ListAdUnitsResponse response; String nextPageToken = null; do { // Create and execute the ad units list request. response = adMob .accounts() .adUnits() .list(ACCOUNT_NAME) .setPageSize(PAGE_SIZE) .setPageToken(nextPageToken) .execute(); // Display ad units. List<AdUnit> adUnits = response.getAdUnits(); for (AdUnit adUnit : adUnits) { System.out.printf( "Ad Unit Display Name: %s, " + "Ad Unit Name: %s, " + "Ad Unit ID: %s, " + "Ad Unit Format: %s, " + "Ad Unit App ID: %s, " + "Ad Unit Ad Types: %s%n", adUnit.getDisplayName(), adUnit.getName(), adUnit.getAdUnitId(), adUnit.getAdFormat(), adUnit.getAppId(), adUnit.getAdTypes()); } // Update the next page token. nextPageToken = response.getNextPageToken(); } while (nextPageToken != null); }
PHP 客户端库
使用 PHP 客户端库的请求
加载客户端密钥文件,然后创建已获授权的 AdMob 客户端。
第一次执行此步骤时,系统会在浏览器中提示您接受授权。接受之前,请务必使用可访问 AdMob API 的 Google 账号登录。您的应用将获得授权,能够代表当前登录的账号访问数据。
// Create an AdMob Client. $client = new Google_Client(); $client->addScope('https://www.googleapis.com/auth/admob.readonly'); $client->setApplicationName('AdMob API PHP Quickstart'); $client->setAccessType('offline'); // Be sure to replace the content of client_secrets.json with your developer // credentials. $client->setAuthConfig('client_secrets.json'); // Create the URL for the authorization prompt. $authUrl = $client->createAuthUrl(); // Once the authorization prompt has been accepted, exchange the // authorization code for an access and refresh token. $client->authenticate($_GET['code']); $client->getAccessToken();
创建 AdMob service 对象。
// Create an AdMob service object on which to run the requests. $service = new Google_Service_AdMob($client);
获取账号信息。
// Get account. $result = $service->accounts->get($accountName); // Print account information. if (!empty($result)) { printf( " Account Name: '%s' \n Publisher Id: '%s' \n Currency Code: '%s' \n Reporting Time Zone: '%s' \n", $result->getName(), $result->getPublisherId(), $result->getCurrencyCode(), $result->getReportingTimezone() ); } else { print "No accounts found.\n"; }
生成广告联盟报告。
/** * Generates a network report. * * @param $service Google_Service_AdMob AdMob service object on which to * run the requests. * @param account_name which follows the format "accounts/pub-XXXXXXXXXXXXXXXX". */ public static function run($service, $accountName) { $separator = str_repeat('=', 80) . "\n"; print $separator; print "Get Network Report\n"; print $separator; // Generate network report. $networkReportRequest = self::createNetworkReportRequest(); $networkReportResponse = $service->accounts_networkReport->generate( $accountName, $networkReportRequest ); // Convert network report response to a simple object. $networkReportResponse = $networkReportResponse->tosimpleObject(); // Print each record in the report. if (!empty($networkReportResponse)) { foreach ($networkReportResponse as $record) { printf("'%s' \n", json_encode($record)); } } else { print "No report found.\n"; } print "\n"; } /** * Generates a network report request. */ public static function createNetworkReportRequest() { /* * AdMob API only supports the account default timezone and * "America/Los_Angeles", see * https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.mediationReport/generate * for more information. */ $startDate = DateUtils::oneWeekBeforeToday(); $endDate = DateUtils::today(); // Specify date range. $dateRange = new \Google_Service_AdMob_DateRange(); $dateRange->setStartDate($startDate); $dateRange->setEndDate($endDate); // Create network report specification. $reportSpec = new \Google_Service_AdMob_NetworkReportSpec(); $reportSpec->setMetrics(['IMPRESSIONS', 'MATCH_RATE']); $reportSpec->setDimensions(['FORMAT', 'AD_UNIT']); $reportSpec->setDateRange($dateRange); // Create network report request. $networkReportRequest = new \Google_Service_AdMob_GenerateNetworkReportRequest(); $networkReportRequest->setReportSpec($reportSpec); return $networkReportRequest; }
生成中介报告。
/** * Generates a mediation report. * * @param $service Google_Service_AdMob AdMob service object on which to * run the requests. * @param account_name which follows the format "accounts/pub-XXXXXXXXXXXXXXXX". */ public static function run($service, $accountName) { $separator = str_repeat('=', 80) . "\n"; print $separator; print "Get Mediation Report\n"; print $separator; // Generate mediation report. $mediationReportRequest = self::createMediationReportRequest(); $mediationReportResponse = $service->accounts_mediationReport->generate( $accountName, $mediationReportRequest ); // Convert mediation report response to a simple object. $mediationReportResponse = $mediationReportResponse->tosimpleObject(); // Print each record in the report. if (!empty($mediationReportResponse)) { foreach ($mediationReportResponse as $record) { printf("'%s' \n", json_encode($record)); } } else { print "No report found.\n"; } print "\n"; } /** * Generates a mediation report request. */ public static function createMediationReportRequest() { /* * AdMob API only supports the account default timezone and * "America/Los_Angeles", see * https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.mediationReport/generate * for more information. */ $startDate = DateUtils::oneWeekBeforeToday(); $endDate = DateUtils::today(); // Specify date range. $dateRange = new \Google_Service_AdMob_DateRange(); $dateRange->setStartDate($startDate); $dateRange->setEndDate($endDate); // Specify sorting conditions. $sortConditions = new \Google_Service_AdMob_MediationReportSpecSortCondition(); $sortConditions->setOrder('ASCENDING'); $sortConditions->setMetric('CLICKS'); // Specify dimension filters. $countries = new \Google_Service_AdMob_StringList(); $countries->setValues(['CA', 'US']); $dimensionFilterMatches = new \Google_Service_AdMob_MediationReportSpecDimensionFilter(); $dimensionFilterMatches->setDimension('COUNTRY'); $dimensionFilterMatches->setMatchesAny($countries); // Create mediation report specification. $reportSpec = new \Google_Service_AdMob_MediationReportSpec(); $reportSpec->setMetrics(['CLICKS', 'ESTIMATED_EARNINGS']); $reportSpec->setDimensions(['APP', 'AD_SOURCE', 'COUNTRY']); $reportSpec->setDateRange($dateRange); $reportSpec->setDimensionFilters($dimensionFilterMatches); $reportSpec->setSortConditions($sortConditions); // Create mediation report request. $mediationReportRequest = new \Google_Service_AdMob_GenerateMediationReportRequest(); $mediationReportRequest->setReportSpec($reportSpec); return $mediationReportRequest; }
列出应用。
// Create the page token variable. $pageToken = ''; $optParams['pageSize'] = $maxPageSize; do { $optParams['pageToken'] = $pageToken; // Get list of apps. $response = $service->accounts_apps->listAccountsApps($accountName, $optParams); $apps = $response->getApps(); // Print list of apps. if (!empty($apps)) { foreach ($apps as $app) { if(!empty($app->getLinkedAppInfo())){ $appStoreId = $app->getLinkedAppInfo()->getAppStoreId(); $displayName = $app->getLinkedAppInfo()->getDisplayName(); } else { $appStoreId = ''; $displayName = ''; } printf( "App Name: '%s' \n" ."App ID: '%s' \n" ."App Platform: '%s' \n" ."App Store ID: '%s' \n" ."App Store Display Name: '%s' \n" ."App Display Name: '%s' \n\n", $app->getName(), $app->getAppId(), $app->getPlatform(), $appStoreId, $displayName, $app->getManualAppInfo()->getDisplayName(), ); } } $pageToken = $response->getNextPageToken(); } while ($pageToken);
列出广告单元。
// Create the page token variable. $pageToken = ''; $optParams['pageSize'] = $maxPageSize; do { $optParams['pageToken'] = $pageToken; // Get list of ad units. $response = $service->accounts_adUnits->listAccountsAdUnits($accountName, $optParams); $adUnits = $response->adUnits; // Print list of ad units. if (!empty($adUnits)) { foreach ($adUnits as $adUnit) { printf( "Ad Unit Display Name: '%s' \n" ."Ad Unit Name: '%s' \n" ."Ad Unit ID: '%s' \n" ."Ad Unit Format: '%s' \n" ."Ad Unit App ID: '%s' \n" ."Ad Unit Ad Types: '%s' \n\n", $adUnit->getDisplayName(), $adUnit->getName(), $adUnit->getAdUnitId(), $adUnit->getAdFormat(), $adUnit->getAppId(), json_encode($adUnit->getAdTypes()), ); } } $pageToken = $response->getNextPageToken(); } while ($pageToken);
Python 客户端库
使用 Python 客户端库发出请求
加载客户端密钥文件并生成授权凭据。
第一次执行此步骤时,系统会在浏览器中提示您接受授权。接受之前,请务必使用可访问 AdMob API 的 Google 账号登录。您的应用将获得授权,能够代表当前登录的账号访问数据。
PORT = 8080 REDIRECT_URI = f"http://127.0.0.1:{PORT}" # This variable specifies the name of a file that contains the OAuth 2.0 # information for this application, including its client_id and client_secret. CLIENT_SECRETS_FILE = "client_secrets.json" # Default OAuth 2.0 access parameters. # # These parameters allow for full read access to the authenticated user's AdMob # account and requires requests to use an SSL connection. API_NAME = "admob" API_VERSION = "v1" API_SCOPE = "https://www.googleapis.com/auth/admob.readonly" # Store refresh tokens in a local disk file. This file contains sensitive # authorization information. TOKEN_FILE = 'token.pickle' def load_user_credentials(): # Name of a file containing the OAuth 2.0 information for this # application, including client_id and client_secret, which are found # on the Credentials tab on the Google Developers Console. client_secrets = os.path.join(os.path.dirname(__file__), CLIENT_SECRETS_FILE) return client_secrets # Authenticate user and create AdMob Service Object. def authenticate( api_name=API_NAME, api_version=API_VERSION, api_scopes=[API_SCOPE], ): """Authenticates a user and creates a Google API Service Object. Args: api_name: Google API name as shown in the API discovery doc. Defaults to the AdMob API. api_version: Google API version as shown in the API discovery doc. Defaults to v1. api_scopes: scope(s) to authenticate with oauth2 flow to access the APIs. Defaults to https://www.googleapis.com/auth/admob.readonly. Returns: A Google API Service Object that is authenticated with the user using either a client_secrets file or previously stored access and refresh tokens. By default, returns the AdMob API service object. """ # The TOKEN_FILE stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists(TOKEN_FILE): with open(TOKEN_FILE, 'rb') as token: credentials = pickle.load(token) if credentials and credentials.expired and credentials.refresh_token: credentials.refresh(Request()) # If there are no valid stored credentials, authenticate using the # client_secrets file. else: client_secrets = load_user_credentials() flow = Flow.from_client_secrets_file(client_secrets, scopes=api_scopes) flow.redirect_uri = REDIRECT_URI # Create an anti-forgery state token as described here: # https://developers.google.com/identity/protocols/OpenIDConnect#createxsrftoken passthrough_val = hashlib.sha256(os.urandom(1024)).hexdigest() # Redirect the user to auth_url on your platform. authorization_url, state = flow.authorization_url( access_type="offline", state=passthrough_val, included_granted_scopes="true") # Prints the authorization URL so you can paste into your browser. In a # typical web application you would redirect the user to this URL, and they # would be redirected back to "redirect_url" provided earlier after # granting permission. print("Paste this URL into your browser: ") print(authorization_url) print(f"\nWaiting for authorization and callback to: {REDIRECT_URI}...") # Retrieves an authorization code by opening a socket to receive the # redirect request and parsing the query parameters set in the URL. code = _get_authorization_code(passthrough_val) # Pass the code back into the OAuth module to get a refresh token. flow.fetch_token(code=code) refresh_token = flow.credentials.refresh_token credentials = flow.credentials print(f"\nYour refresh token is: {refresh_token}\n") # Save the credentials for the next run. with open(TOKEN_FILE, "wb") as token: pickle.dump(credentials, token) # Build the Google API service stub. service = build(api_name, api_version, credentials=credentials) return service def _get_authorization_code(passthrough_val): """Opens a socket to handle a single HTTP request containing auth tokens. Args: passthrough_val: an anti-forgery token used to verify the request received by the socket. Returns: a str access token from the Google Auth service. """ # Open a socket at localhost:PORT and listen for a request sock = socket.socket() sock.bind(("localhost", PORT)) sock.listen(1) connection, address = sock.accept() data = connection.recv(1024) # Parse the raw request to retrieve the URL query parameters. params = _parse_raw_query_params(data) try: if not params.get("code"): # If no code is present in the query params then there will be an # error message with more details. error = params.get("error") message = f"Failed to retrieve authorization code. Error: {error}" raise ValueError(message) elif params.get("state") != passthrough_val: message = "State token does not match the expected state." raise ValueError(message) else: message = "Authorization code was successfully retrieved." except ValueError as error: print(error) sys.exit(1) finally: response = ("HTTP/1.1 200 OK\n" "Content-Type: text/html\n\n" f"<b>{message}</b>" "<p>Please check the console output.</p>\n") connection.sendall(response.encode()) connection.close() return params.get("code") def _parse_raw_query_params(data): """Parses a raw HTTP request to extract its query params as a dict. Note that this logic is likely irrelevant if you're building OAuth logic into a complete web application, where response parsing is handled by a framework. Args: data: raw request data as bytes. Returns: a dict of query parameter key value pairs. """ # Decode the request into a utf-8 encoded string decoded = data.decode("utf-8") # Use a regular expression to extract the URL query parameters string match = re.search("GET\s\/\?(.*) ", decoded) params = match.group(1) # Split the parameters to isolate the key/value pairs pairs = [pair.split("=") for pair in params.split("&")] # Convert pairs to a dict to make it easy to access the values return {key: val for key, val in pairs}
创建 AdMob service 对象。
// Create an AdMob service object on which to run the requests. admob = build('admob', 'v1', credentials=credentials)
获取账号信息。
# Set the 'PUBLISHER_ID' which follows the format "pub-XXXXXXXXXXXXXXXX". # See https://support.google.com/admob/answer/2784578 # for instructions on how to find your publisher ID. PUBLISHER_ID = 'pub-XXXXXXXXXXXXXXXX' def get_account(service, publisher_id): """Gets and prints an AdMob account. Args: service: An AdMob Service Object. publisher_id: An ID that identifies the publisher. """ # Execute the request. response = service.accounts().get( name='accounts/{}'.format(publisher_id)).execute() # Print the response. print('Name: ' + response['name']) print('Publisher ID: ' + response['publisherId']) print('Currency code: ' + response['currencyCode']) print('Reporting time zone: ' + response['reportingTimeZone'])
生成广告联盟报告。
# Set date range. AdMob API only supports the account default timezone and # "America/Los_Angeles", see # https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.networkReport/generate # for more information. date_range = { 'start_date': {'year': 2020, 'month': 1, 'day': 1}, 'end_date': {'year': 2020, 'month': 3, 'day': 30} } # Set dimensions. dimensions = ['DATE', 'APP', 'PLATFORM', 'COUNTRY'] # Set metrics. metrics = ['ESTIMATED_EARNINGS', 'AD_REQUESTS', 'MATCHED_REQUESTS'] # Set sort conditions. sort_conditions = {'dimension': 'DATE', 'order': 'DESCENDING'} # Set dimension filters. dimension_filters = { 'dimension': 'COUNTRY', 'matches_any': { 'values': ['US', 'CA'] } } # Create network report specifications. report_spec = { 'date_range': date_range, 'dimensions': dimensions, 'metrics': metrics, 'sort_conditions': [sort_conditions], 'dimension_filters': [dimension_filters] } # Create network report request. request = {'report_spec': report_spec} # Execute network report request. response = service.accounts().networkReport().generate( parent='accounts/{}'.format(publisher_id), body=request).execute() # Display responses. for report_line in response: print(report_line) print()
生成中介报告。
# Set date range. AdMob API only supports the account default timezone and # "America/Los_Angeles", see # https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.networkReport/generate # for more information. date_range = { 'start_date': {'year': 2020, 'month': 1, 'day': 1}, 'end_date': {'year': 2020, 'month': 3, 'day': 30} } # Set dimensions. dimensions = ['DATE', 'APP', 'PLATFORM', 'COUNTRY'] # Set metrics. metrics = ['ESTIMATED_EARNINGS', 'AD_REQUESTS', 'MATCHED_REQUESTS'] # Set sort conditions. sort_conditions = {'dimension': 'DATE', 'order': 'DESCENDING'} # Set dimension filters. dimension_filters = { 'dimension': 'COUNTRY', 'matches_any': { 'values': ['US', 'CA'] } } # Create mediation report specifications. report_spec = { 'date_range': date_range, 'dimensions': dimensions, 'metrics': metrics, 'sort_conditions': [sort_conditions], 'dimension_filters': [dimension_filters] } # Create mediation report request. request = {'report_spec': report_spec} # Execute mediation report request. response = service.accounts().mediationReport().generate( parent='accounts/{}'.format(publisher_id), body=request).execute() # Display responses. for report_line in response: print(report_line) print()
列出应用。
next_page_token = '' while True: # Execute the request. response = service.accounts().apps().list( pageSize=PAGE_SIZE, pageToken=next_page_token, parent='accounts/{}'.format(publisher_id)).execute() # Check if the response is empty. if not response: break # Print the result. apps = response['apps'] for app in apps: print('App ID: ' + app['appId']) print('App Platform: ' + app['platform']) print('App Name: ' + app['name']) if 'linkedAppInfo' in app: linked_app_info = app['linkedAppInfo'] print('App Store ID: ' + linked_app_info['appStoreId']) if 'displayName' in linked_app_info: print('App Store Display Name: ' + linked_app_info['displayName']) if 'manualAppInfo' in app: manual_app_info = app['manualAppInfo'] print('App Manual Info: ' + manual_app_info['displayName']) if 'nextPageToken' not in response: break # Update the next page token. next_page_token = response['nextPageToken']
列出广告单元。
next_page_token = '' while True: # Execute the request. response = service.accounts().adUnits().list( pageSize=PAGE_SIZE, pageToken=next_page_token, parent='accounts/{}'.format(publisher_id)).execute() # Check if the response is empty. if not response: break # Print the result. ad_units = response['adUnits'] for ad_unit in ad_units: print('Ad Unit Display Name: ' + ad_unit['displayName']) print('Ad Unit Name: ' + ad_unit['name']) print('Ad Unit ID: ' + ad_unit['adUnitId']) print('Ad Unit Format: ' + ad_unit['adFormat']) print('Ad Unit ID: ' + ad_unit['appId']) if 'adTypes' in ad_unit: print('Ad Unit Format: ' + ', '.join(ad_unit['adTypes'])) if 'nextPageToken' not in response: break # Update the next page token. next_page_token = response['nextPageToken']
curl(命令行)
使用 curl 的请求
加载客户端密钥文件并生成授权凭据。
第一次执行此步骤时,系统会在浏览器中提示您接受授权。接受之前,请务必使用可访问 AdMob API 的 Google 账号登录。您的应用将获得授权,能够代表当前登录的账号访问数据。
对于身份验证和授权,我们建议使用 oauth2l,这是一款使用 Google OAuth 2.0 的简单命令行工具。安装 oauth2l 并运行以下命令,将 path_to_credentials_json 替换为您在注册云应用时下载的
credentials.json
文件所在的路径。首次运行时,该命令将引导您完成 OAuth 2.0 授权流程。后续运行则自动刷新令牌。oauth2l header --json path_to_credentials_json \ https://www.googleapis.com/auth/admob.readonly
获取账号信息。
将 pub-XXXXXXXXXXXXXXXX 替换为您的发布商 ID,以获取 AdMob 账号信息。请参阅相关说明,了解如何查找您的发布商 ID。
curl -X GET https://admob.googleapis.com/v1/accounts/pub-XXXXXXXXXXXXXXXX \ -H "$(oauth2l header --json path_to_credentials_json \ https://www.googleapis.com/auth/admob.readonly)"
示例响应:
{ "account": [ { "publisherId": "pub-XXXXXXXXXXXXXXXX", "name:": "accounts/pub-XXXXXXXXXXXXXXXX", "reportingTimeZone": "Europe/Paris", "currencyCode": "EUR" } ] }
生成广告联盟报告。
您可以通过调用
networkReport:generate
方法生成广告联盟报告。在请求 URI 中,加入获取账号信息步骤中接收到的publisherId
,例如v1/accounts/pub-XXXXXXXXXXXXXXXX/networkReport:generate
。然后,使用以下命令生成广告联盟报告:
curl -X POST \ https://admob.googleapis.com/v1/accounts/pub-XXXXXXXXXXXXXXXX/networkReport:generate \ -H "Content-Type: application/json" \ -H "$(oauth2l header --json path_to_credentials_json \ https://www.googleapis.com/auth/admob.readonly)" \ --data @- << EOF { "report_spec": { "date_range": { "start_date": {"year": 2020, "month": 4, "day": 1}, "end_date": {"year": 2020, "month": 4, "day": 2} }, "dimensions": ["DATE"], "metrics": ["CLICKS", "AD_REQUESTS", "IMPRESSIONS", "ESTIMATED_EARNINGS"], "dimension_filters": [{"dimension": "COUNTRY", "matches_any": {"values": ["US"]}}], "sort_conditions": [{"metric":"CLICKS", order: "DESCENDING"}], "localization_settings": {"currency_code": "USD", "language_code": "en-US"} } } EOF
示例响应:
[{ "header": { "dateRange": { "startDate": {"year": 2020, "month": 4, "day": 1}, "endDate": {"year": 2020, "month": 4, "day": 2} } } }, { "row": { "dimensionValues": {"DATE": {"value": "20200401"}}, "metricValues": { "CLICKS": {"integerValue": "31"}, "AD_REQUESTS": {"integerValue": "7409"}, "IMPRESSIONS": {"integerValue": "3440"}, "ESTIMATED_EARNINGS": {"microsValue": "6381903"} } } }, { "row": { "dimensionValues": {"DATE": {"value": "20200402"}}, "metricValues": { "CLICKS": {"integerValue": "30"}, "AD_REQUESTS": {"integerValue": "8828"}, "IMPRESSIONS": {"integerValue": "3724"}, "ESTIMATED_EARNINGS": {"microsValue": "9010390"} } } }, { "footer": { "matchingRowCount": "2" } }]
列出应用。
curl -X GET https://admob.googleapis.com/v1/accounts/pub-XXXXXXXXXXXXXXXX/apps \ -H "Content-Type: application/json" \ -H "$(oauth2l header --json path_to_credentials_json \ https://www.googleapis.com/auth/admob.readonly)"
示例响应:
{ "app": [ { "name": "accounts/pub-XXXXXXXXXXXXXXXX/apps/XXXXXXXXXX", "appId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX", "platform": "ANDROID", "manualAppInfo": { "displayName": "Example App" }, "linkedAppInfo": { "appStoreId": "com.example.myApp", "displayName": "Example App", } } ] }
列出广告单元。
curl -X GET https://admob.googleapis.com/v1/accounts/pub-XXXXXXXXXXXXXXXX/adUnits \ -H "Content-Type: application/json" \ -H "$(oauth2l header --json path_to_credentials_json \ https://www.googleapis.com/auth/admob.readonly)"
示例响应:
{ "adUnit": [ { "name": "accounts/pub-XXXXXXXXXXXXXXXX/adUnits/XXXXXXXXXX", "adUnitId": "ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX", "appId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX", "displayName": "AdMob Rewarded", "adFormat": "REWARDED", "adTypes": ["RICH_MEDIA", "VIDEO"], } ] }