Exemplo n.º 1
0
        private WebRequest CreateAdwordsReportRequest(DeliveryFile file, AdWordsUser user, string postBody)
        {
            var config  = user.Config as AdWordsAppConfig;
            var request = WebRequest.Create(file.SourceUrl) as HttpWebRequest;

            if (config == null || request == null)
            {
                return(null);
            }

            request.Timeout = 100000;
            if (!string.IsNullOrEmpty(postBody))
            {
                request.Method = "POST";
            }
            if (!string.IsNullOrEmpty(config.ClientCustomerId))
            {
                request.Headers.Add("clientCustomerId: " + (user.Config as AdWordsAppConfig).ClientCustomerId);
            }

            request.ContentType = "application/x-www-form-urlencoded";

            if (config.EnableGzipCompression)
            {
                request.AutomaticDecompression = DecompressionMethods.GZip
                                                 | DecompressionMethods.Deflate;
            }
            else
            {
                request.AutomaticDecompression = DecompressionMethods.None;
            }

            if (config.AuthorizationMethod == AdWordsAuthorizationMethod.ClientLogin)
            {
                string authToken = AdwordsUtill.GetAuthToken(user);
                (user.Config as AdWordsAppConfig).AuthToken = authToken;
                request.Headers["Authorization"]            = "GoogleLogin auth=" + authToken;
            }

            request.Headers.Add("returnMoneyInMicros: true");
            request.Headers.Add("developerToken: " + (user.Config as AdWordsAppConfig).DeveloperToken);

            //Try to unmark the following comment in case of api error
            //The client library will use only apiMode = true.
            //request.Headers.Add("apiMode", "true");

            return(request);
        }
        protected override Core.Services.ServiceOutcome DoPipelineWork()
        {
            _batchDownloadOperation = new BatchDownloadOperation()
            {
                MaxConcurrent = 1
            };
            _batchDownloadOperation.Progressed += new EventHandler(_batchDownloadOperation_Progressed);
            _filesInProgress = this.Delivery.Files.Count;
            bool includeZeroImpression = Boolean.Parse(this.Delivery.Parameters["includeZeroImpression"].ToString());


            //Sets Date Range and time period
            _dateRange = GA201406.ReportDefinitionDateRangeType.CUSTOM_DATE;
            string startDate = this.TimePeriod.Start.ToDateTime().ToString("yyyyMMdd");
            string endDate   = this.TimePeriod.End.ToDateTime().ToString("yyyyMMdd");

            _waitHandle = new AutoResetEvent(false);

            foreach (string clientId in (string[])this.Delivery.Parameters["AdwordsClientIDs"])
            {
                //Get all files on specific client
                var files = from f in this.Delivery.Files
                            where f.Parameters["AdwordsClientID"].ToString() == clientId
                            select f;

                #region Adwords User
                //==================================================================================
                Dictionary <string, string> headers = new Dictionary <string, string>()
                {
                    { "DeveloperToken", this.Delivery.Parameters["DeveloperToken"].ToString() },
                    { "UserAgent", FileManager.UserAgentString },
                    { "EnableGzipCompression", "true" },
                    { "ClientCustomerId", clientId },
                    { "Email", this.Delivery.Parameters["MccEmail"].ToString() }
                };
                AdWordsUser user = new AdWordsUser(headers);
                (user.Config as AdWordsAppConfig).AuthorizationMethod = AdWordsAuthorizationMethod.OAuth2;
                AdwordsUtill.GetOAuthDetailsFromDB(this.Delivery.Parameters["OAuth2ClientId"].ToString(), user);
                //==================================================================================
                #endregion Adwords User


                bool          firstCheck = true;
                List <string> awqls      = new List <string>();

                foreach (DeliveryFile file in files)
                {
                    GA201406.ReportDefinitionReportType reportType;

                    //Validate Google report type
                    if (Enum.IsDefined(typeof(GA201406.ReportDefinitionReportType), file.Parameters["ReportType"].ToString()))
                    {
                        reportType = (GA201406.ReportDefinitionReportType)Enum.Parse(typeof(GA201406.ReportDefinitionReportType), file.Parameters["ReportType"].ToString(), true);
                    }
                    else
                    {
                        throw new Exception("Google Adwords Report Type Error ! Could not find Enum value for report type");
                    }

                    if (Enum.IsDefined(typeof(GA201406.ReportDefinitionReportType), file.Parameters["ReportType"].ToString()))
                    {
                        reportType = (GA201406.ReportDefinitionReportType)Enum.Parse(typeof(GA201406.ReportDefinitionReportType), file.Parameters["ReportType"].ToString(), true);
                    }
                    else
                    {
                        throw new Exception("Google Adwords Report Type Error ! Could not find Enum value for report type");
                    }


                    //Creating AWQL
                    StringBuilder sb = new StringBuilder();
                    sb.Append("SELECT ");
                    foreach (string item in GoogleStaticReportFields.REPORTS_FIELDS[reportType][file.Parameters["ReportFieldsType"].ToString()])
                    {
                        sb.Append(item);
                        sb.Append(",");
                    }
                    sb.Remove(sb.Length - 1, 1); // removing last ","
                    sb.Append(" FROM " + reportType.ToString());

                    if (!includeZeroImpression && GoogleStaticReportFields.REPORTS_FIELDS[reportType][file.Parameters["ReportFieldsType"].ToString()].Contains(""))
                    {
                        sb.Append(" WHERE Impressions > 0");
                    }


                    if (file.Name.Equals(GoogleStaticReportsNamesUtill._reportNames[GA201406.ReportDefinitionReportType.PLACEHOLDER_FEED_ITEM_REPORT]))
                    //Site link file
                    {
                        if (sb.ToString().Contains("WHERE"))
                        {
                            sb.Append("AND ClickType IN [SITELINKS] AND PlaceholderType IN [1] ");
                        }
                        else
                        {
                            sb.Append(" WHERE ClickType IN [SITELINKS] AND PlaceholderType IN [1] ");
                        }
                    }

                    sb.Append(string.Format(" DURING {0},{1}", startDate, endDate));

                    AdWordsAppConfig config = (AdWordsAppConfig)user.Config;

                    string QUERY_REPORT_URL_FORMAT = "{0}/api/adwords/reportdownload/{1}?" + "__fmt={2}";
                    string reportVersion           = "v201406";
                    string format = GA201406.DownloadFormat.GZIPPED_CSV.ToString();
                    file.SourceUrl = string.Format(QUERY_REPORT_URL_FORMAT, config.AdWordsApiServer, reportVersion, format);
                    string query    = sb.ToString();
                    string postData = string.Format("__rdquery={0}", HttpUtility.UrlEncode(query));

                    awqls.Add(query);

                    //Validate Report
                    if (firstCheck)
                    {
                        string error = string.Empty;
                        if (!ValidateReport(file, user, postData, out error))
                        {
                            //CHEKING FOR INVALID AUTHTOKEN
                            if (error.Contains(GA201406.AuthenticationErrorReason.GOOGLE_ACCOUNT_COOKIE_INVALID.ToString()))
                            {
                                //RENEWING AUTHTOKEN
                                throw new Exception("GOOGLE_ACCOUNT_COOKIE_INVALID, RENEWING AUTHTOKEN is not supported on version V201406");
                                //(user.Config as AdWordsAppConfig).AuthToken = AdwordsUtill.GetAuthToken(user, generateNew: true);
                            }
                            else
                            {
                                throw new Exception("Google Adwords API Error: " + error);
                            }
                        }
                        firstCheck = !firstCheck;
                    }

                    //If Validate - Success
                    DownloadFile(file, user, postData);
                }
            }

            _batchDownloadOperation.Start();
            _batchDownloadOperation.Wait();

            _batchDownloadOperation.EnsureSuccess(); //INCASE OF GENERAL EXCEPTION OPEN DELIVERY FILE HAS HTML AND VIEW INNER ERROR

            this.Delivery.Save();
            return(Core.Services.ServiceOutcome.Success);
        }
