Consultas

Teste de Requisições GET na API do Receita-WS

Validador de CPF | CPNJ

Classe Principal para Requisição


source

Requisicao

 Requisicao (cpf_usuario:Union[str,int], ambiente:str='ds',
             origem:str=None, cache:int=36)

Classe para fazer requisições ao Web Service Receita - WS da Anatel, este encapsula o Infoconv da Receita Federal

Type Default Details
cpf_usuario Union CPF do usuário requisitante
ambiente str ds Ambiente onde realizar a requisição: ds: desenvolvimento, hm: homologação, su: sustentação, pd: produção
origem str None Texto com identificação da requisição: e.g. “Teste”
cache int 36 Tempo de expiração do cache em meses (Produção)

Exemplos

CPF

from fastcore.test import ExceptionExpected, test_eq
cpf_usuario = input('Digite o CPF do solicitante: ')
identificador = input('Digite o CPF a ser consultado')
origem = "Teste REST API"
ambiente = 'ds'
req = Requisicao(cpf_usuario, ambiente, origem)
r = req.consultar(identificador)
del r['cpf'] # Não expõe o CPF no código
r
{'nome': 'Tow Dh Vrmadfgixfxaxqupjkfp',
 'situacaoCadastral.codigo': 8,
 'situacaoCadastral.valor': 'Nula',
 'paisResidencia.residenteExterior': True,
 'paisResidencia.codigoPais': 0,
 'nomeMae': 'Bvgoxicrewhewdrt',
 'dataNascimento': '1917-06-28',
 'sexo.codigo': 2,
 'sexo.valor': 'Feminino',
 'ocupacao.naturezaOcupacaoCodigo': 5,
 'ocupacao.ocupacaoPrincipalCodigo': 966,
 'ocupacao.exercicioOcupacao': 2736,
 'endereco.logradouro': 'Jgp Vjfrvmytkvnnqskehmrg',
 'endereco.numero': '098',
 'endereco.cep': '93700734',
 'endereco.bairro': 'Pahcjbobur',
 'endereco.codigoMunicipio': 3519600,
 'endereco.nomeMunicipio': 'Hobkpc',
 'endereco.uf': 'RO',
 'telefone.ddd': '0025',
 'telefone.numero': '97620714',
 'unidadeAdministrativaCodigo': '7431014',
 'anoObito': 0,
 'estrangeiro': False,
 'tituloEleitor': '0000000000000',
 'dataAtualizacao': '1964-12-23',
 'dataRegistroAnatel': '2022-08-16',
 'resultado': 'CPF encontrado',
 'erro': ''}
