Zum Hauptinhalt springen

Überblick

revolution/laravel-fullfeed ist ein Laravel-Paket, das für Feed-Reader den Fließtext aus Webseiten extrahiert.
Über site-spezifische Regeln (JSON) werden die benötigten Inhalte je Artikel gezogen.
Ursprünglich war das Feature Teil einer privaten Feed-Reader-Anwendung und wurde extrahiert und als öffentliches Paket veröffentlicht.

Voraussetzungen

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

Installation

composer require revolution/laravel-fullfeed
Für die Entwicklungsversion:
composer require revolution/laravel-fullfeed:dev-main

Konfiguration und Site-Definitionen veröffentlichen

php artisan vendor:publish --tag=fullfeed
Dabei werden folgende Elemente erstellt:
  • config/fullfeed.php
  • resources/fullfeed

Automatische Aktualisierung der Definitionsdateien (composer post-update-cmd)

Wenn Sie die Site-Definitionen bei composer update automatisch neu veröffentlichen lassen möchten, fügen Sie in composer.json Folgendes hinzu.
{
  "scripts": {
    "post-update-cmd": [
      "@php artisan vendor:publish --tag=laravel-assets --ansi --force",
      "@php artisan vendor:publish --tag=fullfeed-site --ansi --force"
    ]
  }
}

Grundlegende Verwendung

use Revolution\Fullfeed\Facades\FullFeed;

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

Tests

Mit FullFeed::expects() können Sie die Facade stubben.
use Revolution\Fullfeed\Facades\FullFeed;

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

Site-Regeln-Dateien

items_all.json

items_all.json ist die Basis, um Regeln im LDRFullFeed-Format (wedata) einzubinden.
Livedoor Reader war ein in Japan bekannter Dienst. Der Dienst selbst wurde eingestellt, die Regel-Daten leben aber als Erbe fort. FullFeed nutzt dieses historische Datenformat.

plus.json

plus.json ist eine Beispieldatei für eigene Regeln.
{
  "name": "note",
  "data": {
    "url": "^https://note\\.com/",
    "selector": "div[data-name=\"body\"]",
    "xpath": "//div[@data-name=\"body\"]",
    "enc": "UTF-8",
    "callable": "App\\FullFeed\\CustomExtractor"
  }
}

Felder der Regel-Konfiguration

  • url: Regex zur Zuordnung der Ziel-URL
  • selector: CSS-Selektor (hat Vorrang gegenüber xpath)
  • xpath: XPath-Angabe
  • enc: Encoding, falls eine Zeichensatz-Konvertierung nötig ist
  • callable: Eigene Extractor-Klasse als Vorverarbeitung (einzeln/als Array)
  • after_callable: Extractor-Klasse, die abschließend als Nachbearbeitung läuft

Ausführungsreihenfolge der Extractors als Pipeline

FullFeed lässt die Extractors nacheinander durch das Pipeline-Pattern von Laravel laufen.
  1. Über callable angegebene Klassen
  2. XPathExtractor
  3. SelectorExtractor
  4. Über after_callable angegebene Klassen
Da vor und nach einer einfachen XPath-/CSS-Extraktion eigene Verarbeitung eingefügt werden kann, lässt sich mit dieser Architektur gut auf site-spezifische Eigenheiten reagieren.

Eingebaute Extractors

RemoveElements

Entfernt die Elemente eines angegebenen Selektors.
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\RemoveElements"],
  "remove": ["svg", "button", "script"]
}

ReplaceMatches

Ersetzt per Regex zutreffende Zeichenketten (arbeitet auf dem HTML-String).
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\ReplaceMatches"],
  "replace": [
    {
      "pattern": "/ data-(h-)?index=\"[0-9]+\"/",
      "replace": ""
    }
  ]
}

StripTags

Entfernt Tags analog zu strip_tags().
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\StripTags:a,img"]
}

Squish

Entfernt mit Str::squish() überflüssige Leerzeichen.
{
  "after_callable": ["Revolution\\Fullfeed\\Extractor\\Squish"]
}

Eigene Regeln hinzufügen

  1. Legen Sie in resources/fullfeed eine JSON-Datei an.
  2. Ergänzen Sie sie in config/fullfeed.php unter paths.
Da die erste in data.url zutreffende Regel verwendet wird, empfiehlt es sich, hinzugefügte Dateien am Anfang von paths einzufügen.
Zuletzt geändert am 13. Juli 2026