Przegląd

Pliki uporządkowanych danych (SDF) to specjalnie sformatowane pliki z wartościami rozdzielanymi przecinkami (CSV) pliki używane do pobierania i aktualizowania danych o reklamach displayowych Zasoby Video 360 w masowych. W sieci reklamowej Video 360 API, można generować i pobierać niestandardowe pliki SDF, pozwala uzyskać uporządkowane, filtrowane dane z sieci reklamowej Film sferyczny i zasobami Google Cloud.

W tym przewodniku opisujemy, jak utworzyć operację pobierania SDF, śledzić ją i pobrać powstałe pliki SDF.

Informacje o formacie SDF i obsłudze wersji znajdziesz w Dokumentacja referencyjna SDF

Tworzenie zadania

Pliki SDF są generowane w ramach operacji asynchronicznej o nazwie sdfdownloadtask. Podczas tworzenia tego zadania definiujesz parametry związane z odpowiednimi plikami SDF. Odbywa się to metodą sdfdownloadtasks.create. Parametry, które można ustawić, są opisane w podsekcjach poniżej.

Określ wersję

Format pliku uporządkowanych danych jest regularnie aktualizowany niezależnie od Reklamy displayowe i Interfejs Video 360 API z nowymi i starymi wersjami regularnie wycofywane. Z tego powodu zawsze zalecamy korzystanie z najnowszej wersji pliku SDF.

Wersję pliku SDF wybranego pliku SDF możesz ustawić za pomocą version w treści żądania. Jeśli wartość nie jest ustawiona na SDF_VERSION_UNSPECIFIED, zadanie będzie korzystać z domyślnej wersji SDF pliku reklamodawca lub zasób partnera używany jako kontekst treści SDF.

Określanie kontekstu

Możesz wygenerować plik SDF zawierający dane o dowolnych dostępnych zasobach, ale każdy pojedynczy plik SDF może zwrócić treści tylko w kontekście partnera lub reklamodawcy. Ten kontekst jest zdefiniowany w treści żądania przez partnerId lub advertiserId. Dokładnie 1 z tych 2 – musisz określić te pola.

W wynikowym pliku SDF zostaną uwzględnione tylko zasoby w danym kontekście. Jeśli próbujesz filtrować według zasobu, który nie należy do podanego partnera ani reklamodawcę, ani ani ona, ani jej treści nie zostaną uwzględnione w wyników. Jeśli filtrujesz tylko według tych nieuwzględnionych zasobów, wynikowe pliki – wartość będzie pusta. Próba filtrowania według zasobów spoza danego kontekstu nie zwróci błędu, sprawdź więc, czy kontekst jest Zgadza się.

Wybierz odpowiedni filtr

Oprócz podanego powyżej kontekstu możesz dodatkowo filtrować zakres aby wygenerować pliki uporządkowanych danych, określając typy plików, które chcesz utworzyć. oraz konkretne zasoby lub rodzinę zasobów, które chcesz uwzględnić.

W przypadku sdfdownloadtask są dostępne 3 filtry, z których każdy odpowiada konkretnego typu specyfikacji. Możesz przypisać tylko jeden element sdfdownloadtask

ParentEntityFilter

ParentEntityFilter to najszersza dostępna filtry.

W polu fileType możesz wymienić wszystkie typy plików, które chcesz wygenerować w ramach zadania. To jest jest wymagane. Jeśli pozostawisz puste pole lub wartość FILE_TYPE_UNSPECIFIED, sdfdownloadtask zakończy się błędem.

Korzystanie z filterType oraz filterIds, możesz dodatkowo zawęzić wyniki. filterType określa typ zasoby, według których chcesz filtrować, i filterIds identyfikuje te zasoby według unikalnego identyfikatora. Utworzone pliki SDF zawierają zasoby określone przez fileType, które są: zasoby (lub ich elementy podrzędne) zasobów wskazanych przez filterType i filterIds.

IdFilter

IdFilter filtruje żądanie, tak aby uwzględniało tylko zasoby i identyfikacji.

IdFilter zawiera pole na każdy typ pliku SDF z wyjątkiem zasobów reklamowych Źródło. Każde z tych pól zawiera listę unikalnych identyfikatorów identyfikujących konkretne zasoby, które chcesz uwzględnić w wygenerowanym pliku SDF. Podane identyfikatory muszą należeć do ustawionego kontekstu, ale nie muszą być bezpośrednio powiązane. Ty nie muszą żądać konkretnej kampanii, by przesłać prośbę o element zamówienia i odwrotnie. Wygenerowane zostaną tylko następujące typy plików: odpowiadające zasobom wskazanym w dokumencie IdFilter.

InventorySourceFilter

InventorySourceFilter umożliwia tylko filtrowanie oraz pobierania plików SDF zawierających zasoby źródła zasobów reklamowych. Jest to jedyny filtr, za pomocą którego można uzyskać informacje o zasobach źródła zasobów reklamowych.

InventorySourceFilter ma liczbę pojedynczą inventorySourceIds, w którym identyfikujesz unikalny Identyfikatory zasobów źródeł zasobów reklamowych, które chcesz uwzględnić w pliku SDF. Jeśli lista podana do inventorySourceIds jest pusta, wszystkie źródła zasobów reklamowych w określonym kontekście zostaną uwzględnione w wygenerowanym pliku SDF.

Poproś

Po zapoznaniu się z parametrami odpowiedniego pliku SDF możesz utworzyć żądanie i utwórz sdfdownloadtask.

Oto przykład, jak utworzyć sdfdownloadtask za pomocą 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());

Sprawdzanie żądania i uzyskiwanie ścieżki pobierania

Gdy tworzysz obiekt sdfdownloadtask, obiekt operation jest . Ta operacja reprezentuje stan asynchronicznego pliku SDF podczas tworzenia. Możesz sprawdzić swoją operację, aby: sprawdzić, czy przesyłanie zostało zakończone i jest gotowe do pobrania lub czy wystąpił błąd, używając metodę sdfdownloadtasks.operations.get.

Po zakończeniu zwrócona operacja będzie miała wartość inną niż null done. Ukończona operacja będzie zawierać jeden z elementów: response lub error . Jeśli pole error jest obecne, Obiekt Status zawierający kod błędu i wiadomość zawierającą szczegóły błędu, który wystąpił . Jeśli pole response jest obecne, będzie miał obiekt z wartością resourceName, która identyfikuje wygenerowany do pobrania.

Oto przykład sposobu sprawdzenia żądania za pomocą wykładniczego czasu do ponowienia:

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