Last active 2 months ago

js Raw
1// 进行 fetch 请求
2fetch('https://api.nsmao.net/api/ip/query?key=你的API密钥,从https://api.nsmao.net申请')
3 .then(response => {
4 if (!response.ok) {
5 throw new Error('Network response was not ok');
6 }
7 return response.json();
8 })
9 .then(data => {
10 ipLocation = data;
11 if (isHomePage()) {
12 showWelcome();
13 }
14 })
15 .catch(error => console.error('Error:', error));
16
17function getDistance(e1, n1, e2, n2) {
18 const R = 6371;
19 const { sin, cos, asin, PI, hypot } = Math;
20 let getPoint = (e, n) => {
21 e *= PI / 180;
22 n *= PI / 180;
23 return { x: cos(n) * cos(e), y: cos(n) * sin(e), z: sin(n) };
24 };
25
26 let a = getPoint(e1, n1);
27 let b = getPoint(e2, n2);
28 let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z);
29 let r = asin(c / 2) * 2 * R;
30 return Math.round(r);
31}
32
33function showWelcome() {
34 if (!ipLocation || !ipLocation.data) {
35 console.error('ipLocation data is not available.');
36 return;
37 }
38
39 let dist = getDistance(120.3074357, 31.4933074, ipLocation.data.lng, ipLocation.data.lat);
40 let pos = ipLocation.data.country;
41 let ip = ipLocation.ip;
42 let posdesc;
43
44 // 新增ipv6显示为指定内容
45 if (ip.includes(":")) {
46 ip = "<br>好复杂,咱看不懂~(ipv6)";
47 }
48
49 // 以下的代码需要根据新API返回的结果进行相应的调整
50 switch (ipLocation.data.country) {
51 case "日本":
52 posdesc = "よろしく,一起去看樱花吗";
53 break;
54 case "美国":
55 posdesc = "Let us live in peace!";
56 break;
57 case "英国":
58 posdesc = "想同你一起夜乘伦敦眼";
59 break;
60 case "俄罗斯":
61 posdesc = "干了这瓶伏特加!";
62 break;
63 case "法国":
64 posdesc = "C'est La Vie";
65 break;
66 case "德国":
67 posdesc = "Die Zeit verging im Fluge.";
68 break;
69 case "澳大利亚":
70 posdesc = "一起去大堡礁吧!";
71 break;
72 case "加拿大":
73 posdesc = "拾起一片枫叶赠予你";
74 break;
75 case "中国":
76 pos = ipLocation.data.prov + " " + ipLocation.data.city + " " + ipLocation.data.district;
77 switch (ipLocation.data.prov) {
78 case "北京":
79 posdesc = "北——京——欢迎你~~~";
80 break;
81 case "上海":
82 posdesc = "走在外滩,感受历史与现代的交融。";
83 break;
84 case "广东":
85 switch (ipLocation.data.city) {
86 case "广州":
87 posdesc = "看小蛮腰,喝早茶了嘛~";
88 break;
89 case "深圳":
90 posdesc = "今天你逛商场了嘛~";
91 break;
92 case "珠海":
93 posdesc = "浪漫之城珠海,海风轻拂。";
94 break;
95 case "东莞":
96 posdesc = "东莞,制造业之都,经济活跃。";
97 break;
98 case "佛山":
99 posdesc = "佛山,武术之乡,陶瓷文化深厚。";
100 break;
101 default:
102 posdesc = "带你感受广东的热情与美食!";
103 break;
104 }
105 break;
106 case "浙江":
107 switch (ipLocation.data.city) {
108 case "杭州":
109 posdesc = "西湖美景,三月天~";
110 break;
111 case "宁波":
112 posdesc = "来宁波,感受大海的气息。";
113 break;
114 case "温州":
115 posdesc = "温州人杰地灵,商贸繁荣。";
116 break;
117 case "绍兴":
118 posdesc = "绍兴,酒乡文化,古韵悠长。";
119 break;
120 case "湖州":
121 posdesc = "湖州,太湖之滨,风景如画。";
122 break;
123 default:
124 posdesc = "这里是浙江,充满江南的韵味!";
125 break;
126 }
127 break;
128 case "四川":
129 switch (ipLocation.data.city) {
130 case "成都":
131 posdesc = "宽窄巷子,成都慢生活。";
132 break;
133 case "绵阳":
134 posdesc = "享受科技城的宁静与创新。";
135 break;
136 case "自贡":
137 posdesc = "自贡的盐文化与灯会,独具魅力。";
138 break;
139 case "德阳":
140 posdesc = "德阳,历史悠久,文化底蕴深厚。";
141 break;
142 case "乐山":
143 posdesc = "乐山大佛,世界文化遗产。";
144 break;
145 default:
146 posdesc = "来四川,品麻辣火锅,赏壮丽山河。";
147 break;
148 }
149 break;
150 case "福建":
151 switch (ipLocation.data.city) {
152 case "厦门":
153 posdesc = "鼓浪屿听海,厦门美食让人流连忘返。";
154 break;
155 case "福州":
156 posdesc = "有福之州,来此感受千年古城。";
157 break;
158 case "泉州":
159 posdesc = "泉州,海上丝绸之路的起点。";
160 break;
161 case "漳州":
162 posdesc = "漳州,古城文化与美食的结合。";
163 break;
164 case "南平":
165 posdesc = "南平,武夷山的自然风光。";
166 break;
167 default:
168 posdesc = "福建山水如画,美景无处不在。";
169 break;
170 }
171 break;
172 case "山东":
173 switch (ipLocation.data.city) {
174 case "青岛":
175 posdesc = "来青岛喝啤酒,看大海吧!";
176 break;
177 case "济南":
178 posdesc = "泉城济南,四面荷花三面柳。";
179 break;
180 case "烟台":
181 posdesc = "烟台的葡萄酒与海鲜,令人陶醉。";
182 break;
183 case "潍坊":
184 posdesc = "潍坊,风筝之都,文化底蕴深厚。";
185 break;
186 case "德州":
187 posdesc = "德州,扒鸡闻名,文化悠久。";
188 break;
189 default:
190 posdesc = "山东好客,欢迎来感受齐鲁文化!";
191 break;
192 }
193 break;
194 case "江苏":
195 switch (ipLocation.data.city) {
196 case "南京":
197 posdesc = "六朝古都南京,历史与现代的碰撞。";
198 break;
199 case "苏州":
200 posdesc = "来苏州,感受园林之美。";
201 break;
202 case "无锡":
203 posdesc = "无锡太湖美景,灵山大佛令人心旷神怡。";
204 break;
205 case "常州":
206 posdesc = "常州,文化与科技的交汇点。";
207 break;
208 case "南通":
209 posdesc = "南通,海门潮涌,文化底蕴深厚。";
210 break;
211 default:
212 posdesc = "水乡泽国,江南佳丽地。";
213 break;
214 }
215 break;
216 case "河北":
217 posdesc = "燕赵大地,英雄辈出的河北,等你探索!";
218 break;
219 case "河南":
220 switch (ipLocation.data.city) {
221 case "郑州":
222 posdesc = "中原大地,郑州是交通枢纽与历史重镇。";
223 break;
224 case "洛阳":
225 posdesc = "千年古都洛阳,牡丹花开的城。";
226 break;
227 case "开封":
228 posdesc = "开封,古都文化与美食的汇聚地。";
229 break;
230 case "新乡":
231 posdesc = "新乡,历史悠久,文化底蕴深厚。";
232 break;
233 case "焦作":
234 posdesc = "焦作,云台山的自然风光。";
235 break;
236 default:
237 posdesc = "这里是河南,历史悠久文化灿烂。";
238 break;
239 }
240 break;
241 case "湖南":
242 switch (ipLocation.data.city) {
243 case "长沙":
244 posdesc = "热辣长沙,吃小龙虾逛黄兴路步行街。";
245 break;
246 case "岳阳":
247 posdesc = "岳阳楼,洞庭湖的美景尽收眼底。";
248 break;
249 case "株洲":
250 posdesc = "株洲,火车制造业的发源地。";
251 break;
252 case "湘潭":
253 posdesc = "湘潭,伟人故里,文化底蕴深厚。";
254 break;
255 default:
256 posdesc = "湖南,烟雨迷蒙的湘江流过这片土地。";
257 break;
258 }
259 break;
260 case "湖北":
261 switch (ipLocation.data.city) {
262 case "武汉":
263 posdesc = "来大武汉,过长江大桥,吃热干面!";
264 break;
265 case "宜昌":
266 posdesc = "三峡大坝,壮丽的自然奇观。";
267 break;
268 case "荆州":
269 posdesc = "荆州,历史文化名城,古韵悠长。";
270 break;
271 case "襄阳":
272 posdesc = "襄阳,古城文化与美食的结合。";
273 break;
274 default:
275 posdesc = "湖北,长江中游的明珠,风景秀丽。";
276 break;
277 }
278 break;
279 case "安徽":
280 switch (ipLocation.data.city) {
281 case "合肥":
282 posdesc = "创新之城合肥,科教文化汇聚地。";
283 break;
284 case "黄山":
285 posdesc = "黄山,天下第一奇山,风景如画。";
286 break;
287 case "芜湖":
288 posdesc = "芜湖,长江之畔,文化底蕴深厚。";
289 break;
290 case "马鞍山":
291 posdesc = "马鞍山,文化与自然的完美结合。";
292 break;
293 default:
294 posdesc = "安徽山水,黄山、九华山欢迎你。";
295 break;
296 }
297 break;
298 case "广西":
299 switch (ipLocation.data.city) {
300 case "桂林":
301 posdesc = "桂林山水甲天下,风景如画。";
302 break;
303 case "南宁":
304 posdesc = "绿城南宁,宜居宜游。";
305 break;
306 case "柳州":
307 posdesc = "柳州的螺蛳粉,独具风味。";
308 break;
309 case "防城港":
310 posdesc = "防城港,海洋资源丰富,风景迷人。";
311 break;
312 default:
313 posdesc = "广西山清水秀,民俗风情浓郁。";
314 break;
315 }
316 break;
317 case "贵州":
318 switch (ipLocation.data.city) {
319 case "贵阳":
320 posdesc = "贵阳,山城之美,民族风情浓郁。";
321 break;
322 case "遵义":
323 posdesc = "遵义,红色之城,历史悠久。";
324 break;
325 case "安顺":
326 posdesc = "安顺,黄果树瀑布的故乡,风景如画。";
327 break;
328 case "毕节":
329 posdesc = "毕节,拥有丰富的自然资源与人文景观。";
330 break;
331 case "六盘水":
332 posdesc = "六盘水,凉爽的夏天,避暑胜地。";
333 break;
334 case "铜仁":
335 posdesc = "铜仁,秀美的山水与独特的民族文化。";
336 break;
337 case "凯里":
338 posdesc = "凯里,苗族文化的发源地,风情独特。";
339 break;
340 default:
341 posdesc = "来贵州,品茅台,赏黄果树瀑布。";
342 break;
343 }
344 break;
345 case "云南":
346 switch (ipLocation.data.city) {
347 case "昆明":
348 posdesc = "春城昆明,四季如春,风景秀丽。";
349 break;
350 case "大理":
351 posdesc = "苍山洱海,大理古城,你来了就不想走。";
352 break;
353 case "丽江":
354 posdesc = "丽江古城,纳西文化的瑰宝。";
355 break;
356 case "西双版纳":
357 posdesc = "西双版纳,热带雨林的奇妙之地。";
358 break;
359 default:
360 posdesc = "云南风景独特,风情万种。";
361 break;
362 }
363 break;
364 case "西藏":
365 switch (ipLocation.data.city) {
366 case "拉萨":
367 posdesc = "拉萨,西藏的首府,布达拉宫的故乡。";
368 break;
369 case "日喀则":
370 posdesc = "日喀则,历史悠久的文化名城。";
371 break;
372 case "林芝":
373 posdesc = "林芝,素有'西藏江南'之称,风景如画。";
374 break;
375 case "昌都":
376 posdesc = "昌都,历史悠久,文化底蕴深厚。";
377 break;
378 case "山南":
379 posdesc = "山南,藏文化的发源地之一。";
380 break;
381 case "那曲":
382 posdesc = "那曲,草原风光,牧民生活的地方。";
383 break;
384 case "阿里":
385 posdesc = "阿里,神秘的西部,拥有壮丽的自然景观。";
386 break;
387 default:
388 posdesc = "西藏,神秘而纯净,等待你的探索。";
389 break;
390 }
391 break;
392 case "新疆维吾尔":
393 posdesc = "辽阔新疆,民族风情与壮丽景观并存。";
394 switch (ipLocation.data.city) {
395 case "乌鲁木齐":
396 posdesc = "乌鲁木齐,天山脚下的城市,文化多元。";
397 break;
398 case "喀什":
399 posdesc = "喀什,古丝绸之路的重要节点,历史悠久。";
400 break;
401 case "克拉玛依":
402 posdesc = "克拉玛依,石油之城,经济发展迅速。";
403 break;
404 case "吐鲁番":
405 posdesc = "吐鲁番,火焰山的故乡,葡萄之乡。";
406 break;
407 case "哈密":
408 posdesc = "哈密,哈密瓜的发源地,风景如画。";
409 break;
410 case "博乐":
411 posdesc = "博乐,草原风光,民族文化交融。";
412 break;
413 case "阿克苏":
414 posdesc = "阿克苏,苹果之乡,风景秀丽。";
415 break;
416 case "和田":
417 posdesc = "和田,玉石之乡,历史文化深厚。";
418 break;
419 default:
420 posdesc = "新疆的城市各具特色,等待你的探索。";
421 break;
422 }
423 break;
424 case "内蒙古":
425 switch (ipLocation.data.city) {
426 case "呼和浩特":
427 posdesc = "呼和浩特,内蒙古的首府,历史悠久。";
428 break;
429 case "包头":
430 posdesc = "包头,钢铁之城,经济发展迅速。";
431 break;
432 case "乌兰察布":
433 posdesc = "乌兰察布,草原文化与现代城市的结合。";
434 break;
435 case "赤峰":
436 posdesc = "赤峰,拥有丰富的自然资源与人文景观。";
437 break;
438 case "通辽":
439 posdesc = "通辽,草原文化的发源地,风情独特。";
440 break;
441 case "鄂尔多斯":
442 posdesc = "鄂尔多斯,现代化城市与草原文化的交融。";
443 break;
444 case "巴彦淖尔":
445 posdesc = "巴彦淖尔,黄河之畔,风景如画。";
446 break;
447 case "锡林郭勒":
448 posdesc = "锡林郭勒,草原辽阔,马背上的民族风情。";
449 break;
450 default:
451 posdesc = "草原辽阔的内蒙古,等你来策马奔腾。";
452 break;
453 }
454 break;
455 case "宁夏回族":
456 posdesc = "宁夏,塞上江南,黄河流经的美丽地方。";
457 break;
458 case "海南":
459 posdesc = "阳光、沙滩、椰风海韵,欢迎来海南度假。";
460 break;
461 case "陕西":
462 switch (ipLocation.data.city) {
463 case "西安":
464 posdesc = "西安,古都文化与兵马俑的故乡。";
465 break;
466 case "咸阳":
467 posdesc = "咸阳,历史悠久,文化底蕴深厚。";
468 break;
469 default:
470 posdesc = "陕西,历史与文化的交汇之地。";
471 break;
472 }
473 break;
474 case "甘肃":
475 switch (ipLocation.data.city) {
476 case "兰州":
477 posdesc = "兰州,黄河之滨,牛肉面闻名。";
478 break;
479 case "天水":
480 posdesc = "天水,历史悠久,文化底蕴深厚。";
481 break;
482 default:
483 posdesc = "甘肃,丝绸之路的重要节点。";
484 break;
485 }
486 break;
487 case "青海":
488 switch (ipLocation.data.city) {
489 case "西宁":
490 posdesc = "西宁,青海湖的门户,风景如画。";
491 break;
492 default:
493 posdesc = "青海,湖泊与草原的美丽结合。";
494 break;
495 }
496 break;
497 case "吉林":
498 switch (ipLocation.data.city) {
499 case "长春":
500 posdesc = "长春,汽车城,文化底蕴深厚。";
501 break;
502 case "吉林市":
503 posdesc = "吉林市,松花江畔,风景如画。";
504 break;
505 default:
506 posdesc = "吉林,冰雪与文化的交融之地。";
507 break;
508 }
509 break;
510 case "黑龙江":
511 switch (ipLocation.data.city) {
512 case "哈尔滨":
513 posdesc = "哈尔滨,冰雪之城,俄罗斯风情浓厚。";
514 break;
515 case "齐齐哈尔":
516 posdesc = "齐齐哈尔,黑龙江的明珠,文化底蕴深厚。";
517 break;
518 default:
519 posdesc = "黑龙江,冰雪与文化的交汇之地。";
520 break;
521 }
522 break;
523 default:
524 posdesc = "带我去你的城逛逛吧!";
525 break;
526 }
527 break;
528 default:
529 posdesc = "带我去你的国家逛逛吧";
530 break;
531 }
532
533 // 根据本地时间切换欢迎语
534 let timeChange;
535 let date = new Date();
536 if (date.getHours() >= 5 && date.getHours() < 11) timeChange = "<span>🌤️ 早上好,一日之计在于晨</span>";
537 else if (date.getHours() >= 11 && date.getHours() < 13) timeChange = "<span>☀️ 中午好,记得午休喔~</span>";
538 else if (date.getHours() >= 13 && date.getHours() < 17) timeChange = "<span>🕞 下午好,饮茶先啦!</span>";
539 else if (date.getHours() >= 17 && date.getHours() < 19) timeChange = "<span>🚶‍♂️ 即将下班,记得按时吃饭~</span>";
540 else if (date.getHours() >= 19 && date.getHours() < 24) timeChange = "<span>🌙 晚上好,夜生活嗨起来!</span>";
541 else timeChange = "夜深了,早点休息,少熬夜";
542
543 let welcomeInfoElement = document.getElementById("welcome-info");
544
545 if (welcomeInfoElement) {
546
547 welcomeInfoElement.style.padding = "15px";
548 welcomeInfoElement.style.borderRadius = "8px";
549 welcomeInfoElement.style.boxShadow = "0 2px 4px rgba(0,0,0,0.1)"; // 可选:添加轻微阴影增强立体感
550 welcomeInfoElement.style.margin = "10px 0"; // 可选:添加上下外边距
551 welcomeInfoElement.style.lineHeight = "1.6"; // 可选:优化行间距
552
553 welcomeInfoElement.innerHTML =
554 `欢迎来自 <b><span style="color: var(--efu-main)">${pos}</span></b> 的小友💖<br>当前位置距博主约 <b><span style="color: var(--efu-main)">${dist.toFixed(2)}</span></b> 公里!<br>${timeChange}<br>Tip:<b><span style="font-size: 15px;">${posdesc}</span></b>`;
555 } else {
556 console.log("Pjax无法获取元素");
557 }
558}
559
560// Pjax完成页面切换的事件回调处理
561function handlePjaxComplete() {
562 if (isHomePage()) {
563 showWelcome();
564 }
565}
566
567function isHomePage() {
568 return window.location.pathname === '/' || window.location.pathname === '/index.html';
569}
570
571
572// 添加pjax:complete事件监听
573window.onload = function () {
574 if (isHomePage()) {
575 showWelcome();
576 }
577 document.addEventListener("pjax:complete", handlePjaxComplete);
578};
579