├── .gitattributes ├── .gitignore ├── README.md ├── cookies └── leiame.txt ├── funcoes.php ├── getcaptcha.php ├── index.php └── processa.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Consultas_CNPJ_CPF_Receita_Federal 2 | Consulta CNPJ e CPF na Receita com Captcha 3 | 4 | ## Utilização 5 | 6 | ### index.php 7 | 8 | Basta digitar os campos CNPJ + Captcha , ou CPF + Data de Nascimanto + Captcha Para consulta os registros na Receita Federal 9 | 10 | Especial atenção para a pasta cookies, pois é lá que serão salvos os cookies de sessão com a Receita Federal. A constante COOKIELOCAL devem apontar para a sua localização. 11 | 12 | ## Recomendações 13 | 14 | Ao Utilizar esta solução em sua aplicação, recomendo o tratamento dos campos de formulário $_GET , $_POST ,afim de evitar possiveis injections em suas aplicações 15 | 16 | ## Autor 17 | 18 | Marcos Peli: [facebook.com/pelimarcos][facebook] 19 | 20 | ## Licensa 21 | 22 | Licensa [MIT][mit]. Aproveite 23 | 24 | [facebook]: https://www.facebook.com/pelimarcos 25 | [mit]: http://www.opensource.org/licenses/mit-license.php 26 | 27 | -------------------------------------------------------------------------------- /cookies/leiame.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Massa191/Consultas_CNPJ_CPF_Receita_Federal/6262af1815c5ccd3a3466d5e1d5d23f84d68d801/cookies/leiame.txt -------------------------------------------------------------------------------- /funcoes.php: -------------------------------------------------------------------------------- 1 | 'comprovante', 80 | 'cnpj' => $cnpj, 81 | 'txtTexto_captcha_serpro_gov_br'=> $captcha, 82 | 'search_type' => 'cnpj' 83 | 84 | ); 85 | 86 | $post = http_build_query($post, NULL, '&'); 87 | 88 | // prepara headers da consulta 89 | $headers = array( 90 | 'Host: servicos.receita.fazenda.gov.br', 91 | 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 92 | 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 93 | 'Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7', 94 | 'Connection: keep-alive', 95 | 'Upgrade-Insecure-Requests: 1', 96 | ); 97 | 98 | $ch = curl_init('http://servicos.receita.fazenda.gov.br/Servicos/cnpjreva/valida.asp'); 99 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 100 | curl_setopt($ch, CURLOPT_POST, true); 101 | curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário 102 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie 103 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie 104 | curl_setopt($ch, CURLOPT_COOKIE, $cookie); // dados de sessão e flag=1 105 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 106 | curl_setopt($ch, CURLOPT_MAXREDIRS, 3); 107 | curl_setopt($ch, CURLOPT_REFERER, 'http://servicos.receita.fazenda.gov.br/Servicos/cnpjreva/Cnpjreva_Solicitacao_CS.asp'); 108 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 109 | $html = curl_exec($ch); 110 | curl_close($ch); 111 | return $html; 112 | } 113 | 114 | // função para pegar a resposta html da consulta pelo CPF na página da receita 115 | function getHtmlCPF($cpf, $datanascim, $captcha) 116 | { 117 | $url = 'https://servicos.receita.fazenda.gov.br/Servicos/CPF/ConsultaSituacao/ConsultaPublicaExibir.asp'; // nova URL 24/marco/2020 para consulta CPF 118 | 119 | $cookieFile = COOKIELOCAL.'cpf_'.session_id(); 120 | if(!file_exists($cookieFile)) 121 | { 122 | return false; 123 | } 124 | else 125 | { 126 | // pega os dados de sessão gerados na visualização do captcha dentro do cookie 127 | $file = fopen($cookieFile, 'r'); 128 | while (!feof($file)) 129 | {$conteudo .= fread($file, 1024);} 130 | fclose ($file); 131 | 132 | $linha = explode("\n",$conteudo); 133 | 134 | // monta o cookie com os dados da sessão 135 | for($contador = 4; $contador < count($linha)-1; $contador++) 136 | { 137 | $explodir = explode(chr(9),$linha[$contador]); 138 | $cookie .= trim($explodir[count($explodir)-2])."=".trim($explodir[count($explodir)-1])."; "; 139 | } 140 | 141 | // acerta o cookie a ser enviado com os dados da sessão 142 | $cookie = substr($cookie,0,-2); 143 | 144 | } 145 | 146 | // dados que serão submetidos a consulta por post 147 | $post = array 148 | ( 149 | 'txtTexto_captcha_serpro_gov_br' => $captcha, 150 | 'txtCPF' => $cpf, 151 | 'txtDataNascimento' => $datanascim, 152 | 'Enviar' => 'Consultar', 153 | 'CPF' => '', 154 | 'NASCIMENTO' => '' 155 | ); 156 | $post = http_build_query($post, NULL, '&'); 157 | 158 | // prepara headers da consulta 159 | $headers = array( 160 | 'Host: servicos.receita.fazenda.gov.br', 161 | 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 162 | 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 163 | 'Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3', 164 | 'Connection: keep-alive', 165 | 'Upgrade-Insecure-Requests: 1', 166 | ); 167 | $ch = curl_init($url); 168 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 169 | curl_setopt($ch, CURLOPT_POST, true); 170 | curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário 171 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie 172 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie 173 | curl_setopt($ch, CURLOPT_COOKIE, $cookie); // continua a sessão anterior com os dados do captcha 174 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 175 | curl_setopt($ch, CURLOPT_MAXREDIRS, 3); 176 | curl_setopt($ch, CURLOPT_REFERER, 'https://servicos.receita.fazenda.gov.br/Servicos/CPF/ConsultaSituacao/ConsultaPublicaSonoro.asp?CPF=&NASCIMENTO='); // Novo Referer 24/Fev/2020 177 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 178 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 179 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 180 | 181 | $html = curl_exec($ch); 182 | curl_close($ch); 183 | return $html; 184 | } 185 | 186 | // Função para extrair o que interessa da HTML e colocar em array 187 | function parseHtmlCNPJ($html) 188 | { 189 | // respostas que interessam 190 | $campos = array( 191 | 'NÚMERO DE INSCRIÇÃO', 192 | 'DATA DE ABERTURA', 193 | 'NOME EMPRESARIAL', 194 | 'TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)', 195 | 'PORTE', 196 | 'CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL', 197 | 'CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS', 198 | 'CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA', 199 | 'LOGRADOURO', 200 | 'NÚMERO', 201 | 'COMPLEMENTO', 202 | 'CEP', 203 | 'BAIRRO/DISTRITO', 204 | 'MUNICÍPIO', 205 | 'UF', 206 | 'ENDEREÇO ELETRÔNICO', 207 | 'TELEFONE', 208 | 'ENTE FEDERATIVO RESPONSÁVEL (EFR)', 209 | 'SITUAÇÃO CADASTRAL', 210 | 'DATA DA SITUAÇÃO CADASTRAL', 211 | 'MOTIVO DE SITUAÇÃO CADASTRAL', 212 | 'SITUAÇÃO ESPECIAL', 213 | 'DATA DA SITUAÇÃO ESPECIAL'); 214 | // caracteres que devem ser eliminados da resposta 215 | $caract_especiais = array( 216 | chr(9), 217 | chr(10), 218 | chr(13), 219 | ' ', 220 | '', 221 | ' ', 222 | 'MATRIZ
', 223 | 'FILIAL
' 224 | ); 225 | // prepara a resposta para extrair os dados 226 | $html = str_replace('
','',str_replace($caract_especiais,'',strip_tags($html,'
'))); 227 | $html = str_replace(' ','',$html); 228 | $html3 = $html; 229 | // faz a extração 230 | for($i=0;$i','
',$html2)); 234 | $html=$html2; 235 | } 236 | // extrai os CNAEs secundarios , quando forem mais de um 237 | if(strstr($resultado[6],'')) 238 | { 239 | $cnae_secundarios = explode('',$resultado[6]); 240 | $resultado[6] = $cnae_secundarios; 241 | unset($cnae_secundarios); 242 | } 243 | // devolve STATUS da consulta correto 244 | if(!$resultado[0]) 245 | { 246 | if(strstr($html3,utf8_decode('O número do CNPJ não é válido'))) 247 | {$resultado['status'] = 'CNPJ incorreto ou não existe';} 248 | else 249 | {$resultado['status'] = 'Imagem digitada incorretamente';} 250 | } 251 | else 252 | {$resultado['status'] = 'OK';} 253 | 254 | return $resultado; 255 | } 256 | // Função para extrair o que interessa da HTML e colocar em array 257 | function parseHtmlCPF($html) 258 | { 259 | // respostas que interessam 260 | $campos = array( 261 | 'No do CPF: ', 262 | 'Nome: ', 263 | 'Data de Nascimento: ', 264 | 'Cadastral: ', 265 | 'Data da Inscrição: ' 266 | ); 267 | // para utilizar na hora de devolver o status da consulta 268 | $html3 = $html; 269 | // faz a extração 270 | for($i=0;$i',$html2)); 274 | $html=$html2; 275 | } 276 | 277 | // devolve STATUS da consulta correto 278 | if(!$resultado[0]) 279 | { 280 | if(strstr($html3,'CPF incorreto')) 281 | {$resultado['status'] = 'CPF incorreto';} 282 | else if(strstr($html3,'não existe em nossa base de dados')) 283 | {$resultado['status'] = 'CPF não existe';} 284 | else if(strstr($html3,'Os caracteres da imagem não foram preenchidos corretamente')) 285 | {$resultado['status'] = 'Imagem digitada incorretamente';} 286 | else if(strstr($html3,'Data de nascimento informada')) 287 | {$resultado['status'] = 'Data de Nascimento divergente';} 288 | else 289 | {$resultado['status'] = 'Receita não responde';} 290 | } 291 | else 292 | {$resultado['status'] = 'OK';} 293 | return $resultado; 294 | } 295 | ?> -------------------------------------------------------------------------------- /getcaptcha.php: -------------------------------------------------------------------------------- 1 |  '', // aqui vai o HOST da consulta conforme a necessidade (CPF ou CNPJ) 17 | 1 => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0', 18 | 2 => 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 19 | 3 => 'Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7', 20 | 4 => 'Connection: keep-alive', 21 | 5 => 'Upgrade-Insecure-Requests: 1' 22 | ); 23 | 24 | // urls para obtenção dos dados 25 | $url['cpf'] = 'https://servicos.receita.fazenda.gov.br/Servicos/CPF/ConsultaSituacao/ConsultaPublicaSonoro.asp'; 26 | $url_captcha['cpf'] = 'https://servicos.receita.fazenda.gov.br/Servicos/CPF/ConsultaSituacao/ConsultaPublicaSonoro.asp'; 27 | $host['cpf'] = 'servicos.receita.fazenda.gov.br'; 28 | 29 | $url['cnpj'] = 'http://servicos.receita.fazenda.gov.br/Servicos/cnpjreva/Cnpjreva_Solicitacao_CS.asp'; 30 | $url_captcha['cnpj'] = 'http://servicos.receita.fazenda.gov.br/Servicos/cnpjreva/captcha/gerarCaptcha.asp'; 31 | $host['cnpj'] = 'servicos.receita.fazenda.gov.br'; 32 | 33 | // percorre os arrays fazendo as chamadas de CNPJ e CPF: $key é o tipo de chamada 34 | foreach ($url as $key => $value) 35 | { 36 | // define o hosts a ser usado no header da chamada curl conforme $key 37 | $headers[0] = $host[$key]; 38 | 39 | // define o nome do arquivo de cookie a ser usado para cada chamada conforme $key 40 | $cookieFile = COOKIELOCAL.$key.'_'.session_id(); 41 | 42 | // cria o arquivo se ele não existe 43 | if(!file_exists($cookieFile)) 44 | { 45 | $file = fopen($cookieFile, 'w'); 46 | fclose($file); 47 | } 48 | else 49 | { 50 | // pega os dados de sessão gerados na visualização do captcha dentro do cookie 51 | $file = fopen($cookieFile, 'r'); 52 | while (!feof($file)) 53 | {$conteudo .= fread($file, 1024);} 54 | fclose ($file); 55 | 56 | $linha = explode("\n",$conteudo); 57 | 58 | // monta o cookie com os dados da sessão 59 | for($contador = 4; $contador < count($linha)-1; $contador++) 60 | { 61 | $explodir = explode(chr(9),$linha[$contador]); 62 | $cookie[$key] .= trim($explodir[count($explodir)-2])."=".trim($explodir[count($explodir)-1])."; "; 63 | } 64 | 65 | // acerta o cookie a ser enviado com os dados da sessão 66 | $cookie[$key] = substr($cookie[$key],0,-2); 67 | } 68 | 69 | $ch = curl_init($value); 70 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 71 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); 72 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); 73 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 74 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 75 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 76 | $result = curl_exec($ch); 77 | curl_close($ch); 78 | 79 | // trata os resultados da consulta curl 80 | 81 | if($key == 'cnpj') 82 | { 83 | // pega os dados de sessão gerados nas primeiras chamadas e que estão dentro do cookie 84 | $file = fopen($cookieFile, 'r'); 85 | while (!feof($file)) 86 | {$conteudo .= fread($file, 1024);} 87 | fclose ($file); 88 | 89 | $linha = explode("\n",$conteudo); 90 | 91 | // monta o cookie com os dados da sessão 92 | for($contador = 4; $contador < count($linha)-1; $contador++) 93 | { 94 | $explodir = explode(chr(9),$linha[$contador]); 95 | $cookie[$key] .= trim($explodir[count($explodir)-2])."=".trim($explodir[count($explodir)-1])."; "; 96 | } 97 | 98 | // acerta o cookie a ser enviado com os dados da sessão 99 | $cookie[$key] = substr($cookie[$key],0,-2); 100 | 101 | // faz segunda chamada para pegar o captcha 102 | $ch = curl_init($url_captcha[$key]); 103 | 104 | // continua setando parâmetros da chamada curl 105 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // headers da chamada 106 | curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie 107 | curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie 108 | curl_setopt($ch, CURLOPT_COOKIE, $cookie[$key]); // cookie com os dados da sessão 109 | curl_setopt($ch, CURLOPT_REFERER, $value); // refer = url da chamada anterior 110 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 111 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // para consulta de CPF, necessário devido SSL (https), para CNPJ este parametro não interfere na consulta 112 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 113 | $result = curl_exec($ch); 114 | curl_close($ch); 115 | 116 | } 117 | 118 | // extrai resultados conforme $key 119 | if($key == 'cnpj') 120 | {$imagem_cnpj = 'data:image/png;base64,'.base64_encode($result);} 121 | else if($key == 'cpf') 122 | { 123 | 124 | // Pega Imagem Captcha 125 | $doc = new DOMDocument(); 126 | @$doc->loadHTML($result); 127 | 128 | $tags = $doc->getElementsByTagName('img'); 129 | $count = 0; 130 | foreach ($tags as $tag) 131 | { 132 | $count++; 133 | 134 | if($tag->getAttribute('id') == "imgCaptcha") 135 | {$imagem_cpf = $tag->getAttribute('src');} 136 | 137 | } 138 | 139 | } 140 | 141 | } 142 | ?> -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | 16 | CNPJ , CPF e Captcha 17 | 18 | 19 | 20 | 21 |
22 |

CNPJ e Captcha 23 |
24 | 25 | CNPJ 26 |
27 | 28 |
29 | 30 | O que vê na imagem acima? 31 |
32 |

33 |

34 | 35 |

36 |

37 | _____________________________________________________ 38 |

39 |
40 | 41 | 42 |
43 |

CPF e Captcha 44 |
45 | 46 | CPF xxx.xxx.xxx-xx 47 |
48 | 49 | Data Nascim. dd/mm/aaaa 50 |
51 | 52 |
53 | 54 | O que vê na imagem acima? 55 |
56 |

57 |

58 | 59 |

60 |

61 | _____________________________________________________ 62 |

63 | 64 |
65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /processa.php: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------