Pobierz pliki raportów

Interfejs Campaign Manager 360 API umożliwia pobieranie plików raportów będących wynikiem generowania raportu w Kreatorze raportów. Zapewnia też bezpośredni dostęp do pliku za pomocą linku.

W zależności od rodzaju pobierania, który chcesz wykonać, możesz użyć jednej z tych metod:

W pozostałej części tego przewodnika znajdziesz szczegółowe instrukcje pobierania plików tego typu za pomocą zasobu Pliki.

Wymagania wstępne

Aby pobrać plik, musisz podać kilka informacji:

  1. Identyfikator raportu, do którego należy plik. Aby go znaleźć, utwórz nowy raport lub wyszukaj istniejący raport.
  2. Identyfikator pliku do pobrania. Aby go znaleźć, wygeneruj raport z poprzedniego kroku lub utwórz zapytanie o listę dotychczasowych plików, tak jak w tym przykładzie:

C#

File target = null;
FileList files;
String nextPageToken = null;

do {
  // Create and execute the files list request.
  ReportsResource.FilesResource.ListRequest request =
      service.Reports.Files.List(profileId, reportId);
  request.PageToken = nextPageToken;
  files = request.Execute();

  foreach (File file in files.Items) {
    if (IsTargetFile(file)) {
      target = file;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = files.NextPageToken;
} while (target == null
    && files.Items.Any()
    && !String.IsNullOrEmpty(nextPageToken));

Java

File target = null;
FileList files;
String nextPageToken = null;

do {
  // Create and execute the files list request.
  files = reporting.reports().files().list(profileId, reportId).setPageToken(nextPageToken)
      .execute();

  for (File file : files.getItems()) {
    if (isTargetFile(file)) {
      target = file;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = files.getNextPageToken();
} while (target == null
    && !files.getItems().isEmpty()
    && !Strings.isNullOrEmpty(nextPageToken));

PHP

$target = null;
$response = null;
$pageToken = null;

do {
    // Create and execute the file list request.
    $response = $this->service->reports_files->listReportsFiles(
        $userProfileId,
        $reportId,
        ['pageToken' => $pageToken]
    );

    foreach ($response->getItems() as $file) {
        if ($this->isTargetFile($file)) {
            $target = $file;
            break;
        }
    }

    $pageToken = $response->getNextPageToken();
} while (empty($target) && !empty($response->getItems()) && !empty($pageToken));

Python

target = None

request = service.reports().files().list(
    profileId=profile_id, reportId=report_id)

while True:
  response = request.execute()

  for report_file in response['items']:
    if is_target_file(report_file):
      target = report_file
      break

  if not target and response['items'] and response['nextPageToken']:
    request = service.reports().files().list_next(request, response)
  else:
    break

Ruby

page_token = nil
target = nil

loop do
  result = service.list_report_files(profile_id, report_id,
    page_token: page_token)

  result.items.each do |file|
    if target_file?(file)
      target = file
      break
    end
  end

  page_token = (result.next_page_token if target.nil? && result.items.any?)
  break if page_token.to_s.empty?
end        

Aby można było pobrać plik, pole status zasobu musi mieć wartość REPORT_AVAILABLE.

Pobieranie bezpośrednie

Aby wykonać bezpośrednie pobieranie, wyślij do usługi Files autoryzowane żądanie HTTP GET i dołącz parametr zapytania alt=media. Przykładowe żądanie może wyglądać tak:

GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1
Authorization: Bearer your_auth_token

Pamiętaj jednak, że odpowiedź będzie zawierać przekierowanie, więc Twoja aplikacja powinna być skonfigurowana do obsługi tej funkcji automatycznie. Jeśli wolisz obsługiwać ją ręcznie, adres URL przekierowania znajdziesz w nagłówku Location odpowiedzi.

Większość oficjalnych bibliotek klienta Google umożliwia wygodne rozpoczęcie pobierania bezpośredniego (jak pokazano w przykładzie poniżej). Jeśli wolisz inicjować pobieranie ręcznie, w polu apiUrl zasobu pliku podany jest wstępnie utworzony URL.

C#

// Retrieve the file metadata.
File file = service.Files.Get(reportId, fileId).Execute();

if ("REPORT_AVAILABLE".Equals(file.Status)) {
  // Create a get request.
  FilesResource.GetRequest getRequest = service.Files.Get(reportId, fileId);

  // Optional: adjust the chunk size used when downloading the file.
  // getRequest.MediaDownloader.ChunkSize = MediaDownloader.MaximumChunkSize;

  // Execute the get request and download the file.
  using (System.IO.FileStream outFile = new System.IO.FileStream(GenerateFileName(file),
      System.IO.FileMode.Create, System.IO.FileAccess.Write)) {
    getRequest.Download(outFile);
    Console.WriteLine("File {0} downloaded to {1}", file.Id, outFile.Name);
  }
}

Java

// Retrieve the file metadata.
File file = reporting.files().get(reportId, fileId).execute();

if ("REPORT_AVAILABLE".equals(file.getStatus())) {
  // Prepare a local file to download the report contents to.
  java.io.File outFile = new java.io.File(Files.createTempDir(), generateFileName(file));

  // Create a get request.
  Get getRequest = reporting.files().get(reportId, fileId);

  // Optional: adjust the chunk size used when downloading the file.
  // getRequest.getMediaHttpDownloader().setChunkSize(MediaHttpDownloader.MAXIMUM_CHUNK_SIZE);

  // Execute the get request and download the file.
  try (OutputStream stream = new FileOutputStream(outFile)) {
    getRequest.executeMediaAndDownloadTo(stream);
  }

  System.out.printf("File %d downloaded to %s%n", file.getId(), outFile.getAbsolutePath());
}

PHP

// Retrieve the file metadata.
$file = $this->service->files->get($reportId, $fileId);

if ($file->getStatus() === 'REPORT_AVAILABLE') {
    try {
        // Prepare a local file to download the report contents to.
        $fileName = join(
            DIRECTORY_SEPARATOR,
            [sys_get_temp_dir(), $this->generateFileName($file)]
        );
        $fileResource = fopen($fileName, 'w+');
        $fileStream = \GuzzleHttp\Psr7\stream_for($fileResource);

        // Execute the get request and download the file.
        $httpClient = $this->service->getClient()->authorize();
        $result = $httpClient->request(
            'GET',
            $file->getUrls()->getApiUrl(),
            [\GuzzleHttp\RequestOptions::SINK => $fileStream]
        );

        printf('<h3>Report file saved to: %s</h3>', $fileName);
    } finally {
        $fileStream->close();
        fclose($fileResource);
    }
}

Python

# Retrieve the file metadata.
report_file = service.files().get(
    reportId=report_id, fileId=file_id).execute()

if report_file['status'] == 'REPORT_AVAILABLE':
  # Prepare a local file to download the report contents to.
  out_file = io.FileIO(generate_file_name(report_file), mode='wb')

  # Create a get request.
  request = service.files().get_media(reportId=report_id, fileId=file_id)

  # Create a media downloader instance.
  # Optional: adjust the chunk size used when downloading the file.
  downloader = http.MediaIoBaseDownload(
      out_file, request, chunksize=CHUNK_SIZE)

  # Execute the get request and download the file.
  download_finished = False
  while download_finished is False:
    _, download_finished = downloader.next_chunk()

  print('File %s downloaded to %s' % (report_file['id'],
                                      os.path.realpath(out_file.name)))

Ruby

# Retrieve the file metadata.
report_file = service.get_file(report_id, file_id)
return unless report_file.status == 'REPORT_AVAILABLE'

# Prepare a local file to download the report contents to.
File.open(generate_file_name(report_file), 'w') do |out_file|
  # Execute the download request. Providing a download destination
  # retrieves the file contents rather than the file metadata.
  service.get_file(report_id, file_id, download_dest: out_file)

  puts format('File %s downloaded to %s', file_id,
    File.absolute_path(out_file.path))
end

Pobieranie możliwe do wznowienia

Podczas pobierania dużych plików raportów może się nie udać. Aby ułatwić przywrócenie i wznowić pobieranie, usługa pliku obsługuje częściową funkcję pobierania.

Pobieranie częściowe obejmuje pobieranie określonych części pliku, co umożliwia podział dużych plików na mniejsze części. Możesz określić, którą część pliku chcesz pobrać, podając zakres bajtów w nagłówku HTTP żądania Range. Na przykład:

Range: bytes=500-999

Funkcja pobierania częściowych jest dostępna w wielu bibliotekach klientów za pomocą usługi pobierania multimediów. Szczegółowe informacje znajdziesz w dokumentacji biblioteki klienta.

Pobieranie plików w przeglądarce

Jeśli chcesz umożliwić użytkownikom pobieranie pliku bezpośrednio z przeglądarki, możesz użyć adresu URL podanego w polu browserUrl zasobu pliku. Możesz przekierować użytkownika do tego adresu URL lub zaoferować mu go jako link, który można kliknąć. W obu przypadkach użytkownik będzie musiał zalogować się na konto Google z dostępem do raportów Campaign Managera 360 i mieć odpowiednie uprawnienia dostępu do określonego pliku, aby można było rozpocząć pobieranie.

C#

File file = service.Files.Get(reportId, fileId).Execute();
String browserUrl = file.Urls.BrowserUrl;

Java

File file = reporting.files().get(reportId, fileId).execute();
String browserUrl = file.getUrls().getBrowserUrl();

PHP

$file = $this->service->files->get($reportId, $fileId);
$browserUrl = $file->getUrls()->getBrowserUrl();

Python

report_file = service.files().get(
    reportId=report_id, fileId=file_id).execute()
browser_url = report_file['urls']['browserUrl']

Ruby

report_file = service.get_file(report_id, file_id)
browser_url = report_file.urls.browser_url