访客信息
模板类型
自定义模板图标:``
标题
访客信息内容:
需要申请自己的key,当前Key已设置白名单
或者访问文章:
https://www.elysium-stack.cn/archives/theme-visitor-information 亦或者自行定义更好看的样式。
<div id="welcome-info"></div>
<style>
#welcome-info {
color: var(--main);
line-height: 1.5rem;
}
#welcome-info b {
color: var(--theme);
}
</style>
<script type="text/javascript">// 访客信息
let ipLocation
// 获取 IP 位置并修改文本内容
fetch('https://api.nsmao.net/api/ip/query?key=vdmoRqlkx7s7DEiBQgLQSegAT2') //申请key:https://api.nsmao.net
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok')
}
return response.json()
})
.then(data => {
ipLocation = data
// 计算距离
let dist = getDistance(116.397697, 39.906036, ipLocation.data.lng, ipLocation.data.lat)
let pos = ipLocation.data.country
let posdesc = ''
// 根据国家或省份/城市生成对应的提示信息
switch (ipLocation.data.country) {
case '日本':
posdesc = 'よろしく,一起去看樱花吗'
break
case '美国':
posdesc = 'Let us live in peace!'
break
case '英国':
posdesc = '想同你一起夜乘伦敦眼'
break
case '俄罗斯':
posdesc = '干了这瓶伏特加!'
break
case '法国':
posdesc = 'C\'est La Vie'
break
case '德国':
posdesc = 'Die Zeit verging im Fluge.'
break
case '澳大利亚':
posdesc = '一起去大堡礁吧!'
break
case '加拿大':
posdesc = '拾起一片枫叶赠予你'
break
case '中国':
pos = ipLocation.data.prov + ' ' + ipLocation.data.city + ' ' + ipLocation.data.district
switch (ipLocation.data.prov) {
case '北京市':
posdesc = '北——京——欢迎你~~~'
break
case '上海市':
posdesc = '走在外滩,感受历史与现代的交融。'
break
case '广东省':
switch (ipLocation.data.city) {
case '广州市':
posdesc = '看小蛮腰,喝早茶了嘛~'
break
case '深圳市':
posdesc = '今天你逛商场了嘛~'
break
default:
posdesc = '带你感受广东的热情与美食!'
break
}
break
case '浙江省':
switch (ipLocation.data.city) {
case '杭州市':
posdesc = '西湖美景,三月天~'
break
case '宁波市':
posdesc = '来宁波,感受大海的气息。'
break
default:
posdesc = '这里是浙江,充满江南的韵味!'
break
}
break
case '四川省':
switch (ipLocation.data.city) {
case '成都市':
posdesc = '宽窄巷子,成都慢生活。'
break
case '绵阳市':
posdesc = '享受科技城的宁静与创新。'
break
default:
posdesc = '来四川,品麻辣火锅,赏壮丽山河。'
break
}
break
case '福建省':
switch (ipLocation.data.city) {
case '厦门市':
posdesc = '鼓浪屿听海,厦门美食让人流连忘返。'
break
case '福州市':
posdesc = '有福之州,来此感受千年古城。'
break
default:
posdesc = '福建山水如画,美景无处不在。'
break
}
break
case '山东省':
switch (ipLocation.data.city) {
case '青岛市':
posdesc = '来青岛喝啤酒,看大海吧!'
break
case '济南市':
posdesc = '泉城济南,四面荷花三面柳。'
break
default:
posdesc = '山东好客,欢迎来感受齐鲁文化!'
break
}
break
case '江苏省':
switch (ipLocation.data.city) {
case '南京市':
posdesc = '六朝古都南京,历史与现代的碰撞。'
break
case '苏州市':
posdesc = '来苏州,感受园林之美。'
break
default:
posdesc = '水乡泽国,江南佳丽地。'
break
}
break
case '河北省':
posdesc = '燕赵大地,英雄辈出的河北,等你探索!'
break
case '河南省':
switch (ipLocation.data.city) {
case '郑州市':
posdesc = '中原大地,郑州是交通枢纽与历史重镇。'
break
case '洛阳市':
posdesc = '千年古都洛阳,牡丹花开的城市。'
break
default:
posdesc = '这里是河南,历史悠久文化灿烂。'
break
}
break
case '湖南省':
switch (ipLocation.data.city) {
case '长沙市':
posdesc = '热辣长沙,吃小龙虾逛黄兴路步行街。'
break
default:
posdesc = '湖南,烟雨迷蒙的湘江流过这片土地。'
break
}
break
case '湖北省':
switch (ipLocation.data.city) {
case '武汉市':
posdesc = '来大武汉,过长江大桥,吃热干面!'
break
default:
posdesc = '湖北,长江中游的明珠,风景秀丽。'
break
}
break
case '安徽省':
switch (ipLocation.data.city) {
case '合肥市':
posdesc = '创新之城合肥,科教文化汇聚地。'
break
default:
posdesc = '安徽山水,黄山、九华山欢迎你。'
break
}
break
case '广西壮族自治区':
switch (ipLocation.data.city) {
case '桂林市':
posdesc = '桂林山水甲天下,风景如画。'
break
case '南宁市':
posdesc = '绿城南宁,宜居宜游。'
break
default:
posdesc = '广西山清水秀,民俗风情浓郁。'
break
}
break
case '贵州省':
posdesc = '来贵州,品茅台,赏黄果树瀑布。'
break
case '云南省':
switch (ipLocation.data.city) {
case '昆明市':
posdesc = '春城昆明,四季如春,风景秀丽。'
break
case '大理市':
posdesc = '苍山洱海,大理古城,你来了就不想走。'
break
default:
posdesc = '云南风景独特,风情万种。'
break
}
break
case '西藏自治区':
posdesc = '世界屋脊西藏,神秘而纯净。'
break
case '新疆维吾尔自治区':
posdesc = '辽阔新疆,民族风情与壮丽景观并存。'
break
case '内蒙古自治区':
posdesc = '草原辽阔的内蒙古,等你来策马奔腾。'
break
case '宁夏回族自治区':
posdesc = '宁夏,塞上江南,黄河流经的美丽地方。'
break
case '海南省':
posdesc = '阳光、沙滩、椰风海韵,欢迎来海南度假。'
break
default:
posdesc = '带我去你的城市逛逛吧!'
break
}
break
default:
posdesc = '带我去你的国家逛逛吧'
break
}
// 根据时间显示不同欢迎语
let timeChange
let date = new Date()
if (date.getHours() >= 5 && date.getHours() < 11) timeChange = '<span>🌤️ 早上好,一日之计在于晨</span>'
else if (date.getHours() >= 11 && date.getHours() < 13) timeChange = '<span>☀️ 中午好,记得午休喔~</span>'
else if (date.getHours() >= 13 && date.getHours() < 17) timeChange = '<span>🕞 下午好,饮茶先啦!</span>'
else if (date.getHours() >= 17 && date.getHours() < 19) timeChange = '<span>🚶‍♂️ 即将下班,记得按时吃饭~</span>'
else if (date.getHours() >= 19 && date.getHours() < 24) timeChange = '<span>🌙 晚上好,夜生活嗨起来!</span>'
else timeChange = '<span>🛏 夜深了,早点休息,少熬夜 </span>'
// 更新页面内容
let welcome = document.getElementById('welcome-info')
// 遍历并更新每个元素
if (welcome) {
welcome.innerHTML =
'欢迎来自 <b><span>' + pos + '</span></b> 的小友💖<br>当前位置距 <b>首都</b> 约 <b><span>' + dist.toFixed(2) + '</span></b> 公里!<br>' + timeChange + '<br>Tip:<b><span style="font-size: 15px;">' + posdesc + '</span></b>'
}
})
.catch(error => console.error('Error:', error))
// 计算距离函数
function getDistance(e1, n1, e2, n2) {
if (!e2 || !n2) {
return '未知地点'
}
const R = 6371 // 地球半径,单位为公里
const {sin, cos, asin, PI, hypot} = Math
let getPoint = (e, n) => {
e *= PI / 180
n *= PI / 180
return {x: cos(n) cos(e), y: cos(n) sin(e), z: sin(n)}
}
let a = getPoint(e1, n1)
let b = getPoint(e2, n2)
let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z)
let r = asin(c / 2)
return Math.round(r)
}
// 访客信息 END
</script>