///------------------------------------------------------------------------------------------------- /// <summary> Редактирует буллетин. </summary> /// /// <remarks> SV Milovanov, 30.01.2018. </remarks> ///------------------------------------------------------------------------------------------------- public override void EditBulletin(Bulletin bulletin) { _DCT.Execute(data => { WebWorker.Execute(() => { WebWorker.NavigatePage(Path.Combine(bulletin.Url, "edit")); var fieldSetter = FieldSetterContainerList.Get(Uid); fieldSetter.LoadFieldsFromGroup(bulletin.Signature); foreach (var pair in bulletin.Fields) { fieldSetter.SetField(pair.Key, pair.Value); } if (bulletin.State == "Активные") { //Продолжить с пакетом «Обычная продажа» var radioButton = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "pack1"); if (radioButton != null) { radioButton.InvokeMember("click"); } var buttons = WebWorker.WebDocument.GetElementsByTagName("button").Cast <HtmlElement>(); var pack = "Продолжить без пакета"; var button = buttons.FirstOrDefault(btn => btn.InnerText == pack); if (button != null) { button.InvokeMember("click"); } Thread.Sleep(1000); } else { var button = WebWorker.WebDocument.GetElementsByTagName("button").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("type") == "submit" && q.InnerText == "Продолжить"); if (button != null) { button.InvokeMember("click"); } Thread.Sleep(1000); } }); WebWorker.DownloadPage(Path.Combine(bulletin.Url, "edit", "confirm"), (doc) => { ////Снимаем галочки var servicePremium = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-premium"); if (servicePremium != null) { servicePremium.InvokeMember("click"); } var serviceVip = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-vip"); if (serviceVip != null) { serviceVip.InvokeMember("click"); } var serviceHighlight = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-highlight"); if (serviceHighlight != null) { serviceHighlight.InvokeMember("click"); } ////Подтверждаем var text = "Продолжить"; var buttonContinue = WebWorker.WebDocument.GetElementsByTagName("button").Cast <HtmlElement>().FirstOrDefault(btn => btn.InnerText == text); if (buttonContinue != null) { buttonContinue.InvokeMember("click"); } Thread.Sleep(1000); }); }); }
///------------------------------------------------------------------------------------------------- /// <summary> Gets the bulletins. </summary> /// /// <remarks> SV Milovanov, 30.01.2018. </remarks> ///------------------------------------------------------------------------------------------------- public override void GetBulletins() { _DCT.Execute(data => { Exit(); Auth(); var bulletins = new List <Bulletin>(); var tabStates = new List <TabState>(); WebWorker.Execute(() => { WebWorker.NavigatePage(ProfileUrl); var tabs = WebWorker.WebDocument.GetElementsByTagName("li").Cast <HtmlElement>() .Where(q => q.GetAttribute("className").Contains("tabs-item")).ToArray(); tabStates.Add(new TabState { Title = "Активные", Href = ProfileUrl, }); foreach (var tab in tabs) { if (!tab.CanHaveChildren) { continue; } foreach (HtmlElement ch in tab.Children) { if (ch.TagName.ToLower() == "a") { var tabUrl = ch.GetAttribute("href"); var tabState = ch.InnerText; tabStates.Add(new TabState { Title = tabState, Href = tabUrl, }); } } } }); WebWorker.Execute(() => { foreach (var tabState in tabStates) { WebWorker.NavigatePage(tabState.Href); var nextPages = new List <string>(); nextPages.Add(tabState.Href); var hasNextPage = true; do { var result = GetBulletinPages(tabState.Title); bulletins.AddRange(result); var nextPage = WebWorker.WebDocument.GetElementsByTagName("a").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("className").Contains("js-pagination-next")); if (nextPage == null) { hasNextPage = false; } else { var nextPageHref = nextPage.GetAttribute("href"); nextPages.Add(nextPageHref); hasNextPage = true; nextPage.InvokeMember("click"); Thread.Sleep(1000); } } while (hasNextPage); } bulletins = bulletins; }); WebWorker.Execute(() => { var groupContainer = GroupContainerList.Get(null); foreach (var bulletin in bulletins) { var url = Path.Combine(bulletin.Url, "edit"); WebWorker.NavigatePage(url); Thread.Sleep(1500); var groupElement = WebWorker.WebDocument.GetElementsByTagName("div").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("className").Contains("form-category-path")); if (groupElement == null) { continue; } var categories = groupElement.InnerText.Split('/').Select(q => q.Trim()).ToArray(); bulletin.Signature = new GroupSignature(categories); var group = groupContainer.Get(bulletin.Signature.GetHash()); if (group == null) { continue; } var fieldSetter = FieldSetterContainerList.Get(Uid); fieldSetter.LoadFieldsFromGroup(bulletin.Signature); var dictionary = new Dictionary <string, string>(); foreach (var field in group.Fields) { var value = fieldSetter.GetField(field.Key); dictionary.Add(field.Key, value); } bulletin.Fields = dictionary; } }); WebWorker.Execute(() => { var groups = bulletins.Where(q => q.Fields != null && q.Fields.Count > 0).GroupBy(q => q.Signature.ToString()); foreach (var groupedBulletins in groups) { var xls = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), $"edit_bulletins[{groupedBulletins.Key}].xlsx")); if (xls.Exists) { xls.Delete(); } var firstBulletin = groupedBulletins.FirstOrDefault(); using (var package = new ExcelPackage(xls)) { var worksheet = package.Workbook.Worksheets.Add("Мои объявления"); var keys = firstBulletin.Fields.Keys; var count = 0; foreach (var k in keys) { var cell = worksheet.Cells[1, count + 1]; cell.Style.Font.Size = 14; cell.Value = k; cell.AutoFitColumns(); count++; } var row = 2; foreach (var bulletin in groupedBulletins) { var column = 0; foreach (var k in keys) { var cell = worksheet.Cells[row, column + 1]; var field = bulletin.Fields[k]; cell.Value = field; column++; } worksheet.Column(column + 1).Hidden = true; var urlCell = worksheet.Cells[row, column + 1]; urlCell.Value = bulletin.Url; worksheet.Column(column + 2).Hidden = true; var stateCell = worksheet.Cells[row, column + 2]; stateCell.Value = bulletin.State; row++; } package.Save(); } } }); }); }
///------------------------------------------------------------------------------------------------- /// <summary> Добавляем буллетин на борду. </summary> /// /// <remarks> SV Milovanov, 30.01.2018. </remarks> /// /// <param name="group"> Выбранная группа. </param> /// <param name="dictionary"> Словарь полей. </param> ///------------------------------------------------------------------------------------------------- public override void AddBulletin(Data.Group group, Dictionary <string, string> dictionary) { _DCT.Execute(data => { WebWorker.DownloadPage("https://www.avito.ru/additem", (doc) => { if (WebWorker.WebDocument != null) { //1 //Категория - Услуги if (!string.IsNullOrEmpty(group.Category1)) { var categoryRadio = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("type") == "radio" && q.GetAttribute("title") == group.Category1); if (categoryRadio == null) { return; } categoryRadio.InvokeMember("click"); Thread.Sleep(1000); } //2 //Услуги - Предложения услуг if (!string.IsNullOrEmpty(group.Category2)) { var serviceRadio = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("type") == "radio" && q.GetAttribute("title") == group.Category2); if (serviceRadio == null) { return; } serviceRadio.InvokeMember("click"); Thread.Sleep(1000); } //3 //Вид услуги - IT, интернет, телеком if (!string.IsNullOrEmpty(group.Category3)) { var serviceTypeRadio = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("type") == "radio" && q.GetAttribute("title") == group.Category3); if (serviceTypeRadio == null) { return; } serviceTypeRadio.InvokeMember("click"); Thread.Sleep(1000); } //4 //Тип услуги - Cоздание и продвижение сайтов if (!string.IsNullOrEmpty(group.Category4)) { var serviceTypeRadio2 = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("type") == "radio" && q.GetAttribute("title") == group.Category4); if (serviceTypeRadio2 == null) { return; } serviceTypeRadio2.InvokeMember("click"); Thread.Sleep(1000); } var fieldSetter = FieldSetterContainerList.Get(Uid); fieldSetter.LoadFieldsFromGroup(new GroupSignature(group.Category1)); var select = WebWorker.WebDocument.GetElementById("flt_param_2843"); if (select != null) { select.SetAttribute("value", "20122"); } foreach (var pair in dictionary) { fieldSetter.SetField(pair.Key, pair.Value); } //Продолжить с пакетом «Обычная продажа» var radioButton = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "pack1"); if (radioButton != null) { radioButton.InvokeMember("click"); } var buttons = WebWorker.WebDocument.GetElementsByTagName("button").Cast <HtmlElement>(); var pack = "Продолжить с пакетом «Обычная продажа»"; var button = buttons.FirstOrDefault(btn => btn.InnerText == pack); if (button != null) { button.InvokeMember("click"); } Thread.Sleep(1000); } }); WebWorker.DownloadPage("https://www.avito.ru/additem/confirm", (doc) => { ////Снимаем галочки var servicePremium = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-premium"); if (servicePremium != null) { servicePremium.InvokeMember("click"); } var serviceVip = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-vip"); if (serviceVip != null) { serviceVip.InvokeMember("click"); } var serviceHighlight = WebWorker.WebDocument.GetElementsByTagName("input").Cast <HtmlElement>() .FirstOrDefault(q => q.GetAttribute("id") == "service-highlight"); if (serviceHighlight != null) { serviceHighlight.InvokeMember("click"); } ////Подтверждаем var text = "Продолжить"; var buttonContinue = WebWorker.WebDocument.GetElementsByTagName("button").Cast <HtmlElement>().FirstOrDefault(btn => btn.InnerText == text); if (buttonContinue != null) { buttonContinue.InvokeMember("click"); } }); }, _DCTGroup.ContainerAvito); }