public async Task <bool> CheckIfThereAreWorkingAdsetsAsync(string c, string cname) { var request = new RestRequest($"{c}/adsets", Method.GET); request.AddQueryParameter("date_preset", "today"); request.AddQueryParameter("fields", "ads{status},status,name"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); if (json["data"].Count() == 0) { Logger.Log($"В кампании {cname} нет адсетов!"); return(false); } if (json["data"].All(adset => adset["ads"] == null)) { Logger.Log($"В кампании {cname} нет объявлений!"); return(false); } if (json["data"].All(adset => adset["status"].ToString() == "PAUSED")) { Logger.Log($"В кампании {cname} нет работающих адсетов, все остановлены!"); return(false); } if (json["data"].All(adset => adset["ads"]["data"].All(ads => ads["status"].ToString() == "PAUSED"))) { Logger.Log($"В кампании {cname} нет работающих объявлений, все остановлены!"); return(false); } return(true); }
public async Task <string> GetCampaignNameAsync(string c) { var request = new RestRequest(c, Method.GET); request.AddQueryParameter("fields", "name"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); return(json["name"].ToString()); }
public async Task <JObject> GetAccountCreativesAsync(string accId) { var request = new RestRequest($"act_{accId}/adcreatives", Method.GET); request.AddQueryParameter("fields", "object_story_spec,object_story_id"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); return(json); }
public async Task <string> GetAdAccountsBusinessManagerAsync(string acc) { var req = new RestRequest($"act_{acc}", Method.GET); req.AddQueryParameter("fields", "business"); var respJson = await _re.ExecuteRequestAsync(req); ErrorChecker.HasErrorsInResponse(respJson, true); return(respJson["business"]["id"].ToString()); }
public async Task <JObject> GetCampaignInsights(string c) { var request = new RestRequest($"{c}/insights", Method.GET); request.AddQueryParameter("date_preset", "today"); request.AddQueryParameter("fields", "impressions,account_name,campaign_name"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); return(json); }
public async Task <List <JToken> > GetAllCampaignAdsAsync(string c) { //Проверяем все объявления кампании var request = new RestRequest($"{c}/ads", Method.GET); request.AddQueryParameter("fields", "account_id,creative{effective_object_story_id},campaign{name},effective_status,issues_info,status"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); return(json["data"].ToList()); }
public async Task <bool> CheckIfAccountIsBanned(string adAccount) { var request = new RestRequest($"act_{adAccount}", Method.GET); request.AddQueryParameter("fields", "account_status"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); if (json["account_status"].ToString() == "2") //Аккаунт забанен! { return(true); } return(false); }
public async Task <bool> CheckIfPageIsBannedAsync(string pageName) { var request = new RestRequest($"me/accounts", Method.GET); request.AddQueryParameter("type", "page"); request.AddQueryParameter("fields", "name,is_published,access_token"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); bool result = false; foreach (var p in json["data"]) { //Если мониторим, то проверяем, опубликована или нет if (pageName != p["id"].ToString() && pageName != p["name"].ToString()) { continue; } if (bool.Parse(p["is_published"].ToString())) { Logger.Log($"Страница {p["name"]} не снята с публикации, ол гут!"); continue; } //Страница не опубликована! Пытаемся опубликовать request = new RestRequest(p["id"].ToString(), Method.POST); request.AddParameter("access_token", p["access_token"].ToString()); request.AddParameter("is_published", "true"); var publishJson = await _re.ExecuteRequestAsync(request, false); if (ErrorChecker.HasErrorsInResponse(publishJson)) { //невозможно опубликовать страницу, вероятно, она забанена! var pageMsg = $"Страница {p["name"]} не опубликована и, вероятно, забанена!"; Logger.Log(pageMsg); result = true; } else { //уведомим пользователя, что мы опубликовали страницу после снятия с публикации var pageMsg = $"Страница {p["name"]} была заново опубликована после снятия с публикации!"; Logger.Log(pageMsg); } } return(result); }
public async Task <HashSet <string> > GetRunningCampaignsAsync(string adAccount) { //Ищем все работающие кампании var campaignsToMonitor = new HashSet <string>(); var request = new RestRequest($"act_{adAccount}/campaigns", Method.GET); request.AddQueryParameter("date_preset", "today"); request.AddQueryParameter("fields", "name"); request.AddQueryParameter("effective_status", "['ACTIVE']"); var json = await _re.ExecuteRequestAsync(request); ErrorChecker.HasErrorsInResponse(json, true); foreach (var d in json["data"]) { Logger.Log($"В аккаунте {adAccount} найдена работающая кампания {d["name"]} c id {d["id"]}"); campaignsToMonitor.Add(d["id"].ToString()); } return(campaignsToMonitor); }
public async Task CheckAdsAsync() { var campaignImpressions = GetCampaignsImpressions(); var accountRecords = await File.ReadAllLinesAsync(Path.GetFullPath(@"../accounts.txt")); foreach (var record in accountRecords) { var ar = new AccountRecord(record); if (!ar.Comment.ToLowerInvariant().StartsWith("ywb")) { continue; } var re = new RequestExecutor( _apiAddress, ar.Token, ar.ProxyAddress, ar.ProxyPort, ar.ProxyLogin, ar.ProxyPassword); var ff = new FacebookFacade(re); Logger.Log($"Начинаем проверку записи {ar.Comment}."); var banned = await ff.CheckIfAccountIsBanned(ar.Account); if (banned) { var banMsg = $"{ar.Comment}: Аккаунт {ar.Account} забанен!"; Logger.Log(banMsg); await _mailer.SendEmailNotificationAsync(banMsg, "Subj!"); Logger.Log($"Проверка записи {ar.Comment} закончена."); continue; } var campaignsToMonitor = await ff.GetRunningCampaignsAsync(ar.Account); if (campaignsToMonitor.Count == 0) { Logger.Log("Не найдено работающих кампаний!"); } var mailMessage = new StringBuilder(); foreach (var c in campaignsToMonitor) { //Сначала получаем имя кампании string cname = await ff.GetCampaignNameAsync(c); Logger.Log($"Начинаем проверку кампании {cname} в аккаунте {ar.Account}..."); //Сначала чекаем, есть ли работающие адсеты в кампании! if (!await ff.CheckIfThereAreWorkingAdsetsAsync(c, cname)) { Logger.Log($"В кампании {cname} в аккаунте {ar.Account} нет работающих адсетов, пропускаем."); continue; } var json = await ff.GetCampaignInsights(c); //Нашли работающую кампанию, проверяем показы if (json["data"] == null || !json["data"].Any()) { Logger.Log($"!!!Похоже, что в кампании {cname} аккаунта {ar.Account} ещё не начался открут, хотя кампания активна!"); } else { var accName = json["data"][0]["account_name"].ToString(); var campaignName = json["data"][0]["campaign_name"].ToString(); var imp = int.Parse(json["data"][0]["impressions"].ToString()); //если уже получали кол-во показов у этой кампании if (campaignImpressions.ContainsKey(c)) { if (campaignImpressions[c] != imp) { campaignImpressions[c] = imp; Logger.Log($"Кампания {campaignName} крутит, всё с ней хорошо!"); } else { //ФРИЗ! Шлём уведомление об этом! var freezeMsg = $"Фриз кампании {campaignName} в аккаунте {accName}!"; mailMessage.AppendLine(freezeMsg); Logger.Log(freezeMsg); } } else { campaignImpressions.Add(c, imp); } } var ads = await ff.GetAllCampaignAdsAsync(c); var adCreatives = new HashSet <string>(); foreach (var ad in ads) { var creoId = ad["creative"]["id"].ToString(); if (!adCreatives.Contains(creoId)) { adCreatives.Add(creoId); } //Получили ID поста, теперь сохраним все данные по негативу var storyId = ad["creative"]["effective_object_story_id"].ToString(); var postFeedback = await ff.GetPostFeedbackAsync(storyId); if (postFeedback.ToString().Contains("does not exist")) { var msg = $"Крео {storyId} отлетело к праотцам! Перезаливай!"; Logger.Log(msg); mailMessage.AppendLine(msg); } else { ErrorChecker.HasErrorsInResponse(json, true); await File.WriteAllTextAsync($"{storyId}.json", json.ToString()); } var status = ad["effective_status"].ToString(); if (status == "DISAPPROVED") { mailMessage.AppendLine($"Объявление из кампании {ad["campaign"]["name"]} аккаунта {ad["account_id"]} перешло в статус DISAPPROVED"); //TODO:сделать перезалив и уведомление по мылу } else if (status == "WITH_ISSUES") { mailMessage.AppendLine($"Объявление из кампании {ad["campaign"]["name"]} аккаунта {ad["account_id"]} перешло в статус WITH_ISSUES: {ad["issues_info"]}"); } } Logger.Log($"Проверили все статусы объяв в кампании {cname}."); //Проверяем все креативы кампании, вычленяем из них ссылки и страницы json = await ff.GetAccountCreativesAsync(ar.Account); var activeCreatives = json["data"].Where(j => adCreatives.Contains(j["id"].ToString())).ToList(); var pages = new HashSet <string>(); var links = new HashSet <string>(); foreach (var adCr in activeCreatives) { var t = GetPageAndCreoLiks(adCr); if (!string.IsNullOrEmpty(t.pageId)) { pages.Add(t.pageId); } if (!string.IsNullOrEmpty(t.link)) { links.Add(t.link); } } foreach (var p in pages) { var pageIsBanned = await ff.CheckIfPageIsBannedAsync(p); if (pageIsBanned) { mailMessage.AppendLine($"Страница {p} в аккаунте {ar.Account} не опубликована и, вероятно, забанена!"); } } foreach (var l in links) { var linkIdBanned = await ff.CheckIfLinkIsBannedAsync(l); if (linkIdBanned) { mailMessage.AppendLine($"Ссылка {l} в аккаунте {ar.Account} забанена на FB!"); } } Logger.Log($"Закончили проверку кампании {cname} в аккаунте {ar.Account}."); } //Шлём одно письмо по всем фризам if (mailMessage.Length > 0) { mailMessage.Insert(0, $"При проверке записи {ar.Comment} возникли ошибки:"); await _mailer.SendEmailNotificationAsync( $"Обнаружены ошибки в акке {ar.Account}", mailMessage.ToString()); } Logger.Log($"Проверка записи {ar.Comment} закончена."); //Записываем все полученные кол-ва показов в "базу" await File.WriteAllLinesAsync(_ciFileName, campaignImpressions.Select(ci => $"{ci.Key}-{ci.Value}")); } }