pbootcms和eyoucms引入蜘蛛抓取插件

    eyoucms更改index.php文件,新增:

    // 加载蜘蛛抓取文件
    require __DIR__ . '/core/spider_logger.php';

    pbootcms更改index.php,新增:

    // 引入蜘蛛记录文件(按周存储)
    require dirname(__FILE__) . '/core/spider_logger.php';

    spider_logger.php文件内容如下:

    <?php
    /**
     * 严格行分隔的JSON日志记录器(域名+日期格式版)
     * 每行一个完整JSON记录,无换行符干扰
     * 记录完整请求URL
     */
    
    // ============== 配置区 ==============
    define('LOG_DIR', __DIR__ . '/data/access_logs/');
    define('LOG_DATE_FORMAT', 'Y-m-d'); // 按日分割
    define('MAX_LINE_LENGTH', 1024);    // 单行最大长度限制
    // ==================================
    
    // 自动初始化日志目录
    if (!file_exists(LOG_DIR)) {
        mkdir(LOG_DIR, 0755, true);
        file_put_contents(LOG_DIR . 'index.html', ''); // 防止目录列表
    }
    
    /**
     * 获取当前域名(用于日志文件名)
     */
    function getCurrentDomain() {
        $host = $_SERVER['HTTP_HOST'] ?? 'unknown';
        // 去除端口号
        return preg_replace('/:\d+$/', '', strtolower($host));
    }
    
    /**
     * 获取当前日志文件路径
     */
    function getLogFile() {
        $domain = getCurrentDomain();
        $filename = LOG_DIR . $domain . '_access_' . date(LOG_DATE_FORMAT) . '.log';
        
        // 首次创建时添加UTF-8 BOM头(解决编码问题)
        if (!file_exists($filename)) {
            file_put_contents($filename, "\xEF\xBB\xBF");
        }
        
        return $filename;
    }
    
    /**
     * 获取完整请求URL
     */
    function getFullRequestUrl() {
        $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
        $host = $_SERVER['HTTP_HOST'] ?? 'unknown';
        $uri = $_SERVER['REQUEST_URI'] ?? '';
        
        return $protocol . $host . $uri;
    }
    
    /**
     * 操作系统检测
     */
    function detectOS($ua) {
        if (empty($ua)) return 'Unknown';
        
        $patterns = [
            '/windows nt 10/i'  => 'Windows 10',
            '/windows nt 6.3/i' => 'Windows 8.1',
            '/windows nt 6.2/i' => 'Windows 8',
            '/windows nt 6.1/i' => 'Windows 7',
            '/windows nt 6.0/i' => 'Windows Vista',
            '/windows nt 5.1/i' => 'Windows XP',
            '/macintosh|mac os x/i' => 'Mac OS X',
            '/linux/i' => 'Linux',
            '/ubuntu/i' => 'Ubuntu',
            '/android/i' => 'Android',
            '/iphone|ipad|ios/i' => 'iOS',
            '/cros/i' => 'Chrome OS'
        ];
        
        foreach ($patterns as $regex => $os) {
            if (preg_match($regex, $ua)) return $os;
        }
        
        return 'Unknown';
    }
    
    /**
     * 浏览器检测
     */
    function detectBrowser($ua) {
        if (empty($ua)) return 'Unknown';
        
        $patterns = [
            '/msie|trident/i' => 'Internet Explorer',
            '/edg/i' => 'Edge',
            '/chrome/i' => 'Chrome',
            '/firefox|fxios/i' => 'Firefox',
            '/safari/i' => 'Safari',
            '/opera|opr/i' => 'Opera',
            '/yabrowser/i' => 'Yandex',
            '/ucbrowser/i' => 'UC Browser',
            '/micromessenger/i' => 'WeChat',
            '/qqbrowser/i' => 'QQ Browser',
            '/baidubrowser/i' => 'Baidu Browser'
        ];
        
        foreach ($patterns as $regex => $browser) {
            if (preg_match($regex, $ua)) return $browser;
        }
        
        return 'Unknown';
    }
    
    /**
     * 严格单行JSON记录
     */
    function writeLogLine(array $data) {
        $json = json_encode($data, 
            JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PARTIAL_OUTPUT_ON_ERROR
        );
        
        // 防御性处理:确保最终是单行
        $cleanJson = str_replace(["\r", "\n"], '', $json);
        $logLine = substr($cleanJson, 0, MAX_LINE_LENGTH) . PHP_EOL;
        
        file_put_contents(getLogFile(), $logLine, FILE_APPEND | LOCK_EX);
    }
    
    /**
     * 主记录逻辑
     */
    function logAccess() {
        try {
            $logData = [
                'time' => date('Y-m-d H:i:s.v'), // 含毫秒
                'ip' => $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0',
                'method' => $_SERVER['REQUEST_METHOD'] ?? 'NULL',
                'status' => http_response_code(),
                'url' => getFullRequestUrl(), // 完整URL(包含协议、域名和路径)
                'ua' => isset($_SERVER['HTTP_USER_AGENT']) 
                       ? substr($_SERVER['HTTP_USER_AGENT'], 0, 500) 
                       : 'NULL',
                'os' => detectOS($_SERVER['HTTP_USER_AGENT'] ?? ''),
                'browser' => detectBrowser($_SERVER['HTTP_USER_AGENT'] ?? '')
            ];
            
            writeLogLine($logData);
        } catch (Exception $e) {
            // 静默失败,不影响主流程
        }
    }
    
    // 自动注册记录器
    if (php_sapi_name() !== 'cli' && !defined('DISABLE_ACCESS_LOG')) {
        register_shutdown_function('logAccess');
    }

    另外三个版本自行参考:

    蜘蛛访问插件.zip