مثال‌ها

این راهنما شامل نمونه‌هایی از فراخوانی مستقیم نقاط پایانی REST، بدون استفاده از کتابخانه کلاینت است.

پیش‌نیازها

تمام نمونه‌های نشان داده شده در اینجا برای کپی کردن و چسباندن در پوسته bash با استفاده از دستور curl در نظر گرفته شده‌اند.

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

متغیرهای محیطی

اطلاعات حساب کاربری و شناسه‌ها را همانطور که نشان داده شده است وارد کنید و سپس آنها را کپی کرده و در ترمینال خود قرار دهید تا متغیرهای محیطی مورد استفاده در مثال‌های بعدی پیکربندی شوند. راهنمای مجوز ، دستورالعمل‌هایی برای تولید یک توکن دسترسی OAuth 2.0 ارائه می‌دهد.

API_VERSION="22"
DEVELOPER_TOKEN="DEVELOPER_TOKEN"
OAUTH2_ACCESS_TOKEN="OAUTH_ACCESS_TOKEN"
MANAGER_CUSTOMER_ID="MANAGER_CUSTOMER_ID"
CUSTOMER_ID="CUSTOMER_ID"

شناسه‌های شیء اختیاری اضافی

برخی از مثال‌های زیر روی بودجه‌ها یا کمپین‌های از پیش موجود کار می‌کنند. اگر شناسه اشیاء موجود را برای استفاده با این مثال‌ها دارید، آنها را مطابق شکل وارد کنید.

BUDGET_ID=BUDGET_ID
CAMPAIGN_ID=CAMPAIGN_ID

در غیر این صورت، دو مثال Mutates - Creates یک بودجه و کمپین جدید ایجاد می‌کنند.

راهنمای Query Cookbook شامل نمونه‌های گزارش‌دهی زیادی است که با برخی از صفحات پیش‌فرض Google Ads مطابقت دارند و با همان متغیرهای محیطی مورد استفاده در این راهنما کار می‌کنند. ابزار سازنده‌ی کوئری تعاملی ما نیز منبع بسیار خوبی برای ساخت کوئری‌های سفارشی به صورت تعاملی است.

صفحه بندی شده

روش search از صفحه‌بندی استفاده می‌کند، با اندازه صفحه ثابت ۱۰۰۰۰ مورد و یک page_token که در کنار query مشخص شده است.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
",
"page_token":"${PAGE_TOKEN}"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'
### استریمینگ متد `searchStream` تمام نتایج را در یک پاسخ واحد استریم می‌کند، بنابراین، فیلد `pageSize` پشتیبانی نمی‌شود.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:searchStream" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'

جهش‌ها

چندین عملیات تغییر شکل ( create ، update یا remove ) را می‌توان با پر کردن آرایه operations در یک بدنه درخواست JSON ارسال کرد.

ایجاد می‌کند

این مثال دو بودجه کمپین مشترک را در یک درخواست واحد ایجاد می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaignBudgets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  },
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  }
]
}"

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

BUDGET_ID=BUDGET_ID

منابعی که به منابع دیگر اشاره می‌کنند، این کار را با نام منبع انجام می‌دهند. کمپین ایجاد شده در مثال زیر به یک campaignBudget با نام منبع رشته‌ای آن اشاره می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'status': 'PAUSED',
      'advertisingChannelType': 'SEARCH',
      'geoTargetTypeSetting': {
        'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
        'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
      },
      'name': 'My Search campaign #${RANDOM}',
      'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/${BUDGET_ID}',
      'targetSpend': {}
    }
  }
]
}"

به‌روزرسانی‌ها

به‌روزرسانی ویژگی‌های اشیاء موجود با استفاده از عملیات update . مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مرحله قبل را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

همه به‌روزرسانی‌ها به یک فیلد updateMask نیاز دارند، لیستی از ویژگی‌های JSON که با کاما از هم جدا شده‌اند و باید به عنوان به‌روزرسانی اعمال شوند. ویژگی‌هایی که در updateMask فهرست شده‌اند اما در بدنه درخواست وجود ندارند، روی یک شیء پاک می‌شوند. ویژگی‌هایی که در updateMask فهرست نشده‌اند اما در بدنه درخواست وجود دارند، نادیده گرفته می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'name': 'A changed campaign name #${RANDOM}',
    },
    'updateMask': 'name'
  }
],
}"

حذف می‌کند

اشیاء با مشخص کردن نام منبع آنها به عنوان یک عملیات remove حذف می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}'
  }
],
}"

خرابی‌های جزئی

وقتی چندین عملیات در یک درخواست واحد انجام می‌شوند، به صورت اختیاری partialFailure مشخص کنید. اگر true ، عملیات با موفقیت انجام می‌شوند و عملیات نامعتبر خطا برمی‌گردانند. اگر false ، تمام عملیات موجود در درخواست موفق می‌شوند اگر و تنها اگر همه آنها معتبر باشند.

مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مثال Creates را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

درخواست زیر شامل دو عملیات است. اولین عملیات سعی در تغییر استراتژی پیشنهاد قیمت کمپین ارائه شده دارد و عملیات بعدی سعی در حذف یک کمپین با شناسه نامعتبر دارد. از آنجایی که عملیات دوم منجر به خطا می‌شود (شناسه کمپین نامعتبر است) و از آنجایی که partialFailure روی false تنظیم شده است، عملیات اول نیز با شکست مواجه می‌شود و استراتژی پیشنهاد قیمت کمپین موجود به‌روزرسانی نمی‌شود.

curl --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'partialFailure': false,
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'manualCpc': {
        'enhancedCpcEnabled': false
      }
    },
    'updateMask': 'manual_cpc.enhanced_cpc_enabled'
  },
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/INVALID_CAMPAIGN_ID'
  }
]
}"

عملیات گروه‌بندی شده

متد googleAds:mutate از ارسال گروه‌هایی از عملیات با انواع مختلف منابع پشتیبانی می‌کند. شما می‌توانید عملیات‌های زیادی از انواع مختلف را برای زنجیره‌سازی دنباله‌ای از عملیات که باید به صورت گروهی انجام شوند، ارسال کنید. اگر هیچ عملیاتی با شکست مواجه نشود، مجموعه عملیات با موفقیت انجام می‌شود یا اگر هر عملیات واحد با شکست مواجه شود، همه با شکست مواجه می‌شوند.

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

اعداد صحیح منفی ( -1 ، -2 ، -3 ) به عنوان جای‌نگهدارنده در نام منابع استفاده می‌شوند و به صورت پویا در زمان اجرا با نتایج حاصل از توالی عملیات پر می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'mutateOperations': [
  {
    'campaignBudgetOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'name': 'My Campaign Budget #${RANDOM}',
        'deliveryMethod': 'STANDARD',
        'amountMicros': 500000,
        'explicitlyShared': false
      }
    }
  },
  {
    'campaignOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'geoTargetTypeSetting': {
          'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
          'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
        },
        'name': 'My Search campaign #${RANDOM}',
        'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'targetSpend': {}
      }
    }
  },
  {
    'adGroupOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'campaign': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'name': 'My ad group #${RANDOM}',
        'status': 'PAUSED',
        'type': 'SEARCH_STANDARD'
      }
    }
  },
  {
    'adGroupAdOperation': {
      'create': {
        'adGroup': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'status': 'PAUSED',
        'ad': {
          'responsiveSearchAd': {
            'headlines': [
              {
                'pinned_field': 'HEADLINE_1',
                'text': 'An example headline'
              },
              {
                'text': 'Another example headline'
              },
              {
                'text': 'Yet another headline'
              }
            ],
            'descriptions': [
              {
                'text': 'An example description'
              },
              {
                'text': 'Another example description'
              }
            ],
            'path1': 'all-inclusive',
            'path2': 'deals'
          },
          'finalUrls': ['https://www.example.com']
        }
      }
    }
  }
]
}"

مدیریت حساب

شما می‌توانید حساب کاربری ایجاد کنید، حساب‌های کاربری قابل دسترسی را فهرست کنید و فایل‌های باینری را آپلود کنید.

ایجاد حساب‌ها

با استفاده از متد createCustomerClient حساب‌های جدید ایجاد کنید. توجه داشته باشید که URL به جای شناسه حساب مشتری ، به شناسه حساب مدیر نیاز دارد. یک حساب مشتری جدید تحت حساب مدیر ایجاد می‌شود.

curl f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${MANAGER_CUSTOMER_ID}:createCustomerClient" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'customerClient': {
  'descriptiveName': 'My Client #${RANDOM}',
  'currencyCode': 'USD',
  'timeZone': 'America/New_York'
}
}"

فهرست حساب‌های قابل دسترسی

از یک درخواست ساده GET به متد listAccessibleCustomers برای دریافت لیستی از حساب‌های گوگل ادز که با توکن دسترسی OAuth 2.0 داده شده قابل دسترسی هستند، استفاده کنید. در این درخواست نباید از شناسه‌های حساب مدیر یا مشتری استفاده شود.

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}" \

آپلود دارایی‌های دودویی

متد assets:mutate برای آپلود و مدیریت دارایی‌ها استفاده می‌شود. داده‌های دودویی، مانند یک تصویر، به صورت یک رشته با استفاده از کدگذاری استاندارد base64 به همراه padding کدگذاری می‌شوند. کدگذاری استاندارد یا base64 ایمن برای URL با یا بدون padding پذیرفته می‌شود.

این مثال یک GIF یک پیکسلی را کدگذاری می‌کند تا نمونه مختصر بماند. در عمل، حجم data بسیار بیشتر است.

از ابزار خط فرمان base64 (بخشی از ابزارهای اصلی GNU ) برای رمزگذاری یک تصویر GIF با اندازه ۱ پیکسل استفاده کنید.

base64 1pixel.gif

مقدار کدگذاری شده با base64 به عنوان ویژگی data در یک درخواست API مشخص می‌شود.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My image asset #${RANDOM}',
      'type': 'IMAGE',
      'imageAsset': {
        'data': 'R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIA'
      }
    }
  }
]
}"
،

این راهنما شامل نمونه‌هایی از فراخوانی مستقیم نقاط پایانی REST، بدون استفاده از کتابخانه کلاینت است.

پیش‌نیازها

تمام نمونه‌های نشان داده شده در اینجا برای کپی کردن و چسباندن در پوسته bash با استفاده از دستور curl در نظر گرفته شده‌اند.

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

متغیرهای محیطی

اطلاعات حساب کاربری و شناسه‌ها را همانطور که نشان داده شده است وارد کنید و سپس آنها را کپی کرده و در ترمینال خود قرار دهید تا متغیرهای محیطی مورد استفاده در مثال‌های بعدی پیکربندی شوند. راهنمای مجوز ، دستورالعمل‌هایی برای تولید یک توکن دسترسی OAuth 2.0 ارائه می‌دهد.

API_VERSION="22"
DEVELOPER_TOKEN="DEVELOPER_TOKEN"
OAUTH2_ACCESS_TOKEN="OAUTH_ACCESS_TOKEN"
MANAGER_CUSTOMER_ID="MANAGER_CUSTOMER_ID"
CUSTOMER_ID="CUSTOMER_ID"

شناسه‌های شیء اختیاری اضافی

برخی از مثال‌های زیر روی بودجه‌ها یا کمپین‌های از پیش موجود کار می‌کنند. اگر شناسه اشیاء موجود را برای استفاده با این مثال‌ها دارید، آنها را مطابق شکل وارد کنید.

BUDGET_ID=BUDGET_ID
CAMPAIGN_ID=CAMPAIGN_ID

در غیر این صورت، دو مثال Mutates - Creates یک بودجه و کمپین جدید ایجاد می‌کنند.

راهنمای Query Cookbook شامل نمونه‌های گزارش‌دهی زیادی است که با برخی از صفحات پیش‌فرض Google Ads مطابقت دارند و با همان متغیرهای محیطی مورد استفاده در این راهنما کار می‌کنند. ابزار سازنده‌ی کوئری تعاملی ما نیز منبع بسیار خوبی برای ساخت کوئری‌های سفارشی به صورت تعاملی است.

صفحه بندی شده

روش search از صفحه‌بندی استفاده می‌کند، با اندازه صفحه ثابت ۱۰۰۰۰ مورد و یک page_token که در کنار query مشخص شده است.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
",
"page_token":"${PAGE_TOKEN}"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'
### استریمینگ متد `searchStream` تمام نتایج را در یک پاسخ واحد استریم می‌کند، بنابراین، فیلد `pageSize` پشتیبانی نمی‌شود.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:searchStream" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'

جهش‌ها

چندین عملیات تغییر شکل ( create ، update یا remove ) را می‌توان با پر کردن آرایه operations در یک بدنه درخواست JSON ارسال کرد.

ایجاد می‌کند

این مثال دو بودجه کمپین مشترک را در یک درخواست واحد ایجاد می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaignBudgets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  },
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  }
]
}"

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

BUDGET_ID=BUDGET_ID

منابعی که به منابع دیگر اشاره می‌کنند، این کار را با نام منبع انجام می‌دهند. کمپین ایجاد شده در مثال زیر به یک campaignBudget با نام منبع رشته‌ای آن اشاره می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'status': 'PAUSED',
      'advertisingChannelType': 'SEARCH',
      'geoTargetTypeSetting': {
        'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
        'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
      },
      'name': 'My Search campaign #${RANDOM}',
      'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/${BUDGET_ID}',
      'targetSpend': {}
    }
  }
]
}"

به‌روزرسانی‌ها

به‌روزرسانی ویژگی‌های اشیاء موجود با استفاده از عملیات update . مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مرحله قبل را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

همه به‌روزرسانی‌ها به یک فیلد updateMask نیاز دارند، لیستی از ویژگی‌های JSON که با کاما از هم جدا شده‌اند و باید به عنوان به‌روزرسانی اعمال شوند. ویژگی‌هایی که در updateMask فهرست شده‌اند اما در بدنه درخواست وجود ندارند، روی یک شیء پاک می‌شوند. ویژگی‌هایی که در updateMask فهرست نشده‌اند اما در بدنه درخواست وجود دارند، نادیده گرفته می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'name': 'A changed campaign name #${RANDOM}',
    },
    'updateMask': 'name'
  }
],
}"

حذف می‌کند

اشیاء با مشخص کردن نام منبع آنها به عنوان یک عملیات remove حذف می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}'
  }
],
}"

خرابی‌های جزئی

وقتی چندین عملیات در یک درخواست واحد انجام می‌شوند، به صورت اختیاری partialFailure مشخص کنید. اگر true ، عملیات با موفقیت انجام می‌شوند و عملیات نامعتبر خطا برمی‌گردانند. اگر false ، تمام عملیات موجود در درخواست موفق می‌شوند اگر و تنها اگر همه آنها معتبر باشند.

مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مثال Creates را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

درخواست زیر شامل دو عملیات است. اولین عملیات سعی در تغییر استراتژی پیشنهاد قیمت کمپین ارائه شده دارد و عملیات بعدی سعی در حذف یک کمپین با شناسه نامعتبر دارد. از آنجایی که عملیات دوم منجر به خطا می‌شود (شناسه کمپین نامعتبر است) و از آنجایی که partialFailure روی false تنظیم شده است، عملیات اول نیز با شکست مواجه می‌شود و استراتژی پیشنهاد قیمت کمپین موجود به‌روزرسانی نمی‌شود.

curl --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'partialFailure': false,
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'manualCpc': {
        'enhancedCpcEnabled': false
      }
    },
    'updateMask': 'manual_cpc.enhanced_cpc_enabled'
  },
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/INVALID_CAMPAIGN_ID'
  }
]
}"

عملیات گروه‌بندی شده

