[
  {
    "path": ".gitignore",
    "content": "/vendor\ncomposer.phar\ncomposer.lock\n.DS_Store\nnbproject/\n/phpunit.xml"
  },
  {
    "path": ".travis.yml",
    "content": "language: php\n\nphp:\n  - 5.5\n  - 5.6\n  - hhvm\n\nbefore_script:\n  - travis_retry composer self-update\n  - travis_retry composer install --dev\n\nscript:\n  - mkdir -p build/logs\n  - vendor/bin/phpunit -c phpunit.xml.dist --verbose\n"
  },
  {
    "path": "README.md",
    "content": "# CNPJ Grátis\n[![Travis](https://travis-ci.org/jansenfelipe/cnpj-gratis.svg?branch=2.0)](https://travis-ci.org/jansenfelipe/cnpj-gratis)\n[![Latest Stable Version](https://poser.pugx.org/jansenfelipe/cnpj-gratis/v/stable.svg)](https://packagist.org/packages/jansenfelipe/cnpj-gratis) \n[![Total Downloads](https://poser.pugx.org/jansenfelipe/cnpj-gratis/downloads.svg)](https://packagist.org/packages/jansenfelipe/cnpj-gratis) \n[![Latest Unstable Version](https://poser.pugx.org/jansenfelipe/cnpj-gratis/v/unstable.svg)](https://packagist.org/packages/jansenfelipe/cnpj-gratis)\n[![MIT license](https://poser.pugx.org/jansenfelipe/nfephp-serialize/license.svg)](http://opensource.org/licenses/MIT)\n\nCom esse pacote você poderá realizar consultas de CNPJ no site da Receita Federal do Brasil gratuitamente.\n\nAtenção: Esse pacote não possui leitor de captcha, mas captura o mesmo para ser digitado pelo usuário\n\n### Changelog\n\n* 2.1.1 - Bugfix: Atualização site receita. Obrigado @fernandobatels\n* 2.1.0 - Removendo dependências extras e versão mínima PHP 5.5\n* 2.0.8 - Bugfix: Campo telefone quando não informado. Obrigado @mprandot\n* 2.0.7 - Bugfix: Atualização site receita. Obrigado @Marciobds\n\n### Como utilizar\n\nAdicione a library\n\n```sh\n$ composer require jansenfelipe/cnpj-gratis\n```\n\nAdicione o autoload.php do composer no seu arquivo PHP.\n\n```php\nrequire_once 'vendor/autoload.php';  \n```\n\nPrimeiro chame o método `getParams()` para retornar os dados necessários para enviar no método `consulta()` \n\n```php\n$params = JansenFelipe\\CnpjGratis\\CnpjGratis::getParams();\n```\n\nAgora basta chamar o método `consulta()`\n\n```php\n$dadosEmpresa = JansenFelipe\\CnpjGratis\\CnpjGratis::consulta(\n    '45.543.915/0001-81',\n    'INFORME_AS_LETRAS_DO_CAPTCHA',\n    $params['cookie']\n);\n```\n\n### Gostou? Conheça também\n\n* [CpfGratis](https://github.com/jansenfelipe/cpf-gratis)\n* [CepGratis](https://github.com/jansenfelipe/cep-gratis)\n* [CidadesGratis](https://github.com/jansenfelipe/cidades-gratis)\n* [NFePHPSerialize](https://github.com/jansenfelipe/nfephp-serialize)\n\n### License\n\nThe MIT License (MIT)\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"jansenfelipe/cnpj-gratis\",\n    \"description\": \"Com esse pacote você poderá consultar, gratuitamente, CNPJs diretamente no site da receita.\",\n    \"keywords\": [\"consulta\", \"receita\", \"cnpj\", \"php\"],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jansen Felipe\",\n            \"email\": \"jansen.felipe@gmail.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \">=5.5\",\n        \"symfony/dom-crawler\": \"^3.2\",\n        \"symfony/css-selector\": \"^3.2\",\n        \"ext-gd\":\"*\",\n        \"ext-curl\":\"*\",\n        \"jansenfelipe/utils\": \"^2.0\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"~4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"JansenFelipe\\\\CnpjGratis\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"2.1-dev\"\n        }\n    },\n     \"suggest\": {\n        \"jansenfelipe/cpf-gratis\": \"Permite consulta de CPF no site da receita\",\n        \"jansenfelipe/cep-gratis\": \"Permite consulta de CEP no site dos Correios\"\n    },\n    \"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "example/index.php",
    "content": "<?php\n\nrequire_once '../vendor/autoload.php';\n\nuse JansenFelipe\\CnpjGratis\\CnpjGratis;\n\n\nif(isset($_POST['captcha']) && isset($_POST['cookie']) && isset($_POST['cnpj'])){\n    $dados = CnpjGratis::consulta($_POST['cnpj'], $_POST['captcha'], $_POST['cookie']);\n    var_dump($dados);\n    die;\n}else\n    $params = CnpjGratis::getParams();\n?>\n\n<img src=\"data:image/png;base64,<?php echo $params['captchaBase64'] ?>\" />\n\n<form method=\"POST\">\n    <input type=\"hidden\" name=\"cookie\" value=\"<?php echo $params['cookie'] ?>\" />\n\n    <input type=\"text\" name=\"captcha\" placeholder=\"Captcha\" />\n    <input type=\"text\" name=\"cnpj\" placeholder=\"CNPJ\" />\n\n    <button type=\"submit\">Consultar</button>\n</form>"
  },
  {
    "path": "formTest.php",
    "content": "<?php\nrequire 'vendor/autoload.php';\n\nif (isset($_POST['cnpj'])) {\n    var_dump(\\JansenFelipe\\CnpjGratis\\CnpjGratis::consulta($_POST['cnpj'], $_POST['captcha'], $_POST['cookie']));\n    die;\n}\n\n$cnpj = '45543915000858';\n\n$params = \\JansenFelipe\\CnpjGratis\\CnpjGratis::getParams();\n\n?>\n\n\n<img src=\"<?php echo $params['captchaBase64']; ?>\" /><br />\n\n<form action=\"\" method=\"POST\">\n    <input type=\"text\" name=\"cnpj\" value=\"<?php echo $cnpj; ?>\" />\n    <input type=\"text\" name=\"captcha\" />\n    <input type=\"text\" name=\"cookie\" value=\"<?php echo $params['cookie']; ?>\" />\n    <input type=\"submit\" />\n</form>\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit \n    colors=\"true\" \n    bootstrap=\"vendor/autoload.php\">\n    \n    <testsuites>\n        <testsuite name=\"CnpjGratis Test\">\n            <directory suffix=\".php\">./tests</directory>\n        </testsuite>\n    </testsuites>\n  \n    <filter>\n        <whitelist processUncoveredFilesFromWhitelist=\"true\">\n            <directory suffix=\".php\">./src</directory>\n            <exclude>\n                <directory suffix=\".php\">./vendor/</directory>\n            </exclude>\n        </whitelist>\n    </filter>\n  \n</phpunit>"
  },
  {
    "path": "src/CnpjGratis.php",
    "content": "<?php\n\nnamespace JansenFelipe\\CnpjGratis;\n\nuse Exception;\nuse JansenFelipe\\Utils\\Utils as Utils;\nuse Symfony\\Component\\DomCrawler\\Crawler;\n\nclass CnpjGratis {\n\n    /**\n     * Metodo para capturar o captcha e cookie para enviar no metodo de consulta\n     *\n     * @throws Exception\n     * @return array Retorna Cookie e CaptchaBase64\n     */\n    public static function getParams()\n    {\n        $data = self::request('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp');\n\n        $cookie = $data['headers']['Set-Cookie'];\n\n        $image = self::request('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp', [], [\n            \"Pragma: no-cache\",\n            \"Origin: http://www.receita.fazenda.gov.br\",\n            \"Host: www.receita.fazenda.gov.br\",\n            \"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0\",\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n            \"Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3\",\n            \"Accept-Encoding: gzip, deflate\",\n            \"Referer: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/cnpjreva_solicitacao2.asp\",\n            \"Cookie: flag=1; $cookie\",\n            \"Connection: keep-alive\"\n        ]);\n\n        if(@imagecreatefromstring($image['response'])==false)\n            throw new Exception('Não foi possível capturar o captcha');\n\n        return array(\n            'cookie' => $cookie,\n            'captchaBase64' => base64_encode($image['response'])\n        );\n    }\n\n    /**\n     * Metodo para realizar a consulta\n     *\n     * @param  string $cnpj CNPJ\n     * @param  string $captchaSolved CAPTCHA\n     * @param  string $cookie COOKIE\n     * @throws Exception\n     * @return array  Dados da empresa\n     */\n    public static function consulta($cnpj, $captchaSolved, $cookie)\n    {\n        $result = array();\n\n        if (!Utils::isCnpj($cnpj))\n            throw new Exception('O CNPJ informado não é válido');\n\n        $headers = [\n            \"Host: www.receita.fazenda.gov.br\",\n            \"User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:32.0) Gecko/20100101 Firefox/32.0\",\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n            \"Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3\",\n            \"Accept-Encoding: gzip, deflate\",\n            \"Referer: http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp\",\n            \"Cookie: $cookie\",\n            \"Connection: keep-alive\"\n        ];\n\n        $params = [\n            'origem' => 'comprovante',\n            'cnpj' => Utils::unmask($cnpj),\n            'txtTexto_captcha_serpro_gov_br' => $captchaSolved,\n            'submit1' => 'Consultar',\n            'search_type' => 'cnpj'\n        ];\n\n        $data = self::request('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp', $params, $headers);\n\n        $crawler = new Crawler($data['response']);\n\n        if (strpos($crawler->html(), '<b>Erro na Consulta</b>') !== false)\n        {\n            throw new Exception('Erro ao consultar. Confira se você digitou corretamente os caracteres fornecidos na imagem.', 98);\n        }\n\n        if ($crawler->filter('body > table:nth-child(3) font:nth-child(1)')->count() > 0)\n            throw new Exception('Erro ao consultar. O CNPJ informado não existe no cadastro.', 99);\n\n        $td = $crawler->filter('body > div > table:nth-child(1)');\n\n        foreach ($td->filter('td') as $td) {\n            $td = new Crawler($td);\n\n            if ($td->filter('font:nth-child(1)')->count() > 0) {\n                $key = trim(strip_tags(preg_replace('/\\s+/', ' ', $td->filter('font:nth-child(1)')->html())));\n\n                switch ($key) {\n                    case 'NOME EMPRESARIAL': $key = 'razao_social';\n                        break;\n                    case 'TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)': $key = 'nome_fantasia';\n                        break;\n                    case 'CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL': $key = 'cnae_principal';\n                        break;\n                    case 'CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS': $key = 'cnaes_secundario';\n                        break;\n                    case 'CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA' : $key = 'natureza_juridica';\n                        break;\n                    case 'LOGRADOURO': $key = 'logradouro';\n                        break;\n                    case 'NÚMERO': $key = 'numero';\n                        break;\n                    case 'COMPLEMENTO': $key = 'complemento';\n                        break;\n                    case 'CEP': $key = 'cep';\n                        break;\n                    case 'BAIRRO/DISTRITO': $key = 'bairro';\n                        break;\n                    case 'MUNICÍPIO': $key = 'cidade';\n                        break;\n                    case 'UF': $key = 'uf';\n                        break;\n                    case 'SITUAÇÃO CADASTRAL': $key = 'situacao_cadastral';\n                        break;\n                    case 'DATA DA SITUAÇÃO CADASTRAL': $key = 'situacao_cadastral_data';\n                        break;\n                    case 'MOTIVO DE SITUAÇÃO CADASTRAL': $key = 'motivo_situacao_cadastral';\n                        break;\n                    case 'SITUAÇÃO ESPECIAL': $key = 'situacao_especial';\n                        break;\n                    case 'DATA DA SITUAÇÃO ESPECIAL': $key = 'situacao_especial_data';\n                        break;\n                    case 'TELEFONE': $key = 'telefone';\n                        break;\n                    case 'ENDEREÇO ELETRÔNICO': $key = 'email';\n                        break;\n                    case 'ENTE FEDERATIVO RESPONSÁVEL (EFR)': $key = 'ente_federativo_responsavel';\n                        break;\n                    case 'DATA DE ABERTURA': $key = 'data_abertura';\n                        break;\n                    default: $key = null;\n                        break;\n                }\n\n\n                if (!is_null($key)) {\n                    $bs = $td->filter('font > b');\n                    foreach ($bs as $b) {\n                        $b = new Crawler($b);\n\n                        $str = trim(preg_replace('/\\s+/', ' ', $b->html()));\n                        $attach = htmlspecialchars_decode($str);\n\n                        if ($bs->count() == 1)\n                            $result[$key] = $attach;\n                        else\n                            $result[$key][] = $attach;\n                    }\n                }\n            }\n        }\n\n        if(isset($result['telefone']) && $result['telefone'] != '') {\n            $posBarra = strpos($result['telefone'], '/');\n            if ($posBarra > 0) {\n                $result['telefone2'] = substr($result['telefone'], $posBarra + 1, strlen($result['telefone']) - $posBarra);\n                $result['telefone'] = substr($result['telefone'], 0, $posBarra - 1);\n            }\n        }\n\n        return $result;\n    }\n\n    /**\n     * Send request\n     *\n     * @param $uri\n     * @param array $data\n     * @param array $headers\n     *\n     * @return array\n     */\n    private static function request($uri, array $data = [], array $headers = [])\n    {\n        $curl = curl_init();\n\n        curl_setopt_array($curl, [\n            CURLOPT_URL            => $uri,\n            CURLOPT_RETURNTRANSFER => true,\n            CURLOPT_HTTPHEADER => $headers,\n            CURLOPT_HEADER => 1,\n            CURLOPT_SSL_VERIFYPEER => false,\n            CURLOPT_SSL_VERIFYHOST => false,\n            CURLOPT_FOLLOWLOCATION => true,\n            CURLOPT_TIMEOUT_MS     => 30000\n        ]);\n\n        if (!empty($data)) {\n            curl_setopt($curl, CURLOPT_POST, true);\n            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));\n        }\n\n        $response = curl_exec($curl);\n\n        $size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);\n\n        curl_close($curl);\n\n        $headers = [];\n\n        foreach (explode(PHP_EOL, substr($response, 0, $size)) as $i)\n        {\n            $t = explode(':', $i, 2);\n            if(isset($t[1]))\n                $headers[trim($t[0])] = trim($t[1]);\n        }\n\n        $response = substr($response, $size);\n\n        return compact('response', 'headers');\n    }\n}\n"
  },
  {
    "path": "tests/CnpjGratisTest.php",
    "content": "<?php\n\nnamespace JansenFelipe\\CnpjGratis;\n\nuse PHPUnit_Framework_TestCase;\n\nclass CnpjGratisTest extends PHPUnit_Framework_TestCase {\n\n    private $params;\n\n    public function testGetParams() {\n\n        $this->params = CnpjGratis::getParams();\n                \n        $this->assertEquals(true, isset($this->params['captchaBase64']));\n        $this->assertEquals(true, isset($this->params['cookie']));\n    }\n\n}\n"
  }
]