Interfejs Campaign Managera 360 API umożliwia pobieranie plików raportów, które są wynikiem uruchomienia raportu w Kreatorze raportów. Umożliwia też przyznanie użytkownikom bezpośredniego dostępu do pliku za pomocą linku.
W zależności od rodzaju pobierania, które chcesz wykonać, użyj jednego z tych sposobów:
- Pobieranie bezpośrednie – Files.get z parametrem
alt=media. - Pobieranie plików w przeglądarce –
browserUrlz zasobu Files.
W pozostałej części tego przewodnika znajdziesz szczegółowe instrukcje pobierania tego typu plików za pomocą zasobu Files.
Wymagania wstępne
Aby pobrać plik, potrzebujesz kilku informacji:
- Identyfikator raportu, do którego należy plik. Możesz to zrobić, tworząc nowy raport lub wyszukując istniejący raport.
- Identyfikator pliku do pobrania. Możesz to sprawdzić, uruchamiając raport z poprzedniego kroku lub wysyłając zapytanie do listy istniejących plików, jak w poniższym 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
Pamiętaj, że aby można było pobrać plik, w polu status zasobu pliku musi być ustawiona wartość REPORT_AVAILABLE.
Bezpośrednie pobieranie
Aby pobrać plik bezpośrednio, wyślij autoryzowane żądanie HTTP GET do usługi Pliki i uwzględnij 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 aplikacja powinna być skonfigurowana tak, aby obsługiwać je automatycznie. Jeśli wolisz to robić ręcznie, adres URL przekierowania znajdziesz w nagłówku Location odpowiedzi.
Większość oficjalnych bibliotek klienta Google udostępnia wygodne metody inicjowania bezpośredniego pobierania, jak pokazano w przykładzie poniżej. Jeśli wolisz rozpocząć pobieranie ręcznie, w polu apiUrl zasobu pliku znajdziesz 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 z możliwością wznowienia
Podczas pobierania dużych plików raportów może się zdarzyć, że pobieranie zostanie przerwane w trakcie. Aby ułatwić przywracanie i wznawianie nieudanych pobrań, usługa plików obsługuje funkcję częściowego pobierania.
Pobieranie częściowe polega na żądaniu określonych części pliku, co pozwala podzielić duże pobierania na mniejsze fragmenty. Możesz określić, którą część pliku chcesz pobrać, podając zakres bajtów w nagłówku HTTP Range żądania. Na przykład:
Range: bytes=500-999
Funkcja pobierania częściowego jest dostępna w wielu bibliotekach klienta za pomocą usługi Media Download. Szczegóły 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 Plik. Możesz przekierować użytkownika na ten adres URL lub udostępnić go jako link, który można kliknąć. W obu przypadkach, aby rozpocząć pobieranie, użytkownik musi zalogować się na konto Google z dostępem do raportów Campaign Managera 360 i mieć odpowiednie uprawnienia do uzyskania 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