package com.microsoft.bingads.examples.v9;
import java.util.Calendar;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.net.*;
import java.io.*;
import com.microsoft.bingads.*;
import com.microsoft.bingads.PasswordAuthentication;
import com.microsoft.bingads.reporting.AdApiError;
import com.microsoft.bingads.reporting.AdApiFaultDetail_Exception;
import com.microsoft.bingads.reporting.ApiFaultDetail_Exception;
import com.microsoft.bingads.reporting.BatchError;
import com.microsoft.bingads.reporting.OperationError;
import com.microsoft.bingads.reporting.*;
public class ReportRequests extends ExampleBase {
static AuthorizationData authorizationData;
static ReportingServiceManager ReportingServiceManager;
/*private static java.lang.String UserName = "<UserNameGoesHere>";
private static java.lang.String Password = "<PasswordGoesHere>";
private static java.lang.String DeveloperToken = "<DeveloperTokenGoesHere>";
private static long CustomerId = <CustomerIdGoesHere>;
private static long AccountId = <AccountIdGoesHere>; ;*/
// The directory for the report file.
static java.lang.String FileDirectory = "c:\\reports\\";
// The name of the report file.
static java.lang.String ResultFileName = "result";
// The report file extension type.
static ReportFormat ReportFileFormat = ReportFormat.CSV;
// The maximum amount of time (in milliseconds) that you want to wait for the report download.
static int TimeoutInMilliseconds = 3600000;
public static void main(String[] args) {
// Confirm that the download folder exists; otherwise, exit.
String folder = FileDirectory.substring(0, FileDirectory.lastIndexOf('\\'));
File dir = new File(folder);
if (!dir.exists())
{
System.out.println("The output folder does not exist. Ensure that the " +
"folder exists and try again.");
return;
}
try
{
authorizationData = new AuthorizationData();
authorizationData.setDeveloperToken(DeveloperToken);
authorizationData.setAuthentication(new PasswordAuthentication(UserName, Password));
authorizationData.setCustomerId(CustomerId);
authorizationData.setAccountId(AccountId);
ReportingServiceManager = new ReportingServiceManager(authorizationData, API_ENVIRONMENT);
ReportingServiceManager.setStatusPollIntervalInMilliseconds(5000);
// You can submit one of the example reports, or build your own.
ReportRequest reportRequest = getKeywordPerformanceReportRequest();
ReportingDownloadParameters reportingDownloadParameters = new ReportingDownloadParameters();
reportingDownloadParameters.setReportRequest(reportRequest);
reportingDownloadParameters.setResultFileDirectory(new File(FileDirectory));
reportingDownloadParameters.setResultFileName(ResultFileName);
reportingDownloadParameters.setOverwriteResultFile(true);
// Option A - Background Completion with ReportingServiceManager
// You can submit a download request and the ReportingServiceManager will automatically
// return results. The ReportingServiceManager abstracts the details of checking for result file
// completion, and you don't have to write any code for results polling.
outputStatusMessage("Awaiting Background Completion . . .");
backgroundCompletionAsync(reportingDownloadParameters);
// Option B - Submit and Download with ReportingServiceManager
// Submit the download request and then use the ReportingDownloadOperation result to
// track status until the report is complete e.g. either using
// trackAsync or getStatusAsync.
outputStatusMessage("Awaiting Submit and Download . . .");
submitAndDownloadAsync(reportRequest);
// Option C - Download Results with ReportingServiceManager
// If for any reason you have to resume from a previous application state,
// you can use an existing download request identifier and use it
// to download the result file.
// For example you might have previously retrieved a request ID using submitDownloadAsync.
ReportingDownloadOperation reportingDownloadOperation =
ReportingServiceManager.submitDownloadAsync(reportRequest, null).get();
java.lang.String requestId = reportingDownloadOperation.getRequestId();
// Given the request ID above, you can resume the workflow and download the report.
// The report request identifier is valid for two days.
// If you do not download the report within two days, you must request the report again.
outputStatusMessage("Awaiting Download Results . . .");
downloadResultsAsync(requestId);
outputStatusMessage("Program execution completed\n");
} catch (ExecutionException ee) {
Throwable cause = ee.getCause();
if (cause instanceof AdApiFaultDetail_Exception) {
AdApiFaultDetail_Exception ex = (AdApiFaultDetail_Exception)cause;
outputStatusMessage("The operation failed with the following faults:\n");
for (AdApiError error : ex.getFaultInfo().getErrors().getAdApiErrors())
{
outputStatusMessage("AdApiError\n");
outputStatusMessage(String.format("Code: %d\nError Code: %s\nMessage: %s\n\n",
error.getCode(), error.getErrorCode(), error.getMessage()));
}
} else if (cause instanceof ApiFaultDetail_Exception) {
ApiFaultDetail_Exception ex = (ApiFaultDetail_Exception)cause;
outputStatusMessage("The operation failed with the following faults:\n");
for (BatchError error : ex.getFaultInfo().getBatchErrors().getBatchErrors())
{
outputStatusMessage(String.format("BatchError at Index: %d\n", error.getIndex()));
outputStatusMessage(String.format("Code: %d\nMessage: %s\n\n", error.getCode(), error.getMessage()));
}
for (OperationError error : ex.getFaultInfo().getOperationErrors().getOperationErrors())
{
outputStatusMessage("OperationError\n");
outputStatusMessage(String.format("Code: %d\nMessage: %s\n\n", error.getCode(), error.getMessage()));
}
} else {
ee.printStackTrace();
}
} catch (OAuthTokenRequestException ex) {
outputStatusMessage(String.format("Couldn't get OAuth tokens. Error: {0}. Description: {1}",
ex.getDetails().getError(), ex.getDetails().getDescription()));
ex.printStackTrace();
} catch (ReportingOperationInProgressException ex) {
outputStatusMessage("The result file for the reporting operation is not yet available for download.");
ex.printStackTrace();
} catch (ReportingOperationCouldNotBeCompletedException ex) {
outputStatusMessage(String.format("ReportingOperationCouldNotBeCompletedException Message: {0}", ex.getMessage()));
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (URISyntaxException ex) {
ex.printStackTrace();
} catch (TimeoutException ex) {
ex.printStackTrace();
}
}
// You can submit a download request and the ReportingServiceManager will automatically
// return results. The ReportingServiceManager abstracts the details of checking for result file
// completion, and you don't have to write any code for results polling.
private static void backgroundCompletionAsync(ReportingDownloadParameters reportingDownloadParameters)
throws ExecutionException, InterruptedException, TimeoutException {
// You may optionally cancel the downloadFileAsync operation after a specified time interval.
File resultFile = ReportingServiceManager.downloadFileAsync(
reportingDownloadParameters,
null).get(TimeoutInMilliseconds, TimeUnit.MILLISECONDS);
outputStatusMessage(String.format("Download result file: %s\n", resultFile.getName()));
}
// Submit the download request and then use the ReportingDownloadOperation result to
// track status until the report is complete e.g. either using
// trackAsync or getStatusAsync.
private static void submitAndDownloadAsync(ReportRequest reportRequest)
throws ExecutionException, InterruptedException, URISyntaxException, IOException, TimeoutException {
ReportingDownloadOperation reportingDownloadOperation = ReportingServiceManager.submitDownloadAsync(
reportRequest,
null).get();
// You may optionally cancel the trackAsync operation after a specified time interval.
ReportingOperationStatus reportingOperationStatus =
reportingDownloadOperation.trackAsync(null).get(TimeoutInMilliseconds, TimeUnit.MILLISECONDS);
// You can use trackAsync to poll until complete as shown above,
// or use custom polling logic with getStatusAsync as shown below.
// ReportingOperationStatus reportingOperationStatus;
//
// for (int i = 0; i < 24; i++)
// {
// Thread.sleep(5000);
// reportingOperationStatus = reportingDownloadOperation.getStatusAsync(null).get(TimeoutInMilliseconds, TimeUnit.MILLISECONDS);
// if (reportingOperationStatus.getStatus() == ReportRequestStatusType.SUCCESS)
// {
// break;
// }
// }
File resultFile = reportingDownloadOperation.downloadResultFileAsync(
new File(FileDirectory),
ResultFileName,
true, // Set this value to true if you want to decompress the ZIP file.
true, // Set this value true if you want to overwrite the named file.
null).get();
outputStatusMessage(String.format("Download result file: %s\n", resultFile.getName()));
}
// If for any reason you have to resume from a previous application state,
// you can use an existing download request identifier and use it
// to download the result file. Use trackAsync to indicate that the application
// should wait to ensure that the download status is completed.
private static void downloadResultsAsync(java.lang.String requestId)
throws ExecutionException, InterruptedException, URISyntaxException, IOException, TimeoutException {
ReportingDownloadOperation reportingDownloadOperation = new ReportingDownloadOperation(requestId, authorizationData);
reportingDownloadOperation.setStatusPollIntervalInMilliseconds(5000);
// You can use trackAsync to poll until complete as shown here,
// or use custom polling logic with getStatusAsync.
// You may optionally cancel the trackAsync operation after a specified time interval.
ReportingOperationStatus reportingOperationStatus =
reportingDownloadOperation.trackAsync(null).get(TimeoutInMilliseconds, TimeUnit.MILLISECONDS);
File resultFile = reportingDownloadOperation.downloadResultFileAsync(
new File(FileDirectory),
ResultFileName,
true, // Set this value to true if you want to decompress the ZIP file
true, // Set this value true if you want to overwrite the named file.
null).get();
outputStatusMessage(String.format("Download result file: %s", resultFile.getName()));
outputStatusMessage(String.format("Status: %s", reportingOperationStatus.getStatus()));
outputStatusMessage(String.format("TrackingId: %s\n", reportingOperationStatus.getTrackingId()));
}
private static ReportRequest getKeywordPerformanceReportRequest(){
KeywordPerformanceReportRequest report = new KeywordPerformanceReportRequest();
report.setFormat(ReportFileFormat);
report.setReportName("My Keyword Performance Report");
report.setReturnOnlyCompleteData(false);
report.setAggregation(ReportAggregation.DAILY);
ArrayOflong accountIds = new ArrayOflong();
accountIds.getLongs().add(authorizationData.getAccountId());
report.setScope(new AccountThroughAdGroupReportScope());
report.getScope().setAccountIds(accountIds);
report.getScope().setCampaigns(null);
report.getScope().setAdGroups(null);
report.setTime(new ReportTime());
report.getTime().setPredefinedTime(ReportTimePeriod.YESTERDAY);
// You may either use a custom date range or predefined time.
//Calendar calendar = Calendar.getInstance();
//report.getTime().setCustomDateRangeStart(new Date());
//report.getTime().getCustomDateRangeStart().setMonth(1);
//report.getTime().getCustomDateRangeStart().setDay(1);
//report.getTime().getCustomDateRangeStart().setYear(calendar.get(Calendar.YEAR)-1);
//report.getTime().setCustomDateRangeEnd(new Date());
//report.getTime().getCustomDateRangeEnd().setMonth(12);
//report.getTime().getCustomDateRangeEnd().setDay(31);
//report.getTime().getCustomDateRangeEnd().setYear(calendar.get(Calendar.YEAR)-1);
// If you specify a filter, results may differ from data you see in the Bing Ads web application
//report.setFilter(new KeywordPerformanceReportFilter());
//ArrayList<DeviceTypeReportFilter> deviceTypes = new ArrayList<DeviceTypeReportFilter>();
//deviceTypes.add(DeviceTypeReportFilter.COMPUTER);
//deviceTypes.add(DeviceTypeReportFilter.SMART_PHONE);
//report.getFilter().setDeviceType(deviceTypes);
// Specify the attribute and data report columns.
ArrayOfKeywordPerformanceReportColumn keywordPerformanceReportColumns = new ArrayOfKeywordPerformanceReportColumn();
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.TIME_PERIOD);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.ACCOUNT_ID);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.CAMPAIGN_ID);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.KEYWORD);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.KEYWORD_ID);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.DEVICE_TYPE);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.BID_MATCH_TYPE);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.CLICKS);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.IMPRESSIONS);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.CTR);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.AVERAGE_CPC);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.SPEND);
keywordPerformanceReportColumns.getKeywordPerformanceReportColumns().add(KeywordPerformanceReportColumn.QUALITY_SCORE);
report.setColumns(keywordPerformanceReportColumns);
// You may optionally sort by any KeywordPerformanceReportColumn, and optionally
// specify the maximum number of rows to return in the sorted report.
KeywordPerformanceReportSort keywordPerformanceReportSort = new KeywordPerformanceReportSort();
keywordPerformanceReportSort.setSortColumn(KeywordPerformanceReportColumn.CLICKS);
keywordPerformanceReportSort.setSortOrder(SortOrder.ASCENDING);
ArrayOfKeywordPerformanceReportSort keywordPerformanceReportSorts = new ArrayOfKeywordPerformanceReportSort();
keywordPerformanceReportSorts.getKeywordPerformanceReportSorts().add(keywordPerformanceReportSort);
report.setSort(keywordPerformanceReportSorts);
report.setMaxRows(10);
return report;
}
}