惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
F
Full Disclosure
月光博客
月光博客
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tailwind CSS Blog
Microsoft Security Blog
Microsoft Security Blog
N
Netflix TechBlog - Medium
The Register - Security
The Register - Security
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
P
Proofpoint News Feed
Cisco Talos Blog
Cisco Talos Blog
NISL@THU
NISL@THU
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
美团技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
T
Threatpost
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
C
Cisco Blogs
S
SegmentFault 最新的问题
Cyberwarzone
Cyberwarzone
GbyAI
GbyAI
IT之家
IT之家
S
Schneier on Security
L
LINUX DO - 热门话题
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
MyScale Blog
MyScale Blog
P
Privacy & Cybersecurity Law Blog
Google Online Security Blog
Google Online Security Blog
T
Threat Research - Cisco Blogs

ElysiumStack

[明日方舟终末地]工具站汇总(截止2026年2月23日) 告别2025 迎接2026 2025.12.2 祝我生日快乐~ [ElysiumMeting]Meting-Api公益服务 《空洞骑士:丝之歌》适不适合入手? BlogsClub一周年纪念币Get✓ 四个步骤使用UptimeKuma搭建状态监测站 自签证书真的安全吗?什么是中间人攻击? 自建CA证书与带CA的SSL自签证书 [MAA配置进阶]明日方舟定时自动化一键长草 docker常用指令大全(2025.6.30更新) Meting快速私有化部署及SSL配置教程 快速理解正向代理与反向代理 基于Postgresql使用Umami搭建访客监测站 Nacos安装部署及配置教程 Kafka安装部署及配置教程 国产化数据库人大金仓(KingBase)部署教程 docker/docker-compose安装教程
Dream2.0Plus主题访客信息侧边栏美化
梅莉 · 2025-08-26 · via ElysiumStack

前段时间有小伙伴问这个是怎么实现的,单独开一篇来说一下

首先说明一下Dream2.0Plus的主题文档中提供了访客侧边栏的源码方案(笔者也是自己写完了才发现原来主题作者其实有提供)

https://www.hcjike.com/docs/halo-theme-dream2.0/theme/sidebar-assembly

如果想直接采用主题作者方案的小伙伴,直接套用上述链接内的代码按照常规的自定义侧边栏配置即可,也可自行编写HTML嵌入

为了对得起自己造的轮子,下面笔者详细说明一下制作过程。

定位API服务

市面上有太多免费的API接口服务了,笔者测试了很多不同服务商的,当然也包括腾讯、高德、百度这些大厂,总结来说大厂的东西确实更好用,但作为个人开发者每天有限额,比如腾讯的地图服务大概是每天6000次的调用量,当然这个量级对于一个博客站来说已经完全够用了,但是配置过于复杂。经过三番比较,笔者最终选择了Nice猫,只能说这大概是笔者见过的最稳定最好用的API服务商之一。

https://api.nsmao.net/

注册并获取API Key

打开Nice猫,注册并登录,随后在密钥管理中找您的API KEY 密钥同时根据需要配置安全校验方式 ,建议配置。

本站访客信息侧边栏源码

废话不多说,直接看代码

<style>
    /* 通用居中 */
    .align-center {
        text-align: center;
    }

    /* 高亮文字颜色 */
    .font-color {
        color: deepskyblue;
    }

    /* IP 遮罩:默认模糊,鼠标悬停后清晰 */
    .ip-mask {
        cursor: pointer;
        user-select: none;
        transition: all .3s ease;
        filter: blur(4px);
    }

    .ip-mask:hover {
        filter: none;
    }
</style>
<!-- 欢迎信息容器 -->
<div id="welcomeMessage" class="align-center">
    <p>🌍 小伙伴你好呀! 🌍</p>
    <p>正在寻找你的足迹...</p>
</div>

<!-- 开往/空间穿梭按钮 -->
<div class="align-center">
    <p>🚇 继续探索未知 👇️👇️ 发现更多精彩 🚇</p>
    <a href="https://www.travellings.cn/go.html" target="_blank" rel="noopener" title="开往-友链接力">
        <img src="https://www.travellings.cn/assets/logo.gif" alt="开往-友链接力" width="120" />
    </a>
    <a href="https://blogs.quest" target="_blank" title="空间穿梭-随机访问 BlogsClub 成员博客">
        <img src="https://www.blogsclub.org/images/shuttle_4.png" alt="空间穿梭" />
    </a>
</div>

<script>
    /***********************
     * 工具函数
     ***********************/

    /** 根据当前小时获取问候语与建议 */
    function getGreetingAndAdvice() {
        const hour = new Date().getHours();

        if (hour < 6) {
            return {
                greeting: "🌛 深夜好呀 👋",
                advice: "🌙这么晚还不睡嘛,不要熬夜,早点休息啦!🌙"
            };
        } else if (hour < 11) {
            return {
                greeting: "🌞 早上好呀 👋",
                advice: "💪新的一天! 充满活力!💪"
            };
        } else if (hour < 13) {
            return {
                greeting: "🍽️ 中午好呀 👋",
                advice: "🍔别忘了享受一顿美味的午餐!🍔"
            };
        } else if (hour < 18) {
            return {
                greeting: "☕ 下午好呀 👋",
                advice: "🍵休息一下,喝杯咖啡吧!🍵"
            };
        } else if (hour < 22) {
            return {
                greeting: "🌜 晚上好呀 👋",
                advice: "🌃放松心情,享受夜晚的宁静!🌃"
            };
        } else {
            return {
                greeting: "🌛 深夜好呀 👋",
                advice: "🌙这么晚还不睡嘛,不要熬夜,早点休息啦!🌙"
            };
        }
    }

    /** 角度转弧度 */
    function toRadians(degrees) {
        return degrees * (Math.PI / 180);
    }

    /** 根据经纬度计算与“本站”之间的距离(km) */
    function calculateDistance(lat, lng) {
        // 地球半径 km
        const R = 6371;
        // 自定义纬度
        const customLat = 0.0;
        // 自定义经度
        const customLng = 0.0;

        const dLat = toRadians(lat - customLat);
        const dLon = toRadians(lng - customLng);

        const a =
            Math.sin(dLat / 2) ** 2 +
            Math.cos(toRadians(customLat)) *
            Math.cos(toRadians(lat)) *
            Math.sin(dLon / 2) ** 2;

        const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        return (R * c).toFixed(2);
    }

    /***********************
     * 网络请求
     ***********************/

    /** 获取当前访问者的 IP 与地理位置信息 */
    async function fetchLocation() {
        // 拼接上你的key
        const url = "https://api.nsmao.net/api/ip/query?key=";
        try {
            const res = await fetch(url);
            const { code, data } = await res.json();
            if (code === 200) {
                return {
                    ip: data.ip,
                    country: data.country,
                    province: data.prov,
                    city: data.city,
                    district: data.district,
                    adcode: data.adcode,
                    length: calculateDistance(data.lat, data.lng)
                };
            }
        } catch (e) {
            console.error("获取地理位置失败:", e);
        }
        return null;
    }

    /***********************
     * 渲染逻辑
     ***********************/

    /** 将获取到的信息渲染到欢迎区域 */
    function renderWelcomeMessage(location) {
        const { greeting, advice } = getGreetingAndAdvice();
        document.getElementById("welcomeMessage").innerHTML = `
                <p class="align-center"><strong>${greeting}</strong></p>
                <p>
                    欢迎来自
                    <strong class="font-color">${location.province}</strong>
                    <strong class="font-color">${location.city}</strong>
                    <strong class="font-color">${location.district}</strong>
                    的小伙伴!
                </p>
                <p class="align-center">${advice}</p>
                <p class="align-center">
                    🌍 您当前的 IP 是
                    <strong><span class="ip-mask font-color">${location.ip}</span></strong> 🌍
                </p>
                <p class="align-center">
                    📍 距离 <strong class="font-color">本站</strong> 约
                    <strong class="font-color">${location.length}</strong> 公里哦!📍
                </p>
                <hr />
            `;
    }

    /** 初始化:获取地理位置并渲染 */
    async function init() {
        const location = await fetchLocation();
        if (location) {
            renderWelcomeMessage(location);
        } else {
            document.getElementById("welcomeMessage").innerHTML =
                `<p>🌍 这位小伙伴,你似乎迷失了~🌍</p>
                     <p>获取位置信息失败,请稍后再试~😅<p>`;
        }
    }

    /***********************
     * 入口
     ***********************/

    // 兼容各种加载状态
    if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", init);
    } else {
        init();
    }
</script>

以上有几个需要进行配置的地方:

  • customLat(纬度)和customLng(经度)分别代表自定义的经纬度,默认是0.0,你可以设置成任何位置,同时也可以一并修改描述信息<strong class="font-color">本站</strong>,将本站改为你的目标地点名称。

  • const url = "https://api.nsmao.net/api/ip/query?key=";这里的key需要自行拼接上刚才在Nice猫生成的key

经纬度的获取也非常方便,直接使用百度坐标拾取器就行

https://lbs.baidu.com/maptool/getpoint

最后,把代码复制进自定义模块侧边栏的侧边栏内容里就大功告成了。