Google বিজ্ঞাপন অ্যাক্সেস মডেল বুঝুন

There are two types of Google Ads accounts: Google Ads manager accounts and Google Ads advertiser accounts (also known as customer or client accounts). Manager accounts can manage other Google Ads manager accounts or Google Ads advertiser accounts. You can link an advertiser account to a manager account and then manage the advertiser account through the manager account. The overall linked structure is a directed acyclic graph with advertiser accounts at the leaf level.

আপনি স্বতন্ত্র ব্যবহারকারী বা পরিষেবা অ্যাকাউন্টকে গুগল অ্যাডস অ্যাকাউন্টে অ্যাক্সেস দিতে পারেন। ব্যবহারকারীদের একটি বিজ্ঞাপনদাতা অ্যাকাউন্টে অ্যাক্সেস দেওয়ার দুটি উপায় রয়েছে:

  • ব্যবহারকারীকে বিজ্ঞাপনদাতার অ্যাকাউন্টে আমন্ত্রণ জানিয়ে সরাসরি প্রবেশাধিকার দিন।
  • ব্যবহারকারীকে বিজ্ঞাপনদাতা অ্যাকাউন্টের সাথে সংযুক্ত একটি ম্যানেজার অ্যাকাউন্টে আমন্ত্রণ জানানোর মাধ্যমে সেই অ্যাকাউন্টে পরোক্ষ অ্যাক্সেস দিন। ব্যবহারকারী বিজ্ঞাপনদাতা অ্যাকাউন্টে অ্যাক্সেস লাভ করেন, কারণ ম্যানেজার অ্যাকাউন্টটির অধীনে সংযুক্ত সমস্ত অ্যাকাউন্টে অ্যাক্সেস থাকে।

কোনো ব্যবহারকারীকে অ্যাকাউন্ট পরিচালনার জন্য আমন্ত্রণ জানানোর সময় আপনি তার ভূমিকাও নির্ধারণ করে দিতে পারেন।

নিম্নলিখিত অ্যাকাউন্ট স্তরবিন্যাসটি বিবেচনা করুন। ধরে নিন যে সকল ব্যবহারকারীর স্ট্যান্ডার্ড অ্যাক্সেস রয়েছে।

একটি অ্যাকাউন্টের স্তরবিন্যাসের চিত্র

নিম্নলিখিত সারণিতে এই অ্যাকাউন্ট কাঠামোর সংক্ষিপ্ত বিবরণ দেওয়া হয়েছে।

ব্যবহারকারী সরাসরি প্রবেশাধিকার আছে পরোক্ষ প্রবেশাধিকার আছে
ইউ১, এসএ১ এম১ এম২, এ১, এ২, এ৩
U2 এম২, এম৩ এ১, এ২, এ৩, এ৪
ইউ৩ এ৪

লগইন গ্রাহক আইডি

একজন ব্যবহারকারীর একাধিক অ্যাকাউন্ট হায়ারার্কিতে অ্যাক্সেস থাকতে পারে। এই ধরনের ক্ষেত্রে এপিআই কল করার সময়, অনুমোদন এবং অ্যাকাউন্ট অ্যাক্সেস লেভেল সঠিকভাবে নির্ধারণ করার জন্য ব্যবহৃত রুট অ্যাকাউন্টটি নির্দিষ্ট করতে হবে। এপিআই অনুরোধের অংশ হিসেবে একটি login-customer-id হেডার উল্লেখ করার মাধ্যমে এটি করা হয়।

নিম্নলিখিত সারণীটি পূর্ববর্তী উদাহরণের অ্যাকাউন্ট ক্রমবিন্যাস ব্যবহার করে দেখায় যে আপনি কোন লগইন গ্রাহক আইডিগুলি ব্যবহার করতে পারবেন এবং সেই অনুযায়ী কোন অ্যাকাউন্টগুলিতে কল করতে পারবেন।

ব্যবহারকারী ব্যবহার করতে গ্রাহক আইডি লগইন করুন এপিআই কল করার জন্য অ্যাকাউন্টগুলি
ইউ১, এসএ১ এম১ এম১, এম২, এ১, এ২, এ৩
U2 এম২ এম২, এ১, এ২, এ৩
U2 এম৩ এম৩, এ১, এ৪
ইউ৩ এ৪ এ৪