cpfs = req.consultar_em_lote([cpf_usuario, identificador])
cpfs = cpfs.map(lambda x: {k:v for k,v in x.items() if k != 'cpf'}) # Não expõe os CPFs
cpfs
(#2) [{'nome': 'Tuwpoxtzyzzruazdjdsqmaewylowhy', 'situacaoCadastral.codigo': 2, 'situacaoCadastral.valor': 'Suspensa', 'paisResidencia.residenteExterior': True, 'paisResidencia.codigoPais': 0, 'nomeMae': 'Sjflu Ifgemqkhdjvpgcjewylowhy', 'dataNascimento': '1937-10-25', 'sexo.codigo': 1, 'sexo.valor': 'Masculino', 'ocupacao.naturezaOcupacaoCodigo': 36, 'ocupacao.ocupacaoPrincipalCodigo': 320, 'ocupacao.ocupacaoPrincipalDescricao': 'Técnico em biologia', 'ocupacao.exercicioOcupacao': 9236, 'endereco.logradouro': 'Viy Emmkgotopwc Yyoamytp', 'endereco.numero': '598', 'endereco.cep': '37377234', 'endereco.bairro': 'Qqukpfkgfti', 'endereco.codigoMunicipio': 2931350, 'endereco.nomeMunicipio': 'Lkgwrl', 'endereco.uf': 'SP', 'telefone.ddd': '0025', 'telefone.numero': '31297214', 'unidadeAdministrativaCodigo': '1008514', 'anoObito': 0, 'estrangeiro': False, 'tituloEleitor': '0000000000000', 'dataAtualizacao': '1962-02-17', 'dataRegistroAnatel': '2022-08-16', 'resultado': 'CPF encontrado', 'erro': ''},{'nome': 'Tow Dh Vrmadfgixfxaxqupjkfp', 'situacaoCadastral.codigo': 8, 'situacaoCadastral.valor': 'Nula', 'paisResidencia.residenteExterior': True, 'paisResidencia.codigoPais': 0, 'nomeMae': 'Bvgoxicrewhewdrt', 'dataNascimento': '1917-06-28', 'sexo.codigo': 2, 'sexo.valor': 'Feminino', 'ocupacao.naturezaOcupacaoCodigo': 5, 'ocupacao.ocupacaoPrincipalCodigo': 966, 'ocupacao.exercicioOcupacao': 2736, 'endereco.logradouro': 'Jgp Vjfrvmytkvnnqskehmrg', 'endereco.numero': '098', 'endereco.cep': '93700734', 'endereco.bairro': 'Pahcjbobur', 'endereco.codigoMunicipio': 3519600, 'endereco.nomeMunicipio': 'Hobkpc', 'endereco.uf': 'RO', 'telefone.ddd': '0025', 'telefone.numero': '97620714', 'unidadeAdministrativaCodigo': '7431014', 'anoObito': 0, 'estrangeiro': False, 'tituloEleitor': '0000000000000', 'dataAtualizacao': '1964-12-23', 'dataRegistroAnatel': '2022-08-16', 'resultado': 'CPF encontrado', 'erro': ''}]
pd.DataFrame(cpfs)
nome situacaoCadastral.codigo situacaoCadastral.valor paisResidencia.residenteExterior paisResidencia.codigoPais nomeMae dataNascimento sexo.codigo sexo.valor ocupacao.naturezaOcupacaoCodigo ... telefone.ddd telefone.numero unidadeAdministrativaCodigo anoObito estrangeiro tituloEleitor dataAtualizacao dataRegistroAnatel resultado erro
0 Tuwpoxtzyzzruazdjdsqmaewylowhy 2 Suspensa True 0 Sjflu Ifgemqkhdjvpgcjewylowhy 1937-10-25 1 Masculino 36 ... 0025 31297214 1008514 0 False 0000000000000 1962-02-17 2022-08-16 CPF encontrado
1 Tow Dh Vrmadfgixfxaxqupjkfp 8 Nula True 0 Bvgoxicrewhewdrt 1917-06-28 2 Feminino 5 ... 0025 97620714 7431014 0 False 0000000000000 1964-12-23 2022-08-16 CPF encontrado

2 rows × 30 columns

CNPJ

CNPJ somente números

req.consultar('00280273000137')
{'cnpj': '00280273000137',
 'matriz': True,
 'nomeEmpresarial': 'Samsung Eletronica da Amazonia Ltda',
 'nomeFantasia': 'Samsung da Amazonia',
 'situacaoCadastral.codigo': '02',
 'situacaoCadastral.valor': 'Ativa',
 'situacaoCadastral.dataAlteracao': '2005-11-03T00:00:00',
 'naturezaJuridica.codigo': '2062',
 'naturezaJuridica.descricao': 'SOCIEDADE EMPRESARIA LIMITADA',
 'dataAbertura': '1994-10-31',
 'cnaePrincipal': '2640000',
 'cnaeSecundario': '1922599|2621300|2622100|2632900|2670102|3313999|4618402|4618499|4645101|4649401|4649402|4649499|4651601|4651602|4652400|5211799|6202300|6203100|7490199|7739002|7739099|8211300|9511800|9512600|9521500|9529199|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000|0000000',
 'endereco.logradouro': 'Av. dos Oitis',
 'endereco.numero': '1460',
 'endereco.complemento': '',
 'endereco.cep': '69007002',
 'endereco.bairro': 'Distrito Industrial Ii',
 'endereco.codigoMunicipio': 1302603,
 'endereco.nomeMunicipio': 'MANAUS',
 'endereco.uf': 'AM',
 'telefone1.ddd': '11',
 'telefone1.numero': '56442800',
 'telefone2.ddd': '11',
 'telefone2.numero': '56442700',
 'email': 'CLEIDE.NERI@SAMSUNG.COM',
 'responsavel.cpf': '70294986235',
 'capitalSocial': '00103840844446',
 'porte.codigo': 5,
 'porte.valor': 'Demais',
 'opcaoSimples.opcaoSimples': False,
 'sociedade.socio': [],
 'dataRegistroAnatel': '2020-01-19',
 'resultado': 'CNPJ encontrado',
 'erro': ''}

CNPJ com separadores

req.consultar('02.030.715/0001-12')
{'cnpj': '02030715000112',
 'matriz': True,
 'nomeEmpresarial': 'H Qyccquxlammrnsnssjydjvwdhlqqhjeaee',
 'nomeFantasia': 'Fwcfey',
 'situacaoCadastral.codigo': '03',
 'situacaoCadastral.valor': 'Suspensa',
 'situacaoCadastral.dataAlteracao': '1938-07-30T00:00:00',
 'naturezaJuridica.codigo': '3525',
 'dataAbertura': '1906-03-01',
 'cnaePrincipal': '9755621',
 'endereco.logradouro': 'Vccqrn H Dctuseqytj8jgkmthhqu[m)oxrvu',
 'endereco.numero': '31',
 'endereco.complemento': "Luug'mettlqhh'",
 'endereco.cep': '81312361',
 'endereco.bairro': 'Ixjxeuy',
 'endereco.codigoMunicipio': 4301073,
 'endereco.nomeMunicipio': 'Ezfakyin',
 'endereco.uf': 'ES',
 'telefone1.ddd': '82',
 'telefone1.numero': '34464555',
 'telefone2.ddd': '82',
 'telefone2.numero': '34463374',
 'email': "rohyx'rgqowo<lxx,bd",
 'responsavel.cpf': '50368609502',
 'responsavel.nome': 'Phj Bg Lzdnugmeinpqdrv',
 'capitalSocial': '1',
 'porte.codigo': 3,
 'porte.valor': 'Empresa de pequeno porte',
 'opcaoSimples.opcaoSimples': False,
 'contador.classificacaoCrcContadorPj': {'codigo': 1, 'valor': 'Profissional'},
 'contador.numeroCrcContadorPj': '342421',
 'contador.cnpjContador': '48250611342422',
 'contador.classficacaoCrcContadorPf': {'codigo': 1, 'valor': 'Profissional'},
 'contador.numeroCrcContadorPf': '232131',
 'contador.cpfContador': '13122131242',
 'sociedade.socio': [],
 'dataRegistroAnatel': '2022-09-14',
 'resultado': 'CNPJ encontrado',
 'erro': ''}

API para consulta em lote


source

requisitar_em_lote

 requisitar_em_lote (filename:str, cpf_usuario:str, ambiente:str='ds',
                     origem:str=None, cache:int=36, saida:str=None)

Lê o arquivo filename com um CPF | CPNJ por linha. Faz a requisição no ambiente do receita-ws e salva os resultados em saida

Type Default Details
filename str Arquivo texto de entrada: 1 CPF | CNPJ por linha
cpf_usuario str CPF do usuário requisitante
ambiente str ds Ambiente onde realizar a requisição: ds | hm | su | pd
origem str None Texto com identificação da requisição: e.g. ‘Teste’
cache int 36 Tempo de expiração do cache em meses
saida str None Arquivo de saída da requisição
Returns None

source

salvar_requisicao

 salvar_requisicao (results:Iterable, saida:str)

Salva a lista de requisições results no arquivo saida

Type Details
results Iterable Lista com o retorno das requisições
saida str Nome do Arquivo de Saída
Returns None

Testes Unitários

Sem string de identificação origem

with ExceptionExpected(ex=AssertionError, regex= 'origem não pode ficar vazio e deve ser uma string de até 30 caracteres'):
    Requisicao(cpf_usuario=cpf_usuario)

origem não é uma string

with ExceptionExpected(ex=AssertionError, regex= 'origem não pode ficar vazio e deve ser uma string de até 30 caracteres'):
    Requisicao(cpf_usuario=cpf_usuario, origem = 50)

ambiente inválido

with ExceptionExpected(ex=AssertionError, regex="Ambiente inválido"):
    Requisicao(cpf_usuario=cpf_usuario, origem='Teste', ambiente='ts')

Teste de formatação da url corretamente de acordo com o ambiente

origem = 'Teste'
for ambiente in AMBIENTE:
    req = Requisicao(cpf_usuario=cpf_usuario, origem=origem, ambiente=ambiente)
    url = req.formatar_url(identificador)
    if ambiente == 'pd': 
        ambiente = ''
    test_eq(url, f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/obterPessoaFisicaIgnoraCacheAntigo?cpf={identificador}&cpfUsuario={cpf_usuario}&mesesExpiraCache=36&origem={origem}')

Teste de ambientes x tipos de requisição

from itertools import product
origem = 'Teste'
cache = 3
for (ambiente, tipo) in product(AMBIENTE, TIPO):
    req = Requisicao(cpf_usuario=cpf_usuario,
                  ambiente=ambiente, 
                  origem=origem, 
                  cache=cache)
    id_ = identificador if tipo == 'cpf' else '02030715000112'
    url = req.formatar_url(id_)
    if ambiente == 'pd': 
        ambiente = ''
    test_eq(url, f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/{TIPO[tipo]}IgnoraCacheAntigo?{tipo}={id_}&cpfUsuario={cpf_usuario}&mesesExpiraCache={cache}&origem={origem}')
origem = 'Teste'
cache = None
for (ambiente, tipo) in product(AMBIENTE, TIPO):
    req = Requisicao(cpf_usuario=cpf_usuario,
                  ambiente=ambiente, 
                  origem=origem, 
                  cache=cache)
    id_ = identificador if tipo == 'cpf' else '02030715000112'
    url = req.formatar_url(id_)
    if ambiente == 'pd': 
        ambiente = ''
    test_eq(url, f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/{TIPO[tipo]}?{tipo}={id_}&cpfUsuario={cpf_usuario}&origem={origem}')