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)
Exemple #2
0
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'
Exemple #6
0
 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
Exemple #9
0
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
Exemple #10
0
 def __init__(self):
     self.sql = Script()
Exemple #11
0
        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()
Exemple #13
0
 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
Exemple #14
0
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
                }