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 של YouTube באורך 11 תווים. |
| 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 Ads.
מצבי העלאה
מחזור החיים של העלאת סרטון ל-YouTube מתועד בשדה state.
הערך YouTubeVideoUploadState enum מגדיר את הסטטוסים הבאים:
| מדינה (State) | תיאור |
|---|---|
PENDING |
הסרטון בתהליך העלאה. |
UPLOADED |
הסרטון הועלה בהצלחה ועובר עיבוד ב-YouTube. |
PROCESSED |
העיבוד של הסרטון הסתיים והוא מוכן לשימוש. |
FAILED |
ההעלאה או העיבוד נכשלו ואי אפשר להשלים אותם. |
REJECTED |
הסרטון נדחה מסיבות שקשורות לאימות או למדיניות. |
UNAVAILABLE |
סטטוס הסרטון לא זמין. יכול להיות שהוא הוסר מ-YouTube. |
הגדרות פרטיות
השדה video_privacy קובע מי יכול לראות את הסרטון שהועלה. הערכים האפשריים של YouTubeVideoPrivacy הם:
PUBLIC: הסרטון זמין לכולם ב-YouTube. (מותר רק בערוצי מותג).-
UNLISTED: אי אפשר לחפש את הסרטון, אבל כל מי שיש לו את הקישור יכול לצפות בו. זוהי אפשרות ברירת המחדל והאפשרות היחידה לערוצים בניהול Google.
דרישות לגבי שם ותיאור
כשיוצרים העלאת סרטון, אפשר לציין מטא-נתונים באמצעות השדות video_title ו-video_description במשאב YouTubeVideoUpload:
-
video_title: חובה. השם יכול להכיל עד 100 תווים, ואסור לכלול בו תווים לא חוקיים (סוגריים זוויתיים<או>). אפשר להגדיר אותו רק כשיוצרים את העלאת הסרטון, ואי אפשר לשנות אותו אחרי היצירה. -
video_description: אופציונלי. התיאור יכול להכיל עד 5,000 תווים, ואסור לכלול בו תווים לא חוקיים (סוגריים זוויתיים<או>). אפשר להגדיר אותו רק כשיוצרים את העלאת הסרטון, ואי אפשר לשנות אותו אחרי היצירה.
אי אפשר לשנות את שני השדות אחרי שיוצרים את הפרויקט. אם כוללים את video_title או את video_description במסכת העדכון של בקשת UpdateYouTubeVideoUpload, הבקשה נכשלת ומוצגת השגיאה FieldError.IMMUTABLE_FIELD.
מידע נוסף על הפורמט של השם והתיאור ב-YouTube ועל תווים לא חוקיים זמין במרכז העזרה של YouTube.
גילוי נאות לגבי תוכן שנוצר על ידי AI
החל מגרסה 26, בהתאם לתקנות כמו EU AI Act (חוק הבינה המלאכותית של האיחוד האירופי), המפרסמים יכולים לציין אם קטע וידאו שהם העלו מכיל מדיה סינתטית או מדיה שנוצרה על ידי AI.
השדה video_content_metadata ב-YouTubeVideoUpload מכיל את הערך VideoContentMetadata. מגדירים את השדה המקונן generative_content_disclosure באמצעות הערך המספרי YouTubeVideoUploadGenerativeContentDisclosure:
| ערך | תיאור |
|---|---|
NON_GENERATIVE_CONTENT |
המפרסם הצהיר שהסרטון לא נוצר באמצעות AI. |
GENERATIVE_CONTENT |
המפרסם ציין שהסרטון נוצר על ידי AI. |
העלאת סרטון
כדי להעלות סרטון, צריך להשתמש בבקשה מרובת חלקים ל-method 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) |
זמין החל מגרסה 26: VideoContentMetadata עם generative_content_disclosure שמוגדר לערך YouTubeVideoUploadGenerativeContentDisclosure (NON_GENERATIVE_CONTENT או GENERATIVE_CONTENT). |
אם אתם משתמשים בספריית לקוח, צריך להפעיל את ה-method 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 משתמש בפרוטוקול העלאה שניתן להמשיך בשני שלבים:
- התחלת סשן ההעלאה: שולחים בקשת
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, יחד עם מטא-נתונים כמו גודל החלק הצפוי. - העברת בייטים של הסרטון וסיום התהליך: שולחים את המטען הייעודי (payload) הבינארי של הסרטון לנקודת הקצה
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}) לקמפיינים או למודעות:
יוצרים את
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" } } } ] }מקשרים את
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" } } } } } ] }
שליחת שאילתה לגבי נכסי
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 הזה, צריך להשתמש ב-method UpdateYouTubeVideoUpload ולהגדיר את update_mask בתור "video_privacy". אחרי שיוצרים את המודעה, אפשר לעדכן רק את השדה video_privacy (PUBLIC או UNLISTED, לסרטונים שהועלו לערוץ מותג בבעלות המפרסם). השדות video_title, video_description, channel_id ו-video_content_metadata לא ניתנים לשינוי. אם כוללים את video_title או את video_description במסכת העדכון, הפעולה נכשלת ומוצגת השגיאה FieldError.IMMUTABLE_FIELD.
הסרת ההעלאות
אם אתם צריכים למחוק סרטונים שהועלו באמצעות Google Ads API, אתם צריכים להעביר את שמות המשאבים שלהם ב-customers/{customer_id}/youTubeVideoUploads/{video_upload_id} בשדה resource_names של השיטה RemoveYouTubeVideoUpload. הפעולה הזו מסירה את הסרטון גם מספריית הנכסים הדיגיטליים של Google Ads וגם מ-YouTube.