Dica stream via HTTP
Depois da aula "Criando um filtro" do curso "PHP I/O: trabalhando com arquivos e streams" resolvi fazer algo semelhante ao web scraping. Realmente foi uma aula muito muito boa !!
O que é um web scraping ? Seria "raspar" a informação que me interessa de um determinado site.
O problema ! A receita federal disponibilizou em formato aberto dados referentes a CNPJ, esse dados são atualizados a cada 3 meses só que a url estava alterando a cada nova atualização, dificultando as atulizações.
A solução ? usar stream_filter_append do PHP para filtra o que não quero, web scraping. Deixando apenas uma lista de links para downloads ;-) Hooooooo
Problemas técnicos do PHP ;-(
Infelizmente o filesize NÃO funciona com http (testado com PHP 8.1.8) !! Sim isso mesmo não funciona. Nesse momento vc provalmente já clicou na documentação que fala que funciona com Wrapper HTTP e HTTPS.
Sem o filesize fica complicado usar o fread com stream_filter_append.
DIIIIICAAA !!! A solução POG foi usar o strlen com file_get_contents, pronto tudo funcionou !! ;-)
Abaixo o código funcionando !!
<?php
require_once 'filtroHref.class.php';
$url = 'https://www.gov.br/receitafederal/pt-br/assuntos/orientacao-tributaria/cadastros/consultas/dados-publicos-cnpj';
$conteudoTotal = file_get_contents($url);
//POG no PHP 8.1 filesize não funciona com Wrapper HTTP ou HTTPS
$tamanho = strlen($conteudoTotal);
$conteudo = fopen($url, "r");
stream_filter_register('alura.partes',filtroHref::class);
stream_filter_append($conteudo,'alura.partes');
echo fread($conteudo,$tamanho);
<?php
class filtroHref extends php_user_filter
{
public $stream;
public function onCreate(): bool
{
$this->stream = fopen( 'php://temp','w+');
return $this->stream !== false;
}
public function filter($in, $out, &$consumed, bool $closing): int
{
$saida = '';
while($bucket = stream_bucket_make_writeable($in)){
$linhas = explode(PHP_EOL, $bucket->data);
foreach ($linhas as $linha) {
if (stripos($linha, '.zip') !== false){
$saida .= "$linha" . PHP_EOL;
}
}
}
$bucketSaida = stream_bucket_new($this->stream, $saida);
stream_bucket_append($out, $bucketSaida);
return PSFS_PASS_ON;
}
}
Momento propaganda !!
Se vc precisa consultar os dados de CNPJ de receita federal em parceria com várias pessoas do mundo software livre criei um web com PHP para realizar essa consulta. Mais informações no GitHub