تحميل مقاطع فيديو

تتيح لك YouTubeVideoUploadService تحميل الفيديوهات مباشرةً إلى YouTube من خلال Google Ads API. ويمكن بعد ذلك استخدام هذه الفيديوهات لإنشاء مواد عرض فيديو في أنواع إعلانات مختلفة، مثل حملات الأداء الأفضل أو حملات زيادة الطلب.

تعمل هذه الخدمة على تبسيط سير عمل إنشاء إعلانات الفيديو من خلال معالجة عملية التحميل على YouTube، ما يضمن ربط الفيديوهات بشكل صحيح بحسابك.

المفاهيم الرئيسية

قبل البدء، من المهم فهم كيفية إدارة عمليات تحميل الفيديوهات والحالات المختلفة التي يمكن أن تمر بها.

سير العمل الشامل

يتطلّب تحميل ملف فيديو وعرضه في إعلان أربع خطوات متتالية:

الخطوة الخدمة والطريقة ملخّص
1. بدء تحميل وحدات بايت الفيديو وتحميلها CreateYouTubeVideoUpload على YouTubeVideoUploadService حمِّل البيانات الوصفية للفيديو والملف الثنائي لإنشاء مرجع YouTubeVideoUpload (customers/{customer_id}/youTubeVideoUploads/{video_upload_id}).
2. حالة معالجة الاستطلاع SearchStream على GoogleAdsService يجب البحث عن you_tube_video_upload حتى state = 'PROCESSED'، وسيتم ملء video_id المكوّن من 11 حرفًا على YouTube.
3. إنشاء مادة عرض فيديو قابلة لإعادة الاستخدام MutateAssets على AssetService أنشئ YoutubeVideoAsset (youtube_video_id = video_id) للحصول على اسم مورد مادة عرض (customers/{customer_id}/assets/{asset_id}).
4. ربط مادة العرض بحملات أو إعلانات MutateAssetGroupAssets على AssetGroupAssetService أو MutateAdGroupAds على AdGroupAdService اربط مادة العرض AssetGroupAsset (field_type = YOUTUBE_VIDEO) بـ "حملة أداء أفضل" أو DemandGenVideoResponsiveAdInfo (videos[].asset) بـ "حملة زيادة طلب".

ملكية القناة

عند تحميل فيديو، يمكنك تحديد قناة على YouTube الوجهة باستخدام الحقل channel_id في عنصر YouTubeVideoUpload:

  • قناة مملوكة للمعلِن (علامة تجارية): قدِّم channel_id لقناة حالية على YouTube يملكها المعلِن. لا تتوفّر هذه الميزة إلا في مسار مصادقة المستخدم، ولا يمكن استخدامها مع حسابات الخدمة.
  • قناة تديرها Google: في حال حذف channel_id، يتم تحميل الفيديو إلى قناة على YouTube تديرها Google ومرتبطة بحساب "إعلانات Google".

حالات التحميل

يتم تتبُّع مراحل نشاط تحميل فيديو على YouTube من خلال الحقل state. يحدّد التعداد YouTubeVideoUploadState الحالات التالية:

ولاية الوصف
PENDING جارٍ تحميل الفيديو.
UPLOADED تم تحميل الفيديو بنجاح ويعالجه YouTube حاليًا.
PROCESSED تمت معالجة الفيديو بنجاح وأصبح جاهزًا للاستخدام.
FAILED تعذّر تحميل الملف أو معالجته ولا يمكن إكمال العملية.
REJECTED تم رفض الفيديو لأسباب تتعلق بالتحقّق من الصحة أو السياسة.
UNAVAILABLE حالة الفيديو غير متاحة، وقد يكون تمّت إزالته من YouTube.

إعدادات الخصوصية

يحدّد الحقل video_privacy المستخدمين الذين يمكنهم مشاهدة الفيديو الذي تم تحميله. يتيح التعداد YouTubeVideoPrivacy ما يلي:

  • ‫PUBLIC: الفيديو متاح لأي مستخدم على YouTube. (يُسمح بذلك فقط للقنوات التابعة لعلامات تجارية).
  • ‫UNLISTED: لا يمكن البحث عن الفيديو، ولكن يمكن لأي مستخدم لديه الرابط مشاهدته. هذا هو الخيار التلقائي والوحيد للقنوات التي تديرها Google.

الإفصاح عن المحتوى من إنشاء الذكاء الاصطناعي التوليدي

