อัปโหลดวิดีโอ

YouTubeVideoUploadService ช่วยให้คุณอัปโหลดวิดีโอไปยัง YouTube ได้โดยตรงผ่าน Google Ads API จากนั้นคุณจะใช้วิดีโอเหล่านี้เพื่อสร้างชิ้นงานวิดีโอในประเภทโฆษณาต่างๆ เช่น แคมเปญ Performance Max หรือ แคมเปญ Demand Gen

บริการนี้ช่วยปรับปรุงเวิร์กโฟลว์การสร้างโฆษณาวิดีโอด้วยการจัดการกระบวนการอัปโหลดไปยัง YouTube เพื่อให้มั่นใจว่าวิดีโอจะเชื่อมโยงกับบัญชีของคุณอย่างถูกต้อง

แนวคิดสำคัญ

ก่อนเริ่มต้น คุณควรทำความเข้าใจวิธีจัดการการอัปโหลดวิดีโอและสถานะต่างๆ ที่วิดีโออาจเปลี่ยนไป

เวิร์กโฟลว์แบบครบวงจร

การอัปโหลดไฟล์วิดีโอและแสดงไฟล์ดังกล่าวในโฆษณาต้องทำตาม 4 ขั้นตอนตามลำดับต่อไปนี้

ขั้นตอน บริการและเมธอด สรุป
1. เริ่มต้นและอัปโหลดไบต์ของวิดีโอ CreateYouTubeVideoUpload ใน YouTubeVideoUploadService อัปโหลดข้อมูลเมตาและไฟล์ไบนารีของวิดีโอเพื่อสร้างทรัพยากร YouTubeVideoUpload (customers/{customer_id}/youTubeVideoUploads/{video_upload_id})
2. สำรวจสถานะการประมวลผล SearchStream ใน GoogleAdsService ค้นหา you_tube_video_upload จนกว่า state = 'PROCESSED' และระบบจะป้อน video_id ของ YouTube ที่มีอักขระ 11 ตัว
3. สร้างชิ้นงานวิดีโอที่ใช้ซ้ำได้ MutateAssets ใน AssetService สร้าง YoutubeVideoAsset (youtube_video_id = video_id) เพื่อรับชื่อทรัพยากรชิ้นงาน (customers/{customer_id}/assets/{asset_id})
4. ลิงก์ชิ้นงานกับแคมเปญหรือโฆษณา MutateAssetGroupAssets ใน AssetGroupAssetService หรือ MutateAdGroupAds ใน AdGroupAdService ลิงก์ชิ้นงานกับ AssetGroupAsset ของ Performance Max (field_type = YOUTUBE_VIDEO) หรือ DemandGenVideoResponsiveAdInfo ของ Demand Gen (videos[].asset)

การเป็นเจ้าของช่อง

เมื่ออัปโหลดวิดีโอ คุณสามารถระบุช่อง YouTube ปลายทางได้โดยใช้ ช่อง channel_id ในทรัพยากรYouTubeVideoUpload ดังนี้

  • ช่องที่ผู้ลงโฆษณาเป็นเจ้าของ (ช่องของแบรนด์): ระบุ channel_id ของช่อง YouTube ที่มีอยู่ซึ่งผู้ลงโฆษณาเป็นเจ้าของ ฟีเจอร์นี้รองรับเฉพาะ โฟลว์การตรวจสอบสิทธิ์ผู้ใช้เท่านั้น และใช้กับบัญชีบริการไม่ได้
  • ช่องที่ Google จัดการ: หากละเว้น channel_id ระบบจะอัปโหลดวิดีโอไปยังช่อง YouTube ที่ Google จัดการซึ่งเชื่อมโยงกับบัญชี Google Ads

สถานะการอัปโหลด

ระบบจะติดตามวงจรการใช้งานของการอัปโหลดวิดีโอ YouTube ผ่านช่อง state YouTubeVideoUploadStateEnum กำหนดสถานะต่อไปนี้

สถานะ คำอธิบาย
PENDING กำลังอัปโหลดวิดีโอ
UPLOADED อัปโหลดวิดีโอเรียบร้อยแล้วและ YouTube กำลังประมวลผลวิดีโอ
PROCESSED ประมวลผลวิดีโอเรียบร้อยแล้วและพร้อมใช้งาน
FAILED การอัปโหลดหรือการประมวลผลไม่สำเร็จและดำเนินการให้เสร็จสมบูรณ์ไม่ได้
REJECTED วิดีโอถูกปฏิเสธเนื่องจากเหตุผลด้านการตรวจสอบหรือนโยบาย
UNAVAILABLE สถานะวิดีโอไม่พร้อมใช้งาน ระบบอาจนำวิดีโอออกจาก YouTube แล้ว

การตั้งค่าความเป็นส่วนตัว

ช่อง video_privacy ควบคุมผู้ที่ดูวิดีโอที่อัปโหลดได้ Enum YouTubeVideoPrivacy รองรับตัวเลือกต่อไปนี้

  • PUBLIC: ทุกคนใน YouTube ดูวิดีโอได้ (อนุญาตเฉพาะช่องของแบรนด์)
  • UNLISTED: ระบบจะไม่แสดงวิดีโอในผลการค้นหา แต่ทุกคนที่มีลิงก์จะดูวิดีโอได้ ตัวเลือกนี้เป็นตัวเลือกเริ่มต้นและตัวเลือกเดียวสำหรับช่องที่ Google จัดการ

การเปิดเผยเนื้อหาที่สร้างขึ้น

ตั้งแต่ v26 เป็นต้นไป ผู้ลงโฆษณาสามารถเปิดเผยได้ว่าเนื้อหาวิดีโอที่อัปโหลดมีสื่อสังเคราะห์หรือสื่อที่สร้างขึ้นโดย AI หรือไม่ โดยเป็นไปตามกฎระเบียบต่างๆ เช่น กฎหมาย AI ของสหภาพยุโรป

ช่อง video_content_metadata ใน YouTubeVideoUpload มี VideoContentMetadata ตั้งค่าช่อง generative_content_disclosureที่ซ้อนอยู่โดยใช้ YouTubeVideoUploadGenerativeContentDisclosure enum:

ค่า คำอธิบาย
NON_GENERATIVE_CONTENT ผู้ลงโฆษณาเปิดเผยว่าวิดีโอไม่ได้สร้างขึ้นโดย AI
GENERATIVE_CONTENT ผู้ลงโฆษณาเปิดเผยว่าวิดีโอสร้างขึ้นโดย AI

อัปโหลดวิดีโอ

หากต้องการอัปโหลดวิดีโอ คุณต้องใช้คำขอแบบหลายส่วนไปยังเมธอด CreateYouTubeVideoUpload คำขอจะมีทั้งข้อมูลเมตาสำหรับการอัปโหลดและไฟล์วิดีโอเอง

1. เริ่มต้นการอัปโหลด

สร้าง CreateYouTubeVideoUploadRequest ที่มีช่องต่อไปนี้

ช่อง ข้อกำหนด คำอธิบายและข้อจำกัด
customer_id ต้องระบุ รหัสลูกค้า Google Ads 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) พร้อมใช้งานตั้งแต่ v26 เป็นต้นไป: VideoContentMetadata ที่ตั้งค่า generative_content_disclosure เป็นค่า YouTubeVideoUploadGenerativeContentDisclosure (NON_GENERATIVE_CONTENT หรือ GENERATIVE_CONTENT)

หากคุณใช้ไลบรารีของไคลเอ็นต์ ให้เรียกเมธอด CreateYouTubeVideoUpload โดยส่งไฟล์วิดีโอ และระบบจะจัดการการอัปโหลดวิดีโอ ภายใน

Java

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 จะใช้โปรโตคอลการอัปโหลดต่อได้ 2 ขั้นตอน

  1. เริ่มเซสชันการอัปโหลด: ส่งคำขอ POST เริ่มต้นไปยัง CreateYouTubeVideoUpload ปลายทางการอัปโหลด (/upload/v26/customers/{customer_id}/youTubeVideoUploads:create) โดยมี x-goog-upload-command: start (และเลือกใช้ x-goog-upload-header-content-length เพื่อประกาศขนาดไฟล์ได้) การตอบกลับจะแสดง URL ของเซสชันการอัปโหลดในส่วนหัวการตอบกลับ HTTP x-goog-upload-url พร้อมกับข้อมูลเมตา เช่น ขนาด Chunk ที่คาดไว้
  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) ด้วย GAQL จนกว่า state = 'PROCESSED' (INPUT_ONLY คุณเลือกช่องใน GAQL ไม่ได้):

Java

// 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

    • Performance Max: สร้าง 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"
            }
          }
        ]
      }
      
    • Demand Gen: อ้างอิง 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}'
    

อัปเดตข้อมูลเมตา

คุณสามารถอัปเดตการตั้งค่าความเป็นส่วนตัวของวิดีโอที่อัปโหลดผ่าน API นี้ได้โดยใช้ เมธอด 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 Ads และ YouTube