קובצי נתונים מובנים (SDF) הם ערכים מופרדים בפסיקים (CSV) בפורמט מיוחד קבצים שמשמשים לאחזור ולעדכון של נתונים לגבי רשת המדיה ו- משאבי Video 360 ב: בכמות גדולה. דרך התצוגה Video 360 API, אפשר ליצור ולהוריד קובצי SDF מותאמים אישית, שמאפשר לך לאחזר נתונים מסודרים ומסוננים מקמפיינים לרשת המדיה וידאו 360 במשאבי אנוש.
במדריך זה מתואר כיצד ליצור פעולה של הורדת SDF, למעקב אחר ונוריד את קובצי ה-SDF שמתקבלים.
מידע בנוגע לפורמט ולניהול גרסאות של SDF זמין בקטע מסמכי עזר של SDF.
צור משימה
מזהי SDF נוצרים על ידי פעולה אסינכרונית, שנקראת sdfdownloadtask
.
כשיוצרים את המשימה, מגדירים את הפרמטרים שקשורים ל-SDF הרצויים.
עושים זאת באמצעות השיטה sdfdownloadtasks.create
.
בקטעי המשנה הבאים מתוארים הפרמטרים שאפשר להגדיר.
ציון גרסה
הפורמט של קובץ הנתונים המובְנים מתעדכן באופן קבוע בנפרד תצוגה ו Video 360 API, עם גרסאות חדשות וגרסאות ישנות הוצאה משימוש באופן קבוע. לכן מומלץ מומלץ תמיד למשתמשים להשתמש בגרסה העדכנית ביותר של SDF.
מגדירים את גרסת ה-SDF של ה-SDF הרצוי באמצעות
השדה version
בגוף הבקשה. אם המאפיין לא מוגדר או מוגדר
עד SDF_VERSION_UNSPECIFIED
, המשימה תשתמש בגרסת ברירת המחדל של SDF
משאב של שותף או מפרסם שמשמשים כהקשר של תוכן ה-SDF.
הגדרת ההקשר
אפשר ליצור SDF שמכיל נתונים בכל המשאבים שזמינים לכם, אבל
כל SDF יכול להחזיר תוכן רק בהקשר של
שותף או מפרסם. הקשר זה מוגדר בגוף הבקשה על ידי
partnerId
או
שדה advertiserId
. בדיוק אחד מהשניים האלה
צריך להגדיר שדות.
רק משאבים בהקשר הנתון ייכללו ב-SDF שיתקבל. אם אתם מנסים לסנן לפי משאב שאינו בבעלות השותף שצוין או של המפרסם, הוא או התוכן שמתחתיו לא ייכללו תוצאות. אם מסננים רק לפי המשאבים שלא כלולים, הקבצים שיתקבלו תהיה ריקה. ניסיון לסנן לפי משאבים שלא בהקשר הנתון לא יחזיר הודעת שגיאה, לכן חשוב לבדוק שההקשר נכון.
בוחרים את המסנן הנכון
בנוסף להקשר שהוגדר למעלה, אפשר לסנן עוד יותר את ההיקף של שנוצרו קובצי נתונים מובנים על ידי ציון סוגי הקבצים יוצרים את המשאבים או את משפחת המשאבים הספציפיים שרוצים לכלול.
יש שלושה מסננים זמינים ל-sdfdownloadtask
, כל אחד מהם מיועד
סוג מפרט מסוים. אפשר להקצות רק אירוע אחד
sdfdownloadtask
ParentEntityFilter
הערך ParentEntityFilter
הוא הרחב ביותר מבין
מסננים.
בשדה fileType
אפשר להציג את כל
סוגי הקבצים שרוצים ליצור במשימה. הדבר
חובה. אם השדה יישאר ריק או מוגדר לערך FILE_TYPE_UNSPECIFIED
, הערך
הפעולה sdfdownloadtask
תושלם בטעות.
באמצעות filterType
filterIds
שדות. אפשר לצמצם את התוצאות עוד יותר.
filterType
מציין את הסוג של
משאבים לסינון לפי וגם filterIds
מזהה את המשאבים באמצעות המזהה הייחודי שלהם. ממשקי ה-SDF שיתקבלו יכללו
המשאבים שמזוהים על ידי fileType
שהם
את המשאבים או הצאצאים של המשאבים שמזוהים
filterType
וfilterIds
.
IdFilter
IdFilter
מסננת את הבקשה כדי לכלול רק את המשאבים
זוהה.
IdFilter
כולל שדה לכל סוג SDF, לא כולל מלאי שטחי פרסום
מקור. כל אחד מהשדות האלו הוא רשימה של מזהים ייחודיים שמזהים את
למשאבים ספציפיים שהיית רוצה לכלול ב-SDF שנוצר. המזהים שסופקו
חייבות להיות במסגרת ההקשר, אבל לא חייב להיות קשר ישיר. שלך
אין צורך לבקש קמפיין מסוים כדי לבקש פריט
מכיל/ה ולהיפך. סוגי הקבצים היחידים שייווצרו יהיו מהם
שתואמים למשאבים המזוהים בIdFilter
.
InventorySourceFilter
ב-InventorySourceFilter
אפשר רק לסנן
והורדה של קובצי SDF שמכילים משאבים של מקור המלאי. הוא היחיד
מסנן שבו אפשר להשתמש כדי לקבל מידע על המשאבים של מקור המלאי.
ל-InventorySourceFilter
יש יחיד
שדה inventorySourceIds
שבו מזהים את
המזהים של משאבי המקור של המלאי שאתם רוצים לכלול ב-SDF. אם
הרשימה שסופקה ל-inventorySourceIds
ריקה, כל
מקורות של מלאי שטחי פרסום במסגרת ההקשר שהוגדר ייכללו ב-SDF שייווצר.
שליחת בקשה
אחרי שתכירו את הפרמטרים של ה-SDF הרצוי, תוכלו ליצור את הבקשה
ויוצרים את sdfdownloadtask
.
הנה דוגמה לאופן שבו יוצרים sdfdownloadtask
באמצעות
ParentEntityFilter
:
Java
// Create the filter structure ParentEntityFilter parentEntityFilter = new ParentEntityFilter(); parentEntityFilter.setFileType(sdf-file-type-list); parentEntityFilter.setFilterType(sdfFilterType); parentEntityFilter.setFilterIds(filter-id-list); // Configure the sdfdownloadtasks.create request Sdfdownloadtasks.Create request = service .sdfdownloadtasks() .create( new CreateSdfDownloadTaskRequest() .setVersion(sdfVersion) .setAdvertiserId(advertiserId) .setParentEntityFilter(parentEntityFilter) ); // Create the sdfdownloadtask Operation operationResponse = request.execute(); System.out.printf("Operation %s was created.\n", operationResponse.getName());
Python
# Configure the sdfdownloadtasks.create request createSdfDownloadTaskRequest = { 'version': sdf-version, 'advertiserId': advertiser-id, 'parentEntityFilter': { 'fileType': sdf-file-type-list, 'filterType': sdf-filter-type, 'filterIds': filter-id-list } } # Create the sdfdownloadtask operation = service.sdfdownloadtasks().create( body=createSdfDownloadTaskRequest).execute(); print("Operation %s was created." % operation["name"])
PHP
// Create the sdfdownloadtasks.create request structure $createSdfDownloadTaskRequest = new Google_Service_DisplayVideo_CreateSdfDownloadTaskRequest(); $createSdfDownloadTaskRequest->setAdvertiserId(advertiser-id); $createSdfDownloadTaskRequest->setVersion(sdf-version); // Create and set the parent entity filter $parentEntityFilter = new Google_Service_DisplayVideo_ParentEntityFilter(); $parentEntityFilter->setFileType(sdf-file-type-list); $parentEntityFilter->setFilterType(sdf-filter-type); if (!empty(filter-id-list)) { $parentEntityFilter->setFilterIds(filter-id-list); } $createSdfDownloadTaskRequest->setParentEntityFilter($parentEntityFilter); // Call the API, creating the SDF Download Task. $operation = $this->service->sdfdownloadtasks->create( $createSdfDownloadTaskRequest ); printf('Operation %s was created.\n', $operation->getName());
בדיקת הבקשה וקבלת נתיב הורדה
כשיוצרים sdfdownloadtask
, אובייקט operation
הוחזרו. פעולה זו מייצגת את הסטטוס של ה-SDF האסינכרוני
בזמן היצירה. אפשר לבדוק את הפעולה כדי
אפשר לבדוק אם ההורדה הסתיימה ומוכן להורדה, או אם הוצגה הודעת שגיאה, באמצעות
השיטה sdfdownloadtasks.operations.get
.
בסיום, הערך של הפעולה שהוחזרה יהיה
done
. הפעולה הסופית תכלול
response
או error
השדה הזה. אם השדה error
קיים, הוא יכלול
אובייקט Status
שמכיל קוד שגיאה וגם
הודעה, שמספקת פרטים על השגיאה
אירעה שגיאה. אם השדה response
מופיע, הוא
יהיה אובייקט עם ערך resourceName
שמזהה את
להורדה.
דוגמה לבדיקת הבקשה באמצעות השהיה מעריכית לפני ניסיון חוזר (exponential backoff):
Java
String operationName = operationResponse.getName(); // Configure the Operations.get request Sdfdownloadtasks.Operations.Get operationRequest = service .sdfdownloadtasks() .operations() .get(operationName); // Configure exponential backoff for checking the status of our operation ExponentialBackOff backOff = new ExponentialBackOff.Builder() .setInitialIntervalMillis(5000) // setting initial interval to five seconds .setMaxIntervalMillis(300000) // setting max interval to five minutes .setMaxElapsedTimeMillis(18000000) // setting max elapsed time to five hours .build(); while (operationResponse.getDone() == null) { long backoffMillis = backOff.nextBackOffMillis(); if (backoffMillis == ExponentialBackOff.STOP) { System.out.printf("The operation has taken more than five hours to complete.\n"); return; } Thread.sleep(backoffMillis); // Get current status of operation operationResponse = operationRequest.execute(); } // Check if the operation finished with an error and return if (operationResponse.getError() != null) { System.out.printf("The operation finished in error with code %s: %s\n", operationResponse.getError().getCode(), operationResponse.getError() .getMessage()); return; } System.out.printf( "The operation completed successfully. Resource %s was created.\n", operationResponse.getResponse().get("resourceName").toString());
Python
# The following values control retry behavior while # the report is processing. # Minimum amount of time between polling requests. Defaults to 5 seconds. min_retry_interval = 5 # Maximum amount of time between polling requests. Defaults to 5 minutes. max_retry_interval = 5 * 60 # Maximum amount of time to spend polling. Defaults to 5 hours. max_retry_elapsed_time = 5 * 60 * 60 # Configure the Operations.get request get_request = service.sdfdownloadtasks().operations().get( name=operation["name"] ) sleep = 0 start_time = time.time() while True: # Get current status of operation operation = get_request.execute() if "done" in operation: if "error" in operation: print("The operation finished in error with code %s: %s" % ( operation["error"]["code"], operation["error"]["message"])) else: print("The operation completed successfully. Resource %s was created." % operation["response"]["resourceName"]) break elif time.time() - start_time > max_retry_elapsed_time: print("Generation deadline exceeded.") sleep = next_sleep_interval(sleep) print("Operation still running, sleeping for %d seconds." % sleep) time.sleep(sleep) def next_sleep_interval(previous_sleep_interval): """Calculates the next sleep interval based on the previous.""" min_interval = previous_sleep_interval or min_retry_interval max_interval = previous_sleep_interval * 3 or min_retry_interval return min(max_retry_interval, random.randint(min_interval, max_interval))
PHP
// The following values control retry behavior // while the task is processing. // Minimum amount of time between polling requests. Defaults to 5 seconds. $minRetryInterval = 5; // Maximum amount of time between polling requests. Defaults to 5 minutes. $maxRetryInterval = 300; // Maximum amount of time to spend polling. Defaults to 5 hours. $maxRetryElapsedTime = 18000; $operationName = $operation->getName(); $sleepInterval = 0; $startTime = time(); while (!$operation->getDone()) { if ($sleepInterval != 0) { printf( 'The operation is still running, sleeping for %d seconds\n', $sleepInterval ); } // Sleep before retrieving the SDF Download Task again. sleep($sleepInterval); // Call the API, retrieving the SDF Download Task. $operation = $this->service->sdfdownloadtasks_operations->get( $operation->getName() ); // If the operation has exceeded the set deadline, throw an exception. if (time() - $startTime > $maxRetryElapsedTime) { printf('SDF download task processing deadline exceeded\n'); throw new Exception( 'Long-running operation processing deadline exceeded' ); } // Generate the next sleep interval using exponential backoff logic. $sleepInterval = min( $maxRetryInterval, rand( max($minRetryInterval, $previousSleepInterval), max($minRetryInterval, $previousSleepInterval * 3) ) ); } // If the operation finished with an error, throw an exception. if($operation->getError() !== null) { $error = $operation->getError(); printf( 'The operation finished in error with code %s: %s\n', $error->getCode(), $error->getMessage() ); throw new Exception($error->getMessage()); } // Print successfully generated resource. $response = $operation->getResponse(); printf( 'The operation completed successfully. Resource %s was ' . 'created. Ready to download.\n', $response['resourceName'] );