hexo-safego-theme-switcher
Version:
✨ A Hexo plugin for safe external link redirection with base64 encoding, domain whitelisting, and support for a custom redirect page, now with light and dark mode switching.
127 lines (115 loc) • 4.96 kB
HTML
<html lang="zh">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex, nofollow"/>
<title>页面加载中,请稍候...</title>
<script type="text/javascript">
const now = new Date();
const beijingTime = new Date(now.getTime() + (now.getTimezoneOffset() + 480) * 60000);
const hours = beijingTime.getHours();
console.log("北京时间:", hours);
const link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
if (hours >= 6 && hours < 18) {
link.href = 'https://cdn.cbd.int/hexo-safego-theme-switcher/css/SafeGoLightModel.css';
console.log("加载白天模式样式表");
} else {
link.href = 'https://cdn.cbd.int/hexo-safego-theme-switcher/css/SafeGoDarkModel.css';
console.log("加载夜间模式样式表");
}
document.head.appendChild(link);
console.log("样式表已添加:", link.href);
const host = window.location.host;
function GetQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
return r ? decodeURI(r[2]) : null;
}
function base64Decode(input) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let str = input.replace(/=+$/, '');
let output = '';
if (str.length % 4 == 1) {
throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
}
for (let bc = 0, bs, buffer, idx = 0; buffer = str.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {
buffer = chars.indexOf(buffer);
}
return output;
}
var jump_url = GetQueryString('{{url_param_name}}');
{% if enable_base64_encode %}
jump_url = base64Decode(jump_url);
{% endif %}
var UrlReg = '^((http|https|thunder|qqdl|ed2k|Flashget|qbrowser|ftp|rtsp|mms)://)';
if (!jump_url || !jump_url.match(UrlReg)) {
document.title = '参数错误,正在返回首页...';
jump_url = location.origin;
}
let countdown = 5;
let progressElement;
let countdownElement;
let jumpUrlElement;
function updateCountdown() {
countdownElement.textContent = countdown;
progressElement.style.width = (countdown / 5 * 100) + '%';
if (countdown === 0) {
jump();
} else {
countdown--;
setTimeout(updateCountdown, 1000);
}
}
function jump() {
location.href = jump_url;
}
function closeWindow() {
window.opener = null;
window.close();
}
function loadAvatar() {
const avatarImg = document.querySelector('.avatar');
const placeholder = document.querySelector('.avatar-placeholder');
const img = new Image();
img.src = '{{avatar}}';
img.onload = function() {
avatarImg.src = img.src;
avatarImg.style.display = 'block';
placeholder.style.display = 'none';
};
}
window.onload = function() {
loadAvatar();
progressElement = document.getElementById('progress');
countdownElement = document.getElementById('countdown');
jumpUrlElement = document.getElementById('jump-url');
jumpUrlElement.textContent = jump_url;
updateCountdown();
}
</script>
</head>
<body>
<div class="avatar-placeholder"></div>
<img src="" alt="头像" class="avatar">
<div class="description">{{title}}</div>
<div class="subtitle">{{subtitle}}</div>
<div class="loading">
<div class="content">
<div class="url-text">您即将离开本站,跳转到:</div>
<div class="jump-url" id="jump-url"></div>
</div>
<div class="countdown-text">⚠ 将在 <span id="countdown">5</span> 秒后跳转,请自行确认链接安全性</div>
<div class="progress-bar">
<div class="progress" id="progress"></div>
</div>
<div class="button-container">
<button class="button cancel-button" onclick="closeWindow()">取消跳转</button>
<button class="button confirm-button" onclick="jump()">立即跳转</button>
</div>
</div>
</body>
</html>