from fastcore.test import ExceptionExpected, test_eq
Consultas
Teste de Requisições GET na API do Receita-WS
Validador de CPF | CPNJ
Classe Principal para Requisição
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
= input('Digite o CPF do solicitante: ')
cpf_usuario = input('Digite o CPF a ser consultado')
identificador = "Teste REST API"
origem = 'ds' ambiente
= Requisicao(cpf_usuario, ambiente, origem) req
= req.consultar(identificador) r
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': ''}
= 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
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
'00280273000137') req.consultar(
{'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
'02.030.715/0001-12') req.consultar(
{'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
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 |
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'):
=cpf_usuario) Requisicao(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'):
=cpf_usuario, origem = 50) Requisicao(cpf_usuario
ambiente inválido
with ExceptionExpected(ex=AssertionError, regex="Ambiente inválido"):
=cpf_usuario, origem='Teste', ambiente='ts') Requisicao(cpf_usuario
Teste de formatação da url corretamente de acordo com o ambiente
= 'Teste'
origem for ambiente in AMBIENTE:
= Requisicao(cpf_usuario=cpf_usuario, origem=origem, ambiente=ambiente)
req = req.formatar_url(identificador)
url if ambiente == 'pd':
= ''
ambiente f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/obterPessoaFisicaIgnoraCacheAntigo?cpf={identificador}&cpfUsuario={cpf_usuario}&mesesExpiraCache=36&origem={origem}') test_eq(url,
Teste de ambientes x tipos de requisição
from itertools import product
= 'Teste'
origem = 3
cache for (ambiente, tipo) in product(AMBIENTE, TIPO):
= Requisicao(cpf_usuario=cpf_usuario,
req =ambiente,
ambiente=origem,
origem=cache)
cache= identificador if tipo == 'cpf' else '02030715000112'
id_ = req.formatar_url(id_)
url if ambiente == 'pd':
= ''
ambiente f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/{TIPO[tipo]}IgnoraCacheAntigo?{tipo}={id_}&cpfUsuario={cpf_usuario}&mesesExpiraCache={cache}&origem={origem}') test_eq(url,
= 'Teste'
origem = None
cache for (ambiente, tipo) in product(AMBIENTE, TIPO):
= Requisicao(cpf_usuario=cpf_usuario,
req =ambiente,
ambiente=origem,
origem=cache)
cache= identificador if tipo == 'cpf' else '02030715000112'
id_ = req.formatar_url(id_)
url if ambiente == 'pd':
= ''
ambiente f'http://webservicesintranet{ambiente}.anatel.gov.br/receita/rest/{TIPO[tipo]}?{tipo}={id_}&cpfUsuario={cpf_usuario}&origem={origem}') test_eq(url,