- 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>
46 lines
2.5 KiB
PHP
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']],
|
|
],
|
|
|
|
];
|