اعتبارًا من الإصدار 26، وبموجب لوائح مثل قانون الذكاء الاصطناعي الأوروبي، يمكن للمعلِنين الإفصاح عمّا إذا كان محتوى الفيديو الذي تم تحميله يتضمّن محتوًى من إنشاء الذكاء الاصطناعي أو وسائط اصطناعية.

يحتوي الحقل video_content_metadata في YouTubeVideoUpload على VideoContentMetadata. اضبط حقل generative_content_disclosure المتداخل باستخدام تعداد YouTubeVideoUploadGenerativeContentDisclosure:

القيمة الوصف
NON_GENERATIVE_CONTENT أفصح المعلِن عن أنّ الفيديو ليس من إنشاء الذكاء الاصطناعي.
GENERATIVE_CONTENT أفصح المعلِن عن أنّ الفيديو من إنشاء الذكاء الاصطناعي.

تحميل فيديو

لتحميل فيديو، يجب استخدام طلب متعدد الأجزاء إلى الطريقة CreateYouTubeVideoUpload. يحتوي الطلب على كل من البيانات الوصفية للتحميل وملف الفيديو نفسه.

1. بدء التحميل

أنشئ CreateYouTubeVideoUploadRequest باستخدام الحقول التالية:

الحقل المتطلبات الوصف والقيود
customer_id مطلوب رقم تعريف عميل "إعلانات Google" المكوّن من 10 أرقام (بدون واصلات)
you_tube_video_upload.video_title مطلوب (INPUT_ONLY، IMMUTABLE) عنوان الفيديو الذي تم تحميله على YouTube (يصل إلى 100 حرف، ولا يمكن أن يحتوي على < أو >).
you_tube_video_upload.video_description اختياري (INPUT_ONLY، IMMUTABLE) وصف الفيديو على YouTube (يصل إلى 5,000 حرف، ولا يمكن أن يحتوي على < أو >).
you_tube_video_upload.channel_id اختياري (IMMUTABLE) معرّف قناة على YouTube المقصودة المكوّن من 24 حرفًا (يبدأ بـ UC) لقناة علامة تجارية يملكها المعلِن في حال حذف هذه المَعلمة، يتم تحميل الفيديوهات إلى قناة تديرها Google.
you_tube_video_upload.video_privacy اختياري (قابل للتعديل على قنوات العلامات التجارية) YouTubeVideoPrivacy (الإعداد التلقائي هو UNLISTED، أو PUBLIC لقنوات العلامات التجارية التي يملكها المعلِن)
you_tube_video_upload.video_content_metadata اختياري (INPUT_ONLY أو IMMUTABLE) متوفّر بدءًا من الإصدار 26: VideoContentMetadata مع ضبط generative_content_disclosure على القيمة YouTubeVideoUploadGenerativeContentDisclosure (NON_GENERATIVE_CONTENT أو GENERATIVE_CONTENT).

إذا كنت تستخدم مكتبة برامج، استدعِ طريقة CreateYouTubeVideoUpload ، مع تمرير ملف الفيديو، وسيتم التعامل مع عملية تحميل الفيديو داخليًا.

جافا

String videoUploadResourceName;
try (YouTubeVideoUploadServiceClient youTubeVideoUploadServiceClient =
    googleAdsClient.getLatestVersion().createYouTubeVideoUploadServiceClient()) {
  YouTubeVideoUpload youTubeVideoUpload =
      YouTubeVideoUpload.newBuilder()
          .setVideoTitle("Test Video")
          .setVideoDescription("Test Video Description")
          .setVideoPrivacy(YouTubeVideoPrivacy.UNLISTED)
          .build();

  CreateYouTubeVideoUploadRequest createUploadRequest =
      CreateYouTubeVideoUploadRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setYouTubeVideoUpload(youTubeVideoUpload)
          .build();

  CreateYouTubeVideoUploadResponse response =
      youTubeVideoUploadServiceClient.createYouTubeVideoUpload(
          createUploadRequest, () -> new FileInputStream(videoFile), null);

  videoUploadResourceName = response.getResourceName();
  System.out.printf("Created YouTube video upload: %s%n", videoUploadResourceName);
}
      

#C

YouTubeVideoUploadServiceClient ytService = client.GetService(
    Services.V26.YouTubeVideoUploadService);

