Пример #1
0
        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);
        }
Пример #2
0
        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());
        }
Пример #3
0
        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);
        }
Пример #4
0
        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());
        }
Пример #5
0
        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);
        }
Пример #6
0
        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());
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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}"));
            }
        }