Giter VIP home page Giter VIP logo

tracking-correios's Introduction

tracking-correios

Build Status npm

Módulo para consulta do rastreio de pacotes do Correios. Acessa diretamento a API do Correios (SRO).

Instalação

Requer Node.js e npm instalados.

$ npm install --save tracking-correios

Depois importe no seu código:

// via require do Node.js
const TrackingCorreios = require('tracking-correios')

// ou via ES6
import TrackingCorreios from 'tracking-correios'

Consulta de eventos do código de rastreio

Para consultas de um único código:

// passando como string
TrackingCorreios.track( 'DU897123996BR' )
    .then(console.log)

// ou como Array
TrackingCorreios.track( [ 'DU897123996BR' ] )
    .then(console.log)

> [ {
   "numero":"DU897123996BR",
   "sigla":"DU",
   "nome":"ENCOMENDA E-SEDEX",
   "categoria":"E-SEDEX",
   "evento": [ {
         "tipo":"BDE",
         "status":"01",
         "data":"12/12/2016",
         "hora":"19:06",
         "descricao":"Objeto entregue ao destinatário",
         "recebedor":"",
         "documento":"",
         "comentario":"",
         "local":"CEE BAURU",
         "codigo":"17034972",
         "cidade":"Bauru",
         "uf":"SP"
      }, { ... }, { ... }, { ... }
   ]
} ]

Exemplo de código válido, porém sem rastreio

TrackingCorreios.track([ 'SB231363632BR' ])
    .then(console.log)

> [ {
    numero: 'SB231363632BR',
    erro: 'Objeto não encontrado na base de dados dos Correios.'
} ]

Para consultas de vários códigos simultâneos:

TrackingCorreios.track([ 'DU897123996BR', 'PN273603577BR', 'DU910139445BR' ])
    .then(console.log)

> [
    { numero: 'DU897123996BR',
        sigla: 'DU',
        nome: 'ENCOMENDA E-SEDEX',
        categoria: 'E-SEDEX',
        evento: [ {...}, [Object], [Object], [Object], [Object], [Object] ] },
    { numero: 'PN273603577BR',
        sigla: 'PN',
        nome: 'ENCOMENDA PAC (ETIQ LOGICA)',
        categoria: 'ENCOMENDA PAC',
        evento: [ [Object], [Object], [Object], [Object], [Object], [Object] ] },
    { numero: 'DU910139445BR',
        sigla: 'DU',
        nome: 'ENCOMENDA E-SEDEX',
        categoria: 'E-SEDEX',
        evento: [ [Object], [Object], [Object], [Object], [Object] ] }
  ]

O método track validará automaticamente os objetos, removendo os inválidos:

TrackingCorreios.track([ 'DU897123996BR', 'invalido' ])
    .then(console.log)

> [ {
    "numero":"DU897123996BR",
    "sigla":"DU",
    "nome":"ENCOMENDA E-SEDEX",
    "categoria":"E-SEDEX",
    "evento": [...]
} ]

Se não tiver nenhum objeto válido a Promise rejeitará com TrackingError:

TrackingCorreios.track('invalido')
    .catch(console.log)

> {
    [TrackingError: Erro ao validar os objetos.]
        name: 'TrackingError',
        message: 'Erro ao validar os objetos.',
        type: 'validation_error',
        errors:
        [ { message: 'Nenhum objeto válido para pesquisa.',
            service: 'objects_validation' } ]
  }

Se não quiser filtrar, use a configuração filter:

TrackingCorreios.track('invalido', { filter: false })
    .catch(console.log)

> [ {
    numero: 'invalido',
    erro: 'Objeto não encontrado na base de dados dos Correios.'
} ]

O método track retorna uma Promise, portanto o tratamento de erros deve ser feito pelo .catch. Exemplo de API fora do ar:

TrackingCorreios.track('DU897123996BR')
    .then(console.log)
    .catch(console.log)