CreateYouTubeVideoUploadRequest createUploadRequest =
    new CreateYouTubeVideoUploadRequest()
    {
        CustomerId = customerId.ToString(),
        YouTubeVideoUpload = new YouTubeVideoUpload()
        {
            VideoTitle = "Test Video",
            VideoDescription = "Test Video Description",
            VideoPrivacy = YouTubeVideoPrivacy.Unlisted
        }
    };

string videoUploadResourceName;
using (FileStream stream = File.OpenRead(videoFilePath))
{
    ResumableUploadSession<CreateYouTubeVideoUploadRequest, CreateYouTubeVideoUploadResponse> session =
        ytService.CreateYouTubeVideoUpload();
    CreateYouTubeVideoUploadResponse response =
        session.BeginUploadAsync(createUploadRequest, stream).Result;

    videoUploadResourceName = response.ResourceName;
    Console.WriteLine($"Created YouTube video upload: {videoUploadResourceName}");
}
      

PHP

$youTubeVideoUploadServiceClient = $googleAdsClient->getYouTubeVideoUploadServiceClient();

$youTubeVideoUpload = new YouTubeVideoUpload([
    'video_title' => 'Test Video',
    'video_description' => 'Test Video Description',
    'video_privacy' => YouTubeVideoPrivacy::UNLISTED
]);

$createYouTubeVideoUploadRequest = CreateYouTubeVideoUploadRequest::build(
    $customerId,
    $youTubeVideoUpload
);

/** @var ResumableUpload $resumableUpload */
$resumableUpload = $youTubeVideoUploadServiceClient->createYouTubeVideoUpload(
    $createYouTubeVideoUploadRequest
);

$stream = Utils::streamFor(fopen($videoFilePath, 'rb'));
/** @var CreateYouTubeVideoUploadResponse $response */
$response = $resumableUpload->startUpload($stream);

$videoUploadResourceName = $response->getResourceName();
printf("Created YouTube video upload: '%s'%s", $videoUploadResourceName, PHP_EOL);
      

Python

yt_service: YouTubeVideoUploadServiceClient = client.get_service(
    "YouTubeVideoUploadService"
)

create_upload_request: CreateYouTubeVideoUploadRequest = (
    youtube_video_upload_service.CreateYouTubeVideoUploadRequest()
)
create_upload_request.customer_id = customer_id
create_upload_request.you_tube_video_upload.video_title = "Test Video"
create_upload_request.you_tube_video_upload.video_description = (
    "Test Video Description"
)
create_upload_request.you_tube_video_upload.video_privacy = (
    client.enums.YouTubeVideoPrivacyEnum.UNLISTED
)

video_upload_resource_name: str
with open(video_file_path, "rb") as stream:
    response: CreateYouTubeVideoUploadResponse = (
        yt_service.create_you_tube_video_upload(
            stream=stream,
            request=create_upload_request,
            retry=None,
        )
    )
    video_upload_resource_name = response.resource_name
    print(f"Created YouTube video upload: {video_upload_resource_name}")
      

Ruby

video_upload = client.resource.you_tube_video_upload do |v|
  v.video_title = "Test Video"
  v.video_description = "Test Video Description"
  v.video_privacy = :UNLISTED
end

upload = client.service.you_tube_video_upload.create_you_tube_video_upload(
  customer_id: customer_id,
  you_tube_video_upload: video_upload,
)

video_upload_resource_name = nil
File.open(video_file_path, "rb") do |stream|
  response = upload.start(
    stream: stream,
    content_type: "application/octet-stream",
  )
  video_upload_resource_name = response.resource_name
  puts "Created YouTube video upload: #{video_upload_resource_name}"
end
      

Perl

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

# 
# Use the --i curl parameter to capture response headers in the $RESPONSE
# variable.
FILE_SIZE=$(wc -c < "${VIDEO_FILE_NAME}" | tr -d '\r')
RESPONSE=$(curl -i -f -v -s --request POST \
"https://googleads.googleapis.com/resumable/upload/v${API_VERSION}/customers/${CUSTOMER_ID}/youTubeVideoUploads:create" \
--header "Content-Type: application/json" \
--header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Protocol: resumable" \
--header "X-Goog-Upload-Command: start" \
--header "X-Goog-Upload-Header-Content-Length: ${FILE_SIZE}" \
--data @- <<EOF
{
  "customer_id": "${CUSTOMER_ID}",
  "you_tube_video_upload": {
    "video_title": "${VIDEO_TITLE}",
    "video_description": "${VIDEO_DESCRIPTION}",
    "video_privacy": "UNLISTED"
  }
}
EOF
)

