class Comunicacao(object): def __init__(self): self.sql = Script() self.telegram = Telegram() def alerta_voos(self, valor, voos): try: msg = '--- CONSULTA: {} ---'.format(voos['data_hora']) msg += '\n' msg += '\n' msg += 'Os seguintes voos estão dentro do valor esperado de R${}: '.format( valor) msg2 = '' for voo in voos['lista_voos']: if voo['valor'] <= float(valor): result = '\n\n ORIGEM: {} \n DESTINO: {} \n VALOR: {} \n DATA: {} \n DIA DA SEMANA: {} \n ####################### \n'.format( voos['origem'], voos['destino'], voo['valor'], voo['data'], voo['dia_semana']) msg2 += result if msg2: msg += msg2 self.telegram.enviar_msg(msg) except Exception as exception: self.sql.insere_log(exception)
class Parametros(object): def __init__(self): self.sql = Script() def retorna_parametros(self): try: parametros = self.sql.consulta_parametros() resultado = {} for parametro in parametros: if parametro['tipo_parametro'] == 'site': resultado['site'] = parametro['valor'] elif parametro['tipo_parametro'] == 'valor_voo': resultado['valor_voo'] = parametro['valor'] elif parametro['tipo_parametro'] == 'bot_token_telegram': resultado['bot_token_telegram'] = parametro['valor'] elif parametro['tipo_parametro'] == 'qnt_semanas': resultado['qnt_semanas'] = parametro['valor'] elif parametro['tipo_parametro'] == 'navegador_handler': resultado['navegador_handler'] = parametro['valor'] return resultado except Exception as exception: self.sql.insere_log(exception) return
def consulta_menor_valor_voo(message): try: sql = Script() resultado = sql.consulta_menor_valor_passagem() valor = round(resultado[0]['valor'], 2) return 'O menor valor encontrado é de R$ {}'.format(valor) except Exception as e: return 'Não há valor válido para a consulta solicitada'
def consulta_log(message): sql = Script() ultima_consulta = sql.consulta_data_ultima_verificacao( )[0]['data_consulta'] quantidade_erros = sql.consulta_quantidade_erros()[0]['qnt'] msg = 'A última consulta aconteceu: {}'.format(ultima_consulta) msg += '\n' msg += 'A quantidade de erros encontrados até agora foram {} erros'.format( quantidade_erros) return msg
def altera_valor_pesquisa(message): try: valor = int(message.text.replace('/altera', '')) sql = Script() sql.atualiza_valor_voos(valor) return 'Valor da busca pelo preço das passagens foi alterado para R$ {}'.format( valor) except Exception as e: return 'Informe um valor válido. \nEx.: /altera 250 \nPara alterar o valor do monitoramento das passagens para R$250'
def __init__(self, driver): self.driver = driver self.campo_origem = '//div[@class="purchase-box-header-division division-input division-input-origin"]/div/a/div' self.campo_destino = '//div[@class="input-destiny division-input-destiny-city active"]/div/a/span' self.botao_compra = 'btn-box-buy' self.lista_voos = '//div[@class="sliderDates sliderGoing"]/ul/li' self.botao_proxima_semana = "ControlGroupSelect2View_AvailabilityInputSelect2View_LinkButtonNextWeek1" self.botao_modal_aviso_data = '//div[@class="carouselDateChangePopup"]/p[@class="btnFecharPopup btCls btClsNew3"]/a[contains(text(), "Fechar")]' self.sql = Script() self.parametros = Parametros() self.parametro = self.parametros.retorna_parametros()
def pesquisa_voo(): sql = Script() paramentos = Parametros() paramento = paramentos.retorna_parametros() comunicacao = Comunicacao() options = Options() options.headless = False if int(paramento['navegador_handler']): options.headless = True driver = webdriver.Chrome(chrome_options=options) driver.maximize_window() destinos = sql.consulta_destinos() for destino in destinos: try: driver.get(paramento['site']) driver.delete_all_cookies() driver.refresh() consulta_ida = Consulta(driver) consulta_ida.informo_origem() consulta_ida.pesquisa_voo(destino['origem']) consulta_ida.pesquisa_voo(destino['destino']) consulta_ida.pesquisar() lista_voos = consulta_ida.pega_dados_voo() if lista_voos is None: continue tratar_voos = TratamentoVoos() dados_voos = tratar_voos.cria_json(lista_voos, destino['origem'], destino['destino']) comunicacao.alerta_voos(paramento['valor_voo'], dados_voos) for voo in dados_voos['lista_voos']: sql.insere_voo(dados_voos, voo) except Exception as exception: try: img = None img = driver.get_screenshot_as_base64() except Exception: pass logger.exception(exception, img) # sql.insere_log(exception, img) driver.quit()
def consulta_parametros(message): sql = Script() paramentros = sql.consulta_paramentros() for valores in paramentros: parametro[valores['tipo_parametro']] = valores['valor'] msg = 'Os seguintes parametros estão sendo utilizados:\n\n' msg += 'O site consultado é: {}\n'.format(parametro['site']) msg += 'O valor da passagem para pesquisa é: {}\n'.format( parametro['valor_voo']) msg += 'A quantidade de semanas que estamos analisando é: {}\n'.format( parametro['qnt_semanas']) msg += 'O navegar está no modo: {}\n'.format( 'Não Renderizado' if parametro['qnt_semanas'] == '1' else 'Renderizado') return msg
class Parametros(object): def __init__(self): self.sql = Script() def retorna_parametros(self): try: parametros = self.sql.consulta_parametros() resultado = {} for parametro in parametros: resultado[parametro['tipo_parametro']] = parametro['valor'] return resultado except Exception as exception: logger.exception(exception) self.sql.insere_log(exception) return
def __init__(self): self.sql = Script()
msg += 'O valor da passagem para pesquisa é: {}\n'.format( parametro['valor_voo']) msg += 'A quantidade de semanas que estamos analisando é: {}\n'.format( parametro['qnt_semanas']) msg += 'O navegar está no modo: {}\n'.format( 'Não Renderizado' if parametro['qnt_semanas'] == '1' else 'Renderizado') return msg @bot.message_handler(commands=['parametros'], func=consulta_parametros) def echo_all(message): bot.reply_to(message, consulta_parametros(message)) def comandos(message): msg = 'Você pode utilizar os seguintes comandos para configurar suas buscas: \n\n' msg += '/menorvalor - Esse comando retorna o valor mais baixo da passagem que foi encontrado nas buscas\n\n' msg += '/altera "valor" - Esse comando altera o valor da passagem que você deseja ser notificado. \n Ex.: Utilizando /altera 200. Quando encontrarmos alguma passagem abaixo de R$ 200,00, iremos notificá-lo por mensagem\n\n' msg += '/log - Esse comando retorna o log do sistema com as informações da última vez que o sistema rodou, e a quantidade de erros gerados até o momento.\n\n' msg += '/parametros - Esse comando retorna os paramentros que estão sendo utilizandos nas consultas atuais\n\n' return msg @bot.message_handler(commands=['help'], func=comandos) def echo_all(message): bot.reply_to(message, comandos(message)) bot.polling() except Exception as exception: sql = Script() sql.insere_log(exception)
def __init__(self): self.sql = Script() self.telegram = Telegram()
def consulta_log(message): sql = Script() ultima_consulta = sql.consulta_data_ultima_verificacao( )[0]['data_consulta'] msg = 'A última consulta aconteceu: {}'.format(ultima_consulta) return msg
class Consulta(object): def __init__(self, driver): self.driver = driver self.campo_origem = '//div[@class="purchase-box-header-division division-input division-input-origin"]/div/a/div' self.campo_destino = '//div[@class="input-destiny division-input-destiny-city active"]/div/a/span' self.botao_compra = 'btn-box-buy' self.lista_voos = '//div[@class="sliderDates sliderGoing"]/ul/li' self.botao_proxima_semana = "ControlGroupSelect2View_AvailabilityInputSelect2View_LinkButtonNextWeek1" self.botao_modal_aviso_data = '//div[@class="carouselDateChangePopup"]/p[@class="btnFecharPopup btCls btClsNew3"]/a[contains(text(), "Fechar")]' self.sql = Script() self.parametros = Parametros() self.parametro = self.parametros.retorna_parametros() def informo_origem(self): try: self.driver.find_element_by_xpath(self.campo_origem).click() except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img) def informo_destino(self): try: self.driver.find_element_by_xpath(self.campo_destino).click() except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img) def pesquisa_voo(self, destino): try: actions = ActionChains(self.driver) actions.send_keys(destino) actions.key_down(Keys.ENTER) actions.key_up(Keys.ENTER) actions.perform() except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img) def pesquisar(self): try: self.driver.find_element_by_id(self.botao_compra).click() except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img) def pega_dados_voo(self): try: datas = [] pesquisar = 0 qnt_semana = self.parametro['qnt_semanas'] while pesquisar < int(qnt_semana): voos = self.driver.find_elements_by_xpath(self.lista_voos) for voo in voos: datas.append(voo.text) try: self.driver.find_element_by_id( self.botao_proxima_semana).click() except Exception as exception: try: self.driver.find_element_by_xpath( self.botao_modal_aviso_data).click() self.driver.find_element_by_id( self.botao_proxima_semana).click() except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img) pesquisar += 1 return datas except Exception as exception: img = self.driver.get_screenshot_as_base64() self.sql.insere_log(exception, img)
from datetime import datetime from src.bd.script import Script sql = Script() class TratamentoVoos(object): def cria_json(self, voos, origem, destino): try: lista_voos = { 'data_hora': datetime.now().strftime("%d-%m-%Y %H:%M"), 'origem': origem, 'destino': destino, 'lista_voos': [] } for data in voos: if 'Indisponível' in data: continue dados = data.split('\n') obj = { 'dia_semana': dados[0], 'data': dados[1], 'valor': float(dados[2].replace('a partir de R$ ', '').replace( ',', '').replace('.', '')) / 100 }