/// <summary> /// Gets the traffic estimates for a list of keywords. /// </summary> /// <param name="user">The user for which keyword ideas are generated.</param> /// <param name="keywords">The keywords for which traffic estimates are /// done.</param> /// <param name="matchType">Type of the keyword match to apply when making /// traffic estimates.</param> /// <param name="maxCpc">The maximum CPC to consider for the traffic.</param> /// <param name="campaignId">The campaign ID whose settings should be used /// for traffic estimation.</param> /// <returns>A list of traffic estimates for the keywords.</returns> private List <TrafficEstimate> GetTrafficEstimates(AdWordsUser user, List <KeywordIdea> keywords, KeywordMatchType matchType, long maxCpc, long campaignId) { // Get the TrafficEstimatorService. TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService( AdWordsService.v201607.TrafficEstimatorService); List <Criterion> trafficCriteria = GetTrafficEstimateCriteria(); List <TrafficEstimate> retval = new List <TrafficEstimate>(); // Eliminate duplicate keywords in the keyword suggestion list so that // TrafficEstimatorService doesn't complain about them. Dictionary <string, KeywordIdea> uniqueEntries = new Dictionary <string, KeywordIdea>(); for (int i = 0; i < keywords.Count; i++) { if (!uniqueEntries.ContainsKey(keywords[i].KeywordText)) { uniqueEntries[keywords[i].KeywordText] = keywords[i]; } } keywords = new List <KeywordIdea>(uniqueEntries.Values); for (int i = 0; i < keywords.Count; i += Settings.TES_KEYWORDS_LIST_SIZE) { List <KeywordEstimateRequest> keywordEstimateRequests = new List <KeywordEstimateRequest>(); for (int j = i; j < i + Settings.TES_KEYWORDS_LIST_SIZE && j < keywords.Count; j++) { KeywordEstimateRequest keywordEstimateRequest = new KeywordEstimateRequest() { keyword = new Keyword() { text = keywords[j].KeywordText, matchType = matchType } }; keywordEstimateRequests.Add(keywordEstimateRequest); } // Create campaign estimate requests. CampaignEstimateRequest campaignEstimateRequest = new CampaignEstimateRequest() { adGroupEstimateRequests = new AdGroupEstimateRequest[] { new AdGroupEstimateRequest() { keywordEstimateRequests = keywordEstimateRequests.ToArray(), maxCpc = new Money() { microAmount = maxCpc } } } }; campaignEstimateRequest.criteria = trafficCriteria.ToArray(); campaignEstimateRequest.campaignId = campaignId; // Create the selector. TrafficEstimatorSelector selector = new TrafficEstimatorSelector(); selector.campaignEstimateRequests = new CampaignEstimateRequest[] { campaignEstimateRequest }; try { // Get traffic estimates. TrafficEstimatorResult result = trafficEstimatorService.get(selector); // Display traffic estimates. if (result != null && result.campaignEstimates != null && result.campaignEstimates.Length > 0) { CampaignEstimate campaignEstimate = result.campaignEstimates[0]; if (campaignEstimate.adGroupEstimates != null && campaignEstimate.adGroupEstimates.Length > 0) { AdGroupEstimate adGroupEstimate = campaignEstimate.adGroupEstimates[0]; if (adGroupEstimate.keywordEstimates != null) { for (int k = 0; k < adGroupEstimate.keywordEstimates.Length; k++) { Keyword keyword = keywordEstimateRequests[k].keyword; KeywordEstimate keywordEstimate = adGroupEstimate.keywordEstimates[k]; if (keywordEstimateRequests[k].isNegative) { continue; } // Find the mean of the min and max values. long meanAverageCpc = 0; double meanAveragePosition = 0; long meanClicks = 0; long meanImpressions = 0; long meanTotalCost = 0; if (keywordEstimate.min != null && keywordEstimate.max != null) { if (keywordEstimate.min.averageCpc != null && keywordEstimate.max.averageCpc != null) { meanAverageCpc = (long)Math.Round( (double)(keywordEstimate.min.averageCpc.microAmount + keywordEstimate.max.averageCpc.microAmount) / 2, Settings.ACCURACY, MidpointRounding.AwayFromZero); } meanAveragePosition = Math.Round((keywordEstimate.min.averagePosition + keywordEstimate.max.averagePosition) / 2, Settings.ACCURACY, MidpointRounding.AwayFromZero); meanClicks = (long)Math.Round((keywordEstimate.min.clicksPerDay + keywordEstimate.max.clicksPerDay) / 2, MidpointRounding.AwayFromZero); meanImpressions = (long)Math.Round((keywordEstimate.min.impressionsPerDay + keywordEstimate.max.impressionsPerDay) / 2, MidpointRounding.AwayFromZero); if (keywordEstimate.min.totalCost != null && keywordEstimate.max.totalCost != null) { meanTotalCost = (keywordEstimate.min.totalCost.microAmount + keywordEstimate.max.totalCost.microAmount) / 2; } } TrafficEstimate trafficEstimate = new TrafficEstimate() { Keyword = keywords[i + k], MatchType = keyword.matchType, Clicks = meanClicks, Impressions = meanImpressions, Cost = meanTotalCost, AverageCpc = meanAverageCpc, AveragePosition = meanAveragePosition }; retval.Add(trafficEstimate); } } } } } catch (Exception e) { throw new System.ApplicationException("Failed to retrieve traffic estimates.", e); } } return(retval); }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> public void Run(AdWordsUser user) { using (TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService( AdWordsService.v201802.TrafficEstimatorService)) { // Create keywords. Refer to the TrafficEstimatorService documentation for the maximum // number of keywords that can be passed in a single request. // https://developers.google.com/adwords/api/docs/reference/latest/TrafficEstimatorService Keyword keyword1 = new Keyword(); keyword1.text = "mars cruise"; keyword1.matchType = KeywordMatchType.BROAD; Keyword keyword2 = new Keyword(); keyword2.text = "cheap cruise"; keyword2.matchType = KeywordMatchType.PHRASE; Keyword keyword3 = new Keyword(); keyword3.text = "cruise"; keyword3.matchType = KeywordMatchType.EXACT; Keyword[] keywords = new Keyword[] { keyword1, keyword2, keyword3 }; // Create a keyword estimate request for each keyword. List <KeywordEstimateRequest> keywordEstimateRequests = new List <KeywordEstimateRequest>(); foreach (Keyword keyword in keywords) { KeywordEstimateRequest keywordEstimateRequest = new KeywordEstimateRequest(); keywordEstimateRequest.keyword = keyword; keywordEstimateRequests.Add(keywordEstimateRequest); } // Create negative keywords. Keyword negativeKeyword1 = new Keyword(); negativeKeyword1.text = "moon walk"; negativeKeyword1.matchType = KeywordMatchType.BROAD; KeywordEstimateRequest negativeKeywordEstimateRequest = new KeywordEstimateRequest(); negativeKeywordEstimateRequest.keyword = negativeKeyword1; negativeKeywordEstimateRequest.isNegative = true; keywordEstimateRequests.Add(negativeKeywordEstimateRequest); // Create ad group estimate requests. AdGroupEstimateRequest adGroupEstimateRequest = new AdGroupEstimateRequest(); adGroupEstimateRequest.keywordEstimateRequests = keywordEstimateRequests.ToArray(); adGroupEstimateRequest.maxCpc = new Money(); adGroupEstimateRequest.maxCpc.microAmount = 1000000; // Create campaign estimate requests. CampaignEstimateRequest campaignEstimateRequest = new CampaignEstimateRequest(); campaignEstimateRequest.adGroupEstimateRequests = new AdGroupEstimateRequest[] { adGroupEstimateRequest }; // Optional: Set additional criteria for filtering estimates. // See http://code.google.com/apis/adwords/docs/appendix/countrycodes.html // for a detailed list of country codes. Location countryCriterion = new Location(); countryCriterion.id = 2840; //US // See http://code.google.com/apis/adwords/docs/appendix/languagecodes.html // for a detailed list of language codes. Language languageCriterion = new Language(); languageCriterion.id = 1000; //en campaignEstimateRequest.criteria = new Criterion[] { countryCriterion, languageCriterion }; try { // Create the selector. TrafficEstimatorSelector selector = new TrafficEstimatorSelector() { campaignEstimateRequests = new CampaignEstimateRequest[] { campaignEstimateRequest }, // Optional: Request a list of campaign level estimates segmented by platform. platformEstimateRequested = true }; // Get traffic estimates. TrafficEstimatorResult result = trafficEstimatorService.get(selector); // Display traffic estimates. if (result != null && result.campaignEstimates != null && result.campaignEstimates.Length > 0) { CampaignEstimate campaignEstimate = result.campaignEstimates[0]; // Display the campaign level estimates segmented by platform. if (campaignEstimate.platformEstimates != null) { foreach (PlatformCampaignEstimate platformEstimate in campaignEstimate.platformEstimates) { string platformMessage = string.Format("Results for the platform with ID: " + "{0} and name : {1}.", platformEstimate.platform.id, platformEstimate.platform.platformName); DisplayMeanEstimates(platformMessage, platformEstimate.minEstimate, platformEstimate.maxEstimate); } } // Display the keyword estimates. if (campaignEstimate.adGroupEstimates != null && campaignEstimate.adGroupEstimates.Length > 0) { AdGroupEstimate adGroupEstimate = campaignEstimate.adGroupEstimates[0]; if (adGroupEstimate.keywordEstimates != null) { for (int i = 0; i < adGroupEstimate.keywordEstimates.Length; i++) { Keyword keyword = keywordEstimateRequests[i].keyword; KeywordEstimate keywordEstimate = adGroupEstimate.keywordEstimates[i]; if (keywordEstimateRequests[i].isNegative) { continue; } string kwdMessage = string.Format("Results for the keyword with text = '{0}' " + "and match type = '{1}':", keyword.text, keyword.matchType); DisplayMeanEstimates(kwdMessage, keywordEstimate.min, keywordEstimate.max); } } } } else { Console.WriteLine("No traffic estimates were returned."); } trafficEstimatorService.Close(); } catch (Exception e) { throw new System.ApplicationException("Failed to retrieve traffic estimates.", e); } } }
/// <summary> /// Runs the code example. /// </summary> /// <param name="user">The AdWords user.</param> public void Run(AdWordsUser user) { // Get the TrafficEstimatorService. TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService( AdWordsService.v201409.TrafficEstimatorService); // Create keywords. Up to 2000 keywords can be passed in a single request. Keyword keyword1 = new Keyword(); keyword1.text = "mars cruise"; keyword1.matchType = KeywordMatchType.BROAD; Keyword keyword2 = new Keyword(); keyword2.text = "cheap cruise"; keyword2.matchType = KeywordMatchType.PHRASE; Keyword keyword3 = new Keyword(); keyword3.text = "cruise"; keyword3.matchType = KeywordMatchType.EXACT; Keyword[] keywords = new Keyword[] { keyword1, keyword2, keyword3 }; // Create a keyword estimate request for each keyword. List <KeywordEstimateRequest> keywordEstimateRequests = new List <KeywordEstimateRequest>(); foreach (Keyword keyword in keywords) { KeywordEstimateRequest keywordEstimateRequest = new KeywordEstimateRequest(); keywordEstimateRequest.keyword = keyword; keywordEstimateRequests.Add(keywordEstimateRequest); } // Create negative keywords. Keyword negativeKeyword1 = new Keyword(); negativeKeyword1.text = "moon walk"; negativeKeyword1.matchType = KeywordMatchType.BROAD; KeywordEstimateRequest negativeKeywordEstimateRequest = new KeywordEstimateRequest(); negativeKeywordEstimateRequest.keyword = negativeKeyword1; negativeKeywordEstimateRequest.isNegative = true; keywordEstimateRequests.Add(negativeKeywordEstimateRequest); // Create ad group estimate requests. AdGroupEstimateRequest adGroupEstimateRequest = new AdGroupEstimateRequest(); adGroupEstimateRequest.keywordEstimateRequests = keywordEstimateRequests.ToArray(); adGroupEstimateRequest.maxCpc = new Money(); adGroupEstimateRequest.maxCpc.microAmount = 1000000; // Create campaign estimate requests. CampaignEstimateRequest campaignEstimateRequest = new CampaignEstimateRequest(); campaignEstimateRequest.adGroupEstimateRequests = new AdGroupEstimateRequest[] { adGroupEstimateRequest }; // See http://code.google.com/apis/adwords/docs/appendix/countrycodes.html // for a detailed list of country codes. Location countryCriterion = new Location(); countryCriterion.id = 2840; //US // See http://code.google.com/apis/adwords/docs/appendix/languagecodes.html // for a detailed list of language codes. Language languageCriterion = new Language(); languageCriterion.id = 1000; //en campaignEstimateRequest.criteria = new Criterion[] { countryCriterion, languageCriterion }; // Create the selector. TrafficEstimatorSelector selector = new TrafficEstimatorSelector(); selector.campaignEstimateRequests = new CampaignEstimateRequest[] { campaignEstimateRequest }; try { // Get traffic estimates. TrafficEstimatorResult result = trafficEstimatorService.get(selector); // Display traffic estimates. if (result != null && result.campaignEstimates != null && result.campaignEstimates.Length > 0) { CampaignEstimate campaignEstimate = result.campaignEstimates[0]; if (campaignEstimate.adGroupEstimates != null && campaignEstimate.adGroupEstimates.Length > 0) { AdGroupEstimate adGroupEstimate = campaignEstimate.adGroupEstimates[0]; if (adGroupEstimate.keywordEstimates != null) { for (int i = 0; i < adGroupEstimate.keywordEstimates.Length; i++) { Keyword keyword = keywordEstimateRequests[i].keyword; KeywordEstimate keywordEstimate = adGroupEstimate.keywordEstimates[i]; if (keywordEstimateRequests[i].isNegative) { continue; } // Find the mean of the min and max values. long meanAverageCpc = (keywordEstimate.min.averageCpc.microAmount + keywordEstimate.max.averageCpc.microAmount) / 2; double meanAveragePosition = (keywordEstimate.min.averagePosition + keywordEstimate.max.averagePosition) / 2; float meanClicks = (keywordEstimate.min.clicksPerDay + keywordEstimate.max.clicksPerDay) / 2; long meanTotalCost = (keywordEstimate.min.totalCost.microAmount + keywordEstimate.max.totalCost.microAmount) / 2; Console.WriteLine("Results for the keyword with text = '{0}' and match type = " + "'{1}':", keyword.text, keyword.matchType); Console.WriteLine(" Estimated average CPC: {0}", meanAverageCpc); Console.WriteLine(" Estimated ad position: {0:0.00}", meanAveragePosition); Console.WriteLine(" Estimated daily clicks: {0}", meanClicks); Console.WriteLine(" Estimated daily cost: {0}", meanTotalCost); } } } } else { Console.WriteLine("No traffic estimates were returned.\n"); } } catch (Exception ex) { throw new System.ApplicationException("Failed to retrieve traffic estimates.", ex); } }