예제 #1
0
class BuscaCotacoes:

    api_key = None
    time_sleep = None
    dbConn = None
    http = urllib3.PoolManager()
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

    def __init__(self):
        project_folder = os.path.expanduser('.\\')
        load_dotenv(os.path.join(project_folder, 'params.env'))
        self.api_key = os.getenv("API_KEY")
        self.time_sleep = os.getenv("TIME_SLEEP")
        self.dbConn = DBConnection()
        if not self.dbConn.connectionCreated():
            self.dbConn.createConnection(os.getenv("STR_CONN"))

    def iniciarColetaCotacoes(self):
        data_hora = self.dateTimeNow()
        CotacaoTempoReal.clear_table(conn=self.dbConn.conn,
                                     dataAtual=data_hora)
        while 10 <= data_hora.hour <= 17:
            self.coletar_cotacoes()
            self.coletar_cotacoes_monitoramento()
            print("[" + time.ctime() + "] Cotações coletadas com sucesso!")
            time.sleep(int(self.time_sleep))
            data_hora = self.dateTimeNow()
        self.dbConn.disposeConnection()

    def coletar_cotacoes(self):
        config = Configuracao.find_by_key(self.dbConn.session, self.api_key)
        acao = Acao.find_acoes_carteira(conn=self.dbConn.session)
        headers = {'User-Agent': self.user_agent}

        for item in acao:
            acesso_api = AcessoAPI.find_by_api_acao(self.dbConn.session,
                                                    api_id=config.id,
                                                    acao_id=item.id)
            if acesso_api is not None:
                url = config.valor.format(acesso_api.nome_api)
                response = self.http.request('GET',
                                             url,
                                             preload_content=False,
                                             headers=headers)
                try:
                    hora_pregao = self.extrairHoraAtualizacao(
                        response.data.decode('utf-8'))
                    valor = self.extrairValorCotacao(
                        response.data.decode('utf-8'))
                    cotacao = CotacaoTempoReal(
                        acao_id=item.id,
                        valor=float(valor.replace(',', '.')),
                        data_atualizacao=self.dateTimeNow(),
                        hora_pregao=hora_pregao)
                    self.dbConn.session.add(cotacao)
                except:
                    print("Não foi possível recuperar cotação da ação: " +
                          item.codigo + ".")
            else:
                print("Não existe Nome de API para ação: " + item.codigo)
        self.dbConn.session.commit()

    def coletar_cotacoes_monitoramento(self):
        config = Configuracao.find_by_key(self.dbConn.session, self.api_key)
        listaAcaoMonitor = Acao.find_acoes_monitoradas_fora_carteira(
            conn=self.dbConn.conn)
        headers = {'User-Agent': self.user_agent}

        for item in listaAcaoMonitor:
            acao = Acao.find_by_id(self.dbConn.session, item.id)
            acesso_api = AcessoAPI.find_by_api_acao(self.dbConn.session,
                                                    api_id=config.id,
                                                    acao_id=acao.id)
            if acesso_api is not None:
                url = config.valor.format(acesso_api.nome_api)
                response = self.http.request('GET',
                                             url,
                                             preload_content=False,
                                             headers=headers)
                try:
                    hora_pregao = self.extrairHoraAtualizacao(
                        response.data.decode('utf-8'))
                    valor = self.extrairValorCotacao(
                        response.data.decode('utf-8'))
                    cotacao = CotacaoTempoReal(
                        acao_id=item.id,
                        valor=float(valor.replace(',', '.')),
                        data_atualizacao=self.dateTimeNow(),
                        hora_pregao=hora_pregao)
                    self.dbConn.session.add(cotacao)
                except:
                    print("Não foi possível recuperar cotação da ação: " +
                          acao.codigo + ".")
            else:
                print("Não existe Nome de API para ação: " + acao.codigo)
        self.dbConn.session.commit()

    def extrairValorCotacao(self, msg):
        try:
            if self.api_key == 'API_INFOM':
                result = re.search(
                    r'\<div class\=\"value\"\>\n                                    \<p\>[0-9\,]*\<\/p\>',
                    msg).group()
                result = re.split(r'\<p\>|\<\/p\>', result)[1]
            elif self.api_key == 'API_INVES':
                result = re.search(
                    r'data-test\=\"instrument-price-last\"\>[0-9\,]*\<\/span\>',
                    msg).group()
                result = re.split(r'\>|\<\/span\>', result)[1]
        except Exception as ex:
            print(ex)
            result = ""
        return result

    def extrairHoraAtualizacao(self, msg):
        try:
            if self.api_key == 'API_INFOM':
                result = re.search(r'[0-9h0-9]+. Delay 15 min', msg).group()
                result = result.split('.')[0]
                result = result.replace('h', ':')
            elif self.api_key == 'API_INVES':
                result = re.search(r'Z\"\>[0-9\:]*\<\/time\>', msg).group()
                result = re.split(r'\>|\<\/time\>', result)[1]
        except Exception as ex:
            print(ex)
            result = ""
        return result

    def dateTimeNow(self):
        now = datetime.datetime.now()
        return now