menighin / cei-crawler Goto Github PK
View Code? Open in Web Editor NEWCrawler para pegar dados do CEI 🤑💰💸
License: MIT License
Crawler para pegar dados do CEI 🤑💰💸
License: MIT License
O QR code pra doação esta quebrando aqui no nu, tava tentando agradecer esse projeto foda que vocês disponibilizaram.
Opa, blz?
Antes de mais nada, parabéns pelo pacote, muito legal!
Já consegui fazer o uso normal dos serviços, inclusive já obtive dados de uma carteira minha e de alguns amigos, porém, 1 amigo em específico está dando o seguinte erro:
Logging at CEI...
Selecting institution 3 - XP INVESTIMENTOS CCTVM S/A (3)
TimeoutError: waiting for function failed: timeout 30000ms exceeded
at new WaitTask (/home/src/node_modules/puppeteer/lib/DOMWorld.js:549:28)
at DOMWorld.waitForFunction (/home/src/node_modules/puppeteer/lib/DOMWorld.js:454:12)
at Frame.waitForFunction (/home/src/node_modules/puppeteer/lib/FrameManager.js:657:28)
at Page.waitForFunction (/home/src/node_modules/puppeteer/lib/Page.js:1141:29)
at Function.getStockHistory (/home/src/app/lib/StockHistoryCrawler.js:103:24)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async CeiCrawler.getStockHistory (/home/src/app/lib/CeiCrawler.js:111:16)
at async /home/src/app/cei-process-new.js:50:36
Tentei dar uma olhada no que poderia ser, mas não encontrei nada que pudesse resolver.
As options que estou utilizando:
const ceiCrawlerOptions = {
puppeteerLaunch: {
headless: true,
timeout: 0,
args: ['--no-sandbox']
},
trace: true,
capEndDate: true
};
O erro acontece na chamada de:
let stockHistory = await ceiCrawler.getStockHistory();
Agradeço desde já qualquer ajuda,
Abraço
Na página existe uma tabela com o preço médio de compra e preço médio de venda de cada ativo.
Sugiro a implementação de um método que pega essas informações. Com o preço médio de compra é possível o usuário calcular os rendimentos baseado no preço atual do ativo e com o preço médio de venta é possível calcular o lucro/prejuízo do ativo que foi vendido.
Primeiro, parabéns pelo projeto!
Existe alguma previsão para parsear o conteúdo da seguinte URL? https://cei.b3.com.br/CEI_Responsivo/ConsultarExtratoCetip.aspx
Através dela é possível pegar CDBs, LCs, etc.
mudar de "treasureWallet": [] para "nationalTreasureWallet": []
tentei subir o fix, mas sem permissao pra subir branch
Pessoal, alguém usou recentemente?
Não estou tomando erro, mas não está autenticando.
To usando o código de exemplo do tratamento de erro do login.
Valeuu!
Na página o CEI disponibiliza as informações consolidadas da carteira. Todos os ativos a quantidade e o valor total da cotação atualizado até o início do dia (acho que atualiza na madrugada).
Sugiro a implementação de um método que pegue essas informações. Apesar do delay de atualização dos valores de cada ativo (uma vez por dia apenas), isso pode facilitar a vida de quem não quer implementar a chamada para uma outra API para pegar a cotação em tempo real. Acredito que existem casos de uso que não precisam de informações em tempo real e podem fazer uso desse método.
Fala pessoal, estou recebendo erro de LOGIN_FAILED, porém se loggo a resposta do método de login, parece que o erro está relacionado a essa mensagem:
2,'The HTTP service located at http://localhost:8053/CEIServicos/GerenciadorGeral.svc is unavailable
Alguma idéia do que pode estar causando esse erro?
Boa tarde pessoal,
Primeiramente, parabéns pelo crawler, está muito bem feito e muito rápido.
Estava olhando esses 2 relatórios Tesouro Extrato Analítico e Extrato BM&FBOVESPA, percebi que hoje ainda não foi implementando, teriam intenção de extrair essa informações ?
Percebi que no caso do Tesouro Extrato Analítico, para pegar as informações é aberto um Modal na tela e dentro do modal uma tabela. Na estrutura que tem hoje do crawler ele suportaria pegar a informação em modal ?
Em questão ao Extrato BM&FBOVESPA, ele exporta um Excel (Download), saberia dizer também se na arquitetura atual, suportaria o download de arquivo ?
Obrigado
Com headless = true não funciona.
No ceiapp eles disponibilizavam o codigo interno do banco (ex 1099 - INTER DTVM LTDA) mas agora so exibem o documento (cnpj) e um nome diferente...
A migração entre as plataformas fica instavel.
Alguém tem alguma lista dos bancos da plataforma nova?
ex: essa da plataforma antiga
[https://clubedospoupadores.com/codigo-corretoras]
Ou alguma forma de combinar ambas...
Em algumas corretoras é possível comprar ações e usar elas como garantia para outras operações. Para esses casos o CEI separa as ações em duas carteiras diferentes dentro da mesma conta.
Nesse cenário o crawler só pega as informações da primeira carteira.
Acho que seria interessante o crawler conseguir pegar as duas carteiras.
Boa tarde pessoa,
Eu percebi que os cookies costumam expirar bastante, vocês sabem se existe alguma forma de dar um refresh neles para não perder a sessão? Não gostaria de guardar os dados de usuário/senha, mas não gostaria de que ficasse me pedindo todo dia. Sabem de alguma forma para solucionar esse problema?
Obrigado pessoal, e o projeto ta massa!
Opa @Menighin tudo beleza? Cara tens alguma ideia sobre como burlar o sistema de Captcha que o CEI adicionou? Ou é algo meio impossível de se realizar? hehe
Olá!
Não tenho conseguido utilizar o getWallet(), ele chega a logar no CEI, começa a buscar os dados da carteira porém da erro no meio. Segue o log completo com o erro:
Logging at CEI...
Selecting institution 308 - CLEAR CORRETORA - GRUPO XP (308)
Selecting account 2129
Processing wallet data
Error ReferenceError: data is not defined
at Function._callee2$ (/Users/matheuscunha/Documents/Projetos/cei/node_modules/cei-crawler/app.js:1:20417)
at tryCatch (/Users/matheuscunha/Documents/Projetos/cei/node_modules/regenerator-runtime/runtime.js:45:40)
at Generator.invoke [as _invoke] (/Users/matheuscunha/Documents/Projetos/cei/node_modules/regenerator-runtime/runtime.js:274:22)
at Generator.prototype.<computed> [as next] (/Users/matheuscunha/Documents/Projetos/cei/node_modules/regenerator-runtime/runtime.js:97:21)
at asyncGeneratorStep (/Users/matheuscunha/Documents/Projetos/cei/node_modules/@babel/runtime/helpers/asyncToGenerator.js:3:24)
at _next (/Users/matheuscunha/Documents/Projetos/cei/node_modules/@babel/runtime/helpers/asyncToGenerator.js:25:9)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
Opa! Tudo beleza?
Primeiramente, meus parabéns pelo excelente trabalho! Facilitou a vida de muito dev por aí!
Estou tendo um problema e tenho razões para acreditar que não é minha máquina (até porque eu estou rodando as funções na nuvem).
Error: Could not find expected browser (chrome) locally. Run
npm install
to download the correct Chromium revision (901912).
at ChromeLauncher.launch (/var/task/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js:88:27)
at async CeiLoginService._getTokenByUserResolve (/var/task/node_modules/cei-crawler/src/lib/CeiLoginService.js:36:25)
at async CeiLoginService.getToken (/var/task/node_modules/cei-crawler/src/lib/CeiLoginService.js:26:24)
at async CeiCrawler._login (/var/task/node_modules/cei-crawler/src/lib/CeiCrawler.js:67:29)
at async CeiCrawler.getConsolidatedValues (/var/task/node_modules/cei-crawler/src/lib/CeiCrawler.js:77:9)
Já tentei instalar o Chromium
e o puppeteer
localmente e não funcionou. E de qualquer forma não pretendo usar essas funções localmente. O package precisa funcionar por si só. Tenho usado o cei-crawler v2
sem problema.
No arquivo LastExecutionCrawler
tem a seguinte url:
https://investidor.b3.com.br/api/v1/sistema/carga/ultima-execucao
porém a correta é:
https://investidor.b3.com.br/api/sistema/v1/carga/ultima-execucao
Em alguns casos, a função getStockHistory retorna a mensagem
waiting for function failed: timeout 30000ms exceeded
Fala João,
Percebi que quando se coloca um CPF ou Senha errado ele acaba esperando o timeout para dar erro na chamada. Fazendo um teste vi que o site da CEI gera um dialog alertando a respeito do ocorrido. Fazendo umas pesquisas vi o puppeteer não lida automaticamente com dialogs, é preciso lidar dentro do método page.on.
Ex:
page.on('dialog', async dialog => {
console.log(dialog.message());
await dialog.dismiss();
});
Estou tentando implementar mais estou com dificuldade de lidar com os erros disparados dentro de uma função assíncrona.
Acho que seria legal implementar algo para lidar com cpf ou senha errados. Assim não seria preciso esperar até o timeout para retornar o erro.
Abraço!
Toda vez que tento utilizar a opcao 'raw-token' para login ele me retorna o seguinte erro:
/node_modules/cei-crawler/src/lib/AxiosWrapper.js:42
const msgStr = e.response.data != null ? (e.response.data.message || e.response.data.trim()) : e.message;
^
TypeError: Cannot read properties of undefined (reading 'data')
Histories that are older than 18 months are not coming on request
Estava aqui olhando o meu CEI, e um dos eventos que o crawler ainda não suporta é o split/inplit de ações (quando você tem 1 ações e passa a ter 20, ou vice versa).
No CEI, é um bloco de eventos com esse, dentro da seção de proventos:
https://imgur.com/kz7NcVF
Ele aparece muito raramente, mas seria legal ter a informação para poder lembrar quem tem controle em planilhas (ou sistemas) para poder ajustar o preço médio :)
Eu já até implementei a alteração aqui e consegui adicionar um novo array no retorno do método getDividends()
:
"splitEvents": [
{
"stock": "B3",
"stockType": "ON NM",
"code": "B3SA3",
"type": "DESDOBRAMENTO DE AÇÕES",
"date": "2021-05-18T03:00:00.000Z",
"baseQuantity": 49,
"factor": 1,
"destinationCode": "B3SA3",
"quantity": 98,
"eventValue": 200,
"exerciseValue": 0
}
]
Caso acham que faz sentido, posso abrir um PR! O que acham?
O CEI está criando uma nova area logada
Atualize a função _getMainPage com a url nova.
if (p.url().indexOf('b3investidor.b2clogin.com/b3Investidor.onmicrosoft.com/oauth2/v2.0/authorize') !== -1)
Bom Dia,
Primeira mente que repositório incrível , que iniciativa fenomenal velho. Parabéns.
Deixa eu perguntar esse crawler funciona mesmo com o recaptcha existente na tela inicial do login do cei ?
Boa tarde, no momento do login apos 35 segundos considera que o login falhou, mas algumas vezes notei que o site da B3 demora mais que esse tempo para retornar a requisicao de login, talvez seria interessante incluir essa variavel como customizada juntamente com o ceiCrawlerOptions, para que em casos onde o retorno demore a aconter nao aconteca esse erro, mesmo sem ser um erro de login.
Trecho de codigo a que me refiro:
{
id: 'fail',
pr: this._page.waitFor(35000) // After 35s, consider the login has failed
}
Valeu!
Opa @Menighin tenho uma sugestão que acho que evitariam alguns problemas.
Teria a possibilidade de usar o mesmo login por exemplo da função /wallet
para retornar os registros da função /transactions
e /dividends
?
Assim usaria apenas 1 login para baixar tudo, por que no momento ele faz 3 logins certo?
E muitas das vezes acontece de efetuar o primeiro login corretamente mas depois da erro de LOGIN_FAILED
,
então se desse pra retornar por exemplo:
Uma nova função /all
por exemplo que retornasse assim:
wallet: {
tudo da função /wallet
},
transactions: {
tudo da função /transactions
},
dividends: {
tudo da função /dividends
}
Eu peço ajuda pois não faço a mínima ideia de como implementar isso no plugin cei-crawler
Obrigado
Fiz uma requisição na stockhistory, porém só trouxe 1 instituição, é possível pegar de todas?
Bom dia amigo, tudo bom?
Existe alguma restrição de acesso na lib? É possível o CEI bloquear minha conta? Você algum solução para isso?
Vi em seu repositório stoincs que você espera a instancia ficar livre, poderia me explicar melhor?
Olá, eu detectei um erro que acontece simplesmente executando a biblioteca. Pela minha pequisa eu encontrei na documentação do Mozilla que:
Public and private field declarations are an experimental feature (stage 3) proposed at TC39, the JavaScript standards committee. Support in browsers is limited, but the feature can be used through a build step with systems like Babel.
Talvez por ser experimental esteja ocadionando o erro. Informações abaixo:
Node: v10.14.2
Erro:
$ node crawler.js
/home/mgm/dev/puppeteer-cei/node_modules/cei-crawler/src/lib/CeiCrawler.js:9
_isLogged = false;
^
SyntaxError: Unexpected token =
at new Script (vm.js:79:7)
at createScript (vm.js:251:10)
at Object.runInThisContext (vm.js:303:10)
at Module._compile (internal/modules/cjs/loader.js:657:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
Código:
const CeiCrawler = require("cei-crawler");
class Foo {
async start(email, password) {
let ceiCrawler = new CeiCrawler(email, password, {
/* options */
trace: true
});
let stockHistory = await ceiCrawler.getStockHistory();
console.log(JSON.stringify(stockHistory, undefined, 4));
}
}
const FooInstance = new Foo();
FooInstance.start("#####", "#####");
Eu tenho uma proposta para corrigir: mover para dentro do construtor as declarações. Vou subir um PR.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.