Ferramentas
Crawler System
Wrapper de alto nível sobre o symfony/dom-crawler para manipulação e extracção de dados de documentos HTML.
Para Que Serve?
O Crawler resolve um problema específico: trabalhar com HTML de fontes externas de forma segura e eficiente. Imagina que recebes emails em HTML que precisas de mostrar no ERP, ou que tens um proxy que exibe páginas externas dentro da aplicação. Em ambos os casos, precisas de:
- Sanitizar: Remover scripts, iframes, e event handlers que podem ser perigosos.
- Manipular: Adicionar atributos, remover elementos, reescrever URLs.
- Extrair: Obter links, imagens, metadados, ou converter para texto simples.
O Crawler fornece uma API fluente para todas estas operações.
Uso Básico
Exemplo Típico
Este exemplo mostra um caso real: receber HTML de um email externo, limpá-lo de conteúdo perigoso, e aplicar lazy loading às imagens para melhorar performance.
use Og\Modules\Common\Facades\Crawler;
// HTML recebido de fonte externa (email, api, etc.)
$htmlExterno = $this->emailService->getBody($emailId);
// Processar com API fluente
$htmlSeguro = Crawler::parse($htmlExterno)
->sanitize() // Remove scripts e event handlers
->removeElements('style, .tracking-pixel') // Remove elementos específicos
->addAttribute('img', 'loading', 'lazy') // Lazy loading em imagens
->addAttribute('a[target="_blank"]', 'rel', 'noopener') // Segurança em links
->html();
return view('emails.show', ['content' => $htmlSeguro]);
Sanitização
A sanitização é crucial quando mostras HTML de fontes não confiáveis. Sem ela, um atacante pode injectar JavaScript malicioso que corre no contexto da tua aplicação — o famoso ataque XSS (Cross-Site Scripting).
O Que o sanitize() Remove?
- • Tags perigosas:
<script>,<iframe>,<object>,<embed> - • Event handlers:
onclick,onload,onerror, etc. - • URLs JavaScript:
href="javascript:..." - • Data URIs em imagens: Podem esconder código malicioso
// Antes: HTML potencialmente perigoso
$html = '<div onclick="alert(1)">Texto</div><script>malicious()</script>';
// Depois: HTML seguro
$safe = Crawler::parse($html)->sanitize()->html();
// Resultado: '<div>Texto</div>'
Reescrita de URLs
Quando crias um proxy de conteúdo (para mostrar páginas externas dentro do ERP, por exemplo), precisas que todos os links e recursos passem pelo teu servidor. O método rewriteUrls() faz isto automaticamente.
Exemplo de Proxy
$proxyBase = 'https://meuapp.com/proxy?url=';
$htmlOriginal = '<a href="https://externo.com/pagina">Link</a>
<img src="https://externo.com/imagem.jpg">';
$htmlProxied = Crawler::parse($htmlOriginal)
->rewriteUrls($proxyBase)
->html();
// Resultado:
// <a href="https://meuapp.com/proxy?url=https://externo.com/pagina">Link</a>
// <img src="https://meuapp.com/proxy?url=https://externo.com/imagem.jpg">
O rewriteUrls() é inteligente: também processa URLs em CSS inline e atributos srcset de imagens responsivas.
Extracção de Dados
Além de manipular, o Crawler também pode extrair informação estruturada do HTML. Isto é útil para web scraping, análise de emails, ou indexação de conteúdo.
Extrair Metadados
Obtém título, descrição, Open Graph e Twitter Cards de uma página.
$meta = Crawler::parse($html)->extractMeta();
// Resultado:
// [
// 'title' => 'Título da Página',
// 'description' => 'Descrição meta...',
// 'og' => [
// 'title' => 'OG Title',
// 'image' => 'https://...',
// ],
// 'twitter' => [...]
// ]
Extrair Links e Imagens
// Todos os links
$links = Crawler::parse($html)->extractLinks();
// [['text' => 'Clique aqui', 'href' => 'https://...', 'rel' => 'noopener'], ...]
// Todas as imagens
$images = Crawler::parse($html)->extractImages();
// [['src' => 'https://...', 'alt' => 'Descrição', 'width' => 800], ...]
// Converter para texto simples (remove todas as tags)
$text = Crawler::parse($html)->toPlainText();