登录客户 ID

使用经理账号访问运营中的客户账号时,login-customer-id 是 Search Ads 360 Reporting API 中必需的标头。如果直接访问正在运营的客户账号,则无需 login-customer-id 标头。

获取“login-customer-id”的一种方法是通过 Search Ads 360 界面。当前所选客户账号的“login-customer-id”会显示在屏幕右上角。

如果经过身份验证的用户同时具有经理账号和运营客户账号的访问权限,则应指定 login-customer-id 以避免产生任何歧义。虽然在这种情况下,未指定 login-customer-id 仍会起作用,但上下文会设为仅限运营客户账号(这可能不是预期的结果)。

如果您一直在使用经理账号的 OAuth2 凭据管理账号,请按照以下步骤获取正确的 login-customer-id 值:

  1. 列出可访问的客户

    Java

    // Copyright 2022 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    package sample;
    
    import com.beust.jcommander.Parameter;
    import com.google.ads.searchads360.v0.lib.SearchAds360Client;
    import com.google.ads.searchads360.v0.resources.CustomerClient;
    import com.google.ads.searchads360.v0.services.SearchAds360Row;
    import com.google.ads.searchads360.v0.services.SearchAds360ServiceClient;
    import com.google.ads.searchads360.v0.services.SearchAds360ServiceClient.SearchPagedResponse;
    import com.google.ads.searchads360.v0.services.SearchSearchAds360Request;
    
    /** Get customer client details. */
    public class GetCustomerClient {
      private static class GetCustomerClientParams extends CodeSampleParams {
    
        @Parameter(names = "--customerId", required = true)
        private String customerId;
    
        @Parameter(names = "--loginCustomerId")
        private String loginCustomerId;
      }
    
      public static void main(String[] args) {
        GetCustomerClientParams params = new GetCustomerClientParams();
        if (!params.parseArguments(args)) {
          // Optional: You may pass the loginCustomerId on the command line or specify a loginCustomerId
          // here (10 digits, no dashes). If neither are set, customerId will be used as
          // loginCustomerId.
          // params.loginCustomerId = Long.parseLong("INSERT_LOGIN_CUSTOMER_ID_HERE");
        }
        final String loginCustomerId = params.loginCustomerId;
        final String customerId = params.customerId;
    
        try {
          // Creates a SearchAds360Client with the specified loginCustomerId. If there's
          // no loginCustomerId, customerId will be used instead.
          final SearchAds360Client searchAds360Client =
              SearchAds360Client.newBuilder()
                  .setLoginCustomerId(loginCustomerId == null ? customerId : loginCustomerId)
                  .fromPropertiesFile()
                  .build();
          // Creates the Search Ads 360 Service client.
          SearchAds360ServiceClient client = searchAds360Client.create();
          new GetCustomerClient().runExample(client, customerId);
        } catch (Exception exception) {
          System.err.printf("Failed with exception: %s%n", exception);
          exception.printStackTrace();
          System.exit(1);
        }
      }
    
      private void runExample(SearchAds360ServiceClient searchAds360ServiceClient, String customerId) {
        // Creates a query that retrieves all child accounts of the customerId specified in search
        // calls below.
        String query =
            "SELECT customer_client.descriptive_name, customer_client.client_customer,"
                + " customer_client.status FROM customer_client";
        SearchSearchAds360Request request =
            SearchSearchAds360Request.newBuilder().setCustomerId(customerId).setQuery(query).build();
    
        // Issues a search request.
        final SearchPagedResponse searchPagedResponse = searchAds360ServiceClient.search(request);
        for (SearchAds360Row element : searchPagedResponse.iterateAll()) {
          CustomerClient customerClient = element.getCustomerClient();
          System.out.printf(
              "CustomerClient found with name '%s', customer %s, and status: %s.%n",
              customerClient.getDescriptiveName(),
              customerClient.getClientCustomer(),
              customerClient.getStatus());
        }
      }
    }

    下载 GetCustomerClient.java

    Python

    #!/usr/bin/env python
    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    """Retrieves customer_client for a customer using a pagination search request.
    """
    
    import argparse
    import traceback
    from google.ads.searchads360.v0.services.types.search_ads360_service import SearchSearchAds360Request
    from util_searchads360 import SearchAds360Client
    
    
    def main(client, customer_id) -> None:
      search_ads_360_service = client.get_service()
    
      query = """
          SELECT
            customer_client.descriptive_name,
            customer_client.client_customer,
            customer_client.status
          FROM customer_client"""
    
      request = SearchSearchAds360Request()
      request.customer_id = customer_id
      request.query = query
    
      # Issues a search request.
      results = search_ads_360_service.search(request=request)
    
      for row in results:
        customer_client = row.customer_client
        print(
            f"CustomerClient found with name {customer_client.descriptive_name}, customer {customer_client.client_customer}, and status: {customer_client.status.name}"
        )
    
    
    if __name__ == "__main__":
      # SearchAds360Client will read the search-ads-360.yaml configuration file in
      # the home directory if none is specified.
      search_ads_360_client = SearchAds360Client.load_from_file()
    
      parser = argparse.ArgumentParser(
          description=("Retrieves customer_client for a customer."))
      # Arguments to provide to run the example.
      parser.add_argument(
          "-c",
          "--customer_id",
          type=str,
          required=True,
          help="The Search Ads 360 customer ID (10 digits, no dashes).",
      )
    
      parser.add_argument(
          "-l",
          "--login_customer_id",
          type=str,
          required=False,
          help="The Search Ads 360 login customer ID (10 digits, no dashes).",
      )
    
      args = parser.parse_args()
    
      search_ads_360_client.set_ids(args.customer_id, args.login_customer_id)
    
      try:
        main(search_ads_360_client, args.customer_id)
      except Exception:  # pylint: disable=broad-except
        traceback.print_exc()

    下载 get_customer_client.py

  2. 确定经理账号层次结构

    Java

    // Copyright 2022 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    package sample;
    
    import com.beust.jcommander.Parameter;
    import com.google.ads.searchads360.v0.lib.SearchAds360Client;
    import com.google.ads.searchads360.v0.services.SearchAds360Row;
    import com.google.ads.searchads360.v0.services.SearchAds360ServiceClient;
    import com.google.ads.searchads360.v0.services.SearchSearchAds360StreamRequest;
    import com.google.ads.searchads360.v0.services.SearchSearchAds360StreamResponse;
    import com.google.api.gax.rpc.ServerStream;
    
    /** Get manager details. */
    public class GetManagersStream {
      private static class GetManagersParams extends CodeSampleParams {
    
        @Parameter(names = "--customerId", required = true)
        private String customerId;
    
        @Parameter(names = "--loginCustomerId")
        private String loginCustomerId;
      }
    
      public static void main(String[] args) {
        GetManagersParams params = new GetManagersParams();
        if (!params.parseArguments(args)) {
          // Optional: You may pass the loginCustomerId on the command line or specify a loginCustomerId
          // here ((10 digits, no dashes). If neither are set, customerId will be used as
          // loginCustomerId.
          // params.loginCustomerId = Long.parseLong("INSERT_LOGIN_CUSTOMER_ID_HERE");
        }
        final String loginCustomerId = params.loginCustomerId;
        final String customerId = params.customerId;
    
        try {
          // Creates a SearchAds360Client with the specified loginCustomerId. If there's
          // no loginCustomerId, customerId will be used instead.
          final SearchAds360Client searchAds360Client =
              SearchAds360Client.newBuilder()
                  .setLoginCustomerId(loginCustomerId == null ? customerId : loginCustomerId)
                  .fromPropertiesFile()
                  .build();
          // Creates the Search Ads 360 Service client.
          SearchAds360ServiceClient client = searchAds360Client.create();
          new GetManagersStream().runExample(client, customerId);
        } catch (Exception exception) {
          System.err.printf("Failed with exception: %s%n", exception);
          exception.printStackTrace();
          System.exit(1);
        }
      }
    
      private void runExample(SearchAds360ServiceClient searchAds360ServiceClient, String customerId) {
        // Creates a query that retrieves manager for the customer.
        String query =
            "SELECT customer_manager_link.manager_customer, customer_manager_link.status FROM"
                + " customer_manager_link";
        SearchSearchAds360StreamRequest request =
            SearchSearchAds360StreamRequest.newBuilder()
                .setCustomerId(customerId)
                .setQuery(query)
                .build();
    
        // Issues a search stream request.
        ServerStream<SearchSearchAds360StreamResponse> stream =
            searchAds360ServiceClient.searchStreamCallable().call(request);
        for (SearchSearchAds360StreamResponse response : stream) {
          for (SearchAds360Row element : response.getResultsList()) {
            System.out.printf(
                "Manager found with customer '%s' and status: %s.%n",
                element.getCustomerManagerLink().getManagerCustomer(),
                element.getCustomerManagerLink().getStatus());
          }
        }
      }
    }

    下载 GetManagersStream.java

    Python

    #!/usr/bin/env python
    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    """Retrieves managers for a customer using a stream request."""
    
    import argparse
    import traceback
    from google.ads.searchads360.v0.services.types.search_ads360_service import SearchSearchAds360StreamRequest
    from util_searchads360 import SearchAds360Client
    
    
    def main(client, customer_id) -> None:
      search_ads_360_service = client.get_service()
    
      query = """
          SELECT
            customer_manager_link.manager_customer,
            customer_manager_link.status
          FROM customer_manager_link"""
    
      request = SearchSearchAds360StreamRequest()
      request.customer_id = customer_id
      request.query = query
    
      # Issues a search stream request.
      results = search_ads_360_service.search_stream(request=request)
    
      for response in results:
        for result in response.results:
          customer_manager_link = result.customer_manager_link
          print(
              f"Manager found with customer {customer_manager_link.manager_customer} and status: {customer_manager_link.status.name}"
          )
    
    
    if __name__ == "__main__":
      # SearchAds360Client will read the search-ads-360.yaml configuration file in
      # the home directory if none is specified.
      search_ads_360_client = SearchAds360Client.load_from_file()
    
      parser = argparse.ArgumentParser(
          description=("Retrieves managers for a customer."))
      # Arguments to provide to run the example.
      parser.add_argument(
          "-c",
          "--customer_id",
          type=str,
          required=True,
          help="The Search Ads 360 customer ID (10 digits, no dashes).",
      )
    
      parser.add_argument(
          "-l",
          "--login_customer_id",
          type=str,
          required=False,
          help="The Search Ads 360 login customer ID (10 digits, no dashes).",
      )
    
      args = parser.parse_args()
    
      search_ads_360_client.set_ids(args.customer_id, args.login_customer_id)
    
      try:
        main(search_ads_360_client, args.customer_id)
      except Exception:  # pylint: disable=broad-except
        traceback.print_exc()

    下载 get_managers_stream.py

  3. 选择适当的经理账号。

    如果给定运营客户账号有多个经理账号,请选择层次结构顶部的经理账号。这样,您就可以在整个账号层次结构中为多个调用保持相同的 login-customer-id,从而避免过度切换。