> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel FullFeed

> Paquete de Laravel que extrae el contenido principal de páginas web para lectores de feeds. Aprovecha el patrón Pipeline de Laravel.

## Descripción general

[revolution/laravel-fullfeed](https://github.com/invokable/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.

<Info>
  Esta funcionalidad se usaba originalmente en una aplicación privada de lector de feeds y se ha extraído y publicado como paquete.
</Info>

## Requisitos

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

## Instalación

```bash theme={null}
composer require revolution/laravel-fullfeed
```

Para usar la versión de desarrollo:

```bash theme={null}
composer require revolution/laravel-fullfeed:dev-main
```

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

```bash theme={null}
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`.

```json theme={null}
{
  "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

```php theme={null}
use Revolution\Fullfeed\Facades\FullFeed;

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

## Testing

Puedes hacer stub del Facade con `FullFeed::expects()`.

```php theme={null}
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.

```json theme={null}
{
  "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.

```json theme={null}
{
  "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).

```json theme={null}
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\ReplaceMatches"],
  "replace": [
    {
      "pattern": "/ data-(h-)?index=\"[0-9]+\"/",
      "replace": ""
    }
  ]
}
```

### StripTags

Elimina etiquetas de forma equivalente a `strip_tags()`.

```json theme={null}
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\StripTags:a,img"]
}
```

### Squish

Elimina espacios en blanco redundantes con `Str::squish()`.

```json theme={null}
{
  "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`.


## Related topics

- [Feed Generator](/es/packages/laravel-bluesky/feed-generator.md)
- [Feedable](/es/packages/feedable/index.md)
- [Lista de sitios compatibles - Feedable](/es/packages/feedable/drivers.md)
- [Paquete core y drivers personalizados - Feedable](/es/packages/feedable/core.md)
- [Tutorial de bots - Laravel Bluesky](/es/packages/laravel-bluesky/bot-tutorial.md)
