Saltar al contenido principal

Descripción general

revolution/laravel-fullfeed es un paquete de Laravel que extrae el cuerpo de páginas web para lectores de feeds.
Usando reglas por sitio (JSON), extrae el contenido necesario de cada artículo.
Esta funcionalidad se usaba originalmente en una aplicación privada de lector de feeds y se ha extraído y publicado como paquete.

Requisitos

  • PHP >= 8.4 (usa Dom\HTMLDocument)
  • Laravel >= 12.x

Instalación

composer require revolution/laravel-fullfeed
Para usar la versión de desarrollo:
composer require revolution/laravel-fullfeed:dev-main

Publicar el archivo de configuración y las definiciones de sitios

php artisan vendor:publish --tag=fullfeed
Este comando crea los siguientes elementos:
  • config/fullfeed.php
  • resources/fullfeed

Actualización automática del archivo de definiciones (composer post-update-cmd)

Si quieres que las definiciones de sitios se republiquen automáticamente al ejecutar composer update, añade lo siguiente en composer.json.
{
  "scripts": {
    "post-update-cmd": [
      "@php artisan vendor:publish --tag=laravel-assets --ansi --force",
      "@php artisan vendor:publish --tag=fullfeed-site --ansi --force"
    ]
  }
}

Uso básico

use Revolution\Fullfeed\Facades\FullFeed;

$html = FullFeed::get($url);

Testing

Puedes hacer stub del Facade con FullFeed::expects().
use Revolution\Fullfeed\Facades\FullFeed;

FullFeed::expects('get')
    ->with('https://example.com/article/1')
    ->andReturn('<div>Main content</div>');

Archivos de reglas por sitio

items_all.json

items_all.json es la base para incorporar reglas del formato de LDRFullFeed (wedata).
Livedoor Reader fue un servicio conocido en Japón, pero el propio servicio ya no existe y hoy sobreviven principalmente los datos de reglas como activo. FullFeed aprovecha este formato de datos histórico.

plus.json

plus.json es un ejemplo para añadir reglas propias.
{
  "name": "note",
  "data": {
    "url": "^https://note\\.com/",
    "selector": "div[data-name=\"body\"]",
    "xpath": "//div[@data-name=\"body\"]",
    "enc": "UTF-8",
    "callable": "App\\FullFeed\\CustomExtractor"
  }
}

Campos de configuración de las reglas

  • url: expresión regular que hace match con la URL objetivo
  • selector: selector CSS (tiene prioridad sobre xpath)
  • xpath: expresión XPath
  • enc: codificación cuando se necesita conversión de charset
  • callable: clase Extractor personalizada ejecutada como preprocesado (única o array)
  • after_callable: clase Extractor ejecutada al final como postprocesado

Orden de ejecución de los Extractors como Pipeline

FullFeed encadena los Extractors por orden mediante el patrón Pipeline de Laravel.
  1. Clases indicadas en callable
  2. XPathExtractor
  3. SelectorExtractor
  4. Clases indicadas en after_callable
Como puedes intercalar procesamiento propio antes y después de la extracción simple con XPath/CSS, es fácil adaptarse a las peculiaridades de cada sitio.

Extractors incorporados

RemoveElements

Elimina los elementos que coincidan con el selector indicado.
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\RemoveElements"],
  "remove": ["svg", "button", "script"]
}

ReplaceMatches

Sustituye las cadenas que coincidan con una expresión regular (se aplica sobre la cadena HTML).
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\ReplaceMatches"],
  "replace": [
    {
      "pattern": "/ data-(h-)?index=\"[0-9]+\"/",
      "replace": ""
    }
  ]
}

StripTags

Elimina etiquetas de forma equivalente a strip_tags().
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\StripTags:a,img"]
}

Squish

Elimina espacios en blanco redundantes con Str::squish().
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\Squish"]
}

Añadir reglas propias

  1. Añade un archivo JSON en resources/fullfeed.
  2. Añádelo a paths en config/fullfeed.php.
Como se usa la primera regla que coincida con data.url, se recomienda colocar los archivos adicionales al principio de paths.
Última modificación el 13 de julio de 2026