> {
    [TrackingError: Erro ao se conectar ao o serviço dos Correios.]
        name: 'TrackingError',
        message: 'Erro ao se conectar com o serviço dos Correios.',
        type: 'system',
        errors:
        [ { message: 'Ocorreu um erro ao se conectar ao serviço dos Correios: request to https://webservice.correios.com.br/service/rastro failed, reason: connect ECONNREFUSED webservice.correios.com.br',
            service: 'service_error' } ]
  }

Pode também passar um objeto de configuração como segundo parâmetro.

// Valores padrão:
TrackingCorreios.track('DU897123996BR', {
        username: "ECT",
        password: "SRO",
        filter: true,
        type: "L",
        result: "T",
        language: "101",
        limit: 5000
    })

Os parâmetros username, password, type, result e language serão enviados a API dos Correios.

O parâmetro limit indica a quantidade máxima de objetos a ser enviado por requisição. Se passar 8 mil objetos e o limite for 5 mil, o módulo fará duas requisições. Se passar mil objetos e o limite for 1, fará mil requisições.

O parâmetro filter indica se deve realizar a filtragem de pacotes válidos antes de acessar a API do Correios.

As requisições não são paralelas, serão realizadas uma após a outra. A Promise só resolverá quando todas as requisições terminarem.

ATENÇÃO!

