array( 'company' => 'OpenAI', 'purpose' => 'training', 'ua' => 'GPTBot' ), 'ClaudeBot' => array( 'company' => 'Anthropic', 'purpose' => 'training', 'ua' => 'ClaudeBot' ), 'Google-Extended' => array( 'company' => 'Google', 'purpose' => 'training', 'ua' => 'Google-Extended' ), 'Applebot-Extended' => array( 'company' => 'Apple', 'purpose' => 'training', 'ua' => 'Applebot-Extended' ), 'meta-externalagent' => array( 'company' => 'Meta', 'purpose' => 'training', 'ua' => 'meta-externalagent' ), 'CCBot' => array( 'company' => 'Common Crawl', 'purpose' => 'training', 'ua' => 'CCBot' ), 'Bytespider' => array( 'company' => 'ByteDance', 'purpose' => 'training', 'ua' => 'Bytespider' ), 'Amazonbot' => array( 'company' => 'Amazon', 'purpose' => 'training', 'ua' => 'Amazonbot' ), 'OAI-SearchBot' => array( 'company' => 'OpenAI', 'purpose' => 'search', 'ua' => 'OAI-SearchBot' ), 'Claude-SearchBot' => array( 'company' => 'Anthropic', 'purpose' => 'search', 'ua' => 'Claude-SearchBot' ), 'PerplexityBot' => array( 'company' => 'Perplexity', 'purpose' => 'search', 'ua' => 'PerplexityBot' ), 'ChatGPT-User' => array( 'company' => 'OpenAI', 'purpose' => 'user', 'ua' => 'ChatGPT-User' ), 'Claude-User' => array( 'company' => 'Anthropic', 'purpose' => 'user', 'ua' => 'Claude-User' ), 'Perplexity-User' => array( 'company' => 'Perplexity', 'purpose' => 'user', 'ua' => 'Perplexity-User' ), 'Meta-ExternalFetcher' => array( 'company' => 'Meta', 'purpose' => 'user', 'ua' => 'Meta-ExternalFetcher' ), 'MistralAI-User' => array( 'company' => 'Mistral', 'purpose' => 'user', 'ua' => 'MistralAI-User' ), ); } /** * Match a user agent string against known bots. * * @param string $ua Raw User-Agent header. * @return string|false Bot key or false. */ public static function match( $ua ) { if ( empty( $ua ) ) { return false; } foreach ( self::all() as $key => $bot ) { if ( false !== stripos( $ua, $bot['ua'] ) ) { return $key; } } return false; } public static function purposes() { return array( 'training' => __( 'Model training', 'aitooler-bot-analytics' ), 'search' => __( 'AI search indexing', 'aitooler-bot-analytics' ), 'user' => __( 'Live user requests', 'aitooler-bot-analytics' ), ); } }