presseportale/config/feeds.php
Kevin Adametz 44d0bb6f29 web: Abruf-Protokoll der RSS-Feeds — Reader-Dienst, gemeldete Abonnenten, Admin-Bericht, Panel (Roadmap 3.1)
- feed_fetches: jeder Feed-Abruf mit Art, Schlüssel, Portal, Sprache,
  erkanntem Reader (config/feeds.php, FeedReaderIdentifier), vom Dienst
  gemeldeter Abonnentenzahl und gekürztem User-Agent — keine IP. Schreiben
  per defer() nach der Antwort, auch bei Cache-Treffer.
- Aufbewahrung 395 Tage über press-releases:purge-events;
  FEED_FETCHES_RECORDED_SINCE.
- Admin ▸ Reports ▸ Indexierung & Abrufe: Block „Abrufe der RSS-Feeds"
  (Summen je Feed-Art, je Reader-Dienst, meistabgerufene Feeds;
  FeedFetchReport, Verdichtung in PHP für MySQL und SQLite).
- Panel „Auslieferung": Abrufe je Feed in 30 Tagen; RSS-Seite nennt die
  Zählung ohne IP.
- Tests: FeedFetchLogTest (5), IndexStatusCheckTest erweitert.
- dev/2026-09-01: Nachtrag Protokoll Teil 11, Roadmap 3.1; 0.7 gilt auch
  für Crawler- und Feed-Log.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 09:00:09 +00:00

46 lines
2.5 KiB
PHP

<?php
/*
|--------------------------------------------------------------------------
| RSS-Feeds (Roadmap 3.1) — Abruf-Protokoll
|--------------------------------------------------------------------------
|
| Jeder Feed-Abruf wird ohne IP protokolliert (feed_fetches). Der
| Reader-Dienst wird am User-Agent erkannt; `patterns` werden
| case-insensitiv als Teilzeichenkette geprüft, der erste Treffer in
| Reihenfolge der Liste gewinnt. Unbekannte Programme zählen als
| „Sonstige". Die Abonnentenzahl kommt, wenn ein Dienst sie im User-Agent
| nennt („12 subscribers"), sonst bleibt sie leer — es ist eine Angabe des
| Dienstes, keine eigene Zählung.
|
*/
return [
// Ab wann das Protokoll läuft — davor gibt es keine Daten.
'recorded_since' => env('FEED_FETCHES_RECORDED_SINCE', '2026-09-21'),
'readers' => [
'feedly' => ['label' => 'Feedly', 'patterns' => ['Feedly']],
'inoreader' => ['label' => 'Inoreader', 'patterns' => ['Inoreader']],
'newsblur' => ['label' => 'NewsBlur', 'patterns' => ['NewsBlur']],
'feedbin' => ['label' => 'Feedbin', 'patterns' => ['Feedbin']],
'theoldreader' => ['label' => 'The Old Reader', 'patterns' => ['theoldreader']],
'bazqux' => ['label' => 'BazQux', 'patterns' => ['BazQux']],
'netnewswire' => ['label' => 'NetNewsWire', 'patterns' => ['NetNewsWire']],
'reeder' => ['label' => 'Reeder', 'patterns' => ['Reeder']],
'thunderbird' => ['label' => 'Thunderbird', 'patterns' => ['Thunderbird']],
'outlook' => ['label' => 'Outlook', 'patterns' => ['Microsoft Office', 'Outlook']],
'miniflux' => ['label' => 'Miniflux', 'patterns' => ['Miniflux']],
'freshrss' => ['label' => 'FreshRSS', 'patterns' => ['FreshRSS']],
'ttrss' => ['label' => 'Tiny Tiny RSS', 'patterns' => ['Tiny Tiny RSS']],
'nextcloud' => ['label' => 'Nextcloud News', 'patterns' => ['NextCloud-News', 'Nextcloud-News']],
'feeder' => ['label' => 'Feeder', 'patterns' => ['Feeder']],
'rssapp' => ['label' => 'RSS.app', 'patterns' => ['RSS.app', 'rss.app']],
'slack' => ['label' => 'Slack', 'patterns' => ['Slackbot', 'Slack-ImgProxy']],
'wordpress' => ['label' => 'WordPress', 'patterns' => ['WordPress']],
'google-feedfetcher' => ['label' => 'Google FeedFetcher', 'patterns' => ['FeedFetcher-Google']],
'browser' => ['label' => 'Browser', 'patterns' => ['Mozilla/5.0 (Windows', 'Mozilla/5.0 (Macintosh', 'Mozilla/5.0 (X11', 'Mozilla/5.0 (iPhone', 'Mozilla/5.0 (Linux; Android']],
],
];