给子比主题右上角增加访问随机文章

图片[1]-给子比主题右上角增加访问随机文章-初一小盏

将下方代码放置于子比主题的func.php文件:

然后在子比主题根目录创建random.php代码如下

<?php
/*
 * 随机文章中转模板(与 go.php 风格一致)
 * 通过 $_SESSION['GOLINK'] 接收目标链接,展示中转页后跳转
 */

// 基础安全拦截(与 go.php 类似)
if (
    strlen($_SERVER['REQUEST_URI']) > 384 ||
    strpos($_SERVER['REQUEST_URI'], 'eval(') ||
    strpos($_SERVER['REQUEST_URI'], 'base64')
) {
    @header('HTTP/1.1 414 Request-URI Too Long');
    @header('Status: 414 Request-URI Too Long');
    @header('Connection: Close');
    @exit;
}

@session_start();
$t_url = !empty($_SESSION['GOLINK']) ? $_SESSION['GOLINK'] : '';

// 数据处理
if (!empty($t_url)) {
    // 防止xss
    $t_url = htmlspecialchars($t_url, ENT_QUOTES, 'UTF-8');
    $t_url = str_replace(array("'", '"'), array(''', '"'), $t_url);
    $t_url = str_replace(array("\r", "\n"), array('
', '
'), $t_url);
    $t_url = str_replace(array("\t"), array('	'), $t_url);
    $t_url = str_replace(array("\x0B"), array(''), $t_url);
    $t_url = str_replace(array("\x0C"), array(''), $t_url);
    $t_url = str_replace(array("\x0D"), array('
'), $t_url);

    // 对取值进行网址校验和判断
    preg_match('/^(http|https|thunder|qqdl|ed2k|Flashget|qbrowser):\/\//i', $t_url, $matches);
    if ($matches) {
        $url   = $t_url;
        $title = '正在穿越次元之门...';
    } else {
        preg_match('/\./i', $t_url, $matche);
        if ($matche) {
            $url   = 'http://' . $t_url;
            $title = '正在穿越次元之门...';
        } else {
            $url   = home_url('/');
            $title = '参数错误,正在返回首页...';
        }
    }
} else {
    $title = '参数缺失,正在返回首页...';
    $url   = home_url('/');
}

// 禁止其它网站跳转此页面
$host    = function_exists('zib_get_url_top_host') ? zib_get_url_top_host($_SERVER['HTTP_HOST']) : $_SERVER['HTTP_HOST'];
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
if (!empty($referer) && !preg_match('/' . preg_quote($host, '/') . '/i', $referer)) {
    $url   = home_url('/');
    $title = '非法请求,正在返回首页...';
}

$url = str_replace(['&', '&'], '&', $url);
?>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="robots" content="noindex, nofollow" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
    <?php zib_head_favicon() ?>
    <title><?php echo $title; ?></title>

</head>
<body>
<style>
    body {
        margin: 0;
        overflow: hidden;
        background: #000;
    }
    canvas {
        display: block;
        width: 100vw;
        height: 100vh;
    }
    #info {
        position: absolute;
        top: 10px;
        left: 10px;
        color: #ffffff;
        font-family: monospace;
        font-size: 12px;
        pointer-events: none;
        z-index: 100;
        background: rgba(255, 255, 255, 0.1);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        border: 1px solid rgba(255, 255, 255, 0.2);
        border-radius: 10px;
        padding: 10px;
        box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
    }
</style>
<script type="module">
    import * as THREE from 'https://cdn.bootcdn.net/ajax/libs/three.js/0.180.0/three.module.js';

    const scene = new THREE.Scene();
    scene.background = new THREE.Color(0x000000);
    const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
    const renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    const time = { value: 0 };

    const numRipples = 3;
    const rippleCenters = [];
    const rippleTimes = [];
    let currentRippleIndex = 0;
    for (let i = 0; i < numRipples; i++) {
        rippleCenters.push(new THREE.Vector2(0.5, 0.5));
        rippleTimes.push(-1.0);
    }

    function onPointer(event) {
        event.preventDefault();
        let clientX, clientY;
        if (event.type === 'touchstart') {
            clientX = event.touches[0].clientX;
            clientY = event.touches[0].clientY;
        } else {
            clientX = event.clientX;
            clientY = event.clientY;
        }
        const normX = clientX / window.innerWidth;
        const normY = 1.0 - (clientY / window.innerHeight);
        rippleCenters[currentRippleIndex].set(normX, normY);
        rippleTimes[currentRippleIndex] = time.value;
        currentRippleIndex = (currentRippleIndex + 1) % numRipples;
    }
    renderer.domElement.addEventListener('click', onPointer);
    renderer.domElement.addEventListener('touchstart', onPointer, { passive: false });

    const material = new THREE.ShaderMaterial({
        uniforms: {
            time: time,
            resolution: { value: new THREE.Vector2(window.innerWidth, window.innerHeight) },
            rippleCenter1: { value: rippleCenters[0] },
            rippleTime1: { value: rippleTimes[0] },
            rippleCenter2: { value: rippleCenters[1] },
            rippleTime2: { value: rippleTimes[1] },
            rippleCenter3: { value: rippleCenters[2] },
            rippleTime3: { value: rippleTimes[2] }
        },
        vertexShader: `
            varying vec2 vUv;
            void main() {
                vUv = uv;
                gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
            }
        `,
        fragmentShader: `
            uniform float time;
            uniform vec2 resolution;
            uniform vec2 rippleCenter1;
            uniform float rippleTime1;
            uniform vec2 rippleCenter2;
            uniform float rippleTime2;
            uniform vec2 rippleCenter3;
            uniform float rippleTime3;
            varying vec2 vUv;
        
            void main() {
                vec2 FC = gl_FragCoord.xy;
                vec2 r = resolution;
                vec4 o = vec4(0.0);
            
                vec2 distortedFC = FC;
                float rippleScale = 20.0;
            
                {
                    float age = time - rippleTime1;
                    if (age >= 0.0) {
                        vec2 delta = (FC / r - rippleCenter1) * 2.0;
                        float dist = length(delta);
                        if (dist > 0.0) {
                            float phase = dist * 30.0 - age * 20.0;
                            float wave = sin(phase) * exp(-age * 3.0) / (dist + 0.1);
                            vec2 offset = (delta / dist) * wave * rippleScale;
                            distortedFC += offset;
                        }
                    }
                }
                {
                    float age = time - rippleTime2;
                    if (age >= 0.0) {
                        vec2 delta = (FC / r - rippleCenter2) * 2.0;
                        float dist = length(delta);
                        if (dist > 0.0) {
                            float phase = dist * 30.0 - age * 20.0;
                            float wave = sin(phase) * exp(-age * 3.0) / (dist + 0.1);
                            vec2 offset = (delta / dist) * wave * rippleScale;
                            distortedFC += offset;
                        }
                    }
                }
                {
                    float age = time - rippleTime3;
                    if (age >= 0.0) {
                        vec2 delta = (FC / r - rippleCenter3) * 2.0;
                        float dist = length(delta);
                        if (dist > 0.0) {
                            float phase = dist * 30.0 - age * 20.0;
                            float wave = sin(phase) * exp(-age * 3.0) / (dist + 0.1);
                            vec2 offset = (delta / dist) * wave * rippleScale;
                            distortedFC += offset;
                        }
                    }
                }
            
                float wx = 1.4 + 0.2 * sin(time * 0.5);
                float wy = 1.0;
            
                for(float i = 0.0; i < 20.0; i++) {
                    float z = i;
                    float s;
                    float outerD;
                
                    vec3 p = z * normalize(vec3(distortedFC * 2.0 - vec2(r.x, r.y), r.y));
                    vec3 a = p;
                
                    vec2 rectCoord = abs(a.xy);
                    float rectDist = max(rectCoord.x / wx, rectCoord.y / wy);
                    float spiralRotation = time * 0.7 + 5.0 / (rectDist + 0.3);
                    float c = cos(spiralRotation);
                    float si = sin(spiralRotation);
                    a.xy = mat2(c, -si, si, c) * a.xy;
                
                    for(float dd = 2.0; dd < 8.0; dd += 1.0) {
                        float freq = dd + sin(time * 0.3 + i * 0.1);
                        a -= sin(a * freq + time + i).yzx / dd;
                    }
                
                    float dist = length(a.xy);
                    vec2 rectCoord2 = abs(a.xy);
                    float rectDist2 = max(rectCoord2.x / wx, rectCoord2.y / wy);
                    float angle = atan(a.y, a.x);
                    float spiralArms = sin(angle * 7.0 - rectDist2 * 4.0 + time * 1.5) * 0.8 + sin(angle * 3.0 + rectDist2 * 2.0 - time) * 0.3;
                    float noise = sin(a.x * 10.0 + time * 2.0) * cos(a.y * 10.0 + time * 3.0) * 0.05;
                    spiralArms += noise;
                 
                    s = a.z + a.y - time * 1.2;
                    outerD = abs(0.7 - dist + spiralArms * 0.25) + abs(cos(s * 1.5)) / 6.0 + abs(sin(s * 2.0)) / 8.0;
                    outerD = max(0.02, outerD);
                    z += outerD;
                
                    vec4 colorShift;
                    float pulse = sin(time * 2.0 + rectDist * 5.0) * 0.5 + 0.5;
                    if(rectDist < 0.5) {
                        colorShift = vec4(0.0, 2.5 * pulse, 8.0, 0.0);
                    } else if(rectDist < 1.0) {
                        colorShift = vec4(1.5 * pulse, 1.0, 7.5, 0.0);
                    } else if(rectDist < 1.5) {
                        colorShift = vec4(1.0, 0.0, 8.5 * pulse, 0.0);
                    } else {
                        colorShift = vec4(0.5 * pulse, 1.5, 7.0, 0.0);
                    }
                 
                    float glow = 1.0 / (outerD * outerD * 0.05 + 0.2);
                    o += (1.5 + glow * 1.5) * (cos(s - z + colorShift) + 1.0) / outerD;
                }
            
                o = o / 150.0;
                o = o / (1.0 + o);
                vec2 uv = FC / r - 0.5;
                float vig = 1.0 - length(uv) * 0.5;
                o.rgb *= vig;
                o.rgb = pow(o.rgb, vec3(0.9));
            
                gl_FragColor = o;
            }
        `
    });

    const geometry = new THREE.PlaneGeometry(2, 2);
    const mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);

    window.addEventListener('resize', () => {
        const width = window.innerWidth;
        const height = window.innerHeight;
        renderer.setSize(width, height);
        material.uniforms.resolution.value.set(width, height);
    });

    function animate() {
        requestAnimationFrame(animate);
        time.value += 0.016;
        material.uniforms.rippleTime1.value = rippleTimes[0];
        material.uniforms.rippleTime2.value = rippleTimes[1];
        material.uniforms.rippleTime3.value = rippleTimes[2];
        for (let i = 0; i < numRipples; i++) {
            const age = time.value - rippleTimes[i];
            if (age > 5.0) {
                rippleTimes[i] = -1.0;
            }
        }
        material.uniforms.rippleCenter1.value.copy(rippleCenters[0]);
        material.uniforms.rippleCenter2.value.copy(rippleCenters[1]);
        material.uniforms.rippleCenter3.value.copy(rippleCenters[2]);
        renderer.render(scene, camera);
    }

    animate();
</script>
    <script>
        function link_jump() {
            location.href = "<?php echo($url); ?>";
        }
        // 延时1.5秒跳转
        setTimeout(link_jump, 1500);
        // 延时15秒关闭跳转页面
        setTimeout(function() { window.opener = null; window.close(); }, 15000);
    </script>
</body>
</html>
© 版权声明
THE END
喜欢就支持一下吧
分享
评论 共1条

请登录后发表评论