متد googleAds:mutate از ارسال گروه‌هایی از عملیات با انواع مختلف منابع پشتیبانی می‌کند. شما می‌توانید عملیات‌های زیادی از انواع مختلف را برای زنجیره‌سازی دنباله‌ای از عملیات که باید به صورت گروهی انجام شوند، ارسال کنید. اگر هیچ عملیاتی با شکست مواجه نشود، مجموعه عملیات با موفقیت انجام می‌شود یا اگر هر عملیات واحد با شکست مواجه شود، همه با شکست مواجه می‌شوند.

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

اعداد صحیح منفی ( -1 ، -2 ، -3 ) به عنوان جای‌نگهدارنده در نام منابع استفاده می‌شوند و به صورت پویا در زمان اجرا با نتایج حاصل از توالی عملیات پر می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'mutateOperations': [
  {
    'campaignBudgetOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'name': 'My Campaign Budget #${RANDOM}',
        'deliveryMethod': 'STANDARD',
        'amountMicros': 500000,
        'explicitlyShared': false
      }
    }
  },
  {
    'campaignOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'geoTargetTypeSetting': {
          'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
          'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
        },
        'name': 'My Search campaign #${RANDOM}',
        'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'targetSpend': {}
      }
    }
  },
  {
    'adGroupOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'campaign': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'name': 'My ad group #${RANDOM}',
        'status': 'PAUSED',
        'type': 'SEARCH_STANDARD'
      }
    }
  },
  {
    'adGroupAdOperation': {
      'create': {
        'adGroup': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'status': 'PAUSED',
        'ad': {
          'responsiveSearchAd': {
            'headlines': [
              {
                'pinned_field': 'HEADLINE_1',
                'text': 'An example headline'
              },
              {
                'text': 'Another example headline'
              },
              {
                'text': 'Yet another headline'
              }
            ],
            'descriptions': [
              {
                'text': 'An example description'
              },
              {
                'text': 'Another example description'
              }
            ],
            'path1': 'all-inclusive',
            'path2': 'deals'
          },
          'finalUrls': ['https://www.example.com']
        }
      }
    }
  }
]
}"

مدیریت حساب

شما می‌توانید حساب کاربری ایجاد کنید، حساب‌های کاربری قابل دسترسی را فهرست کنید و فایل‌های باینری را آپلود کنید.

ایجاد حساب‌ها

با استفاده از متد createCustomerClient حساب‌های جدید ایجاد کنید. توجه داشته باشید که URL به جای شناسه حساب مشتری ، به شناسه حساب مدیر نیاز دارد. یک حساب مشتری جدید تحت حساب مدیر ایجاد می‌شود.

curl f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${MANAGER_CUSTOMER_ID}:createCustomerClient" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'customerClient': {
  'descriptiveName': 'My Client #${RANDOM}',
  'currencyCode': 'USD',
  'timeZone': 'America/New_York'
}
}"

فهرست حساب‌های قابل دسترسی

از یک درخواست ساده GET به متد listAccessibleCustomers برای دریافت لیستی از حساب‌های گوگل ادز که با توکن دسترسی OAuth 2.0 داده شده قابل دسترسی هستند، استفاده کنید. در این درخواست نباید از شناسه‌های حساب مدیر یا مشتری استفاده شود.

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}" \

آپلود دارایی‌های دودویی

متد assets:mutate برای آپلود و مدیریت دارایی‌ها استفاده می‌شود. داده‌های دودویی، مانند یک تصویر، به صورت یک رشته با استفاده از کدگذاری استاندارد base64 به همراه padding کدگذاری می‌شوند. کدگذاری استاندارد یا base64 ایمن برای URL با یا بدون padding پذیرفته می‌شود.

این مثال یک GIF یک پیکسلی را کدگذاری می‌کند تا نمونه مختصر بماند. در عمل، حجم data بسیار بیشتر است.

از ابزار خط فرمان base64 (بخشی از ابزارهای اصلی GNU ) برای رمزگذاری یک تصویر GIF با اندازه ۱ پیکسل استفاده کنید.

base64 1pixel.gif

مقدار کدگذاری شده با base64 به عنوان ویژگی data در یک درخواست API مشخص می‌شود.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My image asset #${RANDOM}',
      'type': 'IMAGE',
      'imageAsset': {
        'data': 'R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIA'
      }
    }
  }
]
}"
،

این راهنما شامل نمونه‌هایی از فراخوانی مستقیم نقاط پایانی REST، بدون استفاده از کتابخانه کلاینت است.

پیش‌نیازها

تمام نمونه‌های نشان داده شده در اینجا برای کپی کردن و چسباندن در پوسته bash با استفاده از دستور curl در نظر گرفته شده‌اند.

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

متغیرهای محیطی

اطلاعات حساب کاربری و شناسه‌ها را همانطور که نشان داده شده است وارد کنید و سپس آنها را کپی کرده و در ترمینال خود قرار دهید تا متغیرهای محیطی مورد استفاده در مثال‌های بعدی پیکربندی شوند. راهنمای مجوز ، دستورالعمل‌هایی برای تولید یک توکن دسترسی OAuth 2.0 ارائه می‌دهد.

API_VERSION="22"
DEVELOPER_TOKEN="DEVELOPER_TOKEN"
OAUTH2_ACCESS_TOKEN="OAUTH_ACCESS_TOKEN"
MANAGER_CUSTOMER_ID="MANAGER_CUSTOMER_ID"
CUSTOMER_ID="CUSTOMER_ID"

