*/ private $aiAssistantPatterns = [ 'ChatGPT-User' => self::BOT_TYPE_AI_CHATBOT, 'MistralAI-User' => self::BOT_TYPE_AI_CHATBOT, 'Gemini-Deep-Research' => self::BOT_TYPE_AI_CHATBOT, 'Claude-User' => self::BOT_TYPE_AI_CHATBOT, 'Perplexity-User' => self::BOT_TYPE_AI_CHATBOT, 'Google-NotebookLM' => self::BOT_TYPE_AI_CHATBOT, ]; public function __construct(string $userAgent) { $this->detectionResult = $this->detect($userAgent); } /** * Detect if the User-Agent represents an AI chatbot or bot * * @param string $userAgent The User-Agent string to check * @return null|array{bot_name: string, bot_type: string} Returns array if detected, null otherwise */ private function detect(string $userAgent): ?array { if (empty($userAgent)) { return null; } foreach ($this->aiAssistantPatterns as $pattern => $botType) { if (stripos($userAgent, $pattern) !== false) { return [ 'bot_name' => $pattern, 'bot_type' => $botType, ]; } } return null; } public function isBot(): bool { return $this->detectionResult !== null; } /** * @return null|array{'bot_name': string, 'bot_type': string} */ public function getDetectionResult(): ?array { return $this->detectionResult; } }