O usuário padrão do sistema é ECT. Esse é um usuário de testes, por isso tem algumas limitações (#15, #5). Só é possível fazer a consulta de 1 código por vez, e também só 1 evento é retornado. Para adquirir um usuário com mais permissões, é necessário ter um contrato com os Correios: http://www.correios.com.br/solucoes-empresariais/comercio-eletronico/sistema-de-rastreamento-de-objetos.

Validação de objetos

Esse módulo expõe três métodos auxiliares para validação de objetos.

  • isValid: verifica se o tracking é válido seguindo as regras do Correios.
  • filter: retorna somente os objetos válidos.
  • validate: retorna um objeto com os itens válidos e inválidos.

Exemplos:

isValid:

TrackingCorreios.isValid('DU897123996BR')
> true

TrackingCorreios.isValid(['DU897123996BR'])
> false

TrackingCorreios.isValid('AAAAA')
> false

TrackingCorreios.isValid()
> false

Verifica um único objeto por vez. Valida as iniciais também com as conhecidas do correios (veja category). Retorna um boolean.


filter:

TrackingCorreios.filter( 'DU897123996BR' )
> [ 'DU897123996BR' ]

TrackingCorreios.filter( [ 'DU897123996BR' ] )
> [ 'DU897123996BR' ]

TrackingCorreios.filter( [ 'DU897123996BR', 'PN273603577BR', 'DU910139445BR' ] )
> [ 'DU897123996BR', 'PN273603577BR', 'DU910139445BR' ]

TrackingCorreios.filter([ 'DU897123996BR', 'invalid' ])
> [ 'DU897123996BR' ]

TrackingCorreios.filter([ 'invalid', 'AAAA' ])
> [ ]

TrackingCorreios.filter( { } )
> [ ]

Sempre retornará um Array, independente se houver ou não itens válidos.


validate:

TrackingCorreios.validate( 'DU897123996BR' )
> { valid: [ 'DU897123996BR' ], invalid: [ ] }

TrackingCorreios.validate( [ 'DU897123996BR' ] )
> { valid: [ 'DU897123996BR' ], invalid: [ ] }

TrackingCorreios.validate( [ 'DU897123996BR', 'PN273603577BR', 'DU910139445BR' ] )
> {
    valid: [ 'DU897123996BR', 'PN273603577BR', 'DU910139445BR' ],
    invalid: [ ]
  }

TrackingCorreios.validate([ 'DU897123996BR', 'invalid' ])
> {
    valid: [ 'DU897123996BR' ],
    invalid: [ 'invalid' ]
  }

TrackingCorreios.validate([ 'invalid', 'AAAA' ])
> {
    valid: [ ],
    invalid: [ 'invalid', 'AAAA' ]
  }

TrackingCorreios.validate( { } )
> {
    valid: [ ],
    invalid: [ { } ]
  }

Sempre retornará um objeto com os campos valid e invalid.

Categoria do Objeto

O módulo expõe um método para retornar a categoria do objeto: category. Exemplo:

TrackingCorreios.category('DU897123996BR')
> 'e-SEDEX'

TrackingCorreios.category(['PN273603577BR'])
> 'PAC'

TrackingCorreios.category(['AA123123123BR'])
> undefined

TrackingCorreios.category('AAAAA')
> undefined

TrackingCorreios.category()
> undefined

Se não for um código de rastreio válido, retornará undefined.

Inspiração

Arquitetura inspirada no módulo cep-promise de Filipe Deschamps. Queria aprender mais sobre encadeamento de Promises, funções pequenas e vários outros assuntos que ele aborda nesse vídeo, por isso decidi desenvolver esse módulo.

tracking-correios's People

Contributors

alefcarlos avatar dependabot[bot] avatar drieger avatar gabrielboliveira avatar gabrielfiel avatar imakecodes avatar jpbm135 avatar larissathasdefar avatar pauloantoniassi avatar thalescloss avatar vitorebatista avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tracking-correios's Issues

Está retornando invalido para siglas iniciadas em FJ

Estas encomendas são do DETRAN (não encontrei no site dos correios referencia a esta sigla, mas pesquisei com varias pessoas e em todas o rastreamento do detran deles de 2017 está com FJ) , fiz em meu codigo a adição do FJ na lista de validInitials. Sugiro que adicione ela também no projeto.

[Dúvida] Rodar em PHP

Este código esta funcionando em PHP 5, 5.6, 7.0, 7.1 ou até mesmo em 7.2 ?
São muitas dúvidas e nada pessoal... (Já deixo claro)
Este código esta nas normativas novas dos correios (2017) e que pelo visto já existe novas normativas em (2018)...
Bom, este não é o único que visualizamos que aparentemente esta tudo correto.
Mas, tenho que ser este USUÁRIO questionador, já que estamos enfrentando tantos problemas seja eles em PHP, AJAX ou qualquer impulso anterior á 2017.
E assim vem as dúvidas...

Gostaria de saber se podemos implementar este código em outras ferramentas e até mesmo em outas plataformas...

Espero que tenhamos uma resposta satisfatória e um UPGRADE. (O que neste notamos que o upgrade é notavel).

S.O = Centos7 - Plesk
Php = 5.6 / 7.0

Erro ao realizar consulta

Estou recebendo o erro ao rastrear a encomenda de exemplo e outras encomendas
exemplo: PL185055478BR
erro: Unhandled rejection TrackingError: _get(...).map is not a function

Nova sigla retornando inválido DY

Gabriel, seria interessante, aceitar alguma configuração opcional para ele não validar na lista de siglas, se for o desejo do usuário, o que acha dessa feature? Dessa forma, o usuário que desejar validar, poderia continuar usando sua validação, ou apenas realizar a consulta diretamente nos correios e se for inválido teriamos a exception.

Segue um exemplo retornando erro: DY158408516BR.

API retornando apenas primeiro evento

Ola, obrigado por partilhar esta lib.
Por alguma razao API SOAP esta retornando apenas dados do primeiro evento. Entendo que o problema esta no lado dos Correios e foge do escopo desse projeto, mas se descobrirem outro endpoint que liste todos eventos seria de grande valia.

Obrigado!

Eventos incompletos

Olá, estou tendo um problema com o módulo.
Estou fazendo a consulta de 3 códigos de rastreamento, todos validados e retornando os dados corretamente no site dos correios. Quando tento fazer o track, estou apenas recebendo o primeiro evento de somente um dos códigos. Dois deles já foram entregues e um aguarda retirada. O único evento que é retornado é do objeto sendo postado no correio.
Não sei se estou fazendo algo errado, mas acho que talvez tenha acontecido alguma mudança com a API do correio.

Os códigos são:
['JT747052058BR', 'JT747052075BR', 'JT747052101BR']

Obrigado pela atenção.

node-red

Alguma chance de colocar como módulo do node-red?

Objetos invalidos

Estou utlizando 3 codigos de rastreamento nos quais me retornam somente que está invalidos, mas ao pesquisar no site da correios me retorna normalmente o rastro

sabe me dizer o que pode ser?

segue os 3 objetos junto ao código

const objects = TrackingCorreios.validate(['PS707468874BR', 'PS707765532BR', 'PS707901927BR']);
console.log(objects);
{ valid: [], invalid: [ 'PS707468874BR', 'PS707765532BR', 'PS707901927BR' ] }

Recebendo apenas um evento.

Olá! Parabéns pelo trabalho! Gostaria de saber se é normal receber apenas um evento, pois já tentei com dois códigos de rastreio que tem mais de um evento e sempre o pacote me retorna apenas um(evento: [{}]) um array com uma posição apenas. De já, muito obrigado.

Códigos de rastreamento inválidos

Quando tento rastrear objetos com prefixo OJ ou PY, retorna a seguinte mensagem:

Unhandled rejection TrackingError: Erro ao validar os objetos.

Vendo o código, vi em tracking-helpers.js#L4 que tem muitos já mapeados, mas estes não.

Estes prefixos são gerados em autorizações do Correios para o Mercado Livre (desconheço se tem outras plataformas).

Então, esta issue é para gerar um PR para correção, sendo assim, tenho 2 possíveis caminhos:

  1. Adiciona estes novos prefixos definindo o label como: Não mapeado
  2. (não ideal, mas é uma opção) Remover este mapeamento e utilizar um regex validando apenas se é um código do Correios: PY000000000BR

Ou alguma outra sugestão @gabrielboliveira?

Codigos iniciado com OK esta retornando inválidos

Estou usando para atualizar meus envios, e percebi que os codigos iniciados com OK não estão atualizando, fui verificar, e está retornando que "Nenhum objeto válido para pesquisa.' sendo que eles são validos, porem verifiquei que ainda não estão listados pelo correios, aqui um codigo valido: OK243578026BR

Inclusão de usuário e senha de contrato

Tenho uma dúvida:

Eu tenho contrato com os correios, porém, não há suporte para configuração dos mesmo, como posso estar realizando essa configuração?

Abraços.

[Dúvida] Histórico de Eventos

@gabrielboliveira estou testando um código de rastreio e surgiu uma dúvida em relação ao histórico de eventos.

TrackingCorreios.track('DY755678612BR')
  .then(

    (results) => {
      console.log(JSON.stringify(results, null, 2));                
    }

  ).catch(

    (error) => {
      console.error(error);                
    }

  );

Nesse caso, era pra api retornar o todos os eventos do objeto?
Apenas o último evento é retornado:

[
  {
    "numero": "DY755678612BR",
    "sigla": "DY",
    "nome": "ENCOMENDA SEDEX (ETIQ FÍSICA)",
    "categoria": "SEDEX",
    "evento": [
      {
        "tipo": "BDE",
        "status": "01",
        "data": "24/01/2018",
        "hora": "19:16",
        "descricao": "Objeto entregue ao destinatário",
        "local": "CEE SANTO AMARO",
        "codigo": "04754970",
        "cidade": "SAO PAULO",
        "uf": "SP"
      }
    ]
  }
]

Devo utilizar algum outro parâmetro para trazer todo o histórico?

Código de rastreio retornando Não Existente

Beleza ? Primeiro, parabéns pelo pacote :-)

Estou tentando rastrear o código OF019481896 e me retorna que não existe na base dos correios.

Porém consultando via web, retorna o tracking correto.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.