Campaign Manager 360 API מאפשר להוריד קובצי דוחות, שהם התוצאה של הפעלת דוח ביוצר הדוחות. הוא גם תומך במתן גישה ישירה לקובץ למשתמשים באמצעות קישור.
בהתאם לסוג ההורדה שרוצים לבצע, משתמשים באחת מהשיטות הבאות:
- הורדה ישירה – Files.get עם הפרמטר
alt=media. - הורדת קבצים בדפדפן –
browserUrlמהמשאב Files.
בהמשך המדריך מפורטות הוראות להורדות מהסוגים האלה באמצעות מקור המידע Files.
דרישות מוקדמות
כדי להוריד קובץ, צריך לספק כמה פרטים:
- המזהה של הדוח שהקובץ שייך אליו. כדי לראות את זה, יוצרים דוח חדש או מחפשים דוח קיים.
- המזהה של הקובץ להורדה. אפשר למצוא את זה על ידי הפעלת הדוח מהשלב הקודם, או על ידי שאילתה של רשימת הקבצים הקיימים כמו בדוגמה שלמטה:
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
שימו לב: כדי שיהיה אפשר להוריד את קובץ המשאב, השדה status שלו צריך להיות מוגדר כ-REPORT_AVAILABLE.
הורדה ישירה
כדי לבצע הורדה ישירה, שולחים בקשת HTTP מורשית GET לשירות Files וכוללים את פרמטר השאילתה alt=media. דוגמה לבקשה:
GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1 Authorization: Bearer your_auth_token
חשוב לדעת שהתשובה שתקבלו תכלול הפניה אוטומטית, ולכן מומלץ להגדיר את האפליקציה כך שתטפל בה באופן אוטומטי. אם אתם מעדיפים לטפל בזה באופן ידני, תוכלו למצוא את כתובת ה-URL להפניה בכותרת Location של התגובה.
רוב ספריות הלקוח הרשמיות של Google מספקות שיטות נוחות להתחלת הורדה ישירה, כמו בדוגמה שלמטה. אם אתם מעדיפים להתחיל הורדה באופן ידני, כתובת URL מוכנה מראש מופיעה בשדה apiUrl של משאב הקובץ.
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
הורדות שניתן להמשיך
כשמורידים קבצים גדולים של דוחות, יכול להיות שההורדה תיכשל באמצע. כדי להקל על השחזור וההמשך של הורדה שנכשלה, שירות הקבצים תומך בפונקציונליות של הורדה חלקית.
הורדה חלקית כוללת בקשה של חלקים ספציפיים בקובץ, וכך אפשר לפצל הורדות גדולות לחלקים קטנים יותר. כדי לציין איזה חלק בקובץ רוצים להוריד, צריך לכלול טווח בייטים בכותרת ה-HTTP Range של הבקשה. לדוגמה:
Range: bytes=500-999
פונקציונליות של הורדה חלקית מסופקת על ידי ספריות לקוח רבות באמצעות שירות Media Download. פרטים נוספים זמינים במסמכי העזרה של ספריית הלקוח.
הורדת קבצים בדפדפן
אם רוצים לספק למשתמשים דרך להוריד קובץ ישירות מדפדפן האינטרנט שלהם, אפשר להשתמש בכתובת ה-URL שמופיעה בשדה browserUrl של משאב הקובץ. אפשר להפנות משתמש לכתובת ה-URL הזו או להציע אותה כקישור שאפשר ללחוץ עליו. בכל מקרה, כדי להתחיל את ההורדה, המשתמש צריך להיות מחובר לחשבון Google עם גישה לדיווח ב-Campaign Manager 360, וצריכות להיות לו ההרשאות המתאימות לגישה לקובץ שצוין.
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