# Extract the value of the "x-goog-upload-url" header from the HTTP response.
UPLOAD_URL=$(echo "${RESPONSE}" \
  | grep -i '^x-goog-upload-url' \
  | awk '{print $2}' \
  | tr -d '\r')
CHUNK_SIZE=$(echo "${RESPONSE}" \
  | grep -i '^x-goog-upload-chunk-granularity' \
  | awk '{print $2}' \
  | tr -d '\r')
      

إذا كنت تستخدم REST، يوضّح القسم التالي كيفية إدارة عملية تحميل الفيديو.

2. تحميل الفيديو

عند التحميل باستخدام REST، تستخدم CreateYouTubeVideoUpload بروتوكول تحميل قابل للاستئناف من خطوتين:

  1. بدء جلسة التحميل: أرسِل طلب POST أوّلي إلى نقطة نهاية التحميل CreateYouTubeVideoUpload (/upload/v26/customers/{customer_id}/youTubeVideoUploads:create) مع x-goog-upload-command: start (ويمكنك اختياريًا استخدام x-goog-upload-header-content-length لتحديد حجم الملف). تتضمّن الاستجابة عنوان URL لجلسة التحميل في عنوان الاستجابة x-goog-upload-url HTTP، بالإضافة إلى بيانات وصفية مثل حجم الجزء المتوقّع.
  2. بث وحدات بايت الفيديو وإكمالها: أرسِل حمولة الفيديو الثنائية إلى نقطة النهاية x-goog-upload-url باستخدام x-goog-upload-command: upload, finalize. عند انتهاء التحميل، يعرض الردّ resource_name (customers/{customer_id}/youTubeVideoUploads/{video_upload_id}) الذي تم إنشاؤه.

للحصول على وصف كامل لرؤوس HTTP المستخدَمة في بروتوكول تحميل الفيديوهات، يُرجى الرجوع إلى مثال الرمز البرمجي التالي:

# Take the first ${CHUNK_SIZE} bytes of the video file and upload them.
head -c ${CHUNK_SIZE} ${VIDEO_FILE_NAME} | curl -i -v -X PUT "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Offset: 0" \
--header "X-Goog-Upload-Command: upload" \
--header "Content-Length: ${CHUNK_SIZE}" \
--data-binary @-

# Query the status of the upload.
QUERY_RESPONSE=$(curl -i -s -X POST "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Command: query")

# Extract the value of the "x-goog-upload-size-received" header from the HTTP
# response.
UPLOADED_BYTES=$(echo "${QUERY_RESPONSE}" \
  | grep -i '^x-goog-upload-size-received' \
  | awk '{print $2}' \
  | tr -d '\r')

echo "Uploaded ${UPLOADED_BYTES} bytes."

REMAINING_BYTES=$((FILE_SIZE - UPLOADED_BYTES))
echo "${REMAINING_BYTES} bytes remaining to upload."

FINALIZE_RESPONSE=$(tail -c ${REMAINING_BYTES} ${VIDEO_FILE_NAME} | curl -v -X PUT "${UPLOAD_URL}" \
--header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
--header "X-Goog-Upload-Offset: ${UPLOADED_BYTES}" \
--header "X-Goog-Upload-Command: upload, finalize" \
--data-binary @-)
UPLOADED_VIDEO_RESOURCE_NAME=$(echo $FINALIZE_RESPONSE | jq -r '.resourceName')
      

3- استرداد حالة تحميل الفيديو

بعد بدء تحميل فيديو، يمكنك الاستعلام عن حالة معالجته من خلال طلب البحث عن الحقول القابلة للاختيار في مورد you_tube_video_upload (resource_name وvideo_upload_id وchannel_id وvideo_id وstate وvideo_privacy) باستخدام لغة طلب البحث في "إعلانات Google"‏ (GAQL) إلى أن يتم عرض state = 'PROCESSED' (لا يمكن اختيار حقول INPUT_ONLY في لغة طلب البحث في "إعلانات Google"‏ (GAQL)):

جافا

// Retrieve the metadata of the newly uploaded video.
String query =
    String.format(
        "SELECT "
            + "you_tube_video_upload.resource_name, "
            + "you_tube_video_upload.video_id, "
            + "you_tube_video_upload.state "
            + "FROM you_tube_video_upload "
            + "WHERE you_tube_video_upload.resource_name = '%s'",
        videoUploadResourceName);

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery(query)
          .build();

  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request);

  for (SearchGoogleAdsStreamResponse response : stream) {
    for (GoogleAdsRow googleAdsRow : response.getResultsList()) {
      YouTubeVideoUpload video = googleAdsRow.getYouTubeVideoUpload();
      System.out.printf(
          "Video with ID %s was found in state %s.%n",
          video.getVideoId(), video.getState());
    }
  }
}
      

#C

// Retrieve the metadata of the newly uploaded video.
string query = $@"
    SELECT
      you_tube_video_upload.resource_name,
      you_tube_video_upload.video_id,
      you_tube_video_upload.state
    FROM you_tube_video_upload
    WHERE you_tube_video_upload.resource_name = '{videoUploadResourceName}'";

GoogleAdsServiceClient gaService = client.GetService(
    Services.V26.GoogleAdsService);

gaService.SearchStream(customerId.ToString(), query,
    delegate (SearchGoogleAdsStreamResponse resp)
    {
        foreach (GoogleAdsRow row in resp.Results)
        {
            Console.WriteLine(
                $"Video with ID {row.YouTubeVideoUpload.VideoId} was found in " +
                $"state {row.YouTubeVideoUpload.State}.");
        }
    }
);
      

PHP

// Retrieve the metadata of the newly uploaded video.
$query = sprintf(
    "SELECT you_tube_video_upload.resource_name, "
    . "you_tube_video_upload.video_id, "
    . "you_tube_video_upload.state "
    . "FROM you_tube_video_upload "
    . "WHERE you_tube_video_upload.resource_name = '%s'",
    $videoUploadResourceName
);

$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
$stream = $googleAdsServiceClient->searchStream(
    SearchGoogleAdsStreamRequest::build($customerId, $query)
);

foreach ($stream->iterateAllElements() as $googleAdsRow) {
    /** @var GoogleAdsRow $googleAdsRow */
    printf(
        "Video with ID '%s' was found in state '%s'.%s",
        $googleAdsRow->getYouTubeVideoUpload()->getVideoId(),
        YouTubeVideoUploadState::name($googleAdsRow->getYouTubeVideoUpload()->getState()),
        PHP_EOL
    );
}
      

Python

# Retrieve the metadata of the newly uploaded video.
query: str = f"""
    SELECT
      you_tube_video_upload.resource_name,
      you_tube_video_upload.video_id,
      you_tube_video_upload.state
    FROM you_tube_video_upload
    WHERE you_tube_video_upload.resource_name = '{video_upload_resource_name}'"""

ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream(
    customer_id=customer_id, query=query
)

for row in itertools.chain.from_iterable(batch.results for batch in stream):
    video = row.you_tube_video_upload
    print(
        f"Video with ID {row.you_tube_video_upload.video_id} was found in state {row.you_tube_video_upload.state}."
    )
      

Ruby

# Retrieve the metadata of the newly uploaded video.
query = <<~EOQ
  SELECT
    you_tube_video_upload.resource_name,
    you_tube_video_upload.video_id,
    you_tube_video_upload.state
  FROM you_tube_video_upload
  WHERE you_tube_video_upload.resource_name = '#{video_upload_resource_name}'
EOQ

responses = client.service.google_ads.search_stream(
  customer_id: customer_id,
  query: query,
)

responses.each do |batch|
  batch.results.each do |row|
    puts "Video with ID #{row.you_tube_video_upload.video_id} was found in " \
      "state #{row.you_tube_video_upload.state}."
  end
end
      

Perl

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

curl -i -v -X POST \
"https://qa-prod-googleads.sandbox.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 @- <<EOF
{
  "query": "SELECT you_tube_video_upload.resource_name, you_tube_video_upload.video_id, you_tube_video_upload.state FROM you_tube_video_upload WHERE you_tube_video_upload.resource_name = '$UPLOADED_VIDEO_RESOURCE_NAME'"
}
EOF
      

إدارة التحميلات

بعد اكتمال عملية تحميل الفيديو، يمكنك استخدامه كمادة عرض فيديو.

استخدام الفيديو الذي تم تحميله