شناسه‌های شیء اختیاری اضافی

برخی از مثال‌های زیر روی بودجه‌ها یا کمپین‌های از پیش موجود کار می‌کنند. اگر شناسه اشیاء موجود را برای استفاده با این مثال‌ها دارید، آنها را مطابق شکل وارد کنید.

BUDGET_ID=BUDGET_ID
CAMPAIGN_ID=CAMPAIGN_ID

در غیر این صورت، دو مثال Mutates - Creates یک بودجه و کمپین جدید ایجاد می‌کنند.

راهنمای Query Cookbook شامل نمونه‌های گزارش‌دهی زیادی است که با برخی از صفحات پیش‌فرض Google Ads مطابقت دارند و با همان متغیرهای محیطی مورد استفاده در این راهنما کار می‌کنند. ابزار سازنده‌ی کوئری تعاملی ما نیز منبع بسیار خوبی برای ساخت کوئری‌های سفارشی به صورت تعاملی است.

صفحه بندی شده

روش search از صفحه‌بندی استفاده می‌کند، با اندازه صفحه ثابت ۱۰۰۰۰ مورد و یک page_token که در کنار query مشخص شده است.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
",
"page_token":"${PAGE_TOKEN}"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'
### استریمینگ متد `searchStream` تمام نتایج را در یک پاسخ واحد استریم می‌کند، بنابراین، فیلد `pageSize` پشتیبانی نمی‌شود.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:searchStream" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'

جهش‌ها

چندین عملیات تغییر شکل ( create ، update یا remove ) را می‌توان با پر کردن آرایه operations در یک بدنه درخواست JSON ارسال کرد.

ایجاد می‌کند

این مثال دو بودجه کمپین مشترک را در یک درخواست واحد ایجاد می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaignBudgets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  },
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  }
]
}"

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

BUDGET_ID=BUDGET_ID

منابعی که به منابع دیگر اشاره می‌کنند، این کار را با نام منبع انجام می‌دهند. کمپین ایجاد شده در مثال زیر به یک campaignBudget با نام منبع رشته‌ای آن اشاره می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'status': 'PAUSED',
      'advertisingChannelType': 'SEARCH',
      'geoTargetTypeSetting': {
        'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
        'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
      },
      'name': 'My Search campaign #${RANDOM}',
      'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/${BUDGET_ID}',
      'targetSpend': {}
    }
  }
]
}"

به‌روزرسانی‌ها

به‌روزرسانی ویژگی‌های اشیاء موجود با استفاده از عملیات update . مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مرحله قبل را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

همه به‌روزرسانی‌ها به یک فیلد updateMask نیاز دارند، لیستی از ویژگی‌های JSON که با کاما از هم جدا شده‌اند و باید به عنوان به‌روزرسانی اعمال شوند. ویژگی‌هایی که در updateMask فهرست شده‌اند اما در بدنه درخواست وجود ندارند، روی یک شیء پاک می‌شوند. ویژگی‌هایی که در updateMask فهرست نشده‌اند اما در بدنه درخواست وجود دارند، نادیده گرفته می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'name': 'A changed campaign name #${RANDOM}',
    },
    'updateMask': 'name'
  }
],
}"

حذف می‌کند

اشیاء با مشخص کردن نام منبع آنها به عنوان یک عملیات remove حذف می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}'
  }
],
}"

خرابی‌های جزئی

وقتی چندین عملیات در یک درخواست واحد انجام می‌شوند، به صورت اختیاری partialFailure مشخص کنید. اگر true ، عملیات با موفقیت انجام می‌شوند و عملیات نامعتبر خطا برمی‌گردانند. اگر false ، تمام عملیات موجود در درخواست موفق می‌شوند اگر و تنها اگر همه آنها معتبر باشند.

مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مثال Creates را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

درخواست زیر شامل دو عملیات است. اولین عملیات سعی در تغییر استراتژی پیشنهاد قیمت کمپین ارائه شده دارد و عملیات بعدی سعی در حذف یک کمپین با شناسه نامعتبر دارد. از آنجایی که عملیات دوم منجر به خطا می‌شود (شناسه کمپین نامعتبر است) و از آنجایی که partialFailure روی false تنظیم شده است، عملیات اول نیز با شکست مواجه می‌شود و استراتژی پیشنهاد قیمت کمپین موجود به‌روزرسانی نمی‌شود.

curl --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'partialFailure': false,
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'manualCpc': {
        'enhancedCpcEnabled': false
      }
    },
    'updateMask': 'manual_cpc.enhanced_cpc_enabled'
  },
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/INVALID_CAMPAIGN_ID'
  }
]
}"

عملیات گروه‌بندی شده

متد googleAds:mutate از ارسال گروه‌هایی از عملیات با انواع مختلف منابع پشتیبانی می‌کند. شما می‌توانید عملیات‌های زیادی از انواع مختلف را برای زنجیره‌سازی دنباله‌ای از عملیات که باید به صورت گروهی انجام شوند، ارسال کنید. اگر هیچ عملیاتی با شکست مواجه نشود، مجموعه عملیات با موفقیت انجام می‌شود یا اگر هر عملیات واحد با شکست مواجه شود، همه با شکست مواجه می‌شوند.

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

اعداد صحیح منفی ( -1 ، -2 ، -3 ) به عنوان جای‌نگهدارنده در نام منابع استفاده می‌شوند و به صورت پویا در زمان اجرا با نتایج حاصل از توالی عملیات پر می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'mutateOperations': [
  {
    'campaignBudgetOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'name': 'My Campaign Budget #${RANDOM}',
        'deliveryMethod': 'STANDARD',
        'amountMicros': 500000,
        'explicitlyShared': false
      }
    }
  },
  {
    'campaignOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'geoTargetTypeSetting': {
          'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
          'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
        },
        'name': 'My Search campaign #${RANDOM}',
        'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'targetSpend': {}
      }
    }
  },
  {
    'adGroupOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'campaign': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'name': 'My ad group #${RANDOM}',
        'status': 'PAUSED',
        'type': 'SEARCH_STANDARD'
      }
    }
  },
  {
    'adGroupAdOperation': {
      'create': {
        'adGroup': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'status': 'PAUSED',
        'ad': {
          'responsiveSearchAd': {
            'headlines': [
              {
                'pinned_field': 'HEADLINE_1',
                'text': 'An example headline'
              },
              {
                'text': 'Another example headline'
              },
              {
                'text': 'Yet another headline'
              }
            ],
            'descriptions': [
              {
                'text': 'An example description'
              },
              {
                'text': 'Another example description'
              }
            ],
            'path1': 'all-inclusive',
            'path2': 'deals'
          },
          'finalUrls': ['https://www.example.com']
        }
      }
    }
  }
]
}"

مدیریت حساب

شما می‌توانید حساب کاربری ایجاد کنید، حساب‌های کاربری قابل دسترسی را فهرست کنید و فایل‌های باینری را آپلود کنید.

ایجاد حساب‌ها

با استفاده از متد createCustomerClient حساب‌های جدید ایجاد کنید. توجه داشته باشید که URL به جای شناسه حساب مشتری ، به شناسه حساب مدیر نیاز دارد. یک حساب مشتری جدید تحت حساب مدیر ایجاد می‌شود.

curl f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${MANAGER_CUSTOMER_ID}:createCustomerClient" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'customerClient': {
  'descriptiveName': 'My Client #${RANDOM}',
  'currencyCode': 'USD',
  'timeZone': 'America/New_York'
}
}"

فهرست حساب‌های قابل دسترسی

از یک درخواست ساده GET به متد listAccessibleCustomers برای دریافت لیستی از حساب‌های گوگل ادز که با توکن دسترسی OAuth 2.0 داده شده قابل دسترسی هستند، استفاده کنید. در این درخواست نباید از شناسه‌های حساب مدیر یا مشتری استفاده شود.

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}" \

آپلود دارایی‌های دودویی

متد assets:mutate برای آپلود و مدیریت دارایی‌ها استفاده می‌شود. داده‌های دودویی، مانند یک تصویر، به صورت یک رشته با استفاده از کدگذاری استاندارد base64 به همراه padding کدگذاری می‌شوند. کدگذاری استاندارد یا base64 ایمن برای URL با یا بدون padding پذیرفته می‌شود.

این مثال یک GIF یک پیکسلی را کدگذاری می‌کند تا نمونه مختصر بماند. در عمل، حجم data بسیار بیشتر است.

از ابزار خط فرمان base64 (بخشی از ابزارهای اصلی GNU ) برای رمزگذاری یک تصویر GIF با اندازه ۱ پیکسل استفاده کنید.

base64 1pixel.gif

مقدار کدگذاری شده با base64 به عنوان ویژگی data در یک درخواست API مشخص می‌شود.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My image asset #${RANDOM}',
      'type': 'IMAGE',
      'imageAsset': {
        'data': 'R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIA'
      }
    }
  }
]
}"
،

این راهنما شامل نمونه‌هایی از فراخوانی مستقیم نقاط پایانی REST، بدون استفاده از کتابخانه کلاینت است.

پیش‌نیازها

تمام نمونه‌های نشان داده شده در اینجا برای کپی کردن و چسباندن در پوسته bash با استفاده از دستور curl در نظر گرفته شده‌اند.

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

متغیرهای محیطی

اطلاعات حساب کاربری و شناسه‌ها را همانطور که نشان داده شده است وارد کنید و سپس آنها را کپی کرده و در ترمینال خود قرار دهید تا متغیرهای محیطی مورد استفاده در مثال‌های بعدی پیکربندی شوند. راهنمای مجوز ، دستورالعمل‌هایی برای تولید یک توکن دسترسی OAuth 2.0 ارائه می‌دهد.

API_VERSION="22"
DEVELOPER_TOKEN="DEVELOPER_TOKEN"
OAUTH2_ACCESS_TOKEN="OAUTH_ACCESS_TOKEN"
MANAGER_CUSTOMER_ID="MANAGER_CUSTOMER_ID"
CUSTOMER_ID="CUSTOMER_ID"

شناسه‌های شیء اختیاری اضافی

برخی از مثال‌های زیر روی بودجه‌ها یا کمپین‌های از پیش موجود کار می‌کنند. اگر شناسه اشیاء موجود را برای استفاده با این مثال‌ها دارید، آنها را مطابق شکل وارد کنید.

BUDGET_ID=BUDGET_ID
CAMPAIGN_ID=CAMPAIGN_ID

در غیر این صورت، دو مثال Mutates - Creates یک بودجه و کمپین جدید ایجاد می‌کنند.

راهنمای Query Cookbook شامل نمونه‌های گزارش‌دهی زیادی است که با برخی از صفحات پیش‌فرض Google Ads مطابقت دارند و با همان متغیرهای محیطی مورد استفاده در این راهنما کار می‌کنند. ابزار سازنده‌ی کوئری تعاملی ما نیز منبع بسیار خوبی برای ساخت کوئری‌های سفارشی به صورت تعاملی است.

صفحه بندی شده

روش search از صفحه‌بندی استفاده می‌کند، با اندازه صفحه ثابت ۱۰۰۰۰ مورد و یک page_token که در کنار query مشخص شده است.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:search" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
",
"page_token":"${PAGE_TOKEN}"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'
### استریمینگ متد `searchStream` تمام نتایج را در یک پاسخ واحد استریم می‌کند، بنابراین، فیلد `pageSize` پشتیبانی نمی‌شود.

حلقه زدن

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:searchStream" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data '{
"query": "
  SELECT campaign.name,
    campaign_budget.amount_micros,
    campaign.status,
    campaign.optimization_score,
    campaign.advertising_channel_type,
    metrics.clicks,
    metrics.impressions,
    metrics.ctr,
    metrics.average_cpc,
    metrics.cost_micros,
    campaign.bidding_strategy_type
  FROM campaign
  WHERE segments.date DURING LAST_7_DAYS
    AND campaign.status != 'REMOVED'
"
}'

جی‌کیوال

SELECT campaign.name,
  campaign_budget.amount_micros,
  campaign.status,
  campaign.optimization_score,
  campaign.advertising_channel_type,
  metrics.clicks,
  metrics.impressions,
  metrics.ctr,
  metrics.average_cpc,
  metrics.cost_micros,
  campaign.bidding_strategy_type
FROM campaign
WHERE segments.date DURING LAST_7_DAYS
  AND campaign.status != 'REMOVED'

جهش‌ها

چندین عملیات تغییر شکل ( create ، update یا remove ) را می‌توان با پر کردن آرایه operations در یک بدنه درخواست JSON ارسال کرد.

ایجاد می‌کند

این مثال دو بودجه کمپین مشترک را در یک درخواست واحد ایجاد می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaignBudgets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  },
  {
    'create': {
      'name': 'My Campaign Budget #${RANDOM}',
      'amountMicros': 500000,
    }
  }
]
}"

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

BUDGET_ID=BUDGET_ID

منابعی که به منابع دیگر اشاره می‌کنند، این کار را با نام منبع انجام می‌دهند. کمپین ایجاد شده در مثال زیر به یک campaignBudget با نام منبع رشته‌ای آن اشاره می‌کند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'status': 'PAUSED',
      'advertisingChannelType': 'SEARCH',
      'geoTargetTypeSetting': {
        'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
        'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
      },
      'name': 'My Search campaign #${RANDOM}',
      'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/${BUDGET_ID}',
      'targetSpend': {}
    }
  }
]
}"

به‌روزرسانی‌ها

به‌روزرسانی ویژگی‌های اشیاء موجود با استفاده از عملیات update . مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مرحله قبل را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

همه به‌روزرسانی‌ها به یک فیلد updateMask نیاز دارند، لیستی از ویژگی‌های JSON که با کاما از هم جدا شده‌اند و باید به عنوان به‌روزرسانی اعمال شوند. ویژگی‌هایی که در updateMask فهرست شده‌اند اما در بدنه درخواست وجود ندارند، روی یک شیء پاک می‌شوند. ویژگی‌هایی که در updateMask فهرست نشده‌اند اما در بدنه درخواست وجود دارند، نادیده گرفته می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'name': 'A changed campaign name #${RANDOM}',
    },
    'updateMask': 'name'
  }
],
}"

حذف می‌کند

اشیاء با مشخص کردن نام منبع آنها به عنوان یک عملیات remove حذف می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}'
  }
],
}"

خرابی‌های جزئی

وقتی چندین عملیات در یک درخواست واحد انجام می‌شوند، به صورت اختیاری partialFailure مشخص کنید. اگر true ، عملیات با موفقیت انجام می‌شوند و عملیات نامعتبر خطا برمی‌گردانند. اگر false ، تمام عملیات موجود در درخواست موفق می‌شوند اگر و تنها اگر همه آنها معتبر باشند.

مثال بعدی از یک کمپین موجود استفاده می‌کند؛ می‌توانید خروجی مثال Creates را کپی و پیست کنید.

CAMPAIGN_ID=CAMPAIGN_ID

درخواست زیر شامل دو عملیات است. اولین عملیات سعی در تغییر استراتژی پیشنهاد قیمت کمپین ارائه شده دارد و عملیات بعدی سعی در حذف یک کمپین با شناسه نامعتبر دارد. از آنجایی که عملیات دوم منجر به خطا می‌شود (شناسه کمپین نامعتبر است) و از آنجایی که partialFailure روی false تنظیم شده است، عملیات اول نیز با شکست مواجه می‌شود و استراتژی پیشنهاد قیمت کمپین موجود به‌روزرسانی نمی‌شود.

curl --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/campaigns:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'partialFailure': false,
'operations': [
  {
    'update': {
      'resourceName': 'customers/${CUSTOMER_ID}/campaigns/${CAMPAIGN_ID}',
      'manualCpc': {
        'enhancedCpcEnabled': false
      }
    },
    'updateMask': 'manual_cpc.enhanced_cpc_enabled'
  },
  {
    'remove': 'customers/${CUSTOMER_ID}/campaigns/INVALID_CAMPAIGN_ID'
  }
]
}"

عملیات گروه‌بندی شده

متد googleAds:mutate از ارسال گروه‌هایی از عملیات با انواع مختلف منابع پشتیبانی می‌کند. شما می‌توانید عملیات‌های زیادی از انواع مختلف را برای زنجیره‌سازی دنباله‌ای از عملیات که باید به صورت گروهی انجام شوند، ارسال کنید. اگر هیچ عملیاتی با شکست مواجه نشود، مجموعه عملیات با موفقیت انجام می‌شود یا اگر هر عملیات واحد با شکست مواجه شود، همه با شکست مواجه می‌شوند.

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

اعداد صحیح منفی ( -1 ، -2 ، -3 ) به عنوان جای‌نگهدارنده در نام منابع استفاده می‌شوند و به صورت پویا در زمان اجرا با نتایج حاصل از توالی عملیات پر می‌شوند.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/googleAds:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'mutateOperations': [
  {
    'campaignBudgetOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'name': 'My Campaign Budget #${RANDOM}',
        'deliveryMethod': 'STANDARD',
        'amountMicros': 500000,
        'explicitlyShared': false
      }
    }
  },
  {
    'campaignOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'geoTargetTypeSetting': {
          'positiveGeoTargetType': 'PRESENCE_OR_INTEREST',
          'negativeGeoTargetType': 'PRESENCE_OR_INTEREST'
        },
        'name': 'My Search campaign #${RANDOM}',
        'campaignBudget': 'customers/${CUSTOMER_ID}/campaignBudgets/-1',
        'targetSpend': {}
      }
    }
  },
  {
    'adGroupOperation': {
      'create': {
        'resourceName': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'campaign': 'customers/${CUSTOMER_ID}/campaigns/-2',
        'name': 'My ad group #${RANDOM}',
        'status': 'PAUSED',
        'type': 'SEARCH_STANDARD'
      }
    }
  },
  {
    'adGroupAdOperation': {
      'create': {
        'adGroup': 'customers/${CUSTOMER_ID}/adGroups/-3',
        'status': 'PAUSED',
        'ad': {
          'responsiveSearchAd': {
            'headlines': [
              {
                'pinned_field': 'HEADLINE_1',
                'text': 'An example headline'
              },
              {
                'text': 'Another example headline'
              },
              {
                'text': 'Yet another headline'
              }
            ],
            'descriptions': [
              {
                'text': 'An example description'
              },
              {
                'text': 'Another example description'
              }
            ],
            'path1': 'all-inclusive',
            'path2': 'deals'
          },
          'finalUrls': ['https://www.example.com']
        }
      }
    }
  }
]
}"

مدیریت حساب

شما می‌توانید حساب کاربری ایجاد کنید، حساب‌های کاربری قابل دسترسی را فهرست کنید و فایل‌های باینری را آپلود کنید.

ایجاد حساب‌ها

با استفاده از متد createCustomerClient حساب‌های جدید ایجاد کنید. توجه داشته باشید که URL به جای شناسه حساب مشتری ، به شناسه حساب مدیر نیاز دارد. یک حساب مشتری جدید تحت حساب مدیر ایجاد می‌شود.

curl f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${MANAGER_CUSTOMER_ID}:createCustomerClient" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'customerClient': {
  'descriptiveName': 'My Client #${RANDOM}',
  'currencyCode': 'USD',
  'timeZone': 'America/New_York'
}
}"

فهرست حساب‌های قابل دسترسی

از یک درخواست ساده GET به متد listAccessibleCustomers برای دریافت لیستی از حساب‌های گوگل ادز که با توکن دسترسی OAuth 2.0 داده شده قابل دسترسی هستند، استفاده کنید. در این درخواست نباید از شناسه‌های حساب مدیر یا مشتری استفاده شود.

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}" \

آپلود دارایی‌های دودویی

متد assets:mutate برای آپلود و مدیریت دارایی‌ها استفاده می‌شود. داده‌های دودویی، مانند یک تصویر، به صورت یک رشته با استفاده از کدگذاری استاندارد base64 به همراه padding کدگذاری می‌شوند. کدگذاری استاندارد یا base64 ایمن برای URL با یا بدون padding پذیرفته می‌شود.

این مثال یک GIF یک پیکسلی را کدگذاری می‌کند تا نمونه مختصر بماند. در عمل، حجم data بسیار بیشتر است.

از ابزار خط فرمان base64 (بخشی از ابزارهای اصلی GNU ) برای رمزگذاری یک تصویر GIF با اندازه ۱ پیکسل استفاده کنید.

base64 1pixel.gif

مقدار کدگذاری شده با base64 به عنوان ویژگی data در یک درخواست API مشخص می‌شود.

curl -f --request POST "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \
--header "Content-Type: application/json" \
--header "developer-token: ${DEVELOPER_TOKEN}" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--data "{
'operations': [
  {
    'create': {
      'name': 'My image asset #${RANDOM}',
      'type': 'IMAGE',
      'imageAsset': {
        'data': 'R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIA'
      }
    }
  }
]
}"