Exemplo n.º 3
0
        protected override ServiceOutcome DoPipelineWork()
        {
            _batchDownloadOperation = new BatchDownloadOperation {
                MaxConcurrent = 1
            };
            _batchDownloadOperation.Progressed += _batchDownloadOperation_Progressed;
            var includeZeroImpression = Boolean.Parse(Delivery.Parameters["includeZeroImpression"].ToString());

            // time period
            var startDate = Delivery.TimePeriodDefinition.Start.ToDateTime().ToString("yyyyMMdd");
            var endDate   = Delivery.TimePeriodDefinition.End.ToDateTime().ToString("yyyyMMdd");

            foreach (var clientId in (string[])Delivery.Parameters["AdwordsClientIDs"])
            {
                //Get all files on specific client
                var files = Delivery.Files.Where(x => x.Parameters["AdwordsClientID"].ToString() == clientId);

                //Setting Adwords User
                var headers = new Dictionary <string, string>
                {
                    { "DeveloperToken", Delivery.Parameters["DeveloperToken"].ToString() },
                    { "UserAgent", FileManager.UserAgentString },
                    { "EnableGzipCompression", "true" },
                    { "ClientCustomerId", clientId },
                    { "Email", Delivery.Parameters["MccEmail"].ToString() }
                };

                var user = new AdWordsUser(headers);
                // AuthToken
                var config = user.Config as AdWordsAppConfig;
                if (config == null)
                {
                    throw new Exception("Failed to convert AdwordUser.Config to AdWordsAppConfig");
                }
                config.AuthToken = AdwordsUtill.GetAuthToken(user);

                var firstCheck = true;
                var awqls      = new List <string>();

                foreach (var file in files)
                {
                    // report type
                    GA201302.ReportDefinitionReportType reportType;
                    if (Enum.IsDefined(typeof(GA201302.ReportDefinitionReportType), file.Parameters["ReportType"].ToString()))
                    {
                        reportType = (GA201302.ReportDefinitionReportType)Enum.Parse(typeof(GA201302.ReportDefinitionReportType), file.Parameters["ReportType"].ToString(), true);
                    }
                    else
                    {
                        throw new ConfigurationErrorsException(String.Format("Unknown Google Adwords Report Type '{0}'", file.Parameters["ReportType"]));
                    }

                    // Creating AWQL
                    var sb = new StringBuilder();
                    sb.AppendFormat("SELECT {0} FROM {1}", file.Parameters["ReportFields"], file.Parameters["ReportType"]);

                    if (!includeZeroImpression)
                    {
                        sb.Append(" WHERE Impressions > 0");
                    }

                    sb.AppendFormat(" DURING {0},{1}", startDate, endDate);

                    var format = GA201302.DownloadFormat.GZIPPED_CSV.ToString();
                    file.SourceUrl = string.Format(QUERY_REPORT_URL_FORMAT, config.AdWordsApiServer, REPORT_VERSION, format);
                    var query    = sb.ToString();
                    var postData = string.Format("__rdquery={0}", HttpUtility.UrlEncode(query));

                    awqls.Add(query);

                    //Validate Report
                    if (firstCheck)
                    {
                        string error;
                        if (!ValidateReport(file, user, postData, out error))
                        {
                            //CHEKING FOR INVALID AUTHTOKEN
                            if (error.Contains(GA201302.AuthenticationErrorReason.GOOGLE_ACCOUNT_COOKIE_INVALID.ToString()))
                            {
                                //RENEWING AUTHTOKEN
                                config.AuthToken = AdwordsUtill.GetAuthToken(user, generateNew: true);
                            }
                            else
                            {
                                throw new Exception(String.Format("Google Adwords API Error: {0}", error));
                            }
                        }
                        firstCheck = false;
                    }

                    //If Validate - Success
                    DownloadFile(file, user, postData);
                }
            }

            Progress = 0.2;
            _batchDownloadOperation.Start();
            _batchDownloadOperation.Wait();

            _batchDownloadOperation.EnsureSuccess();             //INCASE OF GENERAL EXCEPTION OPEN DELIVERY FILE HAS HTML AND VIEW INNER ERROR

            Progress = 0.9;
            Delivery.Save();
            return(ServiceOutcome.Success);
        }