レポートを生成する

このガイドは、前提条件の手順を完了し、AdMob API を使用して AdMob アカウントに関する情報をプログラムで取得し、ネットワーク レポートとメディエーション レポートを生成することを目的としたデベロッパーを対象としています。

前提条件

リクエストを作成する

AdMob API は HTTP と JSON に基づいて構築されているため、標準の HTTP クライアントから API にリクエストを送信し、レスポンスを解析することができます。ただし、Google API クライアント ライブラリを利用すれば、言語が高度に統合され、セキュリティも強化されます。また、認証済みリクエストの作成もサポートされます。クライアント ライブラリにはさまざまなプログラミング言語向けのものが用意されています。それらのライブラリを使用すれば、手動で 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 クライアント ライブラリを使用したリクエスト

  1. クライアント シークレット ファイルを読み込み、認証情報を生成します。

    この手順を初めて行う際には、認証を求めるメッセージがブラウザに表示されます。承認する前に、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();
    }
  2. 認可された AdMob クライアントを作成します。

    // Create an AdMob client instance.
    AdMob admob =
        new AdMob.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
            .setApplicationName("admobapi-java-samples")
            .build();
    
  3. アカウント情報を取得します。

    /* 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());
    }
  4. ネットワーク レポートを生成します。

    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);
    }
  5. メディエーション レポートを生成します。

    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);
    }
  6. アプリを一覧表示します。

    // 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);
    }
  7. 広告ユニットを一覧表示します。

    // 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 クライアント ライブラリを使用したリクエスト

  1. クライアント シークレット ファイルを読み込み、承認済みの 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();
    
  2. AdMob サービス オブジェクトを作成します。

    // Create an AdMob service object on which to run the requests.
    $service = new Google_Service_AdMob($client);
    
  3. アカウント情報を取得します。

    // 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";
    }
  4. ネットワーク レポートを生成します。

    /**
     * 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;
    }
  5. メディエーション レポートを生成します。

    /**
     * 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;
    }
  6. アプリを一覧表示します。

    // 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);
  7. 広告ユニットを一覧表示します。

    // 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 クライアント ライブラリを使用したリクエスト

  1. クライアント シークレット ファイルを読み込み、認証情報を生成します。

    この手順を初めて行う際には、認証を求めるメッセージがブラウザに表示されます。承認する前に、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}
  2. AdMob サービス オブジェクトを作成します。

    // Create an AdMob service object on which to run the requests.
    admob = build('admob', 'v1', credentials=credentials)
    
  3. アカウント情報を取得します。

    # 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'])
  4. ネットワーク レポートを生成します。

    # 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()
  5. メディエーション レポートを生成します。

    # 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()
  6. アプリを一覧表示します。

    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']
  7. 広告ユニットを一覧表示します。

    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 を使用したリクエスト

  1. クライアント シークレット ファイルを読み込み、認証情報を生成します。

    この手順を初めて行う際には、認証を求めるメッセージがブラウザに表示されます。承認する前に、AdMob API へのアクセス権を持つ Google アカウントでログインしていることをご確認ください。ログインしているアカウントに代わって、アプリケーションがデータにアクセスすることが認証されます。

    認証と承認には、Google OAuth 2.0 を操作するためのコマンドライン ツールである oauth2l を使用することをおすすめします。oauth2l をインストールして次のコマンドを実行します。path_to_credentials_json は、クラウド アプリケーションの登録時にダウンロードした credentials.json ファイルのパスに置き換えます。初回実行時に、コマンドにより OAuth 2.0 承認フローを順を追って実行します。後続の実行では、トークンが自動的に更新されます。

    oauth2l header --json path_to_credentials_json \
            https://www.googleapis.com/auth/admob.readonly
    
  2. アカウント情報を取得します。

    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"
       }
     ]
    }
  3. ネットワーク レポートを生成します。

    ネットワーク レポートを生成するには、networkReport:generate メソッドを呼び出します。アカウント情報を取得する手順で受け取った publisherId をリクエスト URI の一部として使用します(例: 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"
     }
    }]
  4. アプリを一覧表示します。

    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",
         }
       }
     ]
    }
  5. 広告ユニットを一覧表示します。

    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"],
       }
     ]
    }