| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| declare(strict_types=1); |
|
|
| namespace Piwik\Plugins\BotTracking; |
|
|
| |
| |
| |
| class BotDetector |
| { |
| public const BOT_TYPE_AI_CHATBOT = 'ai_chatbot'; |
|
|
| |
| private $detectionResult; |
|
|
| |
| |
| |
| |
| |
| 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); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| 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; |
| } |
|
|
| |
| |
| |
| public function getDetectionResult(): ?array |
| { |
| return $this->detectionResult; |
| } |
| } |
|
|