Übersicht

Strukturierte Datendateien (Structured Data Files, SDFs) sind speziell formatierte CSV-Dateien (Comma-Separated Values, durch Kommas getrennte Werte), mit denen Daten zu Display & Video 360-Ressourcen im Bulk abgerufen und aktualisiert werden können. Über die Display & Video 360 API können Sie benutzerdefinierte SDFs generieren und herunterladen, um organisierte, gefilterte Daten zu Ihren Display & Video 360-Ressourcen abzurufen.

In dieser Anleitung wird beschrieben, wie Sie einen SDF-Downloadvorgang erstellen, ihn verfolgen und die resultierenden SDFs herunterladen.

Informationen zum SDF-Format und zur Versionsverwaltung finden Sie in der SDF-Referenzdokumentation.

Aufgaben erstellen

SDFs werden durch einen asynchronen Vorgang generiert, der als sdfdownloadtask bezeichnet wird. Beim Erstellen dieser Aufgabe definieren Sie die Parameter für die gewünschten SDFs. Dies erfolgt über die Methode sdfdownloadtasks.create. In den folgenden Unterabschnitten werden die Parameter beschrieben, die Sie festlegen können.

Version angeben

Das SDF-Format wird regelmäßig unabhängig von der Display & Video 360 API aktualisiert. Es werden neue Versionen veröffentlicht und frühere Versionen werden regelmäßig eingestellt. Aus diesem Grund empfehlen wir Nutzern immer, die aktuelle Version von SDF zu verwenden.

Sie legen die SDF-Version des gewünschten SDF mit dem Feld version im Anfragebody fest. Wenn sie nicht festgelegt oder auf SDF_VERSION_UNSPECIFIED gesetzt ist, wird für die Aufgabe die Standardversion der strukturierten Datendatei der Werbetreibenden- oder Partnerressource verwendet, die als Kontext für den Inhalt der strukturierten Datendatei dient.

Kontext festlegen

Sie können ein SDF mit Daten zu allen für Sie verfügbaren Ressourcen generieren. Ein einzelnes SDF kann jedoch nur Inhalte im Kontext eines einzelnen Partners oder Werbetreibenden zurückgeben. Dieser Kontext wird im Anfragetext entweder durch das Feld partnerId oder advertiserId definiert. Genau eines dieser beiden Felder muss festgelegt werden.

Nur Ressourcen im angegebenen Kontext werden in die resultierende SDF aufgenommen. Wenn Sie versuchen, nach einer Ressource zu filtern, die nicht dem angegebenen Partner oder Werbetreibenden gehört, werden weder sie noch die zugehörigen Inhalte in die Ergebnisse aufgenommen. Wenn Sie nur nach diesen nicht eingeschlossenen Ressourcen filtern, sind die resultierenden Dateien leer. Wenn Sie versuchen, nach Ressourcen außerhalb des angegebenen Kontexts zu filtern, wird kein Fehler zurückgegeben. Achten Sie also darauf, dass Ihr Kontext korrekt ist.

Den richtigen Filter auswählen

Zusätzlich zum oben festgelegten Kontext können Sie den Umfang der generierten Dateien mit strukturierten Daten weiter filtern, indem Sie die Dateitypen angeben, die Sie generieren möchten, sowie die spezifischen Ressourcen oder Ressourcengruppen, die Sie einbeziehen möchten.

Für ein sdfdownloadtask sind drei Filter verfügbar, die jeweils auf einen bestimmten Spezifikationstyp zugeschnitten sind. Sie können nur eine für ein einzelnes sdfdownloadtask zuweisen.

ParentEntityFilter

ParentEntityFilter ist der breiteste der verfügbaren Filter.

Mit dem Feld fileType können Sie alle gewünschten Dateitypen auflisten, die mit Ihrer Aufgabe generiert werden sollen. Dies ist erforderlich. Wenn das Feld leer gelassen oder auf FILE_TYPE_UNSPECIFIED gesetzt wird, wird die sdfdownloadtask mit einem Fehler abgeschlossen.

Mit den Feldern filterType und filterIds können Sie die Ergebnisse weiter eingrenzen. Mit filterType wird der Typ der Ressourcen angegeben, nach denen gefiltert werden soll, und mit filterIds werden diese Ressourcen anhand ihrer eindeutigen ID identifiziert. Die resultierenden SDFs enthalten die Ressourcen, die durch fileType identifiziert werden und entweder die Ressourcen oder untergeordnete Elemente der Ressourcen sind, die durch filterType und filterIds identifiziert werden.

IdFilter

Mit IdFilter wird Ihre Anfrage so gefiltert, dass nur die angegebenen Ressourcen berücksichtigt werden.

IdFilter enthält ein Feld für jeden SDF-Typ, mit Ausnahme von „Inventarquelle“. Jedes dieser Felder ist eine Liste eindeutiger IDs, mit denen die spezifischen Ressourcen angegeben werden, die in die generierte SDF aufgenommen werden sollen. Die angegebenen IDs müssen sich im festgelegten Kontext befinden, müssen aber nicht direkt miteinander in Verbindung stehen. Sie müssen keine bestimmte Kampagne anfordern, um eine darin enthaltene Werbebuchung anzufordern, und umgekehrt. Es werden nur Dateitypen generiert, die den in der IdFilter angegebenen Ressourcen entsprechen.

InventorySourceFilter

Mit InventorySourceFilter können nur strukturierte Datendateien mit Inventarquellen gefiltert und heruntergeladen werden. Es ist der einzige Filter, mit dem Sie Informationen zu Ihren Inventory Source-Ressourcen abrufen können.

InventorySourceFilter hat ein einzelnes Feld inventorySourceIds, in dem Sie die eindeutigen IDs der Inventarquellenressourcen angeben, die in Ihr SDF aufgenommen werden sollen. Wenn die für inventorySourceIds bereitgestellte Liste leer ist, werden alle Inventarquellen im festgelegten Kontext in die generierte SDF aufgenommen.

Anfrage stellen

Sobald Sie die Parameter des gewünschten SDF kennen, können Sie die Anfrage erstellen und das sdfdownloadtask erstellen.

Hier ein Beispiel für das Erstellen eines sdfdownloadtask mit einem 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());

Anfrage prüfen und Downloadpfad abrufen

Wenn Sie ein sdfdownloadtask erstellen, wird ein operation-Objekt zurückgegeben. Dieser Vorgang stellt den Status Ihres asynchronen SDF-Generierungsvorgangs zum Zeitpunkt der Erstellung dar. Mit der Methode sdfdownloadtasks.operations.get können Sie prüfen, ob der Vorgang abgeschlossen und zum Herunterladen bereit ist oder ob ein Fehler aufgetreten ist.

Nach Abschluss des Vorgangs enthält das zurückgegebene Vorgangsobjekt ein done-Feld, das nicht null ist. Der abgeschlossene Vorgang enthält entweder das Feld response oder error. Falls vorhanden, enthält das Feld error ein Status-Objekt mit einem Fehlercode und einer Meldung, die Details zum aufgetretenen Fehler enthält. Wenn das Feld response vorhanden ist, enthält es ein Objekt mit einem resourceName-Wert, der die generierte Datei für den Download identifiziert.

Hier ist ein Beispiel dafür, wie Sie Ihre Anfrage mit exponentiellem Backoff überprüfen:

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']
);