Pobierz pliki raportów

Interfejs API Campaign Managera 360 umożliwia pobieranie plików raportów, które są wynikiem wygenerowania raportu w Kreatorze raportów. Umożliwia też zapewnianie użytkownikom bezpośredniego dostępu do pliku za pomocą linku.

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

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

Wymagania wstępne

Aby pobrać plik, potrzebujesz kilku informacji:

  1. Identyfikator raportu, do którego należy plik. Możesz go znaleźć, tworząc nowy raport lub przeszukując istniejący raport.
  2. Identyfikator pliku do pobrania. Aby to zrobić, wygeneruj raport z poprzedniego kroku lub wykonaj zapytanie o listę istniejących plików, jak w przykładzie poniżej:

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        

Pamiętaj, że aby można było pobrać plik, pole status zasobu pliku musi mieć wartość REPORT_AVAILABLE.

Bezpośrednie pobieranie

Aby pobrać bezpośrednio, wyślij do usługi Pliki autoryzowane żądanie HTTP GET i uwzględnij w nim 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, że otrzymana odpowiedź będzie zawierać przekierowanie, więc Twoja aplikacja powinna być skonfigurowana pod kątem automatycznej obsługi tego przekierowania. Jeśli wolisz robić to ręcznie, przekierowanie znajdziesz w nagłówku Location odpowiedzi.

Większość oficjalnych bibliotek klienta Google zapewnia wygodne metody inicjowania bezpośredniego pobierania, jak pokazano na przykładzie poniżej. Jeśli wolisz zainicjować pobieranie ręcznie, w polu apiUrl zasobu pliku znajdziesz gotowy 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 z możliwością wznowienia

Jeśli pobierasz duże pliki raportu, ich pobieranie może się nie udać. Aby ułatwić przywracanie i wznowienie nieudanego pobierania, usługa plików obsługuje funkcję pobierania częściowego.

Częściowe pobieranie wymaga żądania określonych części pliku, co umożliwia dzielenie dużych pobieranych fragmentów na mniejsze fragmenty. Możesz określić, którą część pliku chcesz pobrać, dodając zakres bajtów w nagłówku HTTP Range żądania. Na przykład:

Range: bytes=500-999

Wiele bibliotek klienckich udostępnia funkcję pobierania częściowego za pomocą usługi pobierania multimediów. Więcej informacji znajdziesz w dokumentacji biblioteki klienta.

Pobieranie plików w przeglądarce

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

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