npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cei-wrapper

v1.0.0

Published

Module to fetch information from CEI (Canal Eletronico do Investidor)

Downloads

29

Readme

CEI Wrapper

This library is a NodeJS wrapper that expose an modern API for CEI service.

The project exploits CEI's "New Logon Area" which now has a captcha for login 🙄 CeiWrapper has integration with the anti-captcha to solve the problem (If there is a need in the future we can implement support for similar services like 2captcha)

Please keep in mind that this is a work in progress. Pull requests welcome!

Features

  • Use the new CEI's API.
  • Support anti-captcha to solve login.
  • Written in TypeScript.
  • Easy to use with an elegant API.

How to works

To instantiate CeiWrapper we need an authentication context, something like this

const authenticateContext = {
  cacheId: "f8f7cac9-5b99-4160-94ae-eddd5dd2218",
  token: "eyJhbGciOiJIUzI1NiJ9.eyJSb2xlIjoiZmFr....",
};

To achieve this we can use the static authenticateUser method

const authenticateContext = await CeiWrapper.authenticateUser({
  captchaSolvingServiceKey: "Your Key",
  username: "CEI's User",
  password: "CEI's Pass",
});

This is useful because the token generated by CEI has a lifetime of about 1h, so we can store these credentials in Redis or any other caching asset for example and be able to make several calls without having to authenticate again (and saving the cost of resolving the captcha) 🎉

With the credentials in hand we can begin the work

const ceiWrapper = new CeiWrapper(authenticateContext);

const result = await ceiWrapper.getConsolidatedValues();

All methods use a standardized response for both success and error. e.g.

ResultError {
  isError: true;
  status: 0;
  errorMessage: "Error Message";
}
ResultSuccess {
  isError: false,
  status: 1,
  data: <data_from_CEI>
}

you can see a complete example here

Documentation

getConsolidatedValues()

Returns the consolidated investments in a total amount and divided into subcategories

ResultSuccess.data:

{
  "total": "1000.50",
  "values": [
    {
      "product": "Renda Variável",
      "totalAmount": "600.54",
      "percentage": "0.607"
    },
    {
      "product": "Tesouro Direto",
      "totalAmount": "300.92",
      "percentage": "0.393"
    }
  ]
}

getInvestments(date?, page?)

Returns the investments with details divided into categories

| Argument | Type | Description | | -------- | ------ | ------------------------------------------------------------------ | | date | Date | Position date. By default use the last processing date of the CEI. | | page | Number | Data paging. By default returns the first page. |

ResultSuccess.data:

{
  "currentPage": 1,
  "totalPages": 1,
  "types": [
    {
      "category": "RendaVariavel",
      "name": "Acao",
      "products": VariableIncomeProduct[],
      "totalAmount": 111.07
    },
    {
      "category": "TesouroDireto",
      "name": "TesouroDireto",
      "products": FixedIncomeProduct[],
      "totalAmount": 224.1
    }
  ]
}

VariableIncomeProduct example

{
  "company": "AMBEV S.A.",
  "code": "ABEV3",
  "type": "ON",
  "amount": 10,
  "price": 16.13,
  "exchange": "CLEAR CORRETORA - GRUPO XP",
  "exchangeId": "02332886001178",
  "bookkeeper": "BANCO BRADESCO S/A",
  "available": 10
},

FixedIncomeProduct example

{
  "name": "Tesouro Selic 2023",
  "index": "SELIC",
  "expirationSate": "2023-03-01T03:00:00.000Z",
  "amount": 0.56,
  "initialValue": 530.23,
  "currentValue": 615.94,
  "netValue": 604.39,
  "initialProfitability": 0.01,
  "exchange": "XP INVESTIMENTOS CCTVM S/A",
  "exchangeId": "02332886000104",
  "available": 0.56
},

Warning! The price or the currentValue are from the last processing date of the CEI.

New methods are coming...

Debugging

If you find any strange behavior you can turn on the logs to find out what might be going on. To turn on the logs just pass as second parameter an options object with a property debug = true. e.g

const ceiWrapper = new CeiWrapper(authenticateContext, { debug: true });

// or

const authenticateContext = await CeiWrapper.authenticateUser(
  {
    // authentication params
  },
  { debug: true },
);

this will start logging everything the lib is doing, following example

{"context":{},"level":"info","datetime":"2021-09-21T15:23:53.871Z","message":"LoggerService.info(): Executing http request","extra":{"options":{"url":"https://investidor.b3.com.br/api/sistema/v1/carga/ultima-execucao","method":"GET","headers":{"Authorization":"*sensitive*"}

{"context":{},"level":"error","datetime":"2021-09-21T15:50:45.536Z","message":"LoggerService.error(): The http request result in a status code 4xx or 5xx","extra":{"options":{"url":"https://investidor.b3.com.br/api/sistema/v1/carga/ultima-execucao","method":"GET","headers":{"Authorization":"*sensitive*"},"params":{"cache-guid":"8de6e874-d5e8-45dc-8328-f31f2d29bfed"}},"error":"Request failed with status code 429"}}

{"context":{},"level":"error","datetime":"2021-09-21T15:50:45.542Z","message":"LoggerService.error(): Fail to fetch the latest processing dates from CEI","extra":{"response":{"isError":true,"status":0,"errorMessage":"Failed to fetch request"}}}

making it easier to understand what is going on

Autor

Made by Michael Santillán (Mike) 👋🏽 Say Hi!

License

MIT Licensed. Copyright (c) Michael Santillán 2021.