public static void KeywordSearchRequestStub(AmazonSearchArgument amazonSearchArgument) { KeywordRequest keywordRequest = new KeywordRequest(); if (string.IsNullOrEmpty(amazonSearchArgument.AccessKeyID)) { amazonSearchArgument.AccessKeyID = AccessKeyID; } System.Console.WriteLine(amazonSearchArgument); keywordRequest.devtag = amazonSearchArgument.AccessKeyID; keywordRequest.keyword = amazonSearchArgument.Keyword; keywordRequest.locale = amazonSearchArgument.Locale; keywordRequest.mode = amazonSearchArgument.Mode; keywordRequest.page = amazonSearchArgument.Page; keywordRequest.sort = amazonSearchArgument.Sort; //keywordRequest.tag keywordRequest.type = amazonSearchArgument.Type; return; using (AmazonSearchService amazonSearchService = new AmazonSearchService()) { try { ProductInfo productInfo = amazonSearchService.KeywordSearchRequest(keywordRequest); if (productInfo.Details.Length > 0) { System.Console.WriteLine(productInfo.Details[0].ProductName); String url = productInfo.Details[0].ImageUrlLarge; using (WebClient webClient = new WebClient()) { webClient.DownloadFile(url, @"c:" + "/" + "Prince" + ".jpg"); /* * WebRequest webReq = WebRequest.Create(productInfo.Details[0].ImageUrlMedium); * WebResponse webResp = webReq.GetResponse(); * _image = Image.FromStream(webResp.GetResponseStream());* */ } } } catch (SoapException) { } } }
public ProductInfo KeywordSearchRequest(KeywordRequest KeywordSearchRequest) { object[] results = this.Invoke("KeywordSearchRequest", new object[] { KeywordSearchRequest}); return ((ProductInfo)(results[0])); }
public System.IAsyncResult BeginKeywordSearchRequest(KeywordRequest KeywordSearchRequest, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("KeywordSearchRequest", new object[] { KeywordSearchRequest}, callback, asyncState); }
/// <summary> /// Creates an AdWords Campaign grouped by category /// </summary> /// <param name="UseSandbox">Call the webservices in the test env</param> /// <param name="AffiliateSiteRefId"></param> /// <param name="Name">Campaign Name</param> /// <param name="Countries">Targeted countires</param> /// <param name="Languages">Targeted Languages</param> /// <param name="BudgetPeriod">The duration over which to spend the budgetAmount. For most developers, Daily is the only allowable option.</param> /// <param name="BudgetAmount">The amount of the budget in micros. Use budgetPeriod to set the duration over which to spend this amount.</param> /// <param name="KeywordMaxCpc">The default maximum cost-per-click bid for Keyword criteria in this ad group. See the note on bid amounts for more information on using this field.</param> /// <param name="MaxAdsPerGroup">Max Ads to create for each AdGroup</param> /// <param name="MaxAdvertiserCompetitionScale">The Max level of competition allowed from advertisers for keyword variations, on a scale from 0 to 5. Set to -1 if data is not available</param> /// <param name="MinSearchVolumeScale">The Min amount of searches to allowed related to keyword variations, on a scale from 0 to 5. Set to -1 if data is not available</param> /// <param name="DisplayUrl">Display Url to use for each Ad</param> /// <param name="destinationUrlPrefix">Destination Url Prefix for the destination Url of the Ads created.</param> /// <param name="UseKeywordVariations">Check for Keyword variations</param> /// <param name="MaxVariations">Max number of Keyword variations to use.</param> /// <param name="AdKeywordType">The type of keyword, indicating how it is targeted. This is not mutable after being set the first time. Values are: Broad=0,Phrase=1,Exact=2</param> //public void CreateCampaignGroupByProduct(bool UseSandbox, Guid AffiliateSiteRefId, string Name, String[] Countries, String[] Languages, int BudgetPeriod, // Moneyv200906 BudgetAmount, long KeywordMaxCpc, int MaxAdGroups, int MaxAdvertiserCompetitionScale, int MinSearchVolumeScale, // string DisplayUrl, string destinationUrlPrefix, bool GetKeywordsFromLandingPage, int MaxVariations, int AdKeywordType) //{ // // Create a user (reads headers from App.config file). // AdWordsUser user = new AdWordsUser(); // if (UseSandbox) // user.UseSandbox(); // use sandbox // AccountService accountService = (AccountService)user.GetService(ApiServices.v13.AccountService); // string[] accounts = accountService.getClientAccounts(); // try // { // #region Create Campaign // // Create a new campaign with an ad group. First create a // // campaign, so we can get its id. // Campaignv200906 newCampaign = new Campaignv200906(); // newCampaign.budget.amount = BudgetAmount; // //newCampaign.budget.amountSpecified = true; // newCampaign.budget.period = (BudgetPeriodv200906)Enum.ToObject(typeof(BudgetPeriodv200906), BudgetPeriod); // newCampaign.budget.periodSpecified = true; // // The campaign name is optional. An error results if a campaign // // of the same name already exists. // newCampaign.name = Name; // //TODO:newCampaign.networkTargeting = new NetworkType[] { NetworkType.SearchNetwork }; // // Target the campaign at // CampaignServicev200906 campaignService = (CampaignServicev200906)user.GetService(ApiServices.v200906.CampaignService); // // Set the campaign status to paused, we don't want to start // // paying for this test. // newCampaign.status = CampaignStatusv200906.PAUSED; // // Add this campaign. The campaign object is returned with ids // // filled in. // // Define an Add operation to add the campaign. // CampaignOperation campaignOperation = new CampaignOperation(); // campaignOperation.operatorSpecified = true; // campaignOperation.@operator = CampaignOperatorv200906.ADD; // campaignOperation.operand = newCampaign; // try // { // CampaignReturnValue results = // campaignService.mutate(new CampaignOperation[] { campaignOperation }); // if (results != null && results.value != null && results.value.Length > 0) // { // Trace.TraceInformation("New campaign with name = \"{0}\" and id = " + "\"{1}\" was created.", results.value[0].name, results.value[0].id); // } // } // catch (Exception ex) // { // throw new Exception("Failed to create campaign. " + ex.Message); // } // long campaignId = newCampaign.id; // #endregion // #region Targeting // CampaignTargetServicev200906 service = (CampaignTargetServicev200906)user.GetService(ApiServices.v200906.CampaignTargetService); // // Create a language target - for English language. // LanguageTargetv200906 languageTarget = new LanguageTargetv200906(); // languageTarget.languageCode = "en"; // LanguageTargetList languageTargetList = new LanguageTargetList(); // languageTargetList.targets = new LanguageTargetv200906[] { languageTarget }; // languageTargetList.campaignId = campaignId; // languageTargetList.campaignIdSpecified = true; // // Create a country target - include US, exclude metrocode 743. // CountryTargetv200906 countryTarget = new CountryTargetv200906(); // countryTarget.countryCode = "US"; // countryTarget.excludedSpecified = true; // countryTarget.excluded = false; // MetroTargetv200906 metroTarget = new MetroTargetv200906(); // metroTarget.excludedSpecified = true; // metroTarget.excluded = true; // metroTarget.metroCode = "743"; // GeoTargetList geoTargetList = new GeoTargetList(); // geoTargetList.targets = new GeoTargetv200906[] { countryTarget, metroTarget }; // geoTargetList.campaignId = campaignId; // geoTargetList.campaignIdSpecified = true; // // Create a network target - Google Search. // NetworkTargetv200906 networkTarget1 = new NetworkTargetv200906(); // networkTarget1.networkCoverageTypeSpecified = true; // networkTarget1.networkCoverageType = NetworkCoverageTypev200906.GOOGLE_SEARCH; // NetworkTargetv200906 networkTarget2 = new NetworkTargetv200906(); // networkTarget2.networkCoverageTypeSpecified = true; // networkTarget2.networkCoverageType = NetworkCoverageTypev200906.SEARCH_NETWORK; // NetworkTargetList networkTargetList = new NetworkTargetList(); // networkTargetList.targets = new NetworkTargetv200906[] { networkTarget1, networkTarget2 }; // networkTargetList.campaignId = campaignId; // networkTargetList.campaignIdSpecified = true; // TargetList[] targets = // new TargetList[] { languageTargetList, geoTargetList, networkTargetList }; // ArrayList campaignTargetOperations = new ArrayList(); // foreach (TargetList target in targets) // { // CampaignTargetOperation ops = new CampaignTargetOperation(); // ops.operatorSpecified = true; // ops.@operator = CampaignTargetOperatorv200906.SET; // ops.operand = target; // campaignTargetOperations.Add(ops); // } // try // { // service.mutate((CampaignTargetOperation[]) // campaignTargetOperations.ToArray(typeof(CampaignTargetOperation))); // Console.WriteLine("Geo, language, and network targeting were " + // "successfully added to campaign id = \"{0}\".", campaignId); // } // catch (Exception ex) // { // Console.WriteLine("Failed to create campaign targeting. " + // "Exception says \"{0}\"", ex.Message); // } // #endregion // #region Create your Services // //create your services // List<SeedKeyword> keywords = new List<SeedKeyword>(); // AdService adService = (AdService)user.GetService(ApiServices.v200906.AdGroupAdService); // KeywordToolService keywordToolService = (KeywordToolService)user.GetService(ApiServices.v13.KeywordToolService); // AdGroupService adgroupService = (AdGroupService)user.GetService(ApiServices.v200906.AdGroupService); // TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService(ApiServices.v13.TrafficEstimatorService); // #endregion // #region Enumerate thru all the categories // //enumerate thru all the categories // foreach (SiteCategory siteCategory in DataRepository.SiteCategoryProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId)) // { // int GroupAdCount = 0; // DataRepository.SiteCategoryProvider.DeepLoad(siteCategory, true, DeepLoadType.IncludeChildren, typeof(TList<SiteCategoryCategoryMapping>)); // //////Create an ad group by site category // ////AdGroup newAdGroup = new AdGroup(); // ////newAdGroup.name = siteCategory.SiteCategory; // ////newAdGroup.keywordMaxCpc = KeywordMaxCpc; // ////newAdGroup.keywordMaxCpcSpecified = true; // ////// Associate this ad group with the newly created campaign. Send // ////// the request to add the new ad group. // ////AdGroup myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup); // ////long adGroupId = myAdGroup.id; // #region Enumerate thru the category mappings to get the merchants // //enumerate thru the categoru mappings to get the merchants // foreach (SiteCategoryCategoryMapping catMap in siteCategory.SiteCategoryCategoryMappingCollection) // { // if (GroupAdCount >= MaxAdGroups) // break; // DataRepository.SiteCategoryCategoryMappingProvider.DeepLoad(catMap, true, DeepLoadType.IncludeChildren, typeof(Category)); // DataRepository.CategoryProvider.DeepLoad(catMap.CategoryRefIdSource, true, DeepLoadType.IncludeChildren, typeof(TList<Merchant>)); // catMap.CategoryRefIdSource.MerchantCollection.Shuffle(); // foreach (Merchant merch in catMap.CategoryRefIdSource.MerchantCollection) // { // if (GroupAdCount >= MaxAdGroups) // break; // DataRepository.MerchantProvider.DeepLoad(merch, true, DeepLoadType.IncludeChildren, typeof(TList<Product>)); // //shuffle the products // merch.ProductCollection.Shuffle(); // // enumerate thru all the merchant's products // foreach (Product prod in merch.ProductCollection) // { // //Create an ad group by site category // AdGroup newAdGroup = new AdGroup(); // newAdGroup.name = siteCategory.Name + "-" + prod.Name; // newAdGroup.keywordMaxCpc = KeywordMaxCpc; // newAdGroup.keywordMaxCpcSpecified = true; // Trace.TraceInformation(prod.Name); // string cleanProdName = StringUtils.ScrubProdName(StringUtils.RemoveDuplicateWords(prod.Name)); // string urlProdName = StringUtils.ScrubProdNameUrl(cleanProdName) + ".aspx"; // int c = 0; // keywords.Clear(); // string[] rawKeywords = new string[] { "" }; // //check to see if the product record has keywords // //if (prod.Keywords != null) // // rawKeywords = prod.Keywords.Split(','); // //if (rawKeywords.Length < 2) // rawKeywords = cleanProdName.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); // foreach (string str in rawKeywords) // { // int tryInt = 0; //not empty, not a number, and not lower case // if (str.Trim() != "" && !int.TryParse(str.Trim(), out tryInt)) //&& !isLowerCase(str.Trim().Substring(0, 1).ToCharArray()[0]) // { // SeedKeyword sw = new SeedKeyword(); // sw.text = StringUtils.ScrubKeywords(str); // if (sw.text.Trim() != "") // { // sw.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // sw.negative = false; // keywords.Add(sw); // c++; // if (c == 10) //TODO: fix this to get all words // break; // } // } // } // //Create an add for each product // // // // IMPORTANT: create an ad before adding keywords! Else the // // minCpc will have a higher value. // TextAd newTextAd = new TextAd(); // newTextAd.headline = prod.Name; // while (newTextAd.headline.Length > 25) // { // newTextAd.headline = newTextAd.headline.Substring(0, newTextAd.headline.LastIndexOf(" ")).Substring(0, newTextAd.headline.Substring(0, newTextAd.headline.LastIndexOf(" ")).LastIndexOf(" ")); // } // if (prod.Description.Length > 35) // { // string[] words = prod.Description.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); // //descriptions are limited to 35 chars // foreach (string wrd in words) // { // string word = StringUtils.ScrubKeywords(wrd); // if (word.Trim() != "") // { // if (newTextAd.description1 == null || (newTextAd.description1.Length + word.Length) < 35) // newTextAd.description1 += word + " "; // else if (newTextAd.description2 == null || (newTextAd.description2.Length + word.Length) < 35) // { // newTextAd.description1 = newTextAd.description1.PadRight(35); // newTextAd.description2 += word + " "; // } // else // { // newTextAd.description2 = newTextAd.description2.PadRight(35); // break; // } // } // } // if (newTextAd.description2 == null || (newTextAd.description2.Length + string.Format("{0:c}", prod.Price).Length) < 35) // newTextAd.description2 += string.Format("{0:c}", prod.Price); // } // else // { // newTextAd.description1 = prod.Description; // newTextAd.description2 = string.Format("{0:c}", prod.Price); // } // newTextAd.displayUrl = DisplayUrl; // newTextAd.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // //newTextAd.adGroupId = adGroupId; // //don't add it yet, there is a check below to see if it meets criteria // SeedKeyword[] keywordsArray = new SeedKeyword[] { new SeedKeyword() }; // keywordsArray = keywords.ToArray(); // //add variations if requested // if (GetKeywordsFromLandingPage) // { // SiteKeywordGroups siteKeywordGroups = keywordToolService.getKeywordsFromSite(newTextAd.destinationUrl, false, Languages, Countries); // int maxVariations = 0; // bool AdAdded = false; // // Associate this ad group with the newly created campaign. Send // // the request to add the new ad group. // AdGroup myAdGroup; //= adgroupService.addAdGroup(campaignId, newAdGroup); // long adGroupId = 0; //= myAdGroup.id; // if (siteKeywordGroups.keywords != null) // { // foreach (SiteKeyword sitekeyword in siteKeywordGroups.keywords) // { // //Trace.TraceInformation("Checking Site Keyword " + maxVariations + ":" + sitekeyword.text); // // check for low compitition and high search volumes // if (sitekeyword.advertiserCompetitionScale <= MaxAdvertiserCompetitionScale && sitekeyword.lastMonthSearchVolume >= MinSearchVolumeScale) // { // // Add keywords to the newly created ad group. // //add keywords and url to dbs // AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = sitekeyword.text; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService); // // check for low compitition and high search volumes // #region Create Ad & Keywords from the Product Name // if (!AdAdded) // { // // Associate this ad group with the newly created campaign. Send // // the request to add the new ad group. // myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup); // adGroupId = myAdGroup.id; // newTextAd.adGroupId = adGroupId; // // create the new add // try // { // //we found a keyword that meets criteria so ad the new Ad. // Ad[] myAds = adService.addAds(new Ad[] { newTextAd }); // GroupAdCount++; // Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // AdAdded = true; // } // catch // { // //do nothing // Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // } // //Add the Product name as a whole phrase // try // { // //add keywords and url to dbs // kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = cleanProdName; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = cleanProdName; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName); // } // //Add the individual product name keywords // foreach (SeedKeyword sk in keywordsArray) // { // try // { // //add keywords and url to dbs // kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = sk.text; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // // Add keywords to the newly created ad group. // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = sk.text; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + sk.text); // } // } // } // #endregion // #region Create keywords from the keyword suggestion gotten from the landing page // try // { // Keyword newKeyword = new Keyword(); // newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = sitekeyword.text; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + sitekeyword.text); // } // #endregion // } // maxVariations++; // if (maxVariations > MaxVariations) // break; // } // } // //check add variations for product name raw keywords // try // { // KeywordVariations keywordVariations = keywordToolService.getKeywordVariations(keywordsArray, true, Languages, Countries); // foreach (KeywordVariation keywordVariation in keywordVariations.moreSpecific) // { // if (Languages[0].ToString() == keywordVariation.language && keywordVariation.advertiserCompetitionScale <= MaxAdvertiserCompetitionScale && keywordVariation.lastMonthSearchVolume >= MinSearchVolumeScale) // { // // Add keywords to the newly created ad group. // //add keywords and url to dbs // AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = keywordVariation.text; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService); // // check for low compitition and high search volumes // #region Create Ad & Keywords from the Product Name // if (!AdAdded) // { // // Associate this ad group with the newly created campaign. Send // // the request to add the new ad group. // myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup); // adGroupId = myAdGroup.id; // newTextAd.adGroupId = adGroupId; // // create the new add // try // { // //we found a keyword that meets criteria so ad the new Ad. // Ad[] myAds = adService.addAds(new Ad[] { newTextAd }); // GroupAdCount++; // Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // AdAdded = true; // } // catch // { // //do nothing // Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // } // //Add the Product name as a whole phrase // try // { // //add keywords and url to dbs // kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = cleanProdName; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = cleanProdName; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch (Exception ex) // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message); // } // //Add the individual product name keywords // foreach (SeedKeyword sk in keywordsArray) // { // try // { // //add keywords and url to dbs // kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = sk.text; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // // Add keywords to the newly created ad group. // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = sk.text; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch (Exception ex) // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message); // } // } // } // #endregion // #region Create keywords from the keyword suggestion gotten from the landing page // try // { // Keyword newKeyword = new Keyword(); // newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = keywordVariation.text; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch (Exception ex) // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName + ex.Message); // } // #endregion // } // } // } // catch // {//this call fails quite a bit so we need the try catch // } // } // else // { // #region Create Keywords from the Product Name Only // // create the ad // // Associate this ad group with the newly created campaign. Send // // the request to add the new ad group. // AdGroup myAdGroup = adgroupService.addAdGroup(campaignId, newAdGroup); // long adGroupId = myAdGroup.id; // newTextAd.adGroupId = adGroupId; // try // { // //we found a keyword that meets criteria so ad the new Ad. // Ad[] myAds = adService.addAds(new Ad[] { newTextAd }); // GroupAdCount++; // Trace.TraceInformation("Text ad" + GroupAdCount + ": " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // //Trace.TraceInformation("Text ad: " + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // } // catch // { // //do nothing // Trace.TraceError("***Text ad Failed:" + newTextAd.headline + " Text Line1:" + newTextAd.description1 + " Text Line2:" + newTextAd.description2); // } // //Add the Product name as a whole phrase // CriterionService criterionService = (CriterionService)user.GetService(ApiServices.v200906.CampaignCriterionService); // //add keywords and url to dbs // AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = cleanProdName; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // try // { // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = cleanProdName; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + cleanProdName); // } // //Add the individual product name keywords // foreach (SeedKeyword sk in keywordsArray) // { // //add keywords and url to dbs // kws = new AffiliTrac.Entities.Keywords(); // kws.KeywordRefId = Guid.NewGuid(); // kws.Keywords = sk.text; // kws.Url = newTextAd.destinationUrl; // kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; // DataRepository.KeywordsProvider.Insert(kws); // try // { // // Add keywords to the newly created ad group. // Keyword newKeyword = new Keyword(); // newKeyword.adGroupId = adGroupId; // newKeyword.type = (KeywordType)Enum.ToObject(typeof(KeywordType), AdKeywordType); // newKeyword.text = sk.text; // //TODO: Use the Traffic Estimator to determine the // // the maxCpc to use // newKeyword.maxCpc = KeywordMaxCpc; // newKeyword.maxCpcSpecified = true; // newKeyword.criterionType = CriterionType.Keyword; // newKeyword.destinationUrl = destinationUrlPrefix + siteCategory.PageUrl.Substring(2, siteCategory.PageUrl.IndexOf(".") - 2) + "__" + urlProdName; // Criterion[] newCriteria = new Criterion[] { newKeyword }; // newCriteria[0].destinationUrl = newKeyword.destinationUrl; // criterionService.addCriteria(newCriteria); // } // catch // { // //do nothing // Trace.TraceError("***Add Criteria Failed: Keyword" + sk.text); // } // } // #endregion // } // if (GroupAdCount >= MaxAdGroups) // break; // } // } // } // #endregion // } // #endregion // #region Log everything created // AdGroup[] adGroups = adgroupService.getAllAdGroups(campaignId); // foreach (AdGroup adGroup in adGroups) // { // Trace.TraceInformation("Ad group: " + adGroup.name); // Ad[] ads = adService.getAllAds(new long[] { adGroup.id }); // foreach (Ad ad in ads) // { // if (ad is TextAd) // { // TextAd textAd = (TextAd)ad; // Trace.TraceInformation("Text ad: " + textAd.headline + " Text Line1:" + textAd.description1 + " Text Line2:" + textAd.description2); // } // } // } // #endregion // } // catch (Exception ex) // { // throw ex; // } //} /// <summary> /// CreateKeywordsByAffiliateSiteRefId /// </summary> /// <param name="CheckAgainstAdwordsAPI"></param> /// <param name="UseSandbox"></param> /// <param name="AffiliateSiteRefId"></param> /// <param name="destinationUrlPrefix"></param> /// <param name="MaxAdvertiserCompetitionScale"></param> /// <param name="MinSearchVolumeScale"></param> /// <param name="MaxEstimateCpc"></param> /// <param name="MinEstimateCpc"></param> /// <param name="MaxEstimateClicksPerDay"></param> /// <param name="MinEstimateClicksPerDay"></param> /// <param name="getVariations"></param> /// <param name="getSiteKeywords"></param> /// <param name="Languages"></param> /// <param name="Countries"></param> public VList<SiteCategoryKeywords> CreateKeywordsByAffiliateSiteRefId(bool CheckAgainstAdwordsAPI, bool UseSandbox, Guid AffiliateSiteRefId, bool getVariations, bool getSiteKeywords, int maxKeywordsPerEstimate, String[] Languages, String[] Countries, decimal maxApiUsageDollars) { // Create a user (reads headers from App.config file). AdWordsUser user = new AdWordsUser(); VList<SiteCategoryKeywords> reserachList = new VList<SiteCategoryKeywords>(); //get seo parameters SeoParameters seop = DataRepository.SeoParametersProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId)[0]; if (CheckAgainstAdwordsAPI) { if (UseSandbox) user.UseSandbox(); // use sandbox AccountService accountService = (AccountService)user.GetService(ApiServices.v13.AccountService); string[] accounts = accountService.getClientAccounts(); } try { #region Create your Services //create your services List<KeywordRequest> keywords = new List<KeywordRequest>(); //List<SeedKeyword> keywordsForVariation = new List<SeedKeyword>(); TrafficEstimatorService trafficEstimatorService = (TrafficEstimatorService)user.GetService(ApiServices.v13.TrafficEstimatorService); AdGroupAdServicev200906 adService = (AdGroupAdServicev200906)user.GetService(ApiServices.v200906.AdGroupAdService); KeywordToolService keywordToolService = (KeywordToolService)user.GetService(ApiServices.v13.KeywordToolService); AdGroupServicev200906 adgroupService = (AdGroupServicev200906)user.GetService(ApiServices.v200906.AdGroupService); #endregion #region Enumerate thru all the categories bool SiteCategoryKeywordMaxCntReached = false; int SiteCategoryKeywordMaxCnt = 0; int SiteCategoryAdMaxCnt = 0; int SiteCategoryKeywordCnt = 0; // calculate max values by budget CalculateKeywordCountsPerSiteCategoryByApiBudget(out SiteCategoryKeywordMaxCnt, out SiteCategoryAdMaxCnt); //enumerate thru all the categories foreach (SiteCategory siteCategory in DataRepository.SiteCategoryProvider.GetByAffiliateSiteRefId(AffiliateSiteRefId)) { if (SiteCategoryKeywordMaxCntReached) { SiteCategoryKeywordMaxCntReached = false; SiteCategoryKeywordCnt = 0; } DataRepository.SiteCategoryProvider.DeepLoad(siteCategory, true, DeepLoadType.IncludeChildren, typeof(TList<SiteCategoryCategoryMapping>)); #region Enumerate thru the category mappings to get the merchants //enumerate thru the categoru mappings to get the merchants foreach (SiteCategoryCategoryMapping catMap in siteCategory.SiteCategoryCategoryMappingCollection) { if (SiteCategoryKeywordMaxCntReached) break; DataRepository.SiteCategoryCategoryMappingProvider.DeepLoad(catMap, true, DeepLoadType.IncludeChildren, typeof(Category)); DataRepository.CategoryProvider.DeepLoad(catMap.CategoryRefIdSource, true, DeepLoadType.IncludeChildren, typeof(TList<Merchant>)); catMap.CategoryRefIdSource.MerchantCollection.Shuffle(); foreach (Merchant merch in catMap.CategoryRefIdSource.MerchantCollection) { if (SiteCategoryKeywordMaxCntReached) break; DataRepository.MerchantProvider.DeepLoad(merch, true, DeepLoadType.IncludeChildren, typeof(TList<Product>)); //shuffle the products merch.ProductCollection.Shuffle(); // enumerate thru all the merchant's products foreach (Product prod in merch.ProductCollection) { if (SiteCategoryKeywordMaxCntReached) break; Trace.TraceInformation(prod.Name); //scrub the product name to extract the keywords string cleanProdKeywords = StringUtils.ScrubProdName(StringUtils.RemoveDuplicateWords(prod.Name)); string urlProdRefId = siteCategory.ProductUrlPrefix + prod.ProductRefId.ToString(); keywords.Clear(); //create an array of keywords string[] rawKeywords = new string[] { "" }; //seperate into individual keywords rawKeywords = cleanProdKeywords.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); List<string> cleanKeyword = new List<string>(); foreach (string str in rawKeywords) { int tryInt = 0; //not empty, not a number, and not lower case if (str.Length > 2 && str.Trim() != "" && !int.TryParse(str.Trim(), out tryInt)) //&& !isLowerCase(str.Trim().Substring(0, 1).ToCharArray()[0]) { cleanKeyword.Add(StringUtils.ScrubKeywords(str)); } } //seperate into keywords phrases //TODO: KeywordPhraseWordCount use this config for (int i = 0; i < rawKeywords.Length - 1; i++) { int tryInt = 0; //not empty, not a number, and not lower case if (rawKeywords[i].Length > 2 && rawKeywords[i].Trim() != "" && !int.TryParse(rawKeywords[i].Trim(), out tryInt) && rawKeywords[i + 1].Length > 2 && rawKeywords[i + 1].Trim() != "" && !int.TryParse(rawKeywords[i + 1].Trim(), out tryInt)) { cleanKeyword.Add(StringUtils.ScrubKeywords(rawKeywords[i] + " " + StringUtils.ScrubKeywords(rawKeywords[i + 1]))); } } //also add a key word for the entire product name cleanKeyword.Add(prod.Name); foreach (string keyword in cleanKeyword) { if (DataRepository.KeywordsProvider.GetByUrlKeywords(urlProdRefId, keyword) == null) { //add keywords and url to dbs AffiliTrac.Entities.Keywords kws = new AffiliTrac.Entities.Keywords(); kws.KeywordRefId = Guid.NewGuid(); kws.Keywords = keyword; kws.Url = urlProdRefId; kws.ProductRefId = prod.ProductRefId; kws.SiteCategoryRefId = siteCategory.SiteCategoryRefId; DataRepository.KeywordsProvider.Insert(kws); SiteCategoryKeywordCnt += 1; if (SiteCategoryKeywordCnt >= SiteCategoryKeywordMaxCnt) { SiteCategoryKeywordMaxCntReached = true; break; } } } } } } #endregion } #endregion #region Check Traffic Estimates for Keywords if (CheckAgainstAdwordsAPI) { try { int apiUnitUsage = 0; reserachList = DataRepository.SiteCategoryKeywordsProvider.GetDistinct(AffiliateSiteRefId); foreach (SiteCategoryKeywords kw in reserachList) { //TODO: check usage //if (apiUsage >= maxApiUsage) // break; KeywordRequest sw = new KeywordRequest(); sw.text = kw.Keywords; sw.type = kw.Keywords.IndexOf(' ') > 0 ? KeywordType.Phrase : KeywordType.Broad; //check to see if it's a phrase sw.maxCpc = seop.MaxEstimateCpc; sw.maxCpcSpecified = true; sw.typeSpecified = true; keywords.Add(sw); #region Add Aditional Search types //sw = new KeywordRequest(); //sw.text = StringUtils.ScrubKeywords(str); //if (sw.text.Length > 2 && sw.text.Trim() != "") //{ // sw.type = KeywordType.Exact; // sw.maxCpc = 1000000; // sw.maxCpcSpecified = true; // sw.typeSpecified = true; // keywords.Add(sw); //} //sw = new KeywordRequest(); //sw.text = StringUtils.ScrubKeywords(str); //if (sw.text.Length > 2 && sw.text.Trim() != "") //{ // sw.type = KeywordType.Phrase; // sw.maxCpc = 1000000; // sw.maxCpcSpecified = true; // sw.typeSpecified = true; // keywords.Add(sw); //} #endregion } // check traffic estimates 100 at a time for (int i = 0; i < keywords.Count; i += maxKeywordsPerEstimate) { if (i >= keywords.Count) break; KeywordRequest[] keywordsRequestArray = new KeywordRequest[] { new KeywordRequest() }; keywordsRequestArray = keywords.GetRange(i, keywords.Count - i >= maxKeywordsPerEstimate ? maxKeywordsPerEstimate : keywords.Count - i).ToArray(); KeywordEstimate[] KeywordEstimates = null; try { KeywordEstimates = trafficEstimatorService.estimateKeywordList(keywordsRequestArray); foreach (KeywordRequest kr in keywordsRequestArray) { Trace.TraceInformation("Accepted keyword :" + kr.text); } //apiUsage += DataRepository.PpcApiRequestTypesProvider.GetByName("").ApiUnitCostPerItem; //((decimal)keywordsRequestArray.Length * (decimal).20); //Trace.TraceInformation("API Usage :" + apiUsage.ToString("{0:c}")); } catch (Exception ex) { //do nothing Trace.TraceError("***Get Keyword Traffic Estimates Failed: " + ex.Message); foreach (KeywordRequest kr in keywordsRequestArray) { Trace.TraceInformation("Possible bad keyword :" + kr.text); } // TODO: now go thru and do them individually continue; } if (KeywordEstimates.Length > 0) { int c = 0; foreach (KeywordEstimate keywordEstimate in KeywordEstimates) { //Trace.TraceInformation("Checking Site Keyword " + maxVariations + ":" + sitekeyword.text); // check for low compitition and high search volumes if (UseSandbox || (keywordEstimate.lowerClicksPerDay >= seop.MinEstimateClicksPerDay && keywordEstimate.lowerCpc <= seop.MaxEstimateCpc)) { // mark MeetsSeoParm on all keyword records with this keyword TList<Keywords> updateList = DataRepository.KeywordsProvider.GetByKeywords(keywordsRequestArray[c].text); foreach (Keywords ukw in updateList) { ukw.MeetsSeoCriteria = true; } DataRepository.KeywordsProvider.Update(updateList); } c++; } } } } catch (Exception ex) { //do nothing Trace.TraceError("***Get Keyword Traffic Estimates Failed: " + ex.Message); } } #endregion //go get the updated list again reserachList = DataRepository.SiteCategoryKeywordsProvider.GetDistinct(AffiliateSiteRefId); return reserachList; } catch (Exception ex) { Trace.TraceError("Error:" + ex.Message); throw ex; } }