Skip to content

Instantly share code, notes, and snippets.

@Rickedb
Created August 13, 2019 14:35
Show Gist options
  • Save Rickedb/4fca03328793136109e74b131edd47bb to your computer and use it in GitHub Desktop.
Save Rickedb/4fca03328793136109e74b131edd47bb to your computer and use it in GitHub Desktop.
public class GoogleAdWordsService
{
private readonly AdWordsAppConfig _config;
public GoogleAdWordsService(AdWordsAppConfig config)
{
_config = config;
}
public async Task<object> GetReport(string customerId)
{
var reportDefinition = new ReportDefinition()
{
reportName = "MyReportName",
selector = new Selector()
{
dateRange = new DateRange()
{
min = DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd"),
max = DateTime.Now.ToString("yyyy-MM-dd")
},
fields = new string[]
{
"CampaignName",
"AdGroupName",
"Date",
"Cost",
"CostPerConversion",
"Ctr",
"Impressions",
"Conversions",
"ConversionRate",
"Clicks",
"PercentNewVisitors"
}
},
dateRangeType = ReportDefinitionDateRangeType.CUSTOM_DATE,
downloadFormat = DownloadFormat.XML,
reportType = ReportDefinitionReportType.AD_PERFORMANCE_REPORT,
};
_config.ClientCustomerId = customerId;
var user = new AdWordsUser(_config);
user.OAuthProvider.RefreshAccessTokenIfExpiring();
var response = await GetResponse(user, reportDefinition);
return await DownloadContent(response);
}
private async Task<ReportResponse> GetResponse(AdWordsUser user, IReportDefinition reportDefinition)
{
var utils = new ReportUtilities(user, reportDefinition);
var response = default(ReportResponse);
utils.OnReady = new AdsReportUtilities.OnReadyCallback((r) => response = r);
utils.OnFailed = new AdsReportUtilities.OnFailedCallback((ex) => throw ex);
var task = Task.Run(async () =>
{
while (response == default(ReportResponse))
await Task.Delay(300);
return response;
});
utils.GetResponseAsync();
return await task;
}
private async Task<object> DownloadContent(ReportResponse response)
{
var result = default(object);
response.OnDownloadSuccess = new ReportResponse.OnDownloadSuccessCallback((bytes) => result = Encoding.UTF8.GetString(bytes));
response.OnFailed = new ReportResponse.OnFailedCallback((ex) => result = ex.Message);
var task = Task.Run(async () =>
{
while (result == null)
await Task.Delay(1000);
return result;
});
response.DownloadAsync();
return await task;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment