Abrufe öffentlicher Meldungen durch bekannte Such- und KI-Dienste werden je Meldung mit Dienst, gekürztem User-Agent und Zeitpunkt protokolliert — keine IP. Dienste und Muster stehen in config/crawlers.php. Aufzeichnung wie der Aufruf-Zähler per defer() und fehlertolerant; Bereinigung hängt an press-releases:purge-events. VisibilityStats liefert die Abrufe je Dienst (letzter Abruf, Anzahl) und verliert den site:-Suchlink (Stufe 1 verspricht nichts, was von Dritten abhängt). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
41 lines
1.2 KiB
PHP
41 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
/**
|
|
* Ordnet einen User-Agent einem bekannten Such- oder KI-Dienst zu
|
|
* (config/crawlers.php). Null, wenn kein Dienst aus der Liste passt —
|
|
* gewöhnliche Browser und unbekannte Bots werden nicht protokolliert.
|
|
*/
|
|
class CrawlerIdentifier
|
|
{
|
|
public static function identify(?string $userAgent): ?string
|
|
{
|
|
if ($userAgent === null || trim($userAgent) === '') {
|
|
return null;
|
|
}
|
|
|
|
/** @var array<string, array{label: string, kind: string, patterns: list<string>}> $services */
|
|
$services = config('crawlers.services', []);
|
|
|
|
foreach ($services as $key => $service) {
|
|
foreach ($service['patterns'] as $pattern) {
|
|
if (stripos($userAgent, $pattern) !== false) {
|
|
return $key;
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static function label(string $service): string
|
|
{
|
|
return (string) (config('crawlers.services.'.$service.'.label') ?? $service);
|
|
}
|
|
|
|
public static function kind(string $service): string
|
|
{
|
|
return (string) (config('crawlers.services.'.$service.'.kind') ?? 'ai');
|
|
}
|
|
}
|