مدل دسترسی به تبلیغات گوگل را درک کنید

دو نوع حساب کاربری گوگل ادز وجود دارد: حساب‌های کاربری مدیر گوگل ادز و حساب‌های کاربری تبلیغ‌کننده گوگل ادز (که با نام حساب‌های کاربری مشتری یا کلاینت نیز شناخته می‌شوند). حساب‌های کاربری مدیر می‌توانند سایر حساب‌های کاربری مدیر گوگل ادز یا حساب‌های کاربری تبلیغ‌کننده گوگل ادز را مدیریت کنند. می‌توانید یک حساب کاربری تبلیغ‌کننده را به یک حساب کاربری مدیر لینک کنید و سپس حساب کاربری تبلیغ‌کننده را از طریق حساب کاربری مدیر مدیریت کنید. ساختار کلی لینک‌شده، یک نمودار غیرمدور جهت‌دار است که حساب‌های کاربری تبلیغ‌کننده در سطح برگ قرار دارند.

شما می‌توانید به کاربران یا حساب‌های خدماتی، دسترسی به حساب‌های گوگل ادز را بدهید. دو راه برای دسترسی کاربران به حساب تبلیغ‌کننده وجود دارد:

  • با دعوت از کاربر به حساب تبلیغ‌کننده، به او دسترسی مستقیم به آن حساب را اعطا کنید.
  • با دعوت کاربر به یک حساب کاربری مدیر که به آن حساب متصل است، به او دسترسی غیرمستقیم به حساب کاربری تبلیغ‌کننده بدهید. کاربر به حساب کاربری تبلیغ‌کننده دسترسی پیدا می‌کند، زیرا حساب کاربری مدیر به تمام حساب‌های کاربری مرتبط با آن دسترسی دارد.

همچنین می‌توانید هنگام دعوت از یک کاربر برای مدیریت یک حساب کاربری ، نقش‌های کاربری را تعیین کنید.

سلسله مراتب حساب‌های کاربری زیر را در نظر بگیرید. فرض کنید همه کاربران دسترسی استاندارد دارند.

نمودار سلسله مراتب حساب‌ها

جدول زیر خلاصه‌ای از این ساختار حساب را نشان می‌دهد.

کاربر دسترسی مستقیم دارد دسترسی غیرمستقیم دارد
یو۱، اس‌ای۱ ام۱ M2، A1، A2، A3
U2 ام۲، ام۳ A1، A2، A3، A4
یو۳ A4

شناسه مشتری ورود

یک کاربر ممکن است به چندین سلسله مراتب حساب کاربری دسترسی داشته باشد. هنگام فراخوانی API در چنین مواردی، باید حساب کاربری ریشه را برای تعیین صحیح سطوح مجوز و دسترسی به حساب کاربری مشخص کنید. این کار با تعیین هدر login-customer-id به عنوان بخشی از درخواست API انجام می‌شود.

جدول زیر از سلسله مراتب حساب‌ها از مثال قبلی استفاده می‌کند تا نشان دهد از چه شناسه‌های مشتری برای ورود می‌توانید استفاده کنید و لیست مربوطه از حساب‌هایی که می‌توانید فراخوانی کنید را نشان می‌دهد.

کاربر برای استفاده، وارد شناسه مشتری شوید حساب‌هایی که می‌توان با آنها فراخوانی‌های API انجام داد
یو۱، اس‌ای۱ ام۱ M1، M2، A1، A2، A3
U2 ام۲ M2، A1، A2، A3
U2 ام۳ M3، A1، A4
یو۳ A4 A4

اگر کاربر دسترسی مستقیم به حساب گوگل ادز که با آن فراخوانی می‌کنید، دارد، می‌توانید از ارائه هدر login-customer-id صرف نظر کنید. برای مثال، هنگام استفاده از اعتبارنامه‌های U3 برای فراخوانی A4 ، نیازی به مشخص کردن هدر login-customer-id ندارید، زیرا سرورهای گوگل ادز می‌توانند سطح دسترسی را از روی شناسه مشتری ( 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.V22.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}" \
      

نقش‌های کاربری

API گوگل ادز مدل دسترسی جداگانه‌ای برای خود ندارد، یا از محدوده‌های جداگانه OAuth 2.0 برای محدود کردن عملکرد استفاده نمی‌کند. به عنوان مثال، API گوگل ادز از محدوده‌های یکسانی برای عملیات فقط خواندنی در مقابل عملیات خواندنی-نوشتنی استفاده می‌کند. در عوض، API گوگل ادز از همان نقش‌های کاربری که گوگل ادز پشتیبانی می‌کند، پیروی می‌کند. هنگامی که یک نقش کاربری به یک حساب در سطح مدیر اعطا می‌شود، این نقش توسط حساب‌های موجود در سلسله مراتب به ارث می‌رسد. اگر کاربری نقش‌های متناقضی با یک حساب معین داشته باشد، سطح صحیح توسط حساب login-customer-id مشخص شده در درخواست API حل می‌شود.

جدول زیر از سلسله مراتب حساب کاربری از مثال قبلی استفاده می‌کند و تأثیر اعطای نقش‌های کاربری مختلف به کاربران را نشان می‌دهد.

کاربر نقش کاربر اعطا شد ورود-شناسه-مشتری سطح دسترسی موثر
SA1 دسترسی استاندارد در حساب M1 ام۱ دسترسی استاندارد به مسیرهای M1، M2، A1، A2، A3
U2 دسترسی استاندارد در M2
دسترسی فقط خواندنی روی M3
ام۲ دسترسی استاندارد در M2، A1، A2، A3
U2 دسترسی استاندارد در M2
دسترسی فقط خواندنی روی M3
ام۳ دسترسی فقط خواندنی روی M3، A1، A4