আপনি যে Google Ads অ্যাকাউন্টে কল করছেন, ব্যবহারকারীর যদি সেই অ্যাকাউন্টে সরাসরি অ্যাক্সেস থাকে, তাহলে আপনি login-customer-id হেডারটি দেওয়া বাদ দিতে পারেন। উদাহরণস্বরূপ, U3 ক্রেডেনশিয়াল ব্যবহার করে A4 কে কল করার সময় আপনার login-customer-id হেডার উল্লেখ করার প্রয়োজন নেই, কারণ Google Ads সার্ভারগুলো কাস্টমার আইডি ( A4 ) থেকে অ্যাক্সেস লেভেল সঠিকভাবে নির্ধারণ করতে পারে।

আপনি যদি আমাদের কোনো ক্লায়েন্ট লাইব্রেরি ব্যবহার করেন, তাহলে login-customer-id হেডারটি নির্দিষ্ট করতে নিম্নলিখিত সেটিংস ব্যবহার করুন।

জাভা

আপনার ads.properties ফাইলে নিম্নলিখিত সেটিংটি যোগ করুন।

api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

সি#

GoogleAdsConfig অবজেক্টটি ইনিশিয়ালাইজ করার সময় নিম্নলিখিত সেটিংটি যোগ করুন এবং এটি ব্যবহার করে একটি GoogleAdsClient অবজেক্ট তৈরি করুন।

GoogleAdsConfig config = new GoogleAdsConfig()
{
    ...
    LoginCustomerId = ******
};
GoogleAdsClient client = new GoogleAdsClient(config);

পিএইচপি

আপনার google_ads_php.ini ফাইলে নিম্নলিখিত সেটিংটি যোগ করুন।

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

পাইথন

আপনার google-ads.yaml ফাইলে নিম্নলিখিত সেটিংটি যোগ করুন।

login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE

রুবি

আপনার google_ads_config.rb ফাইলে নিম্নলিখিত সেটিংটি যোগ করুন।

Google::Ads::GoogleAds::Config.new do |c|
  c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end

এই ফাইলটি যেখানে রেখেছেন, সেই পাথটি দিয়ে একটি GoogleAdsClient ইনস্ট্যান্স তৈরি করুন।

client = Google::Ads::GoogleAds::GoogleAdsClient.new('path/to/google_ads_config.rb')

পার্ল

আপনার googleads.properties ফাইলে নিম্নলিখিত সেটিংটি যোগ করুন।

loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

কার্ল

curl কমান্ড চালানোর সময় নিম্নলিখিত কমান্ড লাইন আর্গুমেন্টটি উল্লেখ করুন।

-H "login-customer-id: LOGIN_CUSTOMER_ID"

কোনো ব্যবহারকারীর সরাসরি অ্যাক্সেস আছে এমন অ্যাকাউন্টগুলোর তালিকা পেতে আপনি CustomerService.ListAccessibleCustomers মেথডটি ব্যবহার করতে পারেন। এই অ্যাকাউন্টগুলো login-customer-id হেডারের বৈধ ভ্যালু হিসেবে ব্যবহার করা যেতে পারে।

জাভা

private void runExample(GoogleAdsClient client) {
  // Optional: Change credentials to use a different refresh token, to retrieve customers
  //           available for a specific user.
  //
  // UserCredentials credentials =
  //     UserCredentials.newBuilder()
  //         .setClientId("INSERT_OAUTH_CLIENT_ID")
  //         .setClientSecret("INSERT_OAUTH_CLIENT_SECRET")
  //         .setRefreshToken("INSERT_REFRESH_TOKEN")
  //         .build();
  //
  // client = client.toBuilder().setCredentials(credentials).build();

  try (CustomerServiceClient customerService =
      client.getLatestVersion().createCustomerServiceClient()) {
    ListAccessibleCustomersResponse response =
        customerService.listAccessibleCustomers(
            ListAccessibleCustomersRequest.newBuilder().build());

    System.out.printf("Total results: %d%n", response.getResourceNamesCount());

    for (String customerResourceName : response.getResourceNamesList()) {
      System.out.printf("Customer resource name: %s%n", customerResourceName);
    }
  }
}
      

সি#

public void Run(GoogleAdsClient client)
{
    // Get the CustomerService.
    CustomerServiceClient customerService = client.GetService(Services.V24.CustomerService);

    try
    {
        // Retrieve the list of customer resources.
        string[] customerResourceNames = customerService.ListAccessibleCustomers();

        // Display the result.
        foreach (string customerResourceName in customerResourceNames)
        {
            Console.WriteLine(
                $"Found customer with resource name = '{customerResourceName}'.");
        }
    }
    catch (GoogleAdsException e)
    {
        Console.WriteLine("Failure:");
        Console.WriteLine($"Message: {e.Message}");
        Console.WriteLine($"Failure: {e.Failure}");
        Console.WriteLine($"Request ID: {e.RequestId}");
        throw;
    }
}
      

পিএইচপি

public static function runExample(GoogleAdsClient $googleAdsClient)
{
    $customerServiceClient = $googleAdsClient->getCustomerServiceClient();

    // Issues a request for listing all accessible customers.
    $accessibleCustomers =
        $customerServiceClient->listAccessibleCustomers(new ListAccessibleCustomersRequest());
    print 'Total results: ' . count($accessibleCustomers->getResourceNames()) . PHP_EOL;

    // Iterates over all accessible customers' resource names and prints them.
    foreach ($accessibleCustomers->getResourceNames() as $resourceName) {
        /** @var string $resourceName */
        printf("Customer resource name: '%s'%s", $resourceName, PHP_EOL);
    }
}
      

পাইথন

def main(client: GoogleAdsClient) -> None:
    customer_service: CustomerServiceClient = client.get_service(
        "CustomerService"
    )

    accessible_customers: ListAccessibleCustomersResponse = (
        customer_service.list_accessible_customers()
    )
    result_total: int = len(accessible_customers.resource_names)
    print(f"Total results: {result_total}")

    resource_names: List[str] = accessible_customers.resource_names
    for resource_name in resource_names:  # resource_name is implicitly str
        print(f'Customer resource name: "{resource_name}"')
      

রুবি

def list_accessible_customers()
  # GoogleAdsClient will read a config file from
  # ENV['HOME']/google_ads_config.rb when called without parameters
  client = Google::Ads::GoogleAds::GoogleAdsClient.new

  accessible_customers = client.service.customer.list_accessible_customers().resource_names

  accessible_customers.each do |resource_name|
    puts "Customer resource name: #{resource_name}"
  end
end
      

পার্ল

sub list_accessible_customers {
  my ($api_client) = @_;

  my $list_accessible_customers_response =
    $api_client->CustomerService()->list_accessible_customers();

  printf "Total results: %d.\n",
    scalar @{$list_accessible_customers_response->{resourceNames}};

  foreach
    my $resource_name (@{$list_accessible_customers_response->{resourceNames}})
  {
    printf "Customer resource name: '%s'.\n", $resource_name;
  }

  return 1;
}
      

কার্ল

# Returns the resource names of customers directly accessible by the user
# authenticating the call.
#
# Variables:
#   API_VERSION,
#   DEVELOPER_TOKEN,
#   OAUTH2_ACCESS_TOKEN:
#     See https://developers.google.com/google-ads/api/rest/auth#request_headers
#     for details.
#
curl -f --request GET \
"https://googleads.googleapis.com/v${API_VERSION}/customers:listAccessibleCustomers" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
      

যদি ListAccessibleCustomers মেথডটি আমার কাস্টমার আইডি খুঁজে না পায় তাহলে কী হবে?

যদি CustomerService.ListAccessibleCustomers মেথডটি ফলাফলে প্রত্যাশিত কোনো কাস্টমার আইডি খুঁজে না পায়, তাহলে এর কয়েকটি সম্ভাব্য ব্যাখ্যা থাকতে পারে।

  1. আপনার কাছে কাস্টমার আইডি-র অ্যাক্সেস আছে, কিন্তু সেই অ্যাক্সেস একটি প্যারেন্ট ম্যানেজার অ্যাকাউন্টের মাধ্যমে দেওয়া হয়। উদাহরণস্বরূপ, যদি আপনি আগের উদাহরণে ইউজার U1 ক্রেডেনশিয়াল দিয়ে ListAccessibleCustomers মেথডটি কল করেন, তাহলে আপনি ফলাফলে শুধুমাত্র M1 ফেরত পাবেন, যদিও U1 আরও বেশি অ্যাকাউন্টে অ্যাক্সেস আছে। এই সম্ভাবনাটি যাচাই করার জন্য, ListAccessibleCustomers মেথড দ্বারা ফেরত আসা প্রতিটি অ্যাকাউন্টের জন্য অ্যাকাউন্ট হায়ারার্কি পুনরুদ্ধার করুন । এটি করার জন্য, আগের বিভাগে বর্ণিত পদ্ধতি অনুযায়ী এই অ্যাকাউন্টগুলোর প্রত্যেকটিকে login-customer-id হিসেবে সেট করুন। যদি আপনার টার্গেট অ্যাকাউন্টে অ্যাক্সেস থাকে, তাহলে আপনি এটিকে অ্যাকাউন্ট হায়ারার্কিগুলোর একটির অংশ হিসেবে খুঁজে পেতে সক্ষম হবেন।

  2. আপনি ভুল OAuth ক্রেডেনশিয়াল ব্যবহার করছেন। এর সবচেয়ে সাধারণ কারণ হলো, আপনি অন্য কোনো ব্যবহারকারীর ক্রেডেনশিয়াল ব্যবহার করছেন। উদাহরণস্বরূপ, স্যান্ডবক্স বা ডেভেলপার ক্রেডেনশিয়ালের সাথে প্রোডাকশন ক্রেডেনশিয়াল ভুলবশত মিশিয়ে ফেলার কারণে অথবা ডাটাবেস বা লোকাল ক্যাশ থেকে অন্য কোনো ব্যবহারকারীর ক্রেডেনশিয়াল ভুলভাবে পড়ার কারণে এমনটা হতে পারে। এই সমস্যাটি সমাধান করার একটি সম্ভাব্য উপায় হলো, Google People API ব্যবহার করে লগ-ইন করা ব্যবহারকারীর নাম এবং ইমেল ঠিকানা সংগ্রহ করা এবং তা আপনার প্রত্যাশিত ইমেল ঠিকানার সাথে মেলে কিনা তা যাচাই করা।

  3. আপনার অ্যাকাউন্টে প্রবেশাধিকার নেই। সঠিক গ্রাহক অ্যাকাউন্টে প্রবেশাধিকার পেতে নির্দেশাবলী অনুসরণ করুন।

ব্যবহারকারীর ভূমিকা

গুগল অ্যাডস এপিআই-এর নিজস্ব কোনো আলাদা অ্যাক্সেস মডেল নেই, বা কার্যকারিতা সীমিত করার জন্য এটি আলাদা OAuth 2.0 স্কোপ ব্যবহার করে না। উদাহরণস্বরূপ, গুগল অ্যাডস এপিআই রিড-অনলি এবং রিড-রাইট অপারেশনের জন্য একই স্কোপ ব্যবহার করে। এর পরিবর্তে, গুগল অ্যাডস এপিআই সেই একই ইউজার রোল অনুসরণ করে যা গুগল অ্যাডস সমর্থন করে। যখন কোনো অ্যাকাউন্টে ম্যানেজার লেভেলে একটি ইউজার রোল প্রদান করা হয়, তখন হায়ারার্কিতে থাকা অ্যাকাউন্টগুলো সেই রোলটি উত্তরাধিকারসূত্রে পায়। যদি কোনো ব্যবহারকারীর একটি নির্দিষ্ট অ্যাকাউন্টের সাথে সাংঘর্ষিক রোল থাকে, তবে এপিআই অনুরোধে উল্লেখিত login-customer-id অ্যাকাউন্টের মাধ্যমে সঠিক লেভেলটি নির্ধারণ করা হয়।

নিম্নলিখিত সারণিটি পূর্ববর্তী উদাহরণের অ্যাকাউন্ট স্তরবিন্যাস ব্যবহার করে ব্যবহারকারীদের বিভিন্ন ভূমিকা প্রদানের প্রভাব দেখায়।

ব্যবহারকারী ব্যবহারকারীর ভূমিকা মঞ্জুর করা হয়েছে লগইন-গ্রাহক-আইডি কার্যকরী প্রবেশাধিকার স্তর
SA1 M1 অ্যাকাউন্টে স্ট্যান্ডার্ড অ্যাক্সেস এম১ M1, M2, A1, A2, A3-তে সাধারণ প্রবেশাধিকার
U2 M2-তে সাধারণ প্রবেশাধিকার
M3-তে শুধুমাত্র পঠনযোগ্য অ্যাক্সেস
এম২ M2, A1, A2, A3-এ স্ট্যান্ডার্ড অ্যাক্সেস
U2 M2-তে সাধারণ প্রবেশাধিকার
M3-তে শুধুমাত্র পঠনযোগ্য অ্যাক্সেস
এম৩ M3, A1, A4-এ শুধুমাত্র পঠনযোগ্য অ্যাক্সেস