Esempio n. 1
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}"));
            }
        }