بعد أن يصل الفيديو إلى الحالة PROCESSED، يمكنك العثور على معرّف الفيديو على YouTube المكوّن من 11 حرفًا في الحقل video_id من المورد YouTubeVideoUpload.

استخدِم هذا video_id لإنشاء YoutubeVideoAsset باستخدام MutateAssets وربط اسم مورد مادة العرض الناتج (customers/{customer_id}/assets/{asset_id}) بحملاتك أو إعلاناتك:

  1. أنشِئ YoutubeVideoAsset من خلال تمرير youtube_video_id إلى AssetService.MutateAssets:

    POST https://googleads.googleapis.com/v26/customers/{customer_id}/assets:mutate
    {
      "operations": [
        {
          "create": {
            "name": "Product Launch Video",
            "youtubeVideoAsset": {
              "youtubeVideoId": "dQw4w9WgXcQ"
            }
          }
        }
      ]
    }
    
  2. ربط Asset بـ AssetGroup أو AdGroupAd:

    • حملات الأداء الأفضل: أنشئ AssetGroupAsset باستخدام AssetGroupAssetService.MutateAssetGroupAssets مع ضبط field_type على YOUTUBE_VIDEO:

      POST https://googleads.googleapis.com/v26/customers/{customer_id}/assetGroupAssets:mutate
      {
        "operations": [
          {
            "create": {
              "assetGroup": "customers/{customer_id}/assetGroups/{asset_group_id}",
              "asset": "customers/{customer_id}/assets/{asset_id}",
              "fieldType": "YOUTUBE_VIDEO"
            }
          }
        ]
      }
      
    • حملات زيادة الطلب: يمكنك الإشارة إلى customers/{customer_id}/assets/{asset_id} في قائمة videos لعنصر DemandGenVideoResponsiveAdInfo عند طلب AdGroupAdService.MutateAdGroupAds:

      POST https://googleads.googleapis.com/v26/customers/{customer_id}/adGroupAds:mutate
      {
        "operations": [
          {
            "create": {
              "adGroup": "customers/{customer_id}/adGroups/{ad_group_id}",
              "status": "PAUSED",
              "ad": {
                "name": "Demand Gen Video Ad",
                "finalUrls": ["https://www.example.com"],
                "demandGenVideoResponsiveAd": {
                  "videos": [
                    {
                      "asset": "customers/{customer_id}/assets/{asset_id}"
                    }
                  ],
                  "logoImages": [
                    {
                      "asset": "customers/{customer_id}/assets/{logo_asset_id}"
                    }
                  ],
                  "headlines": [
                    {
                      "text": "Example Headline"
                    }
                  ],
                  "longHeadlines": [
                    {
                      "text": "Example Long Headline"
                    }
                  ],
                  "descriptions": [
                    {
                      "text": "Example Description"
                    }
                  ],
                  "businessName": {
                    "text": "Example Business"
                  }
                }
              }
            }
          }
        ]
      }
      
  3. الاستعلام عن مواد عرض YOUTUBE_VIDEO الحالية باستخدام GoogleAdsService.SearchStream:

    SELECT
      asset.id,
      asset.resource_name,
      asset.name,
      asset.type,
      asset.youtube_video_asset.youtube_video_id,
      asset.youtube_video_asset.youtube_video_title
    FROM asset
    WHERE asset.type = 'YOUTUBE_VIDEO'
      AND asset.youtube_video_asset.youtube_video_id = '{video_id}'
    

تعديل البيانات الوصفية

يمكنك تعديل إعدادات الخصوصية لفيديو تم تحميله من خلال واجهة برمجة التطبيقات هذه باستخدام الطريقة UpdateYouTubeVideoUpload مع ضبط update_mask على "video_privacy". يمكن تعديل الحقل video_privacy فقط (PUBLIC أو UNLISTED، للفيديوهات التي تم تحميلها إلى قناة علامة تجارية يملكها المعلِن) بعد الإنشاء، ولا يمكن تغيير video_title وvideo_description وchannel_id وvideo_content_metadata.

إزالة المحتوى الذي حمّلته

إذا أردت حذف فيديوهات تم تحميلها باستخدام Google Ads API، عليك تمرير customers/{customer_id}/youTubeVideoUploads/{video_upload_id} أسماء الموارد في حقل resource_names للطريقة RemoveYouTubeVideoUpload. يؤدي ذلك إلى إزالة الفيديو من "مكتبة مواد العرض" في "إعلانات Google" ومن YouTube.