/*Inica o processamento do robot*/ public static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento... " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { AllLinks = new List <string>(); Orgao = OrgaoController.FindById(27); Modalidades = new List <Modalidade>(); Lote = LoteController.CreateLote(43, 506); Repo = new LicitacaoRepository(); Modalidades.Add(ModalidadeController.FindById(24)); Modalidades.Add(ModalidadeController.FindById(22)); CurrentPage = 1; /*Pega o html da primeira página*/ HtmlDocument pagehtml = WebHandle.GetHtmlHandleCaptcha(Constants.CMG_SITE + Constants.CMG_LINK_PAGINATION, Encoding.GetEncoding("ISO-8859-1"), "textoConfirmacao", Constants.CMG_CAPTCHA, GetParametersPagination(string.Format(Constants.CMG_PARAMETERS_PAGINATION, CurrentPage, DateTime.Now.Year))); /*Numero de paginas encontradas*/ int numberPages = pagehtml.DocumentNode.Descendants("a").Where(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.Contains("tabConsultaPregoes_pagina")).ToList().Count; /*Caso existam poucas licitações, ao ponto de só haver uma página, o robô estava retornando numberPages = 0. Com a limitação abaixo, ele sempre vai pegar as licitações independente do pouco número de licitações*/ if (numberPages == 0) { numberPages = 1; } /*Percorre todas as paginas*/ while (pagehtml != null && CurrentPage <= numberPages) { /*Pega todas os pregões de cada página*/ GetPregoes(pagehtml); /*Numero da próxima pagina*/ CurrentPage++; /*Pega o html da próxima página*/ pagehtml = WebHandle.GetHtmlHandleCaptcha(Constants.CMG_SITE + Constants.CMG_LINK_PAGINATION, Encoding.GetEncoding("ISO-8859-1"), "textoConfirmacao", Constants.CMG_CAPTCHA, GetParametersPagination(string.Format(Constants.CMG_PARAMETERS_PAGINATION, CurrentPage, DateTime.Now.ToString("yyyy")))); NumCaptcha++; } if (Directory.Exists(PathEditais)) { Directory.Delete(PathEditais, true); } } catch (Exception e) { RService.Log("Exception (Init)" + Name + ":" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (NumLicitacoes <= 0) { LoteController.Delete(Lote); } } }
internal static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento.. at {0}", Path.GetTempPath() + Name + ".txt"); try { //Inicializa as listas e variáveis que serão usadas pelo robô CurrentPage = 1; Lote = LoteController.CreateLote(43, 1249); repo = new LicitacaoRepository(); Cidades = CidadeController.GetNameToCidade(Constants.TCMCE_UF); NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); HtmlDocument htmlDoc = WebHandle.GetHtmlDocOfPage(string.Format(Constants.TCMCE_PAGE, CurrentPage, DateTime.Today.ToString("dd-MM-yyyy"), DateTime.Today.AddYears(1).ToString("dd-MM-yyyy")), Encoding.GetEncoding("UTF-8")); //O GetLastPage pega o código Html e o vasculha para encontrar o valor da última página int lastPage = GetLastPage(htmlDoc); while (CurrentPage != lastPage) { RService.Log("(Init) " + Name + ": Percorrendo os links da página.. " + CurrentPage + " at {0}", Path.GetTempPath() + Name + ".txt"); HtmlNode licList = htmlDoc.DocumentNode.Descendants("table").SingleOrDefault(x => x.Id.Equals("table")); foreach (var lic in licList.Descendants("tr")) { if (!lic.InnerHtml.Contains("Licitação")) { HandleCreate(lic); } } CurrentPage++; htmlDoc = WebHandle.GetHtmlDocOfPage(string.Format(Constants.TCMCE_PAGE, CurrentPage, DateTime.Today.ToString("dd-MM-yyyy"), DateTime.Today.AddYears(1).ToString("dd-MM-yyyy")), Encoding.GetEncoding("ISO-8859-1")); } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void Init() { RService.Log(name + ": Começando o processamento... at {0}", logPath); try { //Inicializa as listas e variáveis que serão usadas pelo robô currentPage = 1; lote = LoteController.CreateLote(43, 1442); Cidades = CidadeController.GetNameToCidade(Constants.TCEPI_UF); NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); alreadyInserted = LicitacaoController.GetAlreadyInserted(1442, DateTime.Today.AddMonths(-3)); GetLicitacoes(); } catch (Exception e) { RService.Log("Exception (Init) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } }
private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento... " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { nameToModalidade = ModalidadeController.GetNameToModalidade(); nameToOrgao = OrgaoController.GetNomeUfToOrgao(); ufToCapital = CityUtil.GetUfToCapital(); ufToNomeCidadeToIdCidade = CidadeController.GetUfToNameCidadeToIdCidade(); lote = LoteController.CreateLote(43, 508); repo = new LicitacaoRepository(); HtmlDocument htmlDoc = WebHandle.GetHtmlDocOfPage(Constants.CN_COTACOES, Encoding.GetEncoding("ISO-8859-1")); RService.Log("(Init) " + Name + ": Percorrendo as cotações do dia " + DateTime.Today.ToShortDateString() + " at {0}", Path.GetTempPath() + Name + ".txt"); foreach (var row in htmlDoc.DocumentNode.Descendants("tr").Where(x => x.Attributes.Contains("class") && x.Attributes["class"].Value.Contains("estiloLinhaTabela")).ToList()) { if (row.ChildNodes[5].InnerText == "Sim") { icms = true; } else { icms = false; } HandleCreate(htmlDoc, row); } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
private static void Init() { RService.Log("(Init) " + name + ": Começando o processamento.. at {0}", logPath); try { Lote = LoteController.CreateLote(43, 1250); Cidades = CidadeController.GetNameToCidade(Constants.TCESE_UF); NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); for (int i = 0; i < Constants.TCESE_MUN_CODE.Count; i++) { HandleLicitacoes(i); } //repo = new LicitacaoRepository(); //repo.Insert(licitacoes); } catch (Exception e) { RService.Log("Exception (Init) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } }
private static Licitacao CreateLicitacao(HtmlDocument licPage, string link, string num, string situacao) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação " + num + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { licitacao.IdLicitacaoFonte = Convert.ToInt64(num); licitacao.IdFonte = 1249; licitacao.Estado = Constants.TCMCE_ESTADO; licitacao.EstadoFonte = Constants.TCMCE_UF; licitacao.LinkEdital = link; licitacao.LinkSite = Constants.TCMCE_HOST; licitacao.Lote = Lote; var licInfo = licPage.DocumentNode.ChildNodes[2].ChildNodes[5].ChildNodes[5].InnerHtml; string city = Regex.Replace(StringHandle.GetMatches(licInfo, @"h2>(.*)\|")[0].ToString(), @"h2>|\|", "").Trim(); string orgao = Regex.Replace(StringHandle.GetMatches(licInfo, @"\|(.*)<")[0].ToString(), @"(\|)|<", "").Trim(); string numero = Regex.Replace(StringHandle.GetMatches(licInfo, @"h1>(.*)</h1")[0].ToString(), @"h1>Licitação:|</h1", "").Trim(); string obj = Regex.Replace(StringHandle.GetMatches(licInfo, @"Objeto:( *)<b>(.|\n)*?</b>")[0].ToString(), @"Objeto:|<b>|</b>", "").Trim(); string modal = Regex.Replace(StringHandle.GetMatches(licInfo, @"Modalidade:( *)<b>(.*)</b>")[0].ToString(), @"Modalidade:|<b>|</b>", "").Split('|')[0].Trim(); if (modal == "Concorrência Pública") { modal = "Concorrência"; } string dataAb = Regex.Replace(StringHandle.GetMatches(licInfo, @"Data( *)de( *)Abertura:( *)<b>(.*)</b>")[0].ToString(), @"Data( *)de( *)Abertura:|<b>|</b>", "").Split('|')[0].Trim(); string horaAb = Regex.Replace(StringHandle.GetMatches(licInfo, @"Hora( *)da( *)Abertura:( *)<b>(.*)</b>")[0].ToString(), @"Hora( *)da( *)Abertura:|<b>|</b>", "").Trim(); string endereco = Regex.Replace(StringHandle.GetMatches(licInfo, @"Local:( *)<b>(.*)</b>")[0].ToString(), @"Local:|<b>|</b>", "").Trim(); string processo = Regex.Replace(StringHandle.GetMatches(licInfo, @"Administrativo:( *)<b>(.*)<")[0].ToString(), @"Administrativo:|<b>|<", "").Trim(); string dpto = ""; if (Regex.IsMatch(licInfo, @"Órgãos</b>", RegexOptions.IgnoreCase)) { dpto = Regex.Replace(StringHandle.GetMatches(licInfo, @"Órgãos</b>(.|\n)*?</li")[0].ToString(), @"Órgãos|</b>|<ul>|<li>|</li", "").Trim(); } string obs = Regex.Replace(StringHandle.GetMatches(licInfo, @"Objeto/Lote/Item(.|\n)*?</b")[0].ToString(), @"Objeto/Lote/Item:|<b>|</b", "").Trim(); city = city.ToLower(); var textInfo = new CultureInfo("pt-BR").TextInfo; licitacao.Cidade = textInfo.ToTitleCase(city).ToString(); licitacao.CidadeFonte = Cidades.ContainsKey(licitacao.Cidade.ToUpper()) ? Cidades[licitacao.Cidade.ToUpper()] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); licitacao.Departamento = dpto; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(orgao + ":CE", NameToOrgao); if (licitacao.Orgao.Nome == "Prefeitura Municipal") { licitacao.Orgao.Nome = "Prefeitura Municipal de " + licitacao.Cidade; } licitacao.Num = numero; licitacao.Processo = processo; licitacao.AberturaData = DateHandle.Parse(dataAb + " " + horaAb, "dd/MM/yyyy hh:mm:ss"); licitacao.EntregaData = licitacao.AberturaData; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modal.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modal.ToUpper())] : null; licitacao.Situacao = situacao; licitacao.Objeto = obj; licitacao.Observacoes = obs; licitacao.Endereco = endereco; licitacao.DigitacaoUsuario = 43; //Id do Robô no sistema LM //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Inicia o processamento do robot*/ private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento.. " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { ModalidadeCount = 0; Modalidades = new List <Modalidade>(); Modalidades.Add(ModalidadeController.FindById(1)); Modalidades.Add(ModalidadeController.FindById(14)); Orgao = OrgaoController.FindById(388); Lote = LoteController.CreateLote(43, 507); /*Lista das licitacoes que já existem para bec.sp.gov*/ //AlreadyInserted = LicitacaoController.GetAlreadyInserted(Constants.BEC_SITE); /*Lista das cidades para o estado*/ Cidades = CidadeController.GetNameToCidade(Constants.BEC_UF); //Define os pontos de partida List <string> urls = new List <string>(); urls.Add(Constants.BEC_LINK_MODALIDADE_2); urls.Add(Constants.BEC_LINK_MODALIDADE_5); /*Percorre cada modalidade. Como o portal BEC usa javascript para gerar as licitações, foi preciso * criar dois caminhos, uma para cada modalidade: para Carta Convite, usa-se o HtmlAgilityPack e * para Dispensa de Licitação, usa-se o Selenium (PhantomJS), que consegue lidar com javascript*/ foreach (string uri in urls) { if (!uri.Contains("Dispensa")) { GetConvites(uri); } else { GetDispensas(uri); } } if (Directory.Exists(PathEdital)) { Directory.Delete(PathEdital, true); } } catch (Exception e) { RService.Log("Exception (Init)" + Name + ":" + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (NumLicitacoes <= 0) { LoteController.Delete(Lote); } if (web != null) { web.Close(); } } }
/*Criando a licitação com as informações da página*/ private static Licitacao CreateLicitacao(string numUf) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação... " + numUf.Split(':')[0] + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); try { if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); op.AddUserProfilePreference("download.default_directory", PathEditais); web = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); web.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); web.Navigate().GoToUrl(Constants.BB_HOST); web.Navigate().GoToUrl(string.Format(Constants.BB_LINK_LICITACAO, numUf.Split(':')[0])); Thread.Sleep(2000); HandleReCaptcha(); MatchCollection helper; licitacao.IdLicitacaoFonte = long.Parse(numUf.Split(':')[0]); licitacao.EstadoFonte = numUf.Split(':')[1]; licitacao.Lote = Lote; licitacao.LinkSite = Constants.BB_HOST; licitacao.LinkEdital = string.Format(Constants.BB_LINK_LICITACAO, numUf.Split(':')[0]); licitacao.IdFonte = IdFonte; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Estado = numUf.Split(':')[1]; IWebElement div = web.FindElement(By.Id("conteudo")); string innerHtml = Regex.Replace(HttpUtility.HtmlDecode(div.GetAttribute("innerHTML")).Trim(), @"\s+", " "); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Resumo da licit.*?\">(.*?)</div>"); licitacao.Objeto = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Edital.*?\">(.*?)</div>"); licitacao.Num = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Processo.*?\">(.*?)</div>"); licitacao.Processo = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Modalidade/tipo.*?\">(.*?)</div>"); string modalidade = StringHandle.RemoveAccent(innerHtml != null ? helper[0].Groups[1].Value.Trim() : "").ToUpper(); if (modalidade == "LRE") { modalidade = "Licitacao"; } licitacao.Modalidade = NameToModalidade.ContainsKey(modalidade.ToUpper()) ? NameToModalidade[modalidade.ToUpper()] : null; if (licitacao.Modalidade.Modalidades == "Pregão") { licitacao.Modalidade.Modalidades = "Pregão Eletrônico"; licitacao.Modalidade.Id = 24; } helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Situa.*?o da licita.*?o.*?\">(.*?)</div>"); licitacao.Situacao = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Abertura das propostas.*?\">(.*?)</div>"); licitacao.AberturaData = DateHandle.Parse(helper != null ? helper[0].Groups[1].Value.Trim() : null, "dd/MM/yyyy-hh:mm"); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Início acolhimento de propostas.*?\">(.*?)</div>"); licitacao.EntregaData = DateHandle.Parse(helper != null ? helper[0].Groups[1].Value.Trim() : null, "dd/MM/yyyy-hh:mm"); helper = StringHandle.GetMatches(innerHtml, "(?i)>\\s{0,1}Cliente.*?\">(.*?)</div>"); string orgaoDepartamento = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(orgaoDepartamento, "/(.*)"); licitacao.Departamento = helper != null ? helper[0].Groups[1].Value.Trim() : null; helper = StringHandle.GetMatches(orgaoDepartamento, "(.*?)/"); string orgao = helper != null ? helper[0].Groups[1].Value.Trim() : null; if (orgao != null) { licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(orgao.Trim().ToUpper() + ":" + numUf.Split(':')[1].Trim().ToUpper(), NameToOrgao); } else { licitacao.Orgao = OrgaoController.FindById(390);//NÃO ESPECIFICADO } HandleCidade(licitacao, orgao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (web != null) { web.Close(); } } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Metodo que inicia o processamento de dados*/ private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento... " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { Repo = new LicitacaoRepository(); /*Realiza a atualização das situações das licitações já inseridas*/ //UpdateLicitacoes(); /*Inicia listas e dictionary's com informações necessárias*/ NameToOrgao = OrgaoController.GetNomeUfToOrgao(); NameToModalidade = ModalidadeController.GetNameToModalidade(); UfToCapital = CityUtil.GetUfToCapital(); UfToNomeCidadeToIdCidade = CidadeController.GetUfToNameCidadeToIdCidade(); Lote = LoteController.CreateLote(43, IdFonte); TryReload = true; if (DoSearch()) { /*Percorre cada licitação encontrada*/ foreach (var numUf in numUFs) { /*Acessa a página da licitação*/ try { if (!LicitacaoController.Exists(numUf.Split(':')[0])) { /*Cria o objeto licitação com as informações da página*/ Licitacao licitacao = CreateLicitacao(numUf); if (licitacao != null) { Repo.Insert(licitacao); NumLicitacoes++; RService.Log("(Init) " + Name + ": Licitação inserida com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); /*Segmenta a licitação recém criada*/ //SegmentarLicitacao(licitacao); DownloadEdAndCreatLicArq(licitacao); } else { if (licitacao != null && licitacao.Orgao != null) { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " e órgão " + licitacao.Orgao.Nome + " - " + licitacao.Orgao.Estado + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + numUf.Split(':')[0] + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } catch (Exception e) { RService.Log("Exception (Init - CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } }
/*Cria uma nova licitacao e o lote se for necessário*/ public static bool CreateLicitacao() { try { string entidadeExecutora = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnmExecutor")).GetAttribute("value"); string objeto = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdsObjeto")).GetAttribute("value"); string numLicitacao = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrProcessoEdital")).GetAttribute("value"); string preco = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbvlReferencia")).GetAttribute("value"); string dotacao = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrDotacaoOrcamentaria")).GetAttribute("value"); string modalidade = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdsModalidadeLicitacao")).GetAttribute("value"); string numProcesso = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbnrEditalOrigem")).GetAttribute("value"); string dataLancamento = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtLancamentoPublicacao")).GetAttribute("value"); string precoMax = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbvlReferencia")).GetAttribute("value"); string dataAberturaEntrega = ""; if (CidadeAtual == "Diamante do Oeste") { CidadeAtual = "Diamante d'Oeste"; } if (Regex.IsMatch(web.PageSource, @"ctl00_ContentPlaceHolder1_tbdtAberturaLicitacao", RegexOptions.IgnoreCase)) { dataAberturaEntrega = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtAberturaLicitacao")).GetAttribute("value"); //Caso a licitação tenha o campo NOVA Data Abertura preenchido if (Regex.IsMatch(web.PageSource, @"ctl00_ContentPlaceHolder1_tbdtAberturaNova", RegexOptions.IgnoreCase)) { string dataNovaAberturaEntrega = web.FindElement(By.Id("ctl00_ContentPlaceHolder1_tbdtAberturaNova")).GetAttribute("value"); if (!string.IsNullOrEmpty(dataNovaAberturaEntrega)) { dataAberturaEntrega = dataNovaAberturaEntrega; } } string cod = GenerateCod(entidadeExecutora, dataLancamento, numProcesso, preco); string scod = cod.ToString().Substring(0, 19); long numLong = 0; long numScod = long.TryParse(scod, out numLong) ? numLong : 0; if (!string.IsNullOrEmpty(scod) && !LicitacaoController.Exists(scod)) { if (!LicitacaoController.Exists(objeto, preco, "Dotação Orçamentária: " + dotacao, numLicitacao, numProcesso, Constants.TCEPR_HOST)) { RService.Log("(CreateLicitacao) " + Name + ": Criando licitação num... " + scod + " at {0}", Path.GetTempPath() + Name + ".txt"); Licitacao licitacao = new Licitacao(); licitacao.Objeto = objeto; licitacao.Processo = numProcesso; licitacao.IdLicitacaoFonte = numScod; licitacao.IdFonte = 510; licitacao.Excluido = 0; licitacao.SegmentoAguardandoEdital = 0; licitacao.DigitacaoUsuario = 43; //Robo licitacao.Lote = Lote; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; licitacao.Observacoes = "Dotação Orçamentária: " + dotacao + " / Data de lançamento do edital pela entidade executora: " + dataLancamento; licitacao.LinkSite = Constants.TCEPR_HOST; licitacao.Cidade = CidadeAtual; licitacao.CidadeFonte = CidadeController.GetIdCidade(CidadeAtual, Constants.TCEPR_UF); licitacao.EstadoFonte = Constants.TCEPR_UF; licitacao.Estado = Constants.TCEPR_ESTADO; licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modalidade).ToUpper()) ? NameToModalidade[StringHandle.RemoveAccent(modalidade).ToUpper()] : null; licitacao.Num = numLicitacao; licitacao.AberturaData = DateHandle.Parse(dataAberturaEntrega, "dd/MM/yyyy"); licitacao.EntregaData = DateHandle.Parse(dataAberturaEntrega, "dd/MM/yyyy"); licitacao.ValorMax = precoMax; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(entidadeExecutora.Trim() + ":PR", NameToOrgao); if (LicitacaoController.IsValid(licitacao, out mensagemErro)) { Repo.Insert(licitacao); //licitacoes.Add(licitacao); RService.Log("Licitacao salva com sucesso at {0}", Path.GetTempPath() + Name + ".txt"); TotalLic++; } else { if (licitacao.Orgao != null) { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " e órgão " + licitacao.Orgao.Nome + " - " + licitacao.Orgao.Estado + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } else { RService.Log("Exception (CreateLicitacao) " + Name + ": A licitação de nº " + licitacao.Num + " não foi salva - Motivo(s): " + mensagemErro + " at {0}", Path.GetTempPath() + Name + ".txt"); } } } } } } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } return(true); }
/*Inicia a busca*/ private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento.." + " at {0}", Path.GetTempPath() + Name + ".txt"); try { /*Inicia navegador fantasma*/ LoadDriver(); /*Acessa o site do TCE*/ web.Navigate().GoToUrl(Constants.TCEPR_SITE); /*Busca os itens do filtro por cidades*/ GetCidades(); /*Configura os parametros da busca e inicia demais componentes necessários*/ if (config.PreTypedDate != null) { CurrentDay = config.PreTypedDate.Value.AddDays(-2); FinalDay = config.PreTypedDate.Value; config.PreTypedDate = null; ConfigRobotController.Update(config); } else { CurrentDay = DateTime.Now.AddDays(-2); FinalDay = DateTime.Now; } NameToModalidade = ModalidadeController.GetNameToModalidade(); NameToOrgao = OrgaoController.GetNomeUfToOrgao(); Lote = LoteController.CreateLote(43, 510); Repo = new LicitacaoRepository(); CurrentPg = 1; TotalLic = 0; /*Procura licitacoes por cidade pra ointervalo de dias indicado*/ foreach (var cidade in dicCidades) { CidadeAtualKey = cidade.Key; CidadeAtual = cidade.Value; /*Pesquisa licitações com base nos parametros (ano; dtAbertura)*/ if (DoSearch(CurrentDay, FinalDay)) { /*Pra cada pag que a pesquisa retornar*/ do { /*Percorre licitações de uma pag*/ if (!GetLicitacoes()) { //Segunda e ultima tentativa, se não conseguir continua com a pesquisa para a proxima cidade DoSearch(CurrentDay, FinalDay); GetLicitacoes(); } } while (HasNextPage()); } Tens = new List <int>() { 11 }; CurrentPg = 1; } //Repo.Insert(licitacoes); } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (TotalLic <= 0) { LoteController.Delete(Lote); } if (web != null) { web.Close(); } } }
private static Licitacao CreateLicitacao(string licitLink, int index) { ChromeDriver webLicit = null; if (web != null) { web.Quit(); } var driver = ChromeDriverService.CreateDefaultService(); driver.HideCommandPromptWindow = true; var op = new ChromeOptions(); webLicit = new ChromeDriver(driver, new ChromeOptions(), TimeSpan.FromSeconds(300)); webLicit.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(300); wait = new WebDriverWait(web, TimeSpan.FromSeconds(300)); Licitacao licitacao = new Licitacao(); licitacao.IdLicitacaoFonte = Convert.ToInt64(licitLink.Split('=')[1].Split('&')[0]); licitacao.IdFonte = 1250; licitacao.Estado = Constants.TCESE_ESTADO; licitacao.EstadoFonte = Constants.TCESE_UF; licitacao.LinkEdital = licitLink; licitacao.LinkSite = Constants.TCESE_HOST; licitacao.DigitacaoUsuario = 43; licitacao.Lote = Lote; //licitacao.DigitacaoData = null; //licitacao.ProcessamentoData = null; try { webLicit.Navigate().GoToUrl(licitLink); string licitText = webLicit.FindElement(By.XPath("//*[@id=\"aspnetForm\"]/table[3]/tbody/tr/td[2]")).Text; var textInfo = new CultureInfo("pt-BR").TextInfo; string dataAb = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCte_DtLicitacaoMIA")).Text; licitacao.AberturaData = Convert.ToDateTime(StringHandle.GetMatches(dataAb, @"\d+/\d+/\d+")[0].ToString()); string dataEnt = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_DtModificacaoMIA")).Text; licitacao.EntregaData = Convert.ToDateTime(dataEnt); licitacao.Cidade = Constants.TCESE_MUN_NAME[index].Replace("PREFEITURA MUNICIPAL DE ", ""); licitacao.CidadeFonte = Cidades.ContainsKey(licitacao.Cidade) ? Cidades[licitacao.Cidade] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); licitacao.Departamento = Constants.TCESE_MUN_NAME[index]; licitacao.Endereco = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCte_LocalMIA")).Text; string modal = StringHandle.GetMatches(licitText, @"Modalidade:(.*?)Número")[0].ToString().Split(':')[1].Replace(" Número", "").Trim(); licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modal.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modal.ToUpper())] : null; licitacao.Num = StringHandle.GetMatches(licitText, "Ano:(.*)")[0].ToString().Replace("Ano:", "").Replace("\r", ""); licitacao.Objeto = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_ResumoMIA")).Text; licitacao.Observacoes = webLicit.FindElement(By.Id("ctl00_ContentPlaceHolder1_lblCto_ConteudoMIA")).Text; licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(textInfo.ToTitleCase(licitacao.Departamento) + ":SE", NameToOrgao); } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } finally { if (webLicit != null) { webLicit.Close(); } } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
//Cria a licitação em questão com os respectivos dados private static Licitacao CreateLicitacao(string lic) { Licitacao licitacao = new Licitacao(); try { licitacao.DigitacaoUsuario = 43; licitacao.Estado = Constants.TCEPI_ESTADO; licitacao.EstadoFonte = Constants.TCEPI_UF; licitacao.IdLicitacaoFonte = Convert.ToInt64(lic); licitacao.IdFonte = 1442; licitacao.LinkEdital = string.Format(Constants.TCEPI_LICIT, lic); licitacao.LinkSite = Constants.TCEPI_HOST; licitacao.Lote = lote; web.Navigate().GoToUrl(licitacao.LinkEdital); string licitacaoHtmlText = web.PageSource.ToString(); var helper = StringHandle.GetMatches(licitacaoHtmlText, "negrito\">(.|\n)*?</span"); licitacao.Processo = helper[1].ToString().Replace("negrito\">", "").Replace("</span", "").Replace("Pregão ", ""); licitacao.Observacoes = null; licitacao.AberturaData = Convert.ToDateTime(helper[2].ToString().Replace("negrito\">", "").Replace("</span", "")); licitacao.EntregaData = Convert.ToDateTime(helper[7].ToString().Replace("negrito\">", "").Replace("</span", "")); licitacao.ValorMax = helper[4].ToString().Replace("negrito\">", "").Replace("</span", ""); var num = web.FindElement(By.XPath("//*[@id=\"j_idt23_content\"]/div[1]/div[2]/span")); licitacao.Num = num.Text.Split('º')[1].Trim(); var modalidade = num.Text.Split('º')[0].Replace(" N", "").Trim(); licitacao.Modalidade = NameToModalidade.ContainsKey(StringHandle.RemoveAccent(modalidade.ToUpper())) ? NameToModalidade[StringHandle.RemoveAccent(modalidade.ToUpper())] : null; if (licitacao.Modalidade == null) { licitacao.Modalidade = NameToModalidade["PREGAO"]; } var objeto = web.FindElement(By.XPath("//*[@id=\"j_idt23_content\"]/div[4]/div[2]/label")); licitacao.Objeto = objeto.Text.Trim(); var depto = web.FindElement(By.XPath("//*[@id=\"j_idt20_content\"]/div/div[2]/h2")); licitacao.Departamento = depto.Text.Trim(); licitacao.Orgao = OrgaoController.GetOrgaoByNameAndUf(licitacao.Departamento + ":PI", NameToOrgao); if (licitacao.Departamento.Contains("P. M. DE ")) { var textInfo = new CultureInfo("pt-BR").TextInfo; string cidade = licitacao.Departamento.Remove(0, 9); licitacao.Cidade = textInfo.ToTitleCase(cidade); licitacao.CidadeFonte = Cidades.ContainsKey(cidade) ? Cidades[licitacao.Cidade.ToUpper()] : CityUtil.GetCidadeFonte(licitacao.Cidade, Cidades); } else { foreach (var cid in Cidades) { if (licitacao.Objeto.Contains(cid.Key)) { licitacao.Cidade = cid.Key; licitacao.CidadeFonte = cid.Value; } } if (string.IsNullOrEmpty(licitacao.Cidade)) { licitacao.Cidade = "Teresina"; licitacao.CidadeFonte = 5721; } } } catch (Exception e) { RService.Log("Exception (CreateLicitacao) " + name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", logPath); } return(LicitacaoController.IsValid(licitacao, out mensagemErro) ? licitacao : null); }
/*Inicia o processamento do robot*/ private static void Init() { RService.Log("(Init) " + Name + ": Começando o processamento.. " + "at {0}", Path.GetTempPath() + Name + ".txt"); try { AlreadyColected = new HashSet <long>(); /*Lista das licitacoes que já existem para bec.sp.gov*/ //AlreadyInserted = LicitacaoController.GetAlreadyInserted(Constants.BEC_SITE); /*Lista das cidades para o estado*/ Cidades = CidadeController.GetNameToCidade(Constants.BEC_UF); Modalidade = ModalidadeController.FindById(24); Orgao = OrgaoController.FindById(388); Lote = LoteController.CreateLote(43, 507); Repo = new LicitacaoRepository(); //Define os pontos de partida, uri e argumentos do post List <string> urls = new List <string>(); urls.Add(Constants.BEC_LINK_MODALIDADE_71); urls.Add(Constants.BEC_LINK_MODALIDADE_72); /*Percorre cada modalidade*/ foreach (string uri in urls) { /*Lista dos parametros do post*/ NameValueCollection post = new NameValueCollection(); /*Percorre as naturezas de cada modalidade*/ foreach (var attr in WebHandle.GetHtmlDocOfPage(uri, post).DocumentNode.Descendants("span").Where(x => x.Attributes.Contains("id") && x.Attributes["id"].Value.ToString().Contains(Constants.BEC_ID_NATUREZA))) { string urin = attr.SelectSingleNode("a").Attributes["href"].Value.ToString(); int page = 2, count = 20; /*Percorre as páginas para cada uma das naturezas (ex: 1;2;3)*/ HtmlDocument pagehtml = WebHandle.GetHtmlDocOfPage(urin, post); while (pagehtml != null && count == 20) { RService.Log("(GetOC) " + Name + ": Percorrendo os links da página.. " + (page - 1) + " at {0}", Path.GetTempPath() + Name + ".txt"); //Pega as licitações de cada página (OC's) count = GetOC(pagehtml); //Pega o html da próxima página pagehtml = WebHandle.GetHtmlDocOfPage(urin, GetFormParameters(pagehtml, page)); //Numero da proxima página page++; } } } } catch (Exception e) { RService.Log("Exception (Init) " + Name + ": " + e.Message + " / " + e.StackTrace + " / " + e.InnerException + " at {0}", Path.GetTempPath() + Name + ".txt"); } finally { if (NumLicitacoes <= 0) { LoteController.Delete(Lote); } } }