sinzmise-cetastories 2.0.0-1737699253412 → 2.0.0-1737720401223
Sign up to get free protection for your applications and to get access to all the features.
- package/404/index.html +1 -1
- package/404.html +1 -1
- package/archives/2021/12/index.html +1 -1
- package/archives/2021/index.html +1 -1
- package/archives/2022/12/index.html +1 -1
- package/archives/2022/index.html +1 -1
- package/archives/2023/01/index.html +1 -1
- package/archives/2023/02/index.html +1 -1
- package/archives/2023/03/index.html +1 -1
- package/archives/2023/04/index.html +1 -1
- package/archives/2023/07/index.html +1 -1
- package/archives/2023/08/index.html +1 -1
- package/archives/2023/09/index.html +1 -1
- package/archives/2023/10/index.html +1 -1
- package/archives/2023/11/index.html +1 -1
- package/archives/2023/12/index.html +1 -1
- package/archives/2023/index.html +1 -1
- package/archives/2023/page/2/index.html +1 -1
- package/archives/2023/page/3/index.html +1 -1
- package/archives/2024/01/index.html +1 -1
- package/archives/2024/02/index.html +1 -1
- package/archives/2024/03/index.html +1 -1
- package/archives/2024/04/index.html +1 -1
- package/archives/2024/05/index.html +1 -1
- package/archives/2024/06/index.html +1 -1
- package/archives/2024/07/index.html +1 -1
- package/archives/2024/08/index.html +1 -1
- package/archives/2024/09/index.html +1 -1
- package/archives/2024/10/index.html +1 -1
- package/archives/2024/11/index.html +1 -1
- package/archives/2024/12/index.html +1 -1
- package/archives/2024/index.html +1 -1
- package/archives/2024/page/2/index.html +1 -1
- package/archives/2024/page/3/index.html +1 -1
- package/archives/2025/01/index.html +1 -1
- package/archives/2025/index.html +1 -1
- package/archives/index.html +1 -1
- package/archives/page/2/index.html +1 -1
- package/archives/page/3/index.html +1 -1
- package/archives/page/4/index.html +1 -1
- package/archives/page/5/index.html +1 -1
- package/atom.xml +21 -21
- package/baidu_verify_codeva-bWOlt0JEU1.html +1 -0
- package/categories/index.html +1 -1
- package/categories//344/270/252/344/272/272/345/260/217/350/256/260/index.html +1 -1
- package/categories//344/270/252/344/272/272/345/260/217/350/256/260/page/2/index.html +1 -1
- package/categories//344/270/252/344/272/272/345/260/217/350/256/260/page/3/index.html +1 -1
- package/categories//346/255/214/346/233/262/346/224/266/351/233/206/index.html +1 -1
- package/categories//346/270/270/346/210/217/347/233/270/345/205/263/index.html +1 -1
- package/categories//347/253/231/347/202/271/346/212/230/350/205/276/index.html +1 -1
- package/categories//347/253/231/347/202/271/346/212/230/350/205/276/page/2/index.html +1 -1
- package/categories//351/241/271/347/233/256/346/212/230/350/205/276/index.html +1 -1
- package/charts/index.html +1 -1
- package/comments/index.html +1 -1
- package/fcircle/index.html +1 -1
- package/games/index.html +1 -1
- package/games/riddle/esc2-e.html +1 -1
- package/games/riddle/esc3-e.html +1 -1
- package/games/riddle/esc4-e.html +1 -1
- package/google8073542809160a67.html +1 -1
- package/index.html +1 -1
- package/link/index.html +1 -1
- package/load.html +1 -1
- package/music/index.html +1 -1
- package/package.json +1 -1
- package/page/2/index.html +1 -1
- package/page/3/index.html +1 -1
- package/page/4/index.html +1 -1
- package/page/5/index.html +1 -1
- package/posts/10021/index.html +1 -1
- package/posts/10045/index.html +1 -1
- package/posts/10733/index.html +1 -1
- package/posts/10996/index.html +1 -1
- package/posts/12779/index.html +1 -1
- package/posts/13624/index.html +1 -1
- package/posts/15688/index.html +1 -1
- package/posts/15748/index.html +1 -1
- package/posts/15799/index.html +1 -1
- package/posts/15842/index.html +1 -1
- package/posts/16107/index.html +1 -1
- package/posts/18063/index.html +1 -1
- package/posts/20412/index.html +1 -1
- package/posts/21375/index.html +1 -1
- package/posts/22945/index.html +1 -1
- package/posts/23021/index.html +1 -1
- package/posts/23226/index.html +1 -1
- package/posts/27531/index.html +1 -1
- package/posts/27762/index.html +1 -1
- package/posts/28536/index.html +1 -1
- package/posts/28733/index.html +1 -1
- package/posts/29196/index.html +1 -1
- package/posts/38917/index.html +1 -1
- package/posts/38964/index.html +1 -1
- package/posts/42487/index.html +1 -1
- package/posts/42580/index.html +1 -1
- package/posts/45875/index.html +1 -1
- package/posts/46640/index.html +1 -1
- package/posts/48762/index.html +1 -1
- package/posts/50710/index.html +1 -1
- package/posts/52677/index.html +1 -1
- package/posts/53662/index.html +1 -1
- package/posts/54386/index.html +1 -1
- package/posts/54481/index.html +1 -1
- package/posts/54787/index.html +1 -1
- package/posts/56467/index.html +1 -1
- package/posts/57692/index.html +1 -1
- package/posts/58203/index.html +1 -1
- package/posts/60486/index.html +1 -1
- package/posts/61417/index.html +1 -1
- package/posts/61712/index.html +1 -1
- package/posts/61713/index.html +1 -1
- package/posts/646/index.html +1 -1
- package/posts/64856/index.html +1 -1
- package/posts/64935/index.html +1 -1
- package/posts/65382/index.html +1 -1
- package/seas/index.html +1 -1
- package/sw.js +1 -1
- package/tags/Flash/347/233/270/345/205/263/index.html +1 -1
- package/tags/Steam/346/270/270/346/210/217/index.html +1 -1
- package/tags/Windows/350/275/257/344/273/266/index.html +1 -1
- package/tags/index.html +1 -1
- package/tags//344/270/252/344/272/272/345/260/217/350/256/260/index.html +1 -1
- package/tags//344/270/252/344/272/272/345/260/217/350/256/260/page/2/index.html +1 -1
- package/tags//344/270/252/344/272/272/345/260/217/350/256/260/page/3/index.html +1 -1
- package/tags//345/205/266/345/256/203/346/270/270/346/210/217/index.html +1 -1
- package/tags//345/212/240/350/275/275/345/212/250/347/224/273/index.html +1 -1
- package/tags//346/202/254/346/265/256/345/256/240/347/211/251-/347/234/213/346/235/277/345/250/230/index.html +1 -1
- package/tags//346/255/214/346/233/262/346/224/266/351/233/206/index.html +1 -1
- package/tags//346/270/270/346/210/217/347/233/270/345/205/263/index.html +1 -1
- package/tags//347/253/231/347/202/271/345/272/225/351/203/250/351/255/224/346/224/271/index.html +1 -1
- package/tags//347/253/231/347/202/271/346/212/230/350/205/276/index.html +1 -1
- package/tags//347/253/231/347/202/271/346/212/230/350/205/276/page/2/index.html +1 -1
- package/tags//350/207/252/345/273/272/351/203/250/347/275/262/index.html +1 -1
- package/tags//351/241/265/351/235/242/351/255/224/346/224/271/index.html +1 -1
- package/tags//351/241/271/347/233/256/346/212/230/350/205/276/index.html +1 -1
- package/update/index.html +1 -1
- package/baidu_verify_codeva-F0RjFTve6w.html +0 -1
package/posts/38964/index.html
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>小康大佬的说说方案 ———— ispeak搭建教程 | 汐塔魔法屋</title><noscript>开启JavaScript才能访问本站哦~</noscript><link rel="icon" href="/images/icon.png"><link rel="stylesheet" href="/css/index.css?v=3.0.5"><meta name="baidu-site-verification" content="codeva-F0RjFTve6w"><meta name="msvalidate.01" content="18428535B4425286753107589FC35E79"><meta name="blogsclub-find" content="0bcd40f87500234dd4721904e917e748"><meta name="blogsclub-verify" content="c993246f2c944fed8e4fdc8d024561fe"><link rel="canonical" href="https://blog.storical.space/posts/38964/"><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css"><link rel="preconnect"><link rel="preconnect" href="images1.blog.sinzmise.top"><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/@fancyapps/ui@5.0.36/dist/fancybox/fancybox.min.css"><meta name="description" content="这篇文章是我之前写过的教程的重写"><meta name="apple-mobile-web-app-capable" content="汐塔魔法屋"><meta name="theme-color" content="var(--efu-main)"><meta name="apple-mobile-web-app-status-bar-style" content="var(--efu-main)"><link rel="bookmark" href="/images/icon.png"><link rel="apple-touch-icon" href="/images/icon.png" sizes="180x180"><link rel="authorization_endpoint" href="https://indieauth.com/auth"><link rel="token_endpoint" href="https://tokens.indieauth.com/token"><link rel="webmention" href="https://webmention.io/blog.storical.space/webmention"><link rel="pingback" href="https://webmention.io/blog.storical.space/xmlrpc"><script>console.log(" %c Solitude %c 3.0.5 %c https://github.com/everfu/hexo-theme-solitude","background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff9a9a ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:unset ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff")</script><script>let mdate="7-7,9-18,12-13";mdate=mdate.split(",");let ndate=new Date;for(let e of mdate)e===ndate.getMonth()+1+"-"+ndate.getDate()&&document.documentElement.classList.add("memorial")</script><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/aplayer/dist/APlayer.min.css"><link rel="stylesheet" href="/css/schedule.css"><link rel="stylesheet" href="//at.alicdn.com/t/c/font_4199232_wlo8truegv.css"><script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script><script>LA.init({id:"K9WDMA2h2AfDg5GG",ck:"K9WDMA2h2AfDg5GG",autoTrack:!0,hashMode:!0})</script><script src="https://sdk.51.la/perf/js-sdk-perf.min.js" crossorigin="anonymous"></script><script>(new LingQue.Monitor).init({id:"K94JRCDsbHJJSjNs",sendSuspicious:!0,sendSpaPv:!0})</script><script>(()=>{const e={set:function(e,t,n){if(0===n)return;const o=864e5*n,a={value:t,expiry:(new Date).getTime()+o};localStorage.setItem(e,JSON.stringify(a))},get:function(e){const t=localStorage.getItem(e);if(!t)return;const n=JSON.parse(t);if(!((new Date).getTime()>n.expiry))return n.value;localStorage.removeItem(e)}};window.utils={saveToLocal:e,getCSS:(e,t=!1)=>new Promise(((n,o)=>{const a=document.createElement("link");a.rel="stylesheet",a.href=e,t&&(a.id=t),a.onerror=o,a.onload=a.onreadystatechange=function(){const e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,n())},document.head.appendChild(a)})),getScript:(e,t={})=>new Promise(((n,o)=>{const a=document.createElement("script");a.src=e,a.async=!0,a.onerror=o,a.onload=a.onreadystatechange=function(){const e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,n())},Object.keys(t).forEach((e=>{a.setAttribute(e,t[e])})),document.head.appendChild(a)})),addGlobalFn:(e,t,n=!1,o=window)=>{const a=o.globalFn||{},r=a[e]||{};n&&r[n]||(r[n=n||Object.keys(r).length]=t,a[e]=r,o.globalFn=a)},addEventListenerPjax:(e,t,n,o=!1)=>{e.addEventListener(t,n,o),utils.addGlobalFn("pjax",(()=>{e.removeEventListener(t,n,o)}))}}})()</script><script>initTheme=()=>{let e=window.matchMedia("(prefers-color-scheme: dark)").matches;const t=utils.saveToLocal.get("theme");if(void 0===t){const t=e?"dark":"light";document.documentElement.setAttribute("data-theme",t)}else document.documentElement.setAttribute("data-theme",t);"object"==typeof rm&&rm.mode("dark"===t&&e)},initTheme()</script><script>const GLOBAL_CONFIG={root:"/",algolia:{appId:"72TOQYD33Q",apiKey:"608d2f3acd06140a2473153f6cb61eda",indexName:"hexo",hits:{per_page:6}},localsearch:void 0,runtime:"2023-04-20 00:00:00",lazyload:{enable:!0,error:"/img/friend_404.gif"},copyright:!1,highlight:{limit:200,expand:!0,copy:!0,syntax:"highlight.js"},randomlink:!0,lang:{theme:{dark:"已切换至深色模式",light:"已切换至浅色模式"},copy:{success:"复制成功",error:"复制失败"},backtop:"返回顶部",time:{day:"天前",hour:"小时前",just:"刚刚",min:"分钟前",month:"个月前"},day:" 天",f12:"开发者模式已打开,请遵循GPL协议。",totalk:"无需删除空行,直接输入评论即可",search:{empty:"找不到你查询的内容:${query}",hit:"找到 ${hits} 条结果,用时 ${time} 毫秒",placeholder:"输入关键词快速查找",count:"共 <b>${count}</b> 条结果。",loading:"搜索中..."},webmention:{title:'你有对这篇文章写<a href="https://indieweb.org/responses" target="_blank">回应</a>吗? 你可以在这里提交你的文章网址或推特链接(文章或推特内容需要包含这篇文章的地址,点击这里了解 <a href="https://indieweb.org/Webmention" target="_blank">Webmention</a>):',placeholder:"你的文章网址或推特链接",likes:"已经有 ${distinctMentions.length} 朋友喜欢、分享或讨论这篇文章:",comment:"引用或评论(${replies.length})"},barrage:{title:"热评"}},aside:{state:{morning:"✨ 早上好,新的一天开始了",noon:"🍲 午餐时间",afternoon:"🌞 下午好",night:"早点休息",goodnight:"晚安 😴"},witty_words:["你可以的","你一定可以的","祝你好运,陌生人"],witty_comment:{prefix:"好久不见,",back:"欢迎再次回来,"}},covercolor:{enable:!0},comment:{avatar:"https://weavatar.com",commentBarrage:!0},lightbox:"fancybox",post_ai:!1,right_menu:{mode:{dark:"深色模式",light:"浅色模式"},img_error:"此图片无法复制与下载",barrage:{open:"显示热评",close:"关闭热评"},translate:!0,ctrlOriginalMenu:"按住Ctrl+右键可打开浏览器右键菜单"},translate:{translateDelay:0,defaultEncoding:2},lure:!1,expire:!1}</script><script id="config-diff">var PAGE_CONFIG={is_post:!0,is_page:!1,is_home:!1,page:"",toc:!0,comment:!0,ai_text:!1,color:!1}</script><meta name="generator" content="Hexo 7.3.0"><link rel="alternate" href="/atom.xml" title="汐塔魔法屋" type="application/atom+xml"></head><body id="body"><canvas id="universe"></canvas><div id="global_bg"></div><div id="loading-box" onclick="preloader.endLoading()" style="zoom:1"><div class="loading-bg"><img class="loading-img nolazyload" src="/images/icon.png" alt="loading image"></div></div><script>const preloader={isLoaded:!1,endLoading:()=>{preloader.isLoaded||(document.getElementById("loading-box").classList.add("loaded"),preloader.isLoaded=!0,preloader.togglePaceDone())},initLoading:()=>{document.getElementById("loading-box").classList.remove("loaded"),preloader.isLoaded=!1,preloader.togglePaceDone()},togglePaceDone:()=>{document.getElementById("body").className=preloader.isLoaded?"pace-done":""}};window.addEventListener("load",(()=>{preloader.endLoading()})),window.addEventListener("pjax:send",(()=>{preloader.initLoading()})),document.addEventListener("pjax:complete",(()=>{preloader.endLoading()})),setTimeout((()=>{preloader.endLoading()}),5e3)</script><div id="console"><div class="close-btn" onclick="sco.hideConsole()"><i class="solitude fa-solid fa-xmark"></i></div><div class="console-card-group"><div class="console-card-group-left"><div class="console-card" id="card-newest-comments" onclick="sco.hideConsole()"><div class="card-content"><div class="author-content-item-tips">互动</div><div class="author-content-item-title">最新评论</div></div><div class="console_recentcomments"><script pjax="">(async()=>{document.querySelector(".console-card .console_recentcomments").textContent="加载中...";const e=/<img [^>]+ atk-emoticon="[^"]+">/g;let t=utils.saveToLocal.get("artalk-recent-comments-console");if(t)return void o(document.querySelector(".console-card .console_recentcomments"),t);let n=[];const c=new URLSearchParams({site_name:"汐塔魔法屋",limit:"6"});function o(e,t){e.innerHTML=0!==t.length?t.map((e=>`\n <div class="comment-card" title="${e.title}" onclick="pjax.loadUrl('${e.url}')">\n <div class="comment-info">\n <img src="${e.avatar}" class="nolazyload" alt="${e.nick}">\n <div>\n <span class="comment-user">${e.nick}</span>\n </div>\n <time class="comment-time" datetime="${e.time}"></time>\n </div>\n <div class="comment-content">${e.content}</div>\n <div class="comment-title">\n <i class="solitude fa-solid fa-comment"></i>\n ${e.title}</div>\n </div>\n `)).join(""):"暂无评论...","undefined"!=typeof sco?sco.changeTimeFormat(document.querySelectorAll(".comment-time")):(document.addEventListener("pjax:complete",(()=>sco.changeTimeFormat(document.querySelectorAll(".comment-time")))),document.addEventListener("DOMContentLoaded",(()=>sco.changeTimeFormat(document.querySelectorAll(".comment-time")))))}function a(t){return t=(t=(t=(t=t.replace(e,"[表情]")).replace(/!\[.*?\]\((.*?)\)/g,"[图片]")).replace(/\[.*?\]\((.*?)\)/g,"[链接]")).replace(/```.*?```/g,"[代码]")}await fetch(`https://atk.pl.blog.sinzmise.top/api/v2/stats/latest_comments?${c}`,{method:"GET"}).then((async e=>e.json())).then((async t=>{for(const o of t.data){if(c=o.content,e.test(c))continue;let t="";o.page_key&&await fetch(o.page_key).then((e=>e.text())).then((e=>{const n=(new DOMParser).parseFromString(e,"text/html");t=n.querySelector("title").innerText})).catch((()=>{t=o.page_key})),t.indexOf("|")>0&&(t=t.split("|")[0]),n.push({title:t,url:o.page_key+"#atk-comment-"+o.id,nick:o.nick,avatar:"https://weavatar.com/avatar/"+o.email_encrypted,time:o.date,content:a(o.content)})}var c;o(document.querySelector(".console-card .console_recentcomments"),n),utils.saveToLocal.set("artalk-recent-comments-console",n,.2)}))})()</script></div></div></div><div class="console-card-group-right"><div class="console-card tags" onclick="sco.hideConsole()"><div class="card-content"><div class="author-content-item-tips">标签</div><div class="author-content-item-title">寻找感兴趣的领域</div></div><div class="card-tag-cloud"><a href="/tags/%E4%B8%AA%E4%BA%BA%E5%B0%8F%E8%AE%B0/">个人小记<sup>24</sup></a><a href="/tags/%E6%B8%B8%E6%88%8F%E7%9B%B8%E5%85%B3/">游戏相关<sup>4</sup></a><a href="/tags/%E5%85%B6%E5%AE%83%E6%B8%B8%E6%88%8F/">其它游戏<sup>3</sup></a><a href="/tags/%E9%A1%B9%E7%9B%AE%E6%8A%98%E8%85%BE/">项目折腾<sup>3</sup></a><a href="/tags/Windows%E8%BD%AF%E4%BB%B6/">Windows软件<sup>2</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾<sup>14</sup></a><a href="/tags/%E8%87%AA%E5%BB%BA%E9%83%A8%E7%BD%B2/">自建部署<sup>5</sup></a><a href="/tags/Flash%E7%9B%B8%E5%85%B3/">Flash相关<sup>1</sup></a><a href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/">页面魔改<sup>3</sup></a><a href="/tags/%E6%AD%8C%E6%9B%B2%E6%94%B6%E9%9B%86/">歌曲收集<sup>1</sup></a><a href="/tags/Steam%E6%B8%B8%E6%88%8F/">Steam游戏<sup>1</sup></a><a href="/tags/%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB/">加载动画<sup>1</sup></a><a href="/tags/%E6%82%AC%E6%B5%AE%E5%AE%A0%E7%89%A9-%E7%9C%8B%E6%9D%BF%E5%A8%98/">悬浮宠物/看板娘<sup>1</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E5%BA%95%E9%83%A8%E9%AD%94%E6%94%B9/">站点底部魔改<sup>1</sup></a></div></div><div class="console-card history" onclick="sco.hideConsole()"><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2025/01/"><span class="card-archive-list-date">2025/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/12/"><span class="card-archive-list-date">2024/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/11/"><span class="card-archive-list-date">2024/11</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/10/"><span class="card-archive-list-date">2024/10</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/09/"><span class="card-archive-list-date">2024/09</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/08/"><span class="card-archive-list-date">2024/08</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/07/"><span class="card-archive-list-date">2024/07</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/06/"><span class="card-archive-list-date">2024/06</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/05/"><span class="card-archive-list-date">2024/05</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/04/"><span class="card-archive-list-date">2024/04</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/03/"><span class="card-archive-list-date">2024/03</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/02/"><span class="card-archive-list-date">2024/02</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/01/"><span class="card-archive-list-date">2024/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">4</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/12/"><span class="card-archive-list-date">2023/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/11/"><span class="card-archive-list-date">2023/11</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/10/"><span class="card-archive-list-date">2023/10</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/09/"><span class="card-archive-list-date">2023/09</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/08/"><span class="card-archive-list-date">2023/08</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/07/"><span class="card-archive-list-date">2023/07</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">5</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/04/"><span class="card-archive-list-date">2023/04</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/03/"><span class="card-archive-list-date">2023/03</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/02/"><span class="card-archive-list-date">2023/02</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/01/"><span class="card-archive-list-date">2023/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/12/"><span class="card-archive-list-date">2022/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2021/12/"><span class="card-archive-list-date">2021/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/"><span class="card-archive-list-date">全部文章</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">46</span><span class="card-archive-list-count-unit">篇</span></div></a></li></ul></div></div></div><div class="button-group"><div class="console-btn-item"><span class="darkmode_switchbutton" onclick="sco.switchDarkMode()" title="昼夜切换"><i class="solitude fa-solid fa-circle-half-stroke"></i></span></div><div class="console-btn-item" id="consoleHideAside"><span class="asideSwitch" onclick="sco.switchHideAside()" title="边栏显示控制"><i class="solitude fas fa-arrows-left-right-to-line"></i></span></div><div class="console-btn-item on" id="consoleCommentBarrage" onclick="sco.switchCommentBarrage()"><span class="commentBarrage"><i class="solitude fa-solid fa-comment"></i></span></div><div class="console-btn-item" id="consoleplayer" onclick="musicsw()"><span class="music-switch" title="音乐开关"><i class="solitude fa-solid fa-compact-disc"></i></span></div></div><div class="console-mask" onclick="sco.hideConsole()"></div></div><div id="sidebar" style="zoom:1"><div id="menu-mask" style="display:none"></div><div id="sidebar-menus"><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/archives/"><div class="headline">文章</div><div class="length-num">46</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/recentcomments/"><div class="headline">评论</div><div class="length-num" id="artalk_allcount"><i class="solitude fa-solid fa-spinner fa-spin"></i></div><script pjax="pjax">(async()=>{const t=new URLSearchParams({site_name:"汐塔魔法屋",limit:"-1"});await fetch(`https://atk.pl.blog.sinzmise.top/api/v2/stats/latest_comments?${t}`,{method:"GET"}).then((async t=>t.json())).then((async t=>{document.querySelector("#artalk_allcount").innerHTML=t.length}))})()</script></a></div></div></div><span class="sidebar-menu-item-title">功能</span><div class="sidebar-menu-item"><span class="darkmode_switchbutton menu-child" onclick="sco.switchDarkMode()"><i class="solitude fa-solid fa-circle-half-stroke"></i><span>显示模式</span></span></div><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">我的</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener" href="https://www.storical.space/" title="个人主页"><img class="nolazyload back-menu-item-icon" src="/images/icon.png" alt="个人主页"><span class="back-menu-item-text">个人主页</span></a></div></div></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>文章</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-guidang1"></use></svg><span>归档</span></a></li><li><a class="site-page child" href="/tags/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-sekuaibiaoqian"></use></svg><span>标签</span></a></li><li><a class="site-page child" href="/categories/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-fenlei"></use></svg><span>分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/fcircle/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pengyouquan"></use></svg><span>朋友圈</span></a></li><li><a class="site-page child" href="/comments/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-liuyan"></use></svg><span>留言板</span></a></li><li><a class="site-page child" href="/link/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-lianjie"></use></svg><span>友人帐</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>休闲</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/games/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-Swf"></use></svg><span>小游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://umami.status.sinzmise.top/share/tliXWHHcZzGWhRgI/blog.storical.space"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-tongji"></use></svg><span>站点统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>虫洞</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://travel.moe/go.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-meng"></use></svg><span>异次元之旅</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://storeweb.cn/s/1707"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-shangdian"></use></svg><span>个站商店</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://bokelu.suijiboke.gs/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-boke"></use></svg><span>博客录</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://blogscn.fun/random.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-data-input"></use></svg><span>笔墨迹</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://www.blogsclub.org/go"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-b_x"></use></svg><span>BlogsClub</span></a></li></ul></div></div><span class="sidebar-menu-item-title">标签</span><div class="card-widget card-tags card-archives card-webinfo card-allinfo"><div class="card-tag-cloud"><a href="/tags/%E4%B8%AA%E4%BA%BA%E5%B0%8F%E8%AE%B0/">个人小记<sup>24</sup></a><a href="/tags/%E6%B8%B8%E6%88%8F%E7%9B%B8%E5%85%B3/">游戏相关<sup>4</sup></a><a href="/tags/%E5%85%B6%E5%AE%83%E6%B8%B8%E6%88%8F/">其它游戏<sup>3</sup></a><a href="/tags/%E9%A1%B9%E7%9B%AE%E6%8A%98%E8%85%BE/">项目折腾<sup>3</sup></a><a href="/tags/Windows%E8%BD%AF%E4%BB%B6/">Windows软件<sup>2</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾<sup>14</sup></a><a href="/tags/%E8%87%AA%E5%BB%BA%E9%83%A8%E7%BD%B2/">自建部署<sup>5</sup></a><a href="/tags/Flash%E7%9B%B8%E5%85%B3/">Flash相关<sup>1</sup></a><a href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/">页面魔改<sup>3</sup></a><a href="/tags/%E6%AD%8C%E6%9B%B2%E6%94%B6%E9%9B%86/">歌曲收集<sup>1</sup></a><a href="/tags/Steam%E6%B8%B8%E6%88%8F/">Steam游戏<sup>1</sup></a><a href="/tags/%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB/">加载动画<sup>1</sup></a><a href="/tags/%E6%82%AC%E6%B5%AE%E5%AE%A0%E7%89%A9-%E7%9C%8B%E6%9D%BF%E5%A8%98/">悬浮宠物/看板娘<sup>1</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E5%BA%95%E9%83%A8%E9%AD%94%E6%94%B9/">站点底部魔改<sup>1</sup></a></div></div><span class="sidebar-menu-item-title">网站信息</span><div class="webinfo"><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-file-word"></i><div class="item-name">全站字数 :</div></div><div class="item-count">46.4k</div></div></div></div></div><div class="needEndHide" id="rightside"><div class="rs_hide"><button class="translate" type="button" title="简繁转换">简</button><button class="mode" type="button" title="显示模式切换" onclick="sco.switchDarkMode()"><i class="fas fa-circle-half-stroke"></i></button><button class="aside pc" type="button" title="侧边栏" onclick="sco.switchHideAside()"><i class="fas fa-arrows-alt-h"></i></button></div><div class="rs_show"><button class="config" type="button" title="扩展" onclick="document.querySelector(".rs_hide").classList.toggle("show")"><i class="fas fa-gear fa-spin"></i></button><button class="mobile toc" type="button" title="目录" onclick='document.querySelector("#card-toc").classList.toggle("open")'><i class="fas fa-list"></i></button><button class="comment" type="button" title="评论" onclick='sco.scrollTo("post-comment")'><i class="fas fa-comment"></i></button><button class="barrage pc" type="button" title="弹" onclick="sco.switchCommentBarrage()"><span>弹</span></button><button class="top" type="button" title="返回顶部" onclick="sco.toTop()"><i class="fas fa-arrow-up"></i><span id="percent">0</span></button></div></div><div class="post h-entry" id="body-wrap"><header class="post-bg" id="page-header"><nav class="show" id="nav"><div id="nav-group"><div id="blog_name"><div class="back-home-button" tabindex="-1"><i class="back-home-button-icon solitude fas fa-bars-progress"></i><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">我的</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener" href="https://www.storical.space/" title="个人主页"><img class="nolazyload back-menu-item-icon" src="/images/icon.png" alt="个人主页"><span class="back-menu-item-text">个人主页</span></a></div></div></div></div><a id="site-name" href="/" title="返回博客主页"><span class="title">汐塔魔法屋</span><i class="solitude fa-solid fa-home"></i></a></div><div id="page-name-mask"><div id="page-name"><a id="page-name-text" onclick="sco.toTop()">小康大佬的说说方案 ———— ispeak搭建教程</a></div></div><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>文章</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-guidang1"></use></svg><span>归档</span></a></li><li><a class="site-page child" href="/tags/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-sekuaibiaoqian"></use></svg><span>标签</span></a></li><li><a class="site-page child" href="/categories/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-fenlei"></use></svg><span>分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/fcircle/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pengyouquan"></use></svg><span>朋友圈</span></a></li><li><a class="site-page child" href="/comments/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-liuyan"></use></svg><span>留言板</span></a></li><li><a class="site-page child" href="/link/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-lianjie"></use></svg><span>友人帐</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>休闲</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/games/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-Swf"></use></svg><span>小游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://umami.status.sinzmise.top/share/tliXWHHcZzGWhRgI/blog.storical.space"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-tongji"></use></svg><span>站点统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>虫洞</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://travel.moe/go.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-meng"></use></svg><span>异次元之旅</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://storeweb.cn/s/1707"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-shangdian"></use></svg><span>个站商店</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://bokelu.suijiboke.gs/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-boke"></use></svg><span>博客录</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://blogscn.fun/random.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-data-input"></use></svg><span>笔墨迹</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://www.blogsclub.org/go"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-b_x"></use></svg><span>BlogsClub</span></a></li></ul></div></div></div><div id="nav-left"></div><div id="nav-right"><div class="nav-button" id="travellings_button"><a class="site-page" target="_blank" rel="noopener" href="https://www.travellings.cn/go-by-clouds.html"><i class="solitude fas fa-train"></i></a></div><div class="nav-button" id="randomPost_button"><a class="site-page" onclick="toRandomPost()" title="随机一篇文章" href="javascript:void(0);"><i class="solitude fa-solid fa-dice-d6"></i></a></div><div class="nav-button" id="search-button"><a class="site-page social-icon search" href="javascript:void(0);" title="搜索"><i class="solitude fa-solid fa-magnifying-glass"></i></a></div><div class="nav-button" id="nav-console"><a class="console_switchbutton" onclick="sco.showConsole()" title="中控台" href="javascript:void(0);"><label><i class="left"></i><i class="center"></i><i class="right"></i></label></a></div><div id="toggle-menu"><a class="site-page"><i class="solitude fa-solid fa-bars"></i></a></div></div></div></nav><div class="coverdiv" id="coverdiv"><img class="nolazyload" id="post-cover" src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_GVRhG42nuu.1g9uz8t24io0.webp" alt="小康大佬的说说方案 ———— ispeak搭建教程"></div><div id="post-info"><div id="post-firstinfo"><div class="meta-firstline"><a class="post-meta-original" title="该文章为原创文章,注意版权协议">原创</a><span class="post-meta-categories"><a class="post-meta-categories p-category" href="/categories/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾</a></span><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/"><span class="tags-name tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>站点折腾</span></a><a class="post-meta__tags" href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/"><span class="tags-name tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>页面魔改</span></a></div></div></div></div><h1 class="post-title p-name">小康大佬的说说方案 ———— ispeak搭建教程</h1><div id="post-meta"><div class="meta-secondline"><span class="post-meta-date" title="发布于 2023-01-13 21:01:37"><i class="post-meta-icon solitude fas fa-calendar-days"></i><time class="dt-published" datetime="2023-01-13T21:01:37.000Z">2023-01-13T21:01:37.000Z</time></span><span class="post-meta-date" title="最后更新于 2025-01-24 06:12:56"><i class="post-meta-icon solitude fa-solid fa-arrows-rotate"></i><time class="dt-updated" datetime="2025-01-24T06:12:56.262Z">2025-01-24T06:12:56.262Z</time></span><span class="post-meta-wordcount"><i class="post-meta-icon solitude fa-solid fa-file-word" title="文章字数"></i><span class="word-count">5.7k</span><span class="post-meta-separator"></span><i class="post-meta-icon solitude fa-solid fa-clock" title="阅读耗时"></i><span>29 min</span></span><span class="post-meta-position" title="作者IP归属地为广东潮州"><i class="post-meta-icon solitude fas fa-location-dot"></i><span class="p-location">广东潮州</span></span><a class="post-meta-pv" href="/posts/38964/" title="文章热度"><i class="post-meta-icon solitude fa-solid fa-fire-flame-curved"></i><span id="busuanzi_page_pv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></a><span class="post-meta-commentcount" title="评论数" onclick='sco.scrollTo("post-comment")'><i class="solitude fa-solid fa-comment"></i><a href="/posts/38964/#post-comment"><span class="artalk-count"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></a></span></div></div></div><section class="main-hero-waves-area waves-area"><svg class="waves-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"><defs><path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352Z"></path></defs><g class="parallax"><use href="#gentle-wave" x="48" y="0"></use><use href="#gentle-wave" x="48" y="3"></use><use href="#gentle-wave" x="48" y="5"></use><use href="#gentle-wave" x="48" y="7"></use></g></svg></section></header><main class="layout" id="content-inner"><div id="post"><article class="post-content article-container e-content"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>搞ispeak时发现ispeak更新,能自定义评论了,也就是说我之前写的<a target="_blank" rel="noopener" href="https://blog.xsnet.eu.org/posts/43224/">ispeak教程</a>失效了<br>没办法我只能重新写了这篇教程</p><h1 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h1><h2 id="后端部署"><a href="#后端部署" class="headerlink" title="后端部署"></a>后端部署</h2><h3 id="配置数据库"><a href="#配置数据库" class="headerlink" title="配置数据库"></a>配置数据库</h3><div class="tip info"><p>以下内容来自:<a target="_blank" rel="noopener" href="https://discuss.js.org/guide/Get-MongoDB-DataBase.html">https://discuss.js.org/guide/Get-MongoDB-DataBase.html</a></p></div><ol><li>注册<a target="_blank" rel="noopener" href="https://www.mongodb.com/cloud/atlas/register">MongoDB</a>账号,注册完成后会提示你创建一个组织,并且输入一个项目昵称,选择编程语言(不选也可以),随后点击右下角的 <code>Continue</code>(继续),如果没有可以跟如下图执行,点击 <code>Create an Organization</code>(创建组织)<br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Organizations-Home.png" alt="Organizations-Home"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Register-Organizations.png" alt="Register-Organizations"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Create-Organization.png" alt="Create-Organization"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/New-Project.png" alt="New-Project"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Project-Name.png" alt="Project-Name"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Create-Project.png" alt="Create-Project"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Build-Database.png" alt="Build-Database"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Select-Free.png" alt="Select-Free"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/AWS-N.Virginia.png" alt="AWS-N.Virginia"></li><li>选择免费的共享数据库,随后会跳出选择地区(选择离你服务端近的即可),点击 <code>Create Cluster</code>创建</li><li>随后您需要创建数据库用户,输入用户名和密码,继续向下滚动就是添加 IP 地址,最后点击下方的 <code>Finish and Close</code>(完成并关闭)按钮</li></ol><div class="tip warning"><p><strong>注意</strong><br>服务器部署,则填服务器公网 IP<br><code>无服务器(ServerLess)</code>ServerLess 一般都是动态 IP,你无法得到一个固定 IP,我们建议填写 <code>0.0.0.0</code></p></div><p><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Add-IP.png" alt="Add IP"></p><ol><li>稍作等待创建好数据库即可,随后点击 <code>Connect</code>(连接),点击选择 <code>Connect you application</code>(连接应用程序),然后复制连接数据库字符串</li></ol><div class="tip warning"><p><strong>注意</strong><br>需要将字符串中的 <code><password></code>替换为您在第三步创建的数据库用户密码,修改 <code>myFirstDatabase</code>为你想要的数据库名称例如:<code>Discuss</code></p></div><p><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Connect.png" alt="Connect"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Get-Connect.png" alt="Get Connect"></p><h3 id="部署kkapi"><a href="#部署kkapi" class="headerlink" title="部署kkapi"></a>部署kkapi</h3><div class="tabs" id="部署kkapi"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#部署kkapi-0">Vercel部署(推荐)</button></li><li class="tab"><button type="button" data-href="#部署kkapi-1">服务器部署</button></li><li class="tab"><button type="button" data-href="#部署kkapi-2">docker 部署</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="部署kkapi-0"><ol><li>点击下方按钮,跳转至 Vercel 进行部署。<br><a target="_blank" rel="noopener" href="https://vercel.com/new/clone?repository-url=https://github.com/kkfive/kkapi-open/tree/vercel"><img src="/img/load-games.gif" data-lazy-src="https://vercel.com/button" alt="部署到Vercel"></a></li><li>配置环境变量:<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_wwcTzH8isA.10hmhosvut28.webp" alt="msedge_wwcTzH8isA"><br>环境变量可能随项目的迭代而增加必填的环境变量,具体请参考<a target="_blank" rel="noopener" href="https://kkapi.js.org/reference/kkapi/environment.html">官网 —— kkapi环境变量</a></li><li>重新部署<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_owqMifozPi.37vcfu5vfpm0.webp" alt="msedge_owqMifozPi"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_5WUBTLL0NZ.1nl1z1a7qiqo.webp" alt="msedge_5WUBTLL0NZ"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_mMprAjHb9O.3b2527plrfg.webp" alt="msedge_mMprAjHb9O"></li><li>绑定域名(建议)<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_miAwQcdm9f.3htnm9dlllq0.webp" alt="msedge_miAwQcdm9f"></li><li>初始化账户<br>浏览器访问:<br>你刚刚复制的地址/api/user/init?userName=你想设置的账户名<br>如果不指定用户名则自动将账户名设置为admin</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkapi-1"><p></p><div class="tip info"><p>以下内容来自:<a target="_blank" rel="noopener" href="https://kkapi.js.org/guide/setup/deploy.html#%E7%AC%AC%E4%BA%8C%E7%A7%8D%E9%83%A8%E7%BD%B2%E5%A7%BF%E5%8A%BF%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2">https://kkapi.js.org/guide/setup/deploy.html#%E7%AC%AC%E4%BA%8C%E7%A7%8D%E9%83%A8%E7%BD%B2%E5%A7%BF%E5%8A%BF%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2</a></p></div><br>克隆源代码<p></p><p>git clone <a target="_blank" rel="noopener" href="https://ghproxy.com/https://github.com/kkfive/kkapi-open.git">https://ghproxy.com/https://github.com/kkfive/kkapi-open.git</a></p><ol><li><p>安装依赖<br><code>yarn install</code><br>如果没有<code>yarn</code>则先允许<code>npm i yarn -g</code>进行安装</p></li><li><p>安装 pm2</p></li></ol><p><code>npm i pm2 -g</code></p><ol><li>编译项目</li></ol><p><code>yarn build</code></p><ol><li>配置环境变量</li></ol><p>在项目目录新建文件<code>local.env</code>,将环境变量写入其中即可。例如:</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">PORT=3000</span><br><span class="line">DATABASE_URL=mongodb://127.0.0.1:27017/kkpaiopen?authSource=admin</span><br><span class="line">DATABASE_USER=root</span><br><span class="line">DATABASE_PASSWORD=root</span><br><span class="line"># 加密密钥 测试</span><br><span class="line">SECRETKEY=xxxxxxxxxxxxxxx</span><br></pre></td></tr></tbody></table></figure><p>其中 PORT 表示启动的端口</p><ol><li>启动项目</li></ol><p><code>pm2 start pm2.json</code></p><p>然后通过命令<code>curl http://127.0.0.1:3000/api/user/init</code>检查是否允许成功</p><p>image-20220227101623911</p><p>更新项目</p><p>进入项目并执行一下命令</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git pull</span><br><span class="line">yarn build</span><br><span class="line">pm2 restart pm2.json</span><br></pre></td></tr></tbody></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkapi-2"><p>尚未写完</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div><h3 id="部署kkadmin"><a href="#部署kkadmin" class="headerlink" title="部署kkadmin"></a>部署kkadmin</h3><p>介绍:kkadmin是kkapi的后台,方便发布说说<br></p><div class="tip success"><p>以下部署姿势你只需要任选其一即可,无需全部部署。</p></div><p></p><div class="tabs" id="部署kkadmin,"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#部署kkadmin,-0">Vercel部署</button></li><li class="tab"><button type="button" data-href="#部署kkadmin,-1">CF pages部署(推荐)</button></li><li class="tab active"><button type="button" data-href="#部署kkadmin,-2">其他环境部署</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="部署kkadmin,-0"><p></p><div class="tip warning"><p>由于构建 kkadmin 时部分依赖文件需要 nodejs16 及以上版本才可以安装,因此不能将源代码扔给 vercel 进行构建。<br>所以只能够利用 GitHub actions 构建完成后将产物扔给 vercel 进行使用</p></div><p></p><ol><li>Fork这个项目:<a target="_blank" rel="noopener" href="https://github.com/kkfive/kkadmin-open/">https://github.com/kkfive/kkadmin-open/</a></li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_6HMaGfN000.1csf0rae8okg.webp" alt="msedge_6HMaGfN000"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_UPsCgr2okQ.7k0gi7brxoc0.webp" alt="msedge_UPsCgr2okQ"></p><ol><li>配置变量<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_ktuszZjpej.7ftbduod9uc0.webp" alt="msedge_ktuszZjpej"></li></ol><p>VITE_GLOB_API_URL(必选)<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_wqMbtdCCon.26m2h3r94d7k.webp" alt="msedge_wqMbtdCCon"></p><ol><li>构建actions</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_yymiOm8Kek.23xjzofdum3.webp" alt="msedge_yymiOm8Kek"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_4awdNaFJGz.1rdq0mxyfhog.webp" alt="msedge_4awdNaFJGz"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_2uYyc6Qh4I.4p3ngtkhmh00.webp" alt="msedge_2uYyc6Qh4I"></p><ol><li>部署到Vercel<br>复制下面这个网址</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://vercel.com/new/import?s=https://github.com/SinInno/kkadmin-open/tree/vercel</span><br></pre></td></tr></tbody></table></figure><p>并将“SinInno”改为你Github的用户名后访问你刚刚修改的网址<br>PS:如果你Fork的这个项目有改Repository name,那么请将上面的“kkapi-open”改为你这个项目的Repository name</p><p>然后直接部署</p><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_GJbsx9xoOw.8zgxw8og644.webp" alt="msedge_GJbsx9xoOw"></p><p>部署完成后点“Go to Dashboard”,并点左上角的“Visit”</p><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_Lyo0nIvIqF.d4g2uabkljk.webp" alt="msedge_Lyo0nIvIqF"></p><p>账号输入你之前初始化账户的账户名<br>密码请输入默认密码:123456<br>登入面板后请更改默认密码!</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkadmin,-1"><p></p><div class="tip info"><p>如果你已经在 GitHub actions 部署了,那么 cf pages 部署时也可以选择 vercel 进行部署。也可以使用主干分支进行打包部署。<br>接下来的教程以使用 cf pages 构建为例介绍</p></div><p></p><ol><li>fork项目(可直接fork)</li><li>导入项目</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/msedge_1bV5Of8ioS.xtthsj95ytc.webp" alt="msedge_1bV5Of8ioS"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/msedge_CcnQ68DBFQ.2q893j8w72k0.webp" alt="msedge_CcnQ68DBFQ"></p><ol><li>配置环境变量</li></ol><p>环境变量参考:<a target="_blank" rel="noopener" href="https://kkapi.js.org/reference/kkadmin/environment.html">官网 —— kkadmin环境变量</a></p><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227113526.png" alt="配置环境变量"></p><ol><li>等待构建完成后即可</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227114643.png" alt="构建中"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content active" id="部署kkadmin,-2"><p>其他环境部署基本可以直接使用 GitHub 构建后的 vercel 进行,毕竟只是 HTML</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div><h2 id="前端配置"><a href="#前端配置" class="headerlink" title="前端配置"></a>前端配置</h2><h3 id="进入后台,查看个人ID"><a href="#进入后台,查看个人ID" class="headerlink" title="进入后台,查看个人ID"></a>进入后台,查看个人ID</h3><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227131425.png" alt="查看个人ID"></p><h3 id="前端引入"><a href="#前端引入" class="headerlink" title="前端引入"></a>前端引入</h3><div class="tip info"><p>ipseak 使用 marked 依赖和 highlight 依赖,为了减少打包体积,并没有将该依赖打包,因此需要使用 cdn 进行外部引入。</p></div><div class="tabs" id="前端引入ispeak,"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#前端引入ispeak,-0">使用Waline</button></li><li class="tab"><button type="button" data-href="#前端引入ispeak,-1">使用Twikoo</button></li><li class="tab active"><button type="button" data-href="#前端引入ispeak,-2">使用Discuss</button></li><li class="tab"><button type="button" data-href="#前端引入ispeak,-3">使用Artalk</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="前端引入ispeak,-0"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.wl-power{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><!-- CSS --></span></span><br><span class="line"><span class="code"><link href="https://unpkg.com/@waline/client/dist/waline.css" rel="stylesheet" /></span></span><br><span class="line"><span class="code"><script src="https://unpkg.com/@waline/client@v2/dist/waline.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> Waline.init({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment',//不用改</span></span><br><span class="line"><span class="code"> serverURL: '',//填写你的Waline服务端地址</span></span><br><span class="line"><span class="code"> path:'/speak/info.html?q=' + _id,//不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> //后面可按照https://waline.js.org/reference/client/props.html 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> emoji: ["//unpkg.com/@waline/emojis@1.0.1/weibo","https://emoji.shojo.cn/bili/src/小黄脸","//unpkg.com/@waline/emojis@1.0.1/bilibili","https://emoji.shojo.cn/bili/src/枕边童话","https://emoji.shojo.cn/bili/src/咩栗","https://emoji.shojo.cn/bili/src/呜米","https://emoji.shojo.cn/bili/src/进击的冰糖","https://emoji.shojo.cn/bili/src/冰糖IO 蜕变·闪耀","https://emoji.shojo.cn/bili/src/多多poi","https://emoji.shojo.cn/bili/src/穆小泠","https://emoji.shojo.cn/bili/src/早稻叽"],// 表情包大全</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://discuss.js.org/"><strong>Waline</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"https://unpkg.com/@waline/client/dist/waline.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/@waline/client@v2/dist/waline.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> Waline.init({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment',//不用改</span></span><br><span class="line"><span class="emphasis"> serverURL: '',//填写你的Waline服务端地址</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + _</span>id,//不用改</span><br><span class="line"><span class="code"> //后面可按照https://waline.js.org/reference/client/props.html 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> emoji: ["//unpkg.com/@waline/emojis@1.0.1/weibo","https://emoji.shojo.cn/bili/src/小黄脸","//unpkg.com/@waline/emojis@1.0.1/bilibili","https://emoji.shojo.cn/bili/src/枕边童话","https://emoji.shojo.cn/bili/src/咩栗","https://emoji.shojo.cn/bili/src/呜米","https://emoji.shojo.cn/bili/src/进击的冰糖","https://emoji.shojo.cn/bili/src/冰糖IO 蜕变·闪耀","https://emoji.shojo.cn/bili/src/多多poi","https://emoji.shojo.cn/bili/src/穆小泠","https://emoji.shojo.cn/bili/src/早稻叽"],// 表情包大全</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="前端引入ispeak,-1"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.tk-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/twikoo"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> twikoo.init({</span></span><br><span class="line"><span class="code"> envId: '', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="code"> //region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填</span></span><br><span class="line"><span class="code"> path: '/speak/info.html?q=' + _id, //不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/imaegoo/twikoo/blob/main/src/client/utils/i18n/index.js</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://twikoo.js.org/"><strong>Twikoo</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://npm.elemecdn.com/twikoo"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> twikoo.init({</span></span><br><span class="line"><span class="emphasis"> envId: '', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="emphasis"> //region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + speakId, // 不用改</span></span><br><span class="line"><span class="emphasis"> lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/imaegoo/twikoo/blob/main/src/client/utils/i18n/index.js</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content active" id="前端引入ispeak,-2"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.D-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/discuss@latest/dist/discuss.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> discuss.init({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment',// 不用改</span></span><br><span class="line"><span class="code"> serverURLs: '',//填写你的Discuss服务端地址</span></span><br><span class="line"><span class="code"> path: '/speak/info.html?q=' + _id,//不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> //后面可按照https://discuss.js.org/Quick-Start.html#%E5%AE%A2%E6%88%B7%E7%AB%AF-client 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> ph: '千山万水总是情,给个评论行不行' ,//评论框占位符</span></span><br><span class="line"><span class="code"> imgLoading: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif'//评论图片加载动画</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://discuss.js.org/"><strong>Discuss</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://npm.elemecdn.com/discuss@latest/dist/discuss.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak'; //api地址</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> discuss.init({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment',// 不用改</span></span><br><span class="line"><span class="emphasis"> serverURLs: '',//填写你的Discuss服务端地址</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + speakId,// 不用改</span></span><br><span class="line"><span class="emphasis"> //后面可按照https://discuss.js.org/Quick-Start.html#%E5%AE%A2%E6%88%B7%E7%AB%AF-client 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="emphasis"> ph: '千山万水总是情,给个评论行不行' ,//评论框占位符</span></span><br><span class="line"><span class="emphasis"> imgLoading: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif'//评论图片加载动画</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="前端引入ispeak,-3"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.atk-list-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><!-- CSS --></span></span><br><span class="line"><span class="code"><link href="https://unpkg.com/artalk@2.3.4/dist/Artalk.css" rel="stylesheet" /></span></span><br><span class="line"><span class="code"><!-- JS --></span></span><br><span class="line"><span class="code"><script src="https://unpkg.com/artalk@2.3.4/dist/Artalk.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> new Artalk({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="code"> pageKey: '/speak/info.html?q=' + _id, //不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> pageTitle: title || contentSub, // 不用改</span></span><br><span class="line"><span class="code"> server: '', //填写你的Artalk服务端地址</span></span><br><span class="line"><span class="code"> site: '' // 填写你的站点名</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://artalk.js.org/"><strong>Artalk</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"https://unpkg.com/artalk@2.3.4/dist/Artalk.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/artalk@2.3.4/dist/Artalk.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> new Artalk({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="emphasis"> pageKey: path + '?q=' + speakId, // 不用改</span></span><br><span class="line"><span class="emphasis"> pageTitle: title || contentSub, // 不用改</span></span><br><span class="line"><span class="emphasis"> server: '', //填写你的Artalk服务端地址</span></span><br><span class="line"><span class="emphasis"> site: '' // 填写你的站点名</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div></article><div class="post-copyright"><div class="post-copyright__author_group"><div class="post-copyright__author_img"><img class="post-copyright__author_img_front" src="/images/icon.png"></div><div class="post-copyright__author_name">汐塔魔法屋</div><div class="post-copyright__author_desc">致我们的故事</div></div><div class="post-tools" id="post-tools"><div class="post-tools-left"><div id="quit-box" onclick="RemoveRewardMask()"></div><div class="reward-link mode"><a class="reward-link-button" href="/atom.xml"><i class="solitude fa-solid fa-seedling"></i>订阅</a></div></div></div><div class="social-share"><a class="social-share-ico icon-qq" target="_blank" rel="noopener" href="https://connect.qq.com/widget/shareqq/index.html?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&title=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&desc=%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E6%98%AF%E6%88%91%E4%B9%8B%E5%89%8D%E5%86%99%E8%BF%87%E7%9A%84%E6%95%99%E7%A8%8B%E7%9A%84%E9%87%8D%E5%86%99&summary=%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E6%98%AF%E6%88%91%E4%B9%8B%E5%89%8D%E5%86%99%E8%BF%87%E7%9A%84%E6%95%99%E7%A8%8B%E7%9A%84%E9%87%8D%E5%86%99&site=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&pics=https%3A%2F%2Fjsd.cdn.storisinz.site%2Fgh%2FSinzMise%2FMYPictures%40master%2F20230114%2Fmsedge_GVRhG42nuu.1g9uz8t24io0.webp" title="分享到QQ"><i class="solitude fab fa-qq"></i></a><a class="social-share-ico icon-weibo" target="_blank" rel="noopener" href="http://service.weibo.com/share/share.php?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&title=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&pic=https%3A%2F%2Fjsd.cdn.storisinz.site%2Fgh%2FSinzMise%2FMYPictures%40master%2F20230114%2Fmsedge_GVRhG42nuu.1g9uz8t24io0.webp" title="分享到微博"><i class="solitude fab fa-weibo"></i></a><a class="social-share-ico icon-twitter" target="_blank" rel="noopener" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&text=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B" title="分享到Twitter"><i class="solitude fab fa-twitter"></i></a><a class="social-share-ico icon-facebook" target="_blank" rel="noopener" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F" title="分享到Facebook"><i class="solitude fab fa-facebook"></i></a><div class="social-share-ico icon-link" onclick="utils.copy("https://blog.storical.space/posts/38964/")" title="复制文章链接"><i class="solitude fas fa-link"></i></div><div class="social-share-ico icon-qrcode" title="使用手机扫码阅读这篇文章"><i class="solitude fas fa-qrcode"></i><div class="share-main"><div class="share-main-all"><div id="qrcode"></div><div class="reward-dec">使用手机扫码阅读这篇文章</div></div></div><script pjax="">"function"==typeof QRCode&&new QRCode(document.getElementById("qrcode"),{text:"https://blog.storical.space/posts/38964/",correctLevel:QRCode.CorrectLevel.L}),window.addEventListener("DOMContentLoaded",(()=>{new QRCode(document.getElementById("qrcode"),{text:"https://blog.storical.space/posts/38964/",correctLevel:QRCode.CorrectLevel.L})}))</script></div></div><div class="post-copyright__notice"><span class="post-copyright-info">本文是原创文章,采用<a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans">CC BY-NC-SA 4.0</a>协议,完整转载请注明来自<a href="/">汐塔魔法屋</a></span></div></div><div class="post-tools-right"><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/"><span class="tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>站点折腾<span class="tagsPageCount">14</span></span></a><a class="post-meta__tags" href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/"><span class="tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>页面魔改<span class="tagsPageCount">3</span></span></a></div></div></div><nav class="needEndHide pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/posts/61417/"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">自建Meting服务</div></div></a></div><div class="next-post pull-right"><a href="/posts/22945/"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">butterfly主题添加音乐页面(适配手机)</div></div></a></div></nav><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="solitude fa-solid fa-comment"></i> <span>评论</span> <span class="count">(<span class="artalk-count"></span>)</span></div></div><div class="comment-wrap"><div id="artalk-wrap"></div></div></div><hr><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i> <span>网络回响</span></div></div><div class="comment-wrap webmention-timeline"></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info h-card"><div class="card-content"><div class="card-info-avatar is-center"><div class="author-info__top-group"><div class="author-info__sayhi" id="author-info__sayhi" onclick="sco.changeWittyWord()"></div></div></div><div class="avatar-img-group"><img class="avatar-img" alt="头像" src="/img/avatar.webp"></div><div class="author-info__description_group"><div class="author-info__description">人生 没必要 想太多“为什么”<br>也 没必要 想太多乱七八糟的事情<br>而是应该想“怎么做”“怎么样”“会成功的”<br>给自己一些鼓励和关爱<br>才能遇到好的生活</div></div><div class="author-info__bottom-group"><span class="author-info__bottom-group-left"><div class="author-info__name p-name p-author">王九弦SZ·Ninty</div><div class="author-info__desc p-note">种下故事的种子,在光的照耀下生根发芽</div></span><div class="card-info-social-icons is-center"><a class="social-icon u-url" target="_blank" href="https://github.com/SinzMise" title="Github" rel="me noopener"><i class="solitude fab fa-github"></i></a><a class="social-icon u-url u-email" href="mailto:email@sinzmise.top" title="Email" rel="me"><i class="solitude fa fa-envelope"></i></a></div></div></div></div><div class="card-widget" id="card-widget-schedule"><div class="item-headline"><i></i><span></span></div><div class="item-content"><div id="schedule-area-left"><div id="schedule-title">距离除夕</div><div id="schedule-days"></div><div id="schedule-date">2025-01-28</div></div><div id="schedule-area-right"><div class="schedule-r0"><div class="schedule-d0">本年</div><div class="schedule-d1"><span id="p_span_year" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="365" id="pBar_year"></progress></div></div><div class="schedule-r1"><div class="schedule-d0">本月</div><div class="schedule-d1"><span id="p_span_month" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="30" id="pBar_month"></progress></div></div><div class="schedule-r2"><div class="schedule-d0">本周</div><div class="schedule-d1"><span id="p_span_week" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="7" id="pBar_week"></progress></div></div></div></div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="solitude fa-solid fa-bars"></i><span>文章目录</span></div><div class="toc-content" id="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%89%8D%E8%A8%80"><span class="toc-text">前言</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%95%99%E7%A8%8B"><span class="toc-text">教程</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%90%8E%E7%AB%AF%E9%83%A8%E7%BD%B2"><span class="toc-text">后端部署</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="toc-text">配置数据库</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%83%A8%E7%BD%B2kkapi"><span class="toc-text">部署kkapi</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%83%A8%E7%BD%B2kkadmin"><span class="toc-text">部署kkadmin</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E9%85%8D%E7%BD%AE"><span class="toc-text">前端配置</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BF%9B%E5%85%A5%E5%90%8E%E5%8F%B0%EF%BC%8C%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BAID"><span class="toc-text">进入后台,查看个人ID</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E5%BC%95%E5%85%A5"><span class="toc-text">前端引入</span></a></li></ol></li></ol></li></ol></div></div><div class="card-widget" id="card-widget-calendar"><div class="item-headline"><i></i><span></span></div><div class="item-content"><div id="calendar-area-left"><div id="calendar-week"></div><div id="calendar-date" style="font-size:48px"></div><div id="calendar-solar"></div><div id="calendar-lunar"></div></div><div id="calendar-area-right"><div id="calendar-main"></div></div></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="solitude fa-solid fa-map"></i><span>最近发布</span></div><div class="aside-list"><a class="aside-list-item" href="/posts/60486/" title="新的域名,新的故事"><div class="thumbnail"><img alt="新的域名,新的故事" src="https://images1.blog.sinzmise.top/azurlane/a9179659586ee509f27367a82c4d639b52ba1342.avif"></div><div class="content"><span class="title" href="/posts/60486/" title="新的域名,新的故事">新的域名,新的故事</span><span class="article-recent_post_categories" href="/posts/60486/">个人小记</span></div></a><a class="aside-list-item" href="/posts/23226/" title="很屑的2024年度总结("><div class="thumbnail"><img alt="很屑的2024年度总结(" src="https://images1.blog.sinzmise.top/20250121/再见2024,你好2025.39l9926twi.avif"></div><div class="content"><span class="title" href="/posts/23226/" title="很屑的2024年度总结(">很屑的2024年度总结(</span><span class="article-recent_post_categories" href="/posts/23226/">个人小记</span></div></a><a class="aside-list-item" href="/posts/65382/" title="圣诞快乐+12月小记"><div class="thumbnail"><img alt="圣诞快乐+12月小记" src="https://images1.blog.sinzmise.top/azurlane/8.avif"></div><div class="content"><span class="title" href="/posts/65382/" title="圣诞快乐+12月小记">圣诞快乐+12月小记</span><span class="article-recent_post_categories" href="/posts/65382/">个人小记</span></div></a><a class="aside-list-item" href="/posts/61713/" title="2024-11小记"><div class="thumbnail"><img alt="2024-11小记" src="https://images1.blog.sinzmise.top/azurlane/17.avif"></div><div class="content"><span class="title" href="/posts/61713/" title="2024-11小记">2024-11小记</span><span class="article-recent_post_categories" href="/posts/61713/">个人小记</span></div></a><a class="aside-list-item" href="/posts/61712/" title="2024-10小记"><div class="thumbnail"><img alt="2024-10小记" src="https://images1.blog.sinzmise.top/images/2024-10.9gwlrtheoo.webp"></div><div class="content"><span class="title" href="/posts/61712/" title="2024-10小记">2024-10小记</span><span class="article-recent_post_categories" href="/posts/61712/">个人小记</span></div></a></div></div><div class="card-widget card-tags card-archives card-webinfo card-allinfo"><div class="webinfo"><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon fa-solid fa-folder-closed"></i><div class="item-name">文章总数 :</div></div><div class="item-count">46</div></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-eye"></i><div class="item-name">总访问数 :</div></div><span id="busuanzi_site_pv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-user"></i><div class="item-name">总访客数 :</div></div><span id="busuanzi_site_uv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-calendar-day"></i><div class="item-name">建站天数 :</div></div><div class="item-count" id="runtimeshow"></div></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-arrows-rotate"></i><div class="item-name">最后更新 :</div></div><time class="item-count" datetime="2025-01-24T06:13:46.162Z"></time></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-file-word"></i><div class="item-name">全站字数 :</div></div><div class="item-count">46.4k</div></div></div></div></div></div></main><footer id="footer"><div id="footer_deal"><a class="deal_link" target="_blank" rel="noopener" href="https://github.com/SinzMise" title="Github"><i class="solitude fab fa-github"></i></a><a class="deal_link" href="mailto:email@sinzmise.top" title="Mail"><i class="solitude far fa-envelope"></i></a><div class="nolazyload footer_mini_logo" id="footer_mini_logo" title="返回顶部" onclick="sco.toTop()"><img src="/img/avatar.webp" alt="返回顶部"></div><a class="deal_link" target="_blank" rel="noopener" href="https://space.bilibili.com/479627766" title="Bilibili"><i class="solitude fab fa-bilibili"></i></a><a class="deal_link" target="_blank" rel="noopener" href="https://www.storical.space/" title="Home"><i class="solitude fa fa-home"></i></a></div><div id="st-footer"><div class="footer-group"><h3 class="footer-title">我加入的1</h3><div class="footer-links"><a class="footer-item" target="_blank" rel="noopener" href="https://zhblogs.ohyee.cc/" title="中文博客列表">中文博客列表</a><a class="footer-item" target="_blank" rel="noopener" href="https://storeweb.cn/member/o/1585" title="个站商店">个站商店</a><a class="footer-item" target="_blank" rel="noopener" href="https://bf.zzxworld.com/s/995" title="BlogFinder">BlogFinder</a><a class="footer-item" target="_blank" rel="noopener" href="https://sites.applinzi.com/site-info?siteType=life&siteId=64cb373190e35300a8eec654" title="站点聚合平台">站点聚合平台</a><a class="footer-item" target="_blank" rel="noopener" href="https://boke.lu/" title="博客录">博客录</a></div></div><div class="footer-group"><h3 class="footer-title">我加入的2</h3><div class="footer-links"><a class="footer-item" target="_blank" rel="noopener" href="https://rssblog.cn/member/d711afd659d65c2ba2d3b18697818cf7/" title="RssBlog">RssBlog</a><a class="footer-item" target="_blank" rel="noopener" href="https://blogscn.fun/" title="笔墨迹">笔墨迹</a><a class="footer-item" target="_blank" rel="noopener" href="https://daohang.lusongsong.com/" title="博客大全">博客大全</a><a class="footer-item" target="_blank" rel="noopener" href="https://www.blogsclub.org/blog/99.html" title="BlogsClub">BlogsClub</a><a class="footer-item" target="_blank" rel="noopener" href="https://ourblo.gs/blogs/55/" title="OurBlogs">OurBlogs</a></div></div><div class="footer-group"><div class="footer-title-group"><h3 class="footer-title">友链</h3><button class="random-friends-btn" onclick="randomLinksList()" title="友链"><i class="solitude fa-solid fa-arrows-rotate"></i></button></div><div class="footer-links" id="friend-links-in-footer"></div></div></div><div id="footer-bar"><div class="footer-bar-links"><div class="footer-bar-left"><div class="copyright">© 2023 - 2025 By <a class="footer-bar-link" href="/"><img class="author-avatar" src="/images/icon.png">王九弦SZ·Ninty</a></div><div class="beian-group"><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.gov.moe/?keyword=20231033" title="萌ICP备20231033号"><span class="beian-name">萌ICP备20231033号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.yuncheng.fun/id.php?keyword=20241025" title="团ICP备20241025号"><span class="beian-name">团ICP备20241025号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://beian.miit.cn.com/gov/search.php?query=20240818" title="MIIT备20240818号"><img class="beian-icon" src="https://beian.miit.cn.com/logo.svg" alt="MIIT备20240818号"><span class="beian-name">MIIT备20240818号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://guan.ma/hao/2024000155/" title="官码2024000155号"><span class="beian-name">官码2024000155号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.snzy.cc/?id=2024120181" title="梵AIA盟2024120181号"><img class="beian-icon" src="https://icp.snzy.cc/static/picture/icpba.png" alt="梵AIA盟2024120181号"><span class="beian-name">梵AIA盟2024120181号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.sepocatch.xyz/search.php?keyword=blog.storical.space" title="SICP备20243448号"><span class="beian-name">SICP备20243448号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://hexo.io/">框架:Hexo</a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://github.com/everfu/hexo-theme-solitude">主题:Solitude</a></div></div><div class="footer-bar-right"><a class="footer-bar-link" alt="<a href="https://xn--sr8hvo.ws/previous">←</a>&nbsp;An&nbsp;<a href="https://xn--sr8hvo.ws">IndieWeb Webring</a>&nbsp;🕸💍&nbsp;<a href="https://xn--sr8hvo.ws/next">→</a>"></a><a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws/previous">←</a> An <a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws">IndieWeb Webring</a> 🕸💍 <a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws/next">→</a><a class="footer-bar-link" href="/atom.xml" alt="RSS">RSS</a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans" alt="License"><i class="solitude fas fa-copyright"></i><i class="solitude fab fa-creative-commons-by"></i><i class="solitude fab fa-creative-commons-nc"></i><i class="solitude fab fa-creative-commons-nd"></i></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://www.travellings.cn/go.html" alt="开往-友链接力"><img src="https://www.travellings.cn/assets/logo.gif" alt="开往-友链接力"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://boringbay.com/" alt="无聊湾 🥱 The Boring Bay"><img src="https://boringbay.com/api/badge/blog.storical.space" alt="无聊湾 🥱 The Boring Bay"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://blogscn.fun/" alt="本站已加入BLOGS·CN"><img src="https://photo.xiangming.site/img/blogscn.png" alt="本站已加入BLOGS·CN"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://blogscn.fun/random.html" alt="BLOGS·CN随机访问"><img src="https://photo.xiangming.site/img/footer.gif" alt="BLOGS·CN随机访问"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://www.blogsclub.org/go" alt="空间穿梭-随机访问BlogsClub成员博客"><img src="https://www.blogsclub.org/images/shuttle_1.png" alt="空间穿梭-随机访问BlogsClub成员博客"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://http3.wcode.net/?q=blog.storical.space" alt="本站支持HTTP/3"><img src="https://http3.wcode.net/badges/http3.svg?host=blog.storical.space" alt="本站支持HTTP/3"></a></div></div></div><div class="comment-barrage needEndHide"></div></footer></div><div id="rightMenu"><div class="rightMenu-group rightMenu-small"><div class="rightMenu-item" id="menu-backward"><i class="solitude fa-solid fa-arrow-left"></i></div><div class="rightMenu-item" id="menu-forward"><i class="solitude fa-solid fa-arrow-right"></i></div><div class="rightMenu-item" id="menu-refresh"><i class="solitude fa-solid fa-arrows-rotate"></i></div><div class="rightMenu-item" id="menu-top"><i class="solitude fa-solid fa-arrow-up"></i></div></div><div class="rightMenu-group rightMenu-line rightMenuPlugin"><div class="rightMenu-item" id="menu-copytext"><i class="solitude fa-solid fa-clone"></i><span>复制选中文本</span></div><div class="rightMenu-item" id="menu-pastetext"><i class="solitude fa-solid fa-clipboard"></i><span>粘贴文本</span></div><div class="rightMenu-item" id="menu-commenttext"><i class="solitude fa-solid fa-comment-medical"></i><span>引用到评论</span></div><div class="rightMenu-item" id="menu-newwindow"><i class="solitude fa-regular fa-window-maximize"></i><span>新窗口打开</span></div><div class="rightMenu-item" id="menu-copylink"><i class="solitude fa-solid fa-link"></i><span>复制链接地址</span></div><div class="rightMenu-item" id="menu-copyimg"><i class="solitude fa-solid fa-clone"></i><span>复制此图片</span></div><div class="rightMenu-item" id="menu-downloadimg"><i class="solitude fa-solid fa-cloud-arrow-down"></i><span>下载此图片</span></div><div class="rightMenu-item" id="menu-search"><i class="solitude fa-solid fa-magnifying-glass"></i><span>站内搜索</span></div></div><div class="rightMenu-group rightMenu-line rightMenuOther"><div class="rightMenu-item" id="menu-commentBarrage" onclick="sco.switchCommentBarrage()"><i class="solitude fa-solid fa-comment"></i><span class="menu-commentBarrage-text">关闭热评</span></div><div class="rightMenu-item" id="menu-darkmode" onclick="sco.switchDarkMode()"><i class="solitude fa-solid fa-circle-half-stroke"></i><span class="menu-darkmode-text">深色模式</span></div><div class="rightMenu-item" id="menu-translate"><i class="solitude fa-solid fa-language"></i><span>轉為繁體</span></div></div></div><div id="rightmenu-mask"></div><div><script src="/js/utils.js?v=3.0.5"></script><script src="/js/main.js?v=3.0.5"></script><script src="/js/third_party/waterfall.min.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/pjax@0.2.8/pjax.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/qrcodejs@1.0.0/qrcode.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/typeit@8.8.7/dist/index.umd.min.js"></script><script src="/js/third_party/universe.min.js?v=3.0.5"></script><script>dark()</script><script src="/js/tw_cn.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/vanilla-lazyload@19.1.3/dist/lazyload.iife.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/node-snackbar@0.1.16/dist/snackbar.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/@fancyapps/ui@5.0.36/dist/fancybox/fancybox.umd.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/colorthief@2.6.0/dist/color-thief.min.js"></script><script src="/js/covercolor/local.js?v=3.0.5"></script><script>window.paceOptions={restartOnPushState:!1},utils.addGlobalFn("pjaxSend",(()=>{Pace.restart()}),"pace_restart")</script><script src="https://jsd.cdn.sinzmise.top/npm/pace-js@1.2.4/pace.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/instantsearch.js@4.75.6/dist/instantsearch.production.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/algoliasearch@5.18.0/dist/algoliasearch.umd.min.js"></script><script src="/js/right_menu.js?v=3.0.5"></script><script src="/js/schedule.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/chinese-lunar@0.1.4/lib/chinese-lunar.js"></script><script src="/chatroom/chatroom.js"></script><script async src="//at.alicdn.com/t/c/font_3586335_hsivh70x0fm.js"></script><script async src="//at.alicdn.com/t/c/font_4199232_wlo8truegv.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/aplayer/dist/APlayer.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/meting/dist/Meting.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/@ruffle-rs/ruffle"></script><script src="/js/cenguigui.js"></script><div class="js-pjax"><script>(()=>{let t=null;const e=()=>{if(t=Artalk.init({el:"#artalk-wrap",server:"https://atk.pl.blog.sinzmise.top",site:"汐塔魔法屋",pageKey:location.pathname,darkMode:"dark"===document.documentElement.getAttribute("data-theme"),countEl:".artalk-count"},null),"null"===GLOBAL_CONFIG.lightbox)return;t.on("list-loaded",(()=>{const e=[];t.ctx.get("list").getCommentNodes().forEach((t=>{e.push({nick:t.data.nick,content:t.data.content_marked,mailMd5:t.data.email_encrypted});const a=t.getRender().$content;GLOBAL_CONFIG.lightbox&&utils.lightbox(a.querySelectorAll("img:not([atk-emoticon])"))})),sco.owoBig({body:".atk-grp",item:".atk-item"})&&barrageArtalk(e)}));utils.addGlobalFn("pjax",(()=>t.destroy()),"destroyArtalk"),document.addEventListener("pjax:complete",(function(){t.update({pageKey:window.location.pathname,pageTitle:document.title}),t.reload()}))},a=async()=>{"object"==typeof Artalk?e():(await utils.getCSS("https://jsd.cdn.sinzmise.top/npm/artalk@2.9.1/dist/Artalk.min.css"),await utils.getScript("https://jsd.cdn.sinzmise.top/npm/artalk@2.9.1/dist/Artalk.min.js").then(e))};utils.addGlobalFn("themeChange",(e=>{const a=document.getElementById("artalk-wrap");if(!a||!a.children.length)return;const n="dark"===e;t.setDarkMode(n)}),"artalk"),a()})()</script><script defer pjax="" src="https://jsd.cdn.sinzmise.top/npm/penndu/bsz.js"></script></div><script>var webmentionContext={baseUrl:"https://webmention.io"},webmentionEndpoint="https://webmention.io/blog.storical.space/webmention"</script><script data-pjax="" src="/js/webmention/webmention.js?v=3.0.5"></script><script data-pjax="" src="/js/webmention/webmention-timeline.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/jquery@3.5.1/dist/jquery.min.js"></script></div><script>const links=[{name:"Hexo",link:"https://hexo.io/"},{name:"Solitude",link:"https://github.com/everfu/hexo-theme-solitude"},{name:"安知鱼",link:"https://blog.anheyu.com/"},{name:"轻笑Chuckle",link:"https://www.qcqx.cn"},{name:"SeaEpoch",link:"https://www.seayj.cn"},{name:"晓雨杂记",link:"https://lihaoyu.cn"},{name:"山岳库博",link:"https://kmar.top/"},{name:"Ariasakaの小窝",link:"https://blog.yaria.top"},{name:"勿埋我心",link:"https://www.skyqian.com"},{name:"iMaeGoo’s Blog",link:"https://www.imaegoo.com"},{name:"贰猹的小窝",link:"https://noionion.top/"},{name:"定の栈",link:"https://saop.cc"},{name:"Guoqi Sun",link:"https://blog.sunguoqi.com"},{name:"Echo 的小窝",link:"https://www.liveout.cn/"},{name:"米米的博客",link:"https://zhangshuqiao.org"},{name:"MHuiG",link:"https://mhuig.top"},{name:"杜老师说",link:"https://dusays.com"},{name:"Leonus",link:"https://blog.leonus.cn/"},{name:"小N同学",link:"https://www.imcharon.com/"},{name:"Android",link:"https://android99.com"},{name:"张洪Heo",link:"https://blog.zhheo.com/"},{name:"刘洪亮Leo",link:"https://lhliang.com"},{name:"张时贰",link:"https://zhsher.cn"},{name:"Tianli",link:"https://blog.tianli0.top/"},{name:"时光日志",link:"https://www.timelogs.cn"},{name:"葱苓sama",link:"https://blog.ciraos.top"},{name:"Wayne's Blog",link:"https://wrans.top"},{name:"铭心石刻",link:"https://blog.kouseki.cn/"},{name:"猫羽のブログす",link:"https://www.maoyv.cn/"},{name:"猫羽のブログす(新站)",link:"https://www.maoyv.com/"},{name:"风起",link:"https://www.fqxk.com.cn"},{name:"Mycpen",link:"https://blog.cpen.top/"},{name:"W4J1e's blog",link:"https://hin.cool"},{name:"Fomalhaut🥝",link:"https://www.fomal.cc/"},{name:"醉月酿星河",link:"https://blog.catrol.cn/"},{name:"CyanFalse's Weblog",link:"https://blog.eurekac.cn"},{name:"阿锋的小宇宙",link:"https://feng.pub"},{name:"白云苍狗",link:"https://www.imalun.com"},{name:"半方池水半方田",link:"https://uuanqin.top/"},{name:"朽丘秋雨",link:"https://koxiuqiu.cn/"},{name:"网友小宋",link:"https://xyzbz.cn/"},{name:"懋和道人",link:"https://www.dao.js.cn/"},{name:"青桔气球",link:"https://blog.qjqq.cn/"},{name:"微光档案",link:"https://bikari.top"},{name:"风记星辰",link:"https://www.thyuu.com"},{name:"甜鱼/Ayu",link:"https://ayu.land/"},{name:"小鹿的个人网站",link:"https://www.siena.zone"},{name:"Aciano",link:"https://aciano.top/"},{name:"奇思妙想录",link:"https://blog.nicebao.com"},{name:"喵二の小博客",link:"https://www.miaoer.net/"},{name:"Ordis",link:"https://imbhj.com"},{name:"ANXYの小窝",link:"https://blog.anxy.top/"},{name:"月光小镇",link:"https://mooncc.cn/"},{name:"希乐博客",link:"https://blog.xlenco.top/"},{name:"福福不服",link:"https://ffbf.top"},{name:"追梦幻境·云之都",link:"https://blog.dreamerhe.cn/"},{name:"Xiobb’s Blog",link:"https://www.i45s.com/?_ref=blog.sinzmise.top"},{name:"foxcat(狐狸猫的博客)",link:"https://blog.foxcat.eu.org/"},{name:"Gaspard の传火祭祀场",link:"https://www.gaspard.top/"},{name:"阿方的博客",link:"https://fang.blog.miri.site/"},{name:"落落のBlog",link:"https://www.whaleluo.top/"},{name:"俊逸的博客",link:"https://lijunyi.xyz/"},{name:"Calyee",link:"https://blog.calyee.top/"},{name:"小丁的屋舍",link:"https://xding.top/"},{name:"冬天的小窝",link:"https://www.iamdt.cn/"},{name:"郑文峰的博客",link:"https://www.zhengwenfeng.com"},{name:"Naive Koala 🐨",link:"https://www.xalaok.top/"},{name:"微霞",link:"https://yuuu.org"},{name:"孤熵小狼",link:"https://blog.furen.link"},{name:"奥奥の探索日记",link:"https://blog.shaoao.top/"},{name:"Daoker小站",link:"https://daoker.cc"},{name:"LZHの小窝",link:"https://blog.lzh.life/"},{name:"lveMonsiのBlog",link:"https://blog.lvems.top/"},{name:"彬彬加冰",link:"https://blog.wzwzx.cn"},{name:"Isoheptane",link:"https://blog.cascade.moe/"},{name:"雨宮千夏の博麗神社",link:"https://blog.uuz.moe/"},{name:"清羽飞扬",link:"https://blog.liushen.fun/"},{name:"杰帕斯の小窝",link:"https://japerz.com"},{name:"星の野",link:"https://blog.byer.top/"},{name:"Souiken’s Homepage",link:"https://souiken.moe/"},{name:"PuddingKCの小站",link:"https://www.puddingkc.com/"},{name:"MBRjun-Blog",link:"https://www.mbrjun.cn/"},{name:"Homulilly",link:"https://homulilly.com"},{name:"蓝调时刻",link:"https://www.landiaoshike.com/"},{name:"XenWayne’s Blog",link:"https://xenwayne.top"},{name:"白丁往事",link:"https://blog.rayvv.com/"},{name:"haohang",link:"https://www.shimmerl.top"},{name:"咖啡豆子coffee的小站",link:"https://blog.kfdzcoffee.cn"},{name:"雪萌天文台",link:"https://blog.snowy.moe"},{name:"澄沨的漫游茶记",link:"https://champhoon.xyz/"},{name:"VanllaOcap Blog",link:"https://blog.255650.xyz"},{name:"LeZi的猫窝",link:"https://leziblog.com"},{name:"雨滴思绪",link:"https://www.qunqin.net/"},{name:"Pinpe 的云端",link:"https://pinpe.top"},{name:"Debug客栈",link:"https://debuginn.com"},{name:"lhDream",link:"https://blog.luhua.site"},{name:"XingJiのBlog",link:"https://love.xingji.fun/"},{name:"无名博客",link:"https://wuminboke.site/"},{name:"murenyouの小窝",link:"https://murenyou.cn"},{name:"Elykia",link:"https://blog.elykia.cn/"},{name:"小妖客栈",link:"https://wangkay.top"},{name:"陵长镜的小博客",link:"https://r1n.top"},{name:"森尧记",link:"https://07111.cn"},{name:"厄尔科斯",link:"https://sikan.moe/"},{name:"萌!萝莉",link:"https://loliloli.moe"},{name:"洛卡日记",link:"https://luoca.cn/"},{name:"FloatSheep",link:"https://blog.hesiy.cn"},{name:"云团子的博客",link:"https://www.yuncheng.fun/"},{name:"亚斯之声",link:"https://we.owaii.net"},{name:"酸奶云✨",link:"https://blog.mcyogurt.cn/"},{name:"王鑫的小站",link:"https://wxweb.xyz"}],randomText="点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:⌈ ${name} ⌋";function travelling(){const n=links[utils.randomNum(links.length)];Snackbar.show({text:randomText.replace(/\$\{name}/,n.name),duration:8e3,pos:"top-center",actionText:"前往",onActionClick:function(t){t.style.opacity=0,window.open(n.link,"_blank")}})}</script><script>function randomLinksList(){const e=document.getElementById("friend-links-in-footer");if(null==e)return;let n="",t=[...links],l=Math.min(3,t.length);for(let e=0;e<l;e++){let e=utils.randomNum(t.length);const{link:l,name:o}=t[e];n+=`<a class="footer-item" href="${l}" target="_blank" rel="noopener noreferrer nofollow">${o}</a>`,t.splice(e,1)}e.innerHTML=n+'<a class="footer-item" href="/links/">更多</a>'}</script><script>const pjax=new Pjax({elements:'a:not([target="_blank"])',selectors:["title","#body-wrap","#site-config",'meta[name="description"]',".js-pjax",'meta[property^="og:"]',"#config-diff",".rs_show",".rs_hide"],cacheBust:!1,analytics:!1,scrollRestoration:!1});document.querySelectorAll("script[data-pjax]").forEach((e=>{const t=document.createElement("script"),a=e.text||e.textContent||e.innerHTML||"";Array.from(e.attributes).forEach((e=>t.setAttribute(e.name,e.value))),t.appendChild(document.createTextNode(a)),e.parentNode.replaceChild(t,e)})),document.addEventListener("pjax:complete",(()=>{window.refreshFn(),document.querySelectorAll("script[data-pjax]").forEach((e=>{const t=document.createElement("script"),a=e.text||e.textContent||e.innerHTML||"";Array.from(e.attributes).forEach((e=>t.setAttribute(e.name,e.value))),t.appendChild(document.createTextNode(a)),e.parentNode.replaceChild(t,e)})),GLOBAL_CONFIG.islazyload&&window.lazyLoadInstance.update()})),document.addEventListener("pjax:error",(e=>{404===e.request.status&&pjax.loadUrl("/404.html")}))</script><div id="algolia-search"><div class="search-dialog"><div class="algolia-navbar"><div class="search-dialog__title" id="algolia-search-title">搜索</div><div class="algolia-tips"><i class="solitude fab fa-algolia"></i><span class="algolia-tips-text">Algolia</span></div><span class="search-close-button"><i class="solitude fa-solid fa-xmark"></i></span></div><div id="algolia-input-panel"><div id="algolia-search-input"></div></div><div id="search-results"><div id="algolia-hits"></div></div><div id="algolia-tips"><div id="algolia-pagination"></div><div id="algolia-stats"></div></div></div><div id="search-mask"></div></div><script src="/js/search/algolia.js?v=3.0.5"></script></body></html><script>const posts=["posts/60486/","posts/23226/","posts/65382/","posts/61713/","posts/61712/","posts/10733/","posts/64856/","posts/15688/","posts/46640/","posts/15799/","posts/64935/","posts/10021/","posts/57692/","posts/15748/","posts/10996/","posts/13624/","posts/27762/","posts/15842/","posts/54787/","posts/52677/","posts/10045/","posts/45875/","posts/28536/","posts/27531/","posts/42580/","posts/56467/","posts/54386/","posts/29196/","posts/38917/","posts/18063/","posts/58203/","posts/50710/","posts/28733/","posts/12779/","posts/53662/","posts/20412/","posts/21375/","posts/646/","posts/42487/","posts/54481/","posts/48762/","posts/61417/","posts/38964/","posts/22945/","posts/23021/","posts/16107/"];function toRandomPost(){const s=posts[Math.floor(Math.random()*posts.length)];pjax.loadUrl(GLOBAL_CONFIG.root+s)}</script>
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>小康大佬的说说方案 ———— ispeak搭建教程 | 汐塔魔法屋</title><noscript>开启JavaScript才能访问本站哦~</noscript><link rel="icon" href="/images/icon.png"><link rel="stylesheet" href="/css/index.css?v=3.0.5"><meta name="baidu-site-verification" content="codeva-bWOlt0JEU1"><meta name="msvalidate.01" content="18428535B4425286753107589FC35E79"><meta name="blogsclub-find" content="0bcd40f87500234dd4721904e917e748"><meta name="blogsclub-verify" content="c993246f2c944fed8e4fdc8d024561fe"><link rel="canonical" href="https://blog.storical.space/posts/38964/"><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css"><link rel="preconnect"><link rel="preconnect" href="images1.blog.sinzmise.top"><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/@fancyapps/ui@5.0.36/dist/fancybox/fancybox.min.css"><meta name="description" content="这篇文章是我之前写过的教程的重写"><meta name="apple-mobile-web-app-capable" content="汐塔魔法屋"><meta name="theme-color" content="var(--efu-main)"><meta name="apple-mobile-web-app-status-bar-style" content="var(--efu-main)"><link rel="bookmark" href="/images/icon.png"><link rel="apple-touch-icon" href="/images/icon.png" sizes="180x180"><link rel="authorization_endpoint" href="https://indieauth.com/auth"><link rel="token_endpoint" href="https://tokens.indieauth.com/token"><link rel="webmention" href="https://webmention.io/blog.storical.space/webmention"><link rel="pingback" href="https://webmention.io/blog.storical.space/xmlrpc"><script>console.log(" %c Solitude %c 3.0.5 %c https://github.com/everfu/hexo-theme-solitude","background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px; color: #fff","background:#ff9a9a ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff","background:unset ; padding: 1px; border-radius: 0 3px 3px 0; color: #fff")</script><script>let mdate="7-7,9-18,12-13";mdate=mdate.split(",");let ndate=new Date;for(let e of mdate)e===ndate.getMonth()+1+"-"+ndate.getDate()&&document.documentElement.classList.add("memorial")</script><link rel="stylesheet" href="https://jsd.cdn.sinzmise.top/npm/aplayer/dist/APlayer.min.css"><link rel="stylesheet" href="/css/schedule.css"><link rel="stylesheet" href="//at.alicdn.com/t/c/font_4199232_wlo8truegv.css"><script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script><script>LA.init({id:"K9WDMA2h2AfDg5GG",ck:"K9WDMA2h2AfDg5GG",autoTrack:!0,hashMode:!0})</script><script src="https://sdk.51.la/perf/js-sdk-perf.min.js" crossorigin="anonymous"></script><script>(new LingQue.Monitor).init({id:"K94JRCDsbHJJSjNs",sendSuspicious:!0,sendSpaPv:!0})</script><script>(()=>{const e={set:function(e,t,n){if(0===n)return;const o=864e5*n,a={value:t,expiry:(new Date).getTime()+o};localStorage.setItem(e,JSON.stringify(a))},get:function(e){const t=localStorage.getItem(e);if(!t)return;const n=JSON.parse(t);if(!((new Date).getTime()>n.expiry))return n.value;localStorage.removeItem(e)}};window.utils={saveToLocal:e,getCSS:(e,t=!1)=>new Promise(((n,o)=>{const a=document.createElement("link");a.rel="stylesheet",a.href=e,t&&(a.id=t),a.onerror=o,a.onload=a.onreadystatechange=function(){const e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,n())},document.head.appendChild(a)})),getScript:(e,t={})=>new Promise(((n,o)=>{const a=document.createElement("script");a.src=e,a.async=!0,a.onerror=o,a.onload=a.onreadystatechange=function(){const e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,n())},Object.keys(t).forEach((e=>{a.setAttribute(e,t[e])})),document.head.appendChild(a)})),addGlobalFn:(e,t,n=!1,o=window)=>{const a=o.globalFn||{},r=a[e]||{};n&&r[n]||(r[n=n||Object.keys(r).length]=t,a[e]=r,o.globalFn=a)},addEventListenerPjax:(e,t,n,o=!1)=>{e.addEventListener(t,n,o),utils.addGlobalFn("pjax",(()=>{e.removeEventListener(t,n,o)}))}}})()</script><script>initTheme=()=>{let e=window.matchMedia("(prefers-color-scheme: dark)").matches;const t=utils.saveToLocal.get("theme");if(void 0===t){const t=e?"dark":"light";document.documentElement.setAttribute("data-theme",t)}else document.documentElement.setAttribute("data-theme",t);"object"==typeof rm&&rm.mode("dark"===t&&e)},initTheme()</script><script>const GLOBAL_CONFIG={root:"/",algolia:{appId:"72TOQYD33Q",apiKey:"608d2f3acd06140a2473153f6cb61eda",indexName:"hexo",hits:{per_page:6}},localsearch:void 0,runtime:"2023-04-20 00:00:00",lazyload:{enable:!0,error:"/img/friend_404.gif"},copyright:!1,highlight:{limit:200,expand:!0,copy:!0,syntax:"highlight.js"},randomlink:!0,lang:{theme:{dark:"已切换至深色模式",light:"已切换至浅色模式"},copy:{success:"复制成功",error:"复制失败"},backtop:"返回顶部",time:{day:"天前",hour:"小时前",just:"刚刚",min:"分钟前",month:"个月前"},day:" 天",f12:"开发者模式已打开,请遵循GPL协议。",totalk:"无需删除空行,直接输入评论即可",search:{empty:"找不到你查询的内容:${query}",hit:"找到 ${hits} 条结果,用时 ${time} 毫秒",placeholder:"输入关键词快速查找",count:"共 <b>${count}</b> 条结果。",loading:"搜索中..."},webmention:{title:'你有对这篇文章写<a href="https://indieweb.org/responses" target="_blank">回应</a>吗? 你可以在这里提交你的文章网址或推特链接(文章或推特内容需要包含这篇文章的地址,点击这里了解 <a href="https://indieweb.org/Webmention" target="_blank">Webmention</a>):',placeholder:"你的文章网址或推特链接",likes:"已经有 ${distinctMentions.length} 朋友喜欢、分享或讨论这篇文章:",comment:"引用或评论(${replies.length})"},barrage:{title:"热评"}},aside:{state:{morning:"✨ 早上好,新的一天开始了",noon:"🍲 午餐时间",afternoon:"🌞 下午好",night:"早点休息",goodnight:"晚安 😴"},witty_words:["你可以的","你一定可以的","祝你好运,陌生人"],witty_comment:{prefix:"好久不见,",back:"欢迎再次回来,"}},covercolor:{enable:!0},comment:{avatar:"https://weavatar.com",commentBarrage:!0},lightbox:"fancybox",post_ai:!1,right_menu:{mode:{dark:"深色模式",light:"浅色模式"},img_error:"此图片无法复制与下载",barrage:{open:"显示热评",close:"关闭热评"},translate:!0,ctrlOriginalMenu:"按住Ctrl+右键可打开浏览器右键菜单"},translate:{translateDelay:0,defaultEncoding:2},lure:!1,expire:!1}</script><script id="config-diff">var PAGE_CONFIG={is_post:!0,is_page:!1,is_home:!1,page:"",toc:!0,comment:!0,ai_text:!1,color:!1}</script><meta name="generator" content="Hexo 7.3.0"><link rel="alternate" href="/atom.xml" title="汐塔魔法屋" type="application/atom+xml"></head><body id="body"><canvas id="universe"></canvas><div id="global_bg"></div><div id="loading-box" onclick="preloader.endLoading()" style="zoom:1"><div class="loading-bg"><img class="loading-img nolazyload" src="/images/icon.png" alt="loading image"></div></div><script>const preloader={isLoaded:!1,endLoading:()=>{preloader.isLoaded||(document.getElementById("loading-box").classList.add("loaded"),preloader.isLoaded=!0,preloader.togglePaceDone())},initLoading:()=>{document.getElementById("loading-box").classList.remove("loaded"),preloader.isLoaded=!1,preloader.togglePaceDone()},togglePaceDone:()=>{document.getElementById("body").className=preloader.isLoaded?"pace-done":""}};window.addEventListener("load",(()=>{preloader.endLoading()})),window.addEventListener("pjax:send",(()=>{preloader.initLoading()})),document.addEventListener("pjax:complete",(()=>{preloader.endLoading()})),setTimeout((()=>{preloader.endLoading()}),5e3)</script><div id="console"><div class="close-btn" onclick="sco.hideConsole()"><i class="solitude fa-solid fa-xmark"></i></div><div class="console-card-group"><div class="console-card-group-left"><div class="console-card" id="card-newest-comments" onclick="sco.hideConsole()"><div class="card-content"><div class="author-content-item-tips">互动</div><div class="author-content-item-title">最新评论</div></div><div class="console_recentcomments"><script pjax="">(async()=>{document.querySelector(".console-card .console_recentcomments").textContent="加载中...";const e=/<img [^>]+ atk-emoticon="[^"]+">/g;let t=utils.saveToLocal.get("artalk-recent-comments-console");if(t)return void o(document.querySelector(".console-card .console_recentcomments"),t);let n=[];const c=new URLSearchParams({site_name:"汐塔魔法屋",limit:"6"});function o(e,t){e.innerHTML=0!==t.length?t.map((e=>`\n <div class="comment-card" title="${e.title}" onclick="pjax.loadUrl('${e.url}')">\n <div class="comment-info">\n <img src="${e.avatar}" class="nolazyload" alt="${e.nick}">\n <div>\n <span class="comment-user">${e.nick}</span>\n </div>\n <time class="comment-time" datetime="${e.time}"></time>\n </div>\n <div class="comment-content">${e.content}</div>\n <div class="comment-title">\n <i class="solitude fa-solid fa-comment"></i>\n ${e.title}</div>\n </div>\n `)).join(""):"暂无评论...","undefined"!=typeof sco?sco.changeTimeFormat(document.querySelectorAll(".comment-time")):(document.addEventListener("pjax:complete",(()=>sco.changeTimeFormat(document.querySelectorAll(".comment-time")))),document.addEventListener("DOMContentLoaded",(()=>sco.changeTimeFormat(document.querySelectorAll(".comment-time")))))}function a(t){return t=(t=(t=(t=t.replace(e,"[表情]")).replace(/!\[.*?\]\((.*?)\)/g,"[图片]")).replace(/\[.*?\]\((.*?)\)/g,"[链接]")).replace(/```.*?```/g,"[代码]")}await fetch(`https://atk.pl.blog.sinzmise.top/api/v2/stats/latest_comments?${c}`,{method:"GET"}).then((async e=>e.json())).then((async t=>{for(const o of t.data){if(c=o.content,e.test(c))continue;let t="";o.page_key&&await fetch(o.page_key).then((e=>e.text())).then((e=>{const n=(new DOMParser).parseFromString(e,"text/html");t=n.querySelector("title").innerText})).catch((()=>{t=o.page_key})),t.indexOf("|")>0&&(t=t.split("|")[0]),n.push({title:t,url:o.page_key+"#atk-comment-"+o.id,nick:o.nick,avatar:"https://weavatar.com/avatar/"+o.email_encrypted,time:o.date,content:a(o.content)})}var c;o(document.querySelector(".console-card .console_recentcomments"),n),utils.saveToLocal.set("artalk-recent-comments-console",n,.2)}))})()</script></div></div></div><div class="console-card-group-right"><div class="console-card tags" onclick="sco.hideConsole()"><div class="card-content"><div class="author-content-item-tips">标签</div><div class="author-content-item-title">寻找感兴趣的领域</div></div><div class="card-tag-cloud"><a href="/tags/%E4%B8%AA%E4%BA%BA%E5%B0%8F%E8%AE%B0/">个人小记<sup>24</sup></a><a href="/tags/%E6%B8%B8%E6%88%8F%E7%9B%B8%E5%85%B3/">游戏相关<sup>4</sup></a><a href="/tags/%E5%85%B6%E5%AE%83%E6%B8%B8%E6%88%8F/">其它游戏<sup>3</sup></a><a href="/tags/%E9%A1%B9%E7%9B%AE%E6%8A%98%E8%85%BE/">项目折腾<sup>3</sup></a><a href="/tags/Windows%E8%BD%AF%E4%BB%B6/">Windows软件<sup>2</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾<sup>14</sup></a><a href="/tags/%E8%87%AA%E5%BB%BA%E9%83%A8%E7%BD%B2/">自建部署<sup>5</sup></a><a href="/tags/Flash%E7%9B%B8%E5%85%B3/">Flash相关<sup>1</sup></a><a href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/">页面魔改<sup>3</sup></a><a href="/tags/%E6%AD%8C%E6%9B%B2%E6%94%B6%E9%9B%86/">歌曲收集<sup>1</sup></a><a href="/tags/Steam%E6%B8%B8%E6%88%8F/">Steam游戏<sup>1</sup></a><a href="/tags/%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB/">加载动画<sup>1</sup></a><a href="/tags/%E6%82%AC%E6%B5%AE%E5%AE%A0%E7%89%A9-%E7%9C%8B%E6%9D%BF%E5%A8%98/">悬浮宠物/看板娘<sup>1</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E5%BA%95%E9%83%A8%E9%AD%94%E6%94%B9/">站点底部魔改<sup>1</sup></a></div></div><div class="console-card history" onclick="sco.hideConsole()"><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2025/01/"><span class="card-archive-list-date">2025/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/12/"><span class="card-archive-list-date">2024/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/11/"><span class="card-archive-list-date">2024/11</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/10/"><span class="card-archive-list-date">2024/10</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/09/"><span class="card-archive-list-date">2024/09</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/08/"><span class="card-archive-list-date">2024/08</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/07/"><span class="card-archive-list-date">2024/07</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/06/"><span class="card-archive-list-date">2024/06</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/05/"><span class="card-archive-list-date">2024/05</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/04/"><span class="card-archive-list-date">2024/04</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/03/"><span class="card-archive-list-date">2024/03</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/02/"><span class="card-archive-list-date">2024/02</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/01/"><span class="card-archive-list-date">2024/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">4</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/12/"><span class="card-archive-list-date">2023/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/11/"><span class="card-archive-list-date">2023/11</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/10/"><span class="card-archive-list-date">2023/10</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/09/"><span class="card-archive-list-date">2023/09</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/08/"><span class="card-archive-list-date">2023/08</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/07/"><span class="card-archive-list-date">2023/07</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">5</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/04/"><span class="card-archive-list-date">2023/04</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/03/"><span class="card-archive-list-date">2023/03</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/02/"><span class="card-archive-list-date">2023/02</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/01/"><span class="card-archive-list-date">2023/01</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">3</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/12/"><span class="card-archive-list-date">2022/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2021/12/"><span class="card-archive-list-date">2021/12</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">1</span><span class="card-archive-list-count-unit">篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/"><span class="card-archive-list-date">全部文章</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">46</span><span class="card-archive-list-count-unit">篇</span></div></a></li></ul></div></div></div><div class="button-group"><div class="console-btn-item"><span class="darkmode_switchbutton" onclick="sco.switchDarkMode()" title="昼夜切换"><i class="solitude fa-solid fa-circle-half-stroke"></i></span></div><div class="console-btn-item" id="consoleHideAside"><span class="asideSwitch" onclick="sco.switchHideAside()" title="边栏显示控制"><i class="solitude fas fa-arrows-left-right-to-line"></i></span></div><div class="console-btn-item on" id="consoleCommentBarrage" onclick="sco.switchCommentBarrage()"><span class="commentBarrage"><i class="solitude fa-solid fa-comment"></i></span></div><div class="console-btn-item" id="consoleplayer" onclick="musicsw()"><span class="music-switch" title="音乐开关"><i class="solitude fa-solid fa-compact-disc"></i></span></div></div><div class="console-mask" onclick="sco.hideConsole()"></div></div><div id="sidebar" style="zoom:1"><div id="menu-mask" style="display:none"></div><div id="sidebar-menus"><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/archives/"><div class="headline">文章</div><div class="length-num">46</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/recentcomments/"><div class="headline">评论</div><div class="length-num" id="artalk_allcount"><i class="solitude fa-solid fa-spinner fa-spin"></i></div><script pjax="pjax">(async()=>{const t=new URLSearchParams({site_name:"汐塔魔法屋",limit:"-1"});await fetch(`https://atk.pl.blog.sinzmise.top/api/v2/stats/latest_comments?${t}`,{method:"GET"}).then((async t=>t.json())).then((async t=>{document.querySelector("#artalk_allcount").innerHTML=t.length}))})()</script></a></div></div></div><span class="sidebar-menu-item-title">功能</span><div class="sidebar-menu-item"><span class="darkmode_switchbutton menu-child" onclick="sco.switchDarkMode()"><i class="solitude fa-solid fa-circle-half-stroke"></i><span>显示模式</span></span></div><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">我的</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener" href="https://www.storical.space/" title="个人主页"><img class="nolazyload back-menu-item-icon" src="/images/icon.png" alt="个人主页"><span class="back-menu-item-text">个人主页</span></a></div></div></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>文章</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-guidang1"></use></svg><span>归档</span></a></li><li><a class="site-page child" href="/tags/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-sekuaibiaoqian"></use></svg><span>标签</span></a></li><li><a class="site-page child" href="/categories/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-fenlei"></use></svg><span>分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/fcircle/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pengyouquan"></use></svg><span>朋友圈</span></a></li><li><a class="site-page child" href="/comments/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-liuyan"></use></svg><span>留言板</span></a></li><li><a class="site-page child" href="/link/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-lianjie"></use></svg><span>友人帐</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>休闲</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/games/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-Swf"></use></svg><span>小游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://umami.status.sinzmise.top/share/tliXWHHcZzGWhRgI/blog.storical.space"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-tongji"></use></svg><span>站点统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>虫洞</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://travel.moe/go.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-meng"></use></svg><span>异次元之旅</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://storeweb.cn/s/1707"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-shangdian"></use></svg><span>个站商店</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://bokelu.suijiboke.gs/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-boke"></use></svg><span>博客录</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://blogscn.fun/random.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-data-input"></use></svg><span>笔墨迹</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://www.blogsclub.org/go"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-b_x"></use></svg><span>BlogsClub</span></a></li></ul></div></div><span class="sidebar-menu-item-title">标签</span><div class="card-widget card-tags card-archives card-webinfo card-allinfo"><div class="card-tag-cloud"><a href="/tags/%E4%B8%AA%E4%BA%BA%E5%B0%8F%E8%AE%B0/">个人小记<sup>24</sup></a><a href="/tags/%E6%B8%B8%E6%88%8F%E7%9B%B8%E5%85%B3/">游戏相关<sup>4</sup></a><a href="/tags/%E5%85%B6%E5%AE%83%E6%B8%B8%E6%88%8F/">其它游戏<sup>3</sup></a><a href="/tags/%E9%A1%B9%E7%9B%AE%E6%8A%98%E8%85%BE/">项目折腾<sup>3</sup></a><a href="/tags/Windows%E8%BD%AF%E4%BB%B6/">Windows软件<sup>2</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾<sup>14</sup></a><a href="/tags/%E8%87%AA%E5%BB%BA%E9%83%A8%E7%BD%B2/">自建部署<sup>5</sup></a><a href="/tags/Flash%E7%9B%B8%E5%85%B3/">Flash相关<sup>1</sup></a><a href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/">页面魔改<sup>3</sup></a><a href="/tags/%E6%AD%8C%E6%9B%B2%E6%94%B6%E9%9B%86/">歌曲收集<sup>1</sup></a><a href="/tags/Steam%E6%B8%B8%E6%88%8F/">Steam游戏<sup>1</sup></a><a href="/tags/%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB/">加载动画<sup>1</sup></a><a href="/tags/%E6%82%AC%E6%B5%AE%E5%AE%A0%E7%89%A9-%E7%9C%8B%E6%9D%BF%E5%A8%98/">悬浮宠物/看板娘<sup>1</sup></a><a href="/tags/%E7%AB%99%E7%82%B9%E5%BA%95%E9%83%A8%E9%AD%94%E6%94%B9/">站点底部魔改<sup>1</sup></a></div></div><span class="sidebar-menu-item-title">网站信息</span><div class="webinfo"><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-file-word"></i><div class="item-name">全站字数 :</div></div><div class="item-count">46.4k</div></div></div></div></div><div class="needEndHide" id="rightside"><div class="rs_hide"><button class="translate" type="button" title="简繁转换">简</button><button class="mode" type="button" title="显示模式切换" onclick="sco.switchDarkMode()"><i class="fas fa-circle-half-stroke"></i></button><button class="aside pc" type="button" title="侧边栏" onclick="sco.switchHideAside()"><i class="fas fa-arrows-alt-h"></i></button></div><div class="rs_show"><button class="config" type="button" title="扩展" onclick="document.querySelector(".rs_hide").classList.toggle("show")"><i class="fas fa-gear fa-spin"></i></button><button class="mobile toc" type="button" title="目录" onclick='document.querySelector("#card-toc").classList.toggle("open")'><i class="fas fa-list"></i></button><button class="comment" type="button" title="评论" onclick='sco.scrollTo("post-comment")'><i class="fas fa-comment"></i></button><button class="barrage pc" type="button" title="弹" onclick="sco.switchCommentBarrage()"><span>弹</span></button><button class="top" type="button" title="返回顶部" onclick="sco.toTop()"><i class="fas fa-arrow-up"></i><span id="percent">0</span></button></div></div><div class="post h-entry" id="body-wrap"><header class="post-bg" id="page-header"><nav class="show" id="nav"><div id="nav-group"><div id="blog_name"><div class="back-home-button" tabindex="-1"><i class="back-home-button-icon solitude fas fa-bars-progress"></i><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">我的</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener" href="https://www.storical.space/" title="个人主页"><img class="nolazyload back-menu-item-icon" src="/images/icon.png" alt="个人主页"><span class="back-menu-item-text">个人主页</span></a></div></div></div></div><a id="site-name" href="/" title="返回博客主页"><span class="title">汐塔魔法屋</span><i class="solitude fa-solid fa-home"></i></a></div><div id="page-name-mask"><div id="page-name"><a id="page-name-text" onclick="sco.toTop()">小康大佬的说说方案 ———— ispeak搭建教程</a></div></div><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>文章</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/archives/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-guidang1"></use></svg><span>归档</span></a></li><li><a class="site-page child" href="/tags/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-sekuaibiaoqian"></use></svg><span>标签</span></a></li><li><a class="site-page child" href="/categories/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-fenlei"></use></svg><span>分类</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/fcircle/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pengyouquan"></use></svg><span>朋友圈</span></a></li><li><a class="site-page child" href="/comments/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-liuyan"></use></svg><span>留言板</span></a></li><li><a class="site-page child" href="/link/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-lianjie"></use></svg><span>友人帐</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>休闲</span></a><ul class="menus_item_child"><li><a class="site-page child" href="/games/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-Swf"></use></svg><span>小游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://umami.status.sinzmise.top/share/tliXWHHcZzGWhRgI/blog.storical.space"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-tongji"></use></svg><span>站点统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);"><span>虫洞</span></a><ul class="menus_item_child"><li><a class="site-page child" target="_blank" rel="noopener" href="https://travel.moe/go.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-meng"></use></svg><span>异次元之旅</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://storeweb.cn/s/1707"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-shangdian"></use></svg><span>个站商店</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://bokelu.suijiboke.gs/"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-boke"></use></svg><span>博客录</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://blogscn.fun/random.html"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-data-input"></use></svg><span>笔墨迹</span></a></li><li><a class="site-page child" target="_blank" rel="noopener" href="https://www.blogsclub.org/go"><svg class="menu_icon solitude" aria-hidden="true" style="width:20px;height:20px;vertical-align:-.15em;fill:currentColor;overflow:hidden"><use xlink:href="#icon-pjh-b_x"></use></svg><span>BlogsClub</span></a></li></ul></div></div></div><div id="nav-left"></div><div id="nav-right"><div class="nav-button" id="travellings_button"><a class="site-page" target="_blank" rel="noopener" href="https://www.travellings.cn/go-by-clouds.html"><i class="solitude fas fa-train"></i></a></div><div class="nav-button" id="randomPost_button"><a class="site-page" onclick="toRandomPost()" title="随机一篇文章" href="javascript:void(0);"><i class="solitude fa-solid fa-dice-d6"></i></a></div><div class="nav-button" id="search-button"><a class="site-page social-icon search" href="javascript:void(0);" title="搜索"><i class="solitude fa-solid fa-magnifying-glass"></i></a></div><div class="nav-button" id="nav-console"><a class="console_switchbutton" onclick="sco.showConsole()" title="中控台" href="javascript:void(0);"><label><i class="left"></i><i class="center"></i><i class="right"></i></label></a></div><div id="toggle-menu"><a class="site-page"><i class="solitude fa-solid fa-bars"></i></a></div></div></div></nav><div class="coverdiv" id="coverdiv"><img class="nolazyload" id="post-cover" src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_GVRhG42nuu.1g9uz8t24io0.webp" alt="小康大佬的说说方案 ———— ispeak搭建教程"></div><div id="post-info"><div id="post-firstinfo"><div class="meta-firstline"><a class="post-meta-original" title="该文章为原创文章,注意版权协议">原创</a><span class="post-meta-categories"><a class="post-meta-categories p-category" href="/categories/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/">站点折腾</a></span><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/"><span class="tags-name tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>站点折腾</span></a><a class="post-meta__tags" href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/"><span class="tags-name tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>页面魔改</span></a></div></div></div></div><h1 class="post-title p-name">小康大佬的说说方案 ———— ispeak搭建教程</h1><div id="post-meta"><div class="meta-secondline"><span class="post-meta-date" title="发布于 2023-01-13 21:01:37"><i class="post-meta-icon solitude fas fa-calendar-days"></i><time class="dt-published" datetime="2023-01-13T21:01:37.000Z">2023-01-13T21:01:37.000Z</time></span><span class="post-meta-date" title="最后更新于 2025-01-24 12:05:27"><i class="post-meta-icon solitude fa-solid fa-arrows-rotate"></i><time class="dt-updated" datetime="2025-01-24T12:05:27.985Z">2025-01-24T12:05:27.985Z</time></span><span class="post-meta-wordcount"><i class="post-meta-icon solitude fa-solid fa-file-word" title="文章字数"></i><span class="word-count">5.7k</span><span class="post-meta-separator"></span><i class="post-meta-icon solitude fa-solid fa-clock" title="阅读耗时"></i><span>29 min</span></span><span class="post-meta-position" title="作者IP归属地为广东潮州"><i class="post-meta-icon solitude fas fa-location-dot"></i><span class="p-location">广东潮州</span></span><a class="post-meta-pv" href="/posts/38964/" title="文章热度"><i class="post-meta-icon solitude fa-solid fa-fire-flame-curved"></i><span id="busuanzi_page_pv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></a><span class="post-meta-commentcount" title="评论数" onclick='sco.scrollTo("post-comment")'><i class="solitude fa-solid fa-comment"></i><a href="/posts/38964/#post-comment"><span class="artalk-count"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></a></span></div></div></div><section class="main-hero-waves-area waves-area"><svg class="waves-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"><defs><path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352Z"></path></defs><g class="parallax"><use href="#gentle-wave" x="48" y="0"></use><use href="#gentle-wave" x="48" y="3"></use><use href="#gentle-wave" x="48" y="5"></use><use href="#gentle-wave" x="48" y="7"></use></g></svg></section></header><main class="layout" id="content-inner"><div id="post"><article class="post-content article-container e-content"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>搞ispeak时发现ispeak更新,能自定义评论了,也就是说我之前写的<a target="_blank" rel="noopener" href="https://blog.xsnet.eu.org/posts/43224/">ispeak教程</a>失效了<br>没办法我只能重新写了这篇教程</p><h1 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h1><h2 id="后端部署"><a href="#后端部署" class="headerlink" title="后端部署"></a>后端部署</h2><h3 id="配置数据库"><a href="#配置数据库" class="headerlink" title="配置数据库"></a>配置数据库</h3><div class="tip info"><p>以下内容来自:<a target="_blank" rel="noopener" href="https://discuss.js.org/guide/Get-MongoDB-DataBase.html">https://discuss.js.org/guide/Get-MongoDB-DataBase.html</a></p></div><ol><li>注册<a target="_blank" rel="noopener" href="https://www.mongodb.com/cloud/atlas/register">MongoDB</a>账号,注册完成后会提示你创建一个组织,并且输入一个项目昵称,选择编程语言(不选也可以),随后点击右下角的 <code>Continue</code>(继续),如果没有可以跟如下图执行,点击 <code>Create an Organization</code>(创建组织)<br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Organizations-Home.png" alt="Organizations-Home"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Register-Organizations.png" alt="Register-Organizations"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Create-Organization.png" alt="Create-Organization"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/New-Project.png" alt="New-Project"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Project-Name.png" alt="Project-Name"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Create-Project.png" alt="Create-Project"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Build-Database.png" alt="Build-Database"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Select-Free.png" alt="Select-Free"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/AWS-N.Virginia.png" alt="AWS-N.Virginia"></li><li>选择免费的共享数据库,随后会跳出选择地区(选择离你服务端近的即可),点击 <code>Create Cluster</code>创建</li><li>随后您需要创建数据库用户,输入用户名和密码,继续向下滚动就是添加 IP 地址,最后点击下方的 <code>Finish and Close</code>(完成并关闭)按钮</li></ol><div class="tip warning"><p><strong>注意</strong><br>服务器部署,则填服务器公网 IP<br><code>无服务器(ServerLess)</code>ServerLess 一般都是动态 IP,你无法得到一个固定 IP,我们建议填写 <code>0.0.0.0</code></p></div><p><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Add-IP.png" alt="Add IP"></p><ol><li>稍作等待创建好数据库即可,随后点击 <code>Connect</code>(连接),点击选择 <code>Connect you application</code>(连接应用程序),然后复制连接数据库字符串</li></ol><div class="tip warning"><p><strong>注意</strong><br>需要将字符串中的 <code><password></code>替换为您在第三步创建的数据库用户密码,修改 <code>myFirstDatabase</code>为你想要的数据库名称例如:<code>Discuss</code></p></div><p><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Connect.png" alt="Connect"><br><img src="/img/load-games.gif" data-lazy-src="https://discuss.js.org/img/guide/Get-MongoDB-DataBase/Get-Connect.png" alt="Get Connect"></p><h3 id="部署kkapi"><a href="#部署kkapi" class="headerlink" title="部署kkapi"></a>部署kkapi</h3><div class="tabs" id="部署kkapi"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#部署kkapi-0">Vercel部署(推荐)</button></li><li class="tab"><button type="button" data-href="#部署kkapi-1">服务器部署</button></li><li class="tab"><button type="button" data-href="#部署kkapi-2">docker 部署</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="部署kkapi-0"><ol><li>点击下方按钮,跳转至 Vercel 进行部署。<br><a target="_blank" rel="noopener" href="https://vercel.com/new/clone?repository-url=https://github.com/kkfive/kkapi-open/tree/vercel"><img src="/img/load-games.gif" data-lazy-src="https://vercel.com/button" alt="部署到Vercel"></a></li><li>配置环境变量:<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_wwcTzH8isA.10hmhosvut28.webp" alt="msedge_wwcTzH8isA"><br>环境变量可能随项目的迭代而增加必填的环境变量,具体请参考<a target="_blank" rel="noopener" href="https://kkapi.js.org/reference/kkapi/environment.html">官网 —— kkapi环境变量</a></li><li>重新部署<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_owqMifozPi.37vcfu5vfpm0.webp" alt="msedge_owqMifozPi"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_5WUBTLL0NZ.1nl1z1a7qiqo.webp" alt="msedge_5WUBTLL0NZ"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_mMprAjHb9O.3b2527plrfg.webp" alt="msedge_mMprAjHb9O"></li><li>绑定域名(建议)<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/20230114/msedge_miAwQcdm9f.3htnm9dlllq0.webp" alt="msedge_miAwQcdm9f"></li><li>初始化账户<br>浏览器访问:<br>你刚刚复制的地址/api/user/init?userName=你想设置的账户名<br>如果不指定用户名则自动将账户名设置为admin</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkapi-1"><p></p><div class="tip info"><p>以下内容来自:<a target="_blank" rel="noopener" href="https://kkapi.js.org/guide/setup/deploy.html#%E7%AC%AC%E4%BA%8C%E7%A7%8D%E9%83%A8%E7%BD%B2%E5%A7%BF%E5%8A%BF%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2">https://kkapi.js.org/guide/setup/deploy.html#%E7%AC%AC%E4%BA%8C%E7%A7%8D%E9%83%A8%E7%BD%B2%E5%A7%BF%E5%8A%BF%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2</a></p></div><br>克隆源代码<p></p><p>git clone <a target="_blank" rel="noopener" href="https://ghproxy.com/https://github.com/kkfive/kkapi-open.git">https://ghproxy.com/https://github.com/kkfive/kkapi-open.git</a></p><ol><li><p>安装依赖<br><code>yarn install</code><br>如果没有<code>yarn</code>则先允许<code>npm i yarn -g</code>进行安装</p></li><li><p>安装 pm2</p></li></ol><p><code>npm i pm2 -g</code></p><ol><li>编译项目</li></ol><p><code>yarn build</code></p><ol><li>配置环境变量</li></ol><p>在项目目录新建文件<code>local.env</code>,将环境变量写入其中即可。例如:</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">PORT=3000</span><br><span class="line">DATABASE_URL=mongodb://127.0.0.1:27017/kkpaiopen?authSource=admin</span><br><span class="line">DATABASE_USER=root</span><br><span class="line">DATABASE_PASSWORD=root</span><br><span class="line"># 加密密钥 测试</span><br><span class="line">SECRETKEY=xxxxxxxxxxxxxxx</span><br></pre></td></tr></tbody></table></figure><p>其中 PORT 表示启动的端口</p><ol><li>启动项目</li></ol><p><code>pm2 start pm2.json</code></p><p>然后通过命令<code>curl http://127.0.0.1:3000/api/user/init</code>检查是否允许成功</p><p>image-20220227101623911</p><p>更新项目</p><p>进入项目并执行一下命令</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git pull</span><br><span class="line">yarn build</span><br><span class="line">pm2 restart pm2.json</span><br></pre></td></tr></tbody></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkapi-2"><p>尚未写完</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div><h3 id="部署kkadmin"><a href="#部署kkadmin" class="headerlink" title="部署kkadmin"></a>部署kkadmin</h3><p>介绍:kkadmin是kkapi的后台,方便发布说说<br></p><div class="tip success"><p>以下部署姿势你只需要任选其一即可,无需全部部署。</p></div><p></p><div class="tabs" id="部署kkadmin,"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#部署kkadmin,-0">Vercel部署</button></li><li class="tab"><button type="button" data-href="#部署kkadmin,-1">CF pages部署(推荐)</button></li><li class="tab active"><button type="button" data-href="#部署kkadmin,-2">其他环境部署</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="部署kkadmin,-0"><p></p><div class="tip warning"><p>由于构建 kkadmin 时部分依赖文件需要 nodejs16 及以上版本才可以安装,因此不能将源代码扔给 vercel 进行构建。<br>所以只能够利用 GitHub actions 构建完成后将产物扔给 vercel 进行使用</p></div><p></p><ol><li>Fork这个项目:<a target="_blank" rel="noopener" href="https://github.com/kkfive/kkadmin-open/">https://github.com/kkfive/kkadmin-open/</a></li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_6HMaGfN000.1csf0rae8okg.webp" alt="msedge_6HMaGfN000"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_UPsCgr2okQ.7k0gi7brxoc0.webp" alt="msedge_UPsCgr2okQ"></p><ol><li>配置变量<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_ktuszZjpej.7ftbduod9uc0.webp" alt="msedge_ktuszZjpej"></li></ol><p>VITE_GLOB_API_URL(必选)<br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_wqMbtdCCon.26m2h3r94d7k.webp" alt="msedge_wqMbtdCCon"></p><ol><li>构建actions</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_yymiOm8Kek.23xjzofdum3.webp" alt="msedge_yymiOm8Kek"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_4awdNaFJGz.1rdq0mxyfhog.webp" alt="msedge_4awdNaFJGz"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_2uYyc6Qh4I.4p3ngtkhmh00.webp" alt="msedge_2uYyc6Qh4I"></p><ol><li>部署到Vercel<br>复制下面这个网址</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://vercel.com/new/import?s=https://github.com/SinInno/kkadmin-open/tree/vercel</span><br></pre></td></tr></tbody></table></figure><p>并将“SinInno”改为你Github的用户名后访问你刚刚修改的网址<br>PS:如果你Fork的这个项目有改Repository name,那么请将上面的“kkapi-open”改为你这个项目的Repository name</p><p>然后直接部署</p><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_GJbsx9xoOw.8zgxw8og644.webp" alt="msedge_GJbsx9xoOw"></p><p>部署完成后点“Go to Dashboard”,并点左上角的“Visit”</p><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/StarWEB890/TuChuang@master/images/msedge_Lyo0nIvIqF.d4g2uabkljk.webp" alt="msedge_Lyo0nIvIqF"></p><p>账号输入你之前初始化账户的账户名<br>密码请输入默认密码:123456<br>登入面板后请更改默认密码!</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="部署kkadmin,-1"><p></p><div class="tip info"><p>如果你已经在 GitHub actions 部署了,那么 cf pages 部署时也可以选择 vercel 进行部署。也可以使用主干分支进行打包部署。<br>接下来的教程以使用 cf pages 构建为例介绍</p></div><p></p><ol><li>fork项目(可直接fork)</li><li>导入项目</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/msedge_1bV5Of8ioS.xtthsj95ytc.webp" alt="msedge_1bV5Of8ioS"><br><img src="/img/load-games.gif" data-lazy-src="https://jsd.cdn.storisinz.site/gh/SinzMise/MYPictures@master/msedge_CcnQ68DBFQ.2q893j8w72k0.webp" alt="msedge_CcnQ68DBFQ"></p><ol><li>配置环境变量</li></ol><p>环境变量参考:<a target="_blank" rel="noopener" href="https://kkapi.js.org/reference/kkadmin/environment.html">官网 —— kkadmin环境变量</a></p><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227113526.png" alt="配置环境变量"></p><ol><li>等待构建完成后即可</li></ol><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227114643.png" alt="构建中"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content active" id="部署kkadmin,-2"><p>其他环境部署基本可以直接使用 GitHub 构建后的 vercel 进行,毕竟只是 HTML</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div><h2 id="前端配置"><a href="#前端配置" class="headerlink" title="前端配置"></a>前端配置</h2><h3 id="进入后台,查看个人ID"><a href="#进入后台,查看个人ID" class="headerlink" title="进入后台,查看个人ID"></a>进入后台,查看个人ID</h3><p><img src="/img/load-games.gif" data-lazy-src="https://file.acs.pw/picGo/2022/02/27/20220227131425.png" alt="查看个人ID"></p><h3 id="前端引入"><a href="#前端引入" class="headerlink" title="前端引入"></a>前端引入</h3><div class="tip info"><p>ipseak 使用 marked 依赖和 highlight 依赖,为了减少打包体积,并没有将该依赖打包,因此需要使用 cdn 进行外部引入。</p></div><div class="tabs" id="前端引入ispeak,"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#前端引入ispeak,-0">使用Waline</button></li><li class="tab"><button type="button" data-href="#前端引入ispeak,-1">使用Twikoo</button></li><li class="tab active"><button type="button" data-href="#前端引入ispeak,-2">使用Discuss</button></li><li class="tab"><button type="button" data-href="#前端引入ispeak,-3">使用Artalk</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="前端引入ispeak,-0"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.wl-power{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><!-- CSS --></span></span><br><span class="line"><span class="code"><link href="https://unpkg.com/@waline/client/dist/waline.css" rel="stylesheet" /></span></span><br><span class="line"><span class="code"><script src="https://unpkg.com/@waline/client@v2/dist/waline.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> Waline.init({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment',//不用改</span></span><br><span class="line"><span class="code"> serverURL: '',//填写你的Waline服务端地址</span></span><br><span class="line"><span class="code"> path:'/speak/info.html?q=' + _id,//不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> //后面可按照https://waline.js.org/reference/client/props.html 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> emoji: ["//unpkg.com/@waline/emojis@1.0.1/weibo","https://emoji.shojo.cn/bili/src/小黄脸","//unpkg.com/@waline/emojis@1.0.1/bilibili","https://emoji.shojo.cn/bili/src/枕边童话","https://emoji.shojo.cn/bili/src/咩栗","https://emoji.shojo.cn/bili/src/呜米","https://emoji.shojo.cn/bili/src/进击的冰糖","https://emoji.shojo.cn/bili/src/冰糖IO 蜕变·闪耀","https://emoji.shojo.cn/bili/src/多多poi","https://emoji.shojo.cn/bili/src/穆小泠","https://emoji.shojo.cn/bili/src/早稻叽"],// 表情包大全</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://discuss.js.org/"><strong>Waline</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"https://unpkg.com/@waline/client/dist/waline.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/@waline/client@v2/dist/waline.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> Waline.init({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment',//不用改</span></span><br><span class="line"><span class="emphasis"> serverURL: '',//填写你的Waline服务端地址</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + _</span>id,//不用改</span><br><span class="line"><span class="code"> //后面可按照https://waline.js.org/reference/client/props.html 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> emoji: ["//unpkg.com/@waline/emojis@1.0.1/weibo","https://emoji.shojo.cn/bili/src/小黄脸","//unpkg.com/@waline/emojis@1.0.1/bilibili","https://emoji.shojo.cn/bili/src/枕边童话","https://emoji.shojo.cn/bili/src/咩栗","https://emoji.shojo.cn/bili/src/呜米","https://emoji.shojo.cn/bili/src/进击的冰糖","https://emoji.shojo.cn/bili/src/冰糖IO 蜕变·闪耀","https://emoji.shojo.cn/bili/src/多多poi","https://emoji.shojo.cn/bili/src/穆小泠","https://emoji.shojo.cn/bili/src/早稻叽"],// 表情包大全</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="前端引入ispeak,-1"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.tk-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/twikoo"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> twikoo.init({</span></span><br><span class="line"><span class="code"> envId: '', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="code"> //region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填</span></span><br><span class="line"><span class="code"> path: '/speak/info.html?q=' + _id, //不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/imaegoo/twikoo/blob/main/src/client/utils/i18n/index.js</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://twikoo.js.org/"><strong>Twikoo</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://npm.elemecdn.com/twikoo"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> twikoo.init({</span></span><br><span class="line"><span class="emphasis"> envId: '', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="emphasis"> //region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + speakId, // 不用改</span></span><br><span class="line"><span class="emphasis"> lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/imaegoo/twikoo/blob/main/src/client/utils/i18n/index.js</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content active" id="前端引入ispeak,-2"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.D-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/discuss@latest/dist/discuss.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> discuss.init({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment',// 不用改</span></span><br><span class="line"><span class="code"> serverURLs: '',//填写你的Discuss服务端地址</span></span><br><span class="line"><span class="code"> path: '/speak/info.html?q=' + _id,//不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> //后面可按照https://discuss.js.org/Quick-Start.html#%E5%AE%A2%E6%88%B7%E7%AB%AF-client 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="code"> ph: '千山万水总是情,给个评论行不行' ,//评论框占位符</span></span><br><span class="line"><span class="code"> imgLoading: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif'//评论图片加载动画</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://discuss.js.org/"><strong>Discuss</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://npm.elemecdn.com/discuss@latest/dist/discuss.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak'; //api地址</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> discuss.init({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment',// 不用改</span></span><br><span class="line"><span class="emphasis"> serverURLs: '',//填写你的Discuss服务端地址</span></span><br><span class="line"><span class="emphasis"> path: path + '?q=' + speakId,// 不用改</span></span><br><span class="line"><span class="emphasis"> //后面可按照https://discuss.js.org/Quick-Start.html#%E5%AE%A2%E6%88%B7%E7%AB%AF-client 修改(必须放在path后面!以下为一个例子)</span></span><br><span class="line"><span class="emphasis"> ph: '千山万水总是情,给个评论行不行' ,//评论框占位符</span></span><br><span class="line"><span class="emphasis"> imgLoading: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif'//评论图片加载动画</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="前端引入ispeak,-3"><ol><li>在博客目录下运行<code>hexo new page speaks</code></li><li>编辑[blogroot]\source\speaks\index.md,将里面的内容替换成:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 说说</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">aside: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">{% raw %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"> .speak-footer,.atk-list-footer{</span><br><span class="line"><span class="code"> display:none;</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"></style></span></span><br><span class="line"><span class="code"><div id="ispeak"></div></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><link</span></span><br><span class="line"><span class="code"> rel="stylesheet"</span></span><br><span class="line"><span class="code"> href="https://npm.elemecdn.com/ispeak@4.4.0/style.css"</span></span><br><span class="line"><span class="code">/></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://cdn.staticfile.org/marked/2.0.0/marked.min.js"></script></span></span><br><span class="line"><span class="code"><script src="https://npm.elemecdn.com/ispeak@4.4.0/ispeak.umd.js"></script></span></span><br><span class="line"><span class="code"><!-- CSS --></span></span><br><span class="line"><span class="code"><link href="https://unpkg.com/artalk@2.3.4/dist/Artalk.css" rel="stylesheet" /></span></span><br><span class="line"><span class="code"><!-- JS --></span></span><br><span class="line"><span class="code"><script src="https://unpkg.com/artalk@2.3.4/dist/Artalk.js"></script></span></span><br><span class="line"><span class="code"><script></span></span><br><span class="line"><span class="code"> function load_ispeak() {</span></span><br><span class="line"><span class="code"> setTimeout(function() {</span></span><br><span class="line"><span class="code"> var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;</span></span><br><span class="line"><span class="code"> var src = 'https://cdn1.tianli0.top/npm/ispeak/ispeak.umd.js'</span></span><br><span class="line"><span class="code"> var script = document.createElement('script')</span></span><br><span class="line"><span class="code"> script.setAttribute('type','text/javascript')</span></span><br><span class="line"><span class="code"> script.onload = function() {</span></span><br><span class="line"><span class="code"> pjax_ispeak()</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> script.setAttribute('src', src)</span></span><br><span class="line"><span class="code"> HEAD.appendChild(script)</span></span><br><span class="line"><span class="code"> }, 1);</span></span><br><span class="line"><span class="code"> };</span></span><br><span class="line"><span class="code"> function pjax_ispeak() {</span></span><br><span class="line"><span class="code"> if(!document.querySelectorAll("#ispeak")[0])return;</span></span><br><span class="line"><span class="code"> ispeak</span></span><br><span class="line"><span class="code"> .init({</span></span><br><span class="line"><span class="code"> el: '#ispeak',//不用改</span></span><br><span class="line"><span class="code"> api: '', //填写你kkapi地址(不是kkadmin后台地址!)</span></span><br><span class="line"><span class="code"> author: '',//填写个人ID</span></span><br><span class="line"><span class="code"> pageSize: 10,//每页speak显示的条数(建议保持默认,除非你要魔改css)</span></span><br><span class="line"><span class="code"> loading_img: 'https://bu.dusays.com/2021/03/04/d2d5e983e2961.gif',//加载动画</span></span><br><span class="line"><span class="code"> comment: function (speak) {</span></span><br><span class="line"><span class="code"> const { _id, title, content } = speak</span></span><br><span class="line"><span class="code"> const contentSub = content.substring(0, 30)</span></span><br><span class="line"><span class="code"> new Artalk({</span></span><br><span class="line"><span class="code"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="code"> pageKey: '/speak/info.html?q=' + _id, //不用改,除非你将上面的speak改为别的文件夹昵称</span></span><br><span class="line"><span class="code"> pageTitle: title || contentSub, // 不用改</span></span><br><span class="line"><span class="code"> server: '', //填写你的Artalk服务端地址</span></span><br><span class="line"><span class="code"> site: '' // 填写你的站点名</span></span><br><span class="line"><span class="code"> })</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"> }</span></span><br><span class="line"><span class="code"> load_ispeak();</span></span><br><span class="line"><span class="code"> document.addEventListener('pjax:complete', function () {</span></span><br><span class="line"><span class="code"> pjax_ispeak();</span></span><br><span class="line"><span class="code"> });</span></span><br><span class="line"><span class="code"></script></span></span><br><span class="line"><span class="code"><!--建议标注末尾链接--></span></span><br><span class="line"><span class="code"><p style="width: 100%;text-align: end;font-size: .75em;color: #999;margin-top: 1em;">Powered by <a href="https://www.antmoe.com/speak/"><strong>iSpeak</strong></a> | Comment by <a href="https://artalk.js.org/"><strong>Artalk</strong></a></p> </span></span><br><span class="line"><span class="code">{% endraw %}</span></span><br></pre></td></tr></tbody></table></figure></li><li>在[blogroot]\source\speaks\下新建info.md,内容为下:<figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Speak</span><br><span class="line">aside: false</span><br><span class="line">comments: false</span><br><span class="line"><span class="section">description: 欢迎来到SinzMise的日记,快来看看SinzMise分享了什么! # speak介绍</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><!-- CSS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"https://unpkg.com/artalk@2.3.4/dist/Artalk.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/styles/atom-one-dark.min.css"</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'content'</span>></span></span></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">'https://bu.dusays.com/2022/05/01/626e88f349943.gif'</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line">{% btn '/speaks/',查看全部,far fa-hand-point-right,block center blue larger %}</span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">hr</span> /></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">'ispeak-comment'</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><!-- JS --></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/artalk@2.3.4/dist/Artalk.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/marked@4.0.18/marked.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.staticfile.org/highlight.js/10.6.0/highlight.min.js"</span>></span></span><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span></span></span><br><span class="line"> const searchParams = new URLSearchParams(window.location.search);</span><br><span class="line"> const speakId = searchParams.get('q');</span><br><span class="line"> const path = window.location.pathname;</span><br><span class="line"> const apiURL = 'https://(你的api地址)/api/ispeak';</span><br><span class="line"> const markedRender = (body, loading<span class="emphasis">_img='https://bu.dusays.com/2022/05/01/626e88f349943.gif') => {</span></span><br><span class="line"><span class="emphasis"> const renderer = {</span></span><br><span class="line"><span class="emphasis"> image(href, title, text) {</span></span><br><span class="line"><span class="emphasis"> return `<span class="language-xml"><span class="language-javascript"><a href=<span class="string">"${href}"</span> target=<span class="string">"_blank"</span> data-fancybox=<span class="string">"group"</span> <span class="keyword">class</span>=<span class="string">"fancybox"</span>></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"><<span class="name">img</span> <span class="attr">speak-src</span>=<span class="string">"${href}"</span> <span class="attr">src</span>=<span class="string">${loading_img}</span> <span class="attr">alt</span>=<span class="string">'${text}'</span>></span></span></span></span></span></span><br><span class="line"><span class="emphasis"> <span class="language-xml"><span class="language-handlebars"><span class="language-xml"><span class="tag"></<span class="name">a</span>></span></span></span></span>`</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> marked.setOptions({</span></span><br><span class="line"><span class="emphasis"> renderer: new marked.Renderer(),</span></span><br><span class="line"><span class="emphasis"> highlight: function (code) {</span></span><br><span class="line"><span class="emphasis"> if (hljs) {</span></span><br><span class="line"><span class="emphasis"> return hljs.highlightAuto(code).value</span></span><br><span class="line"><span class="emphasis"> } else {</span></span><br><span class="line"><span class="emphasis"> return code</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> },</span></span><br><span class="line"><span class="emphasis"> pedantic: false,</span></span><br><span class="line"><span class="emphasis"> gfm: true,</span></span><br><span class="line"><span class="emphasis"> tables: true,</span></span><br><span class="line"><span class="emphasis"> breaks: true,</span></span><br><span class="line"><span class="emphasis"> sanitize: false,</span></span><br><span class="line"><span class="emphasis"> smartLists: true,</span></span><br><span class="line"><span class="emphasis"> smartypants: false,</span></span><br><span class="line"><span class="emphasis"> xhtml: false</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> marked.use({ renderer })</span></span><br><span class="line"><span class="emphasis"> return marked.parse(body)</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> fetch(`${apiURL}/get/${speakId}`)</span></span><br><span class="line"><span class="emphasis"> .then(response => response.json())</span></span><br><span class="line"><span class="emphasis"> .then(res => {</span></span><br><span class="line"><span class="emphasis"> const data = res.data;</span></span><br><span class="line"><span class="emphasis"> if(data){</span></span><br><span class="line"><span class="emphasis"> const {title,content} = data;</span></span><br><span class="line"><span class="emphasis"> const contentSub = content.substring(0, 30);</span></span><br><span class="line"><span class="emphasis"> document.querySelector('.content').innerHTML = markedRender(content);</span></span><br><span class="line"><span class="emphasis"> if(title){</span></span><br><span class="line"><span class="emphasis"> document.title = title;</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> new Artalk({</span></span><br><span class="line"><span class="emphasis"> el: '.ispeak-comment', // 不用改</span></span><br><span class="line"><span class="emphasis"> pageKey: path + '?q=' + speakId, // 不用改</span></span><br><span class="line"><span class="emphasis"> pageTitle: title || contentSub, // 不用改</span></span><br><span class="line"><span class="emphasis"> server: '', //填写你的Artalk服务端地址</span></span><br><span class="line"><span class="emphasis"> site: '' // 填写你的站点名</span></span><br><span class="line"><span class="emphasis"> })</span></span><br><span class="line"><span class="emphasis"> }</span></span><br><span class="line"><span class="emphasis"> });</span></span><br><span class="line"><span class="emphasis"><span class="language-xml"><span class="tag"></<span class="name">script</span>></span></span></span></span><br></pre></td></tr></tbody></table></figure></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="solitude fas fa-arrow-up"></i></button></div></div></div></article><div class="post-copyright"><div class="post-copyright__author_group"><div class="post-copyright__author_img"><img class="post-copyright__author_img_front" src="/images/icon.png"></div><div class="post-copyright__author_name">汐塔魔法屋</div><div class="post-copyright__author_desc">致我们的故事</div></div><div class="post-tools" id="post-tools"><div class="post-tools-left"><div id="quit-box" onclick="RemoveRewardMask()"></div><div class="reward-link mode"><a class="reward-link-button" href="/atom.xml"><i class="solitude fa-solid fa-seedling"></i>订阅</a></div></div></div><div class="social-share"><a class="social-share-ico icon-qq" target="_blank" rel="noopener" href="https://connect.qq.com/widget/shareqq/index.html?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&title=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&desc=%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E6%98%AF%E6%88%91%E4%B9%8B%E5%89%8D%E5%86%99%E8%BF%87%E7%9A%84%E6%95%99%E7%A8%8B%E7%9A%84%E9%87%8D%E5%86%99&summary=%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E6%98%AF%E6%88%91%E4%B9%8B%E5%89%8D%E5%86%99%E8%BF%87%E7%9A%84%E6%95%99%E7%A8%8B%E7%9A%84%E9%87%8D%E5%86%99&site=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&pics=https%3A%2F%2Fjsd.cdn.storisinz.site%2Fgh%2FSinzMise%2FMYPictures%40master%2F20230114%2Fmsedge_GVRhG42nuu.1g9uz8t24io0.webp" title="分享到QQ"><i class="solitude fab fa-qq"></i></a><a class="social-share-ico icon-weibo" target="_blank" rel="noopener" href="http://service.weibo.com/share/share.php?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&title=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B&pic=https%3A%2F%2Fjsd.cdn.storisinz.site%2Fgh%2FSinzMise%2FMYPictures%40master%2F20230114%2Fmsedge_GVRhG42nuu.1g9uz8t24io0.webp" title="分享到微博"><i class="solitude fab fa-weibo"></i></a><a class="social-share-ico icon-twitter" target="_blank" rel="noopener" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F&text=%E5%B0%8F%E5%BA%B7%E5%A4%A7%E4%BD%AC%E7%9A%84%E8%AF%B4%E8%AF%B4%E6%96%B9%E6%A1%88%20%E2%80%94%E2%80%94%E2%80%94%E2%80%94%20ispeak%E6%90%AD%E5%BB%BA%E6%95%99%E7%A8%8B" title="分享到Twitter"><i class="solitude fab fa-twitter"></i></a><a class="social-share-ico icon-facebook" target="_blank" rel="noopener" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fblog.storical.space%2Fposts%2F38964%2F" title="分享到Facebook"><i class="solitude fab fa-facebook"></i></a><div class="social-share-ico icon-link" onclick="utils.copy("https://blog.storical.space/posts/38964/")" title="复制文章链接"><i class="solitude fas fa-link"></i></div><div class="social-share-ico icon-qrcode" title="使用手机扫码阅读这篇文章"><i class="solitude fas fa-qrcode"></i><div class="share-main"><div class="share-main-all"><div id="qrcode"></div><div class="reward-dec">使用手机扫码阅读这篇文章</div></div></div><script pjax="">"function"==typeof QRCode&&new QRCode(document.getElementById("qrcode"),{text:"https://blog.storical.space/posts/38964/",correctLevel:QRCode.CorrectLevel.L}),window.addEventListener("DOMContentLoaded",(()=>{new QRCode(document.getElementById("qrcode"),{text:"https://blog.storical.space/posts/38964/",correctLevel:QRCode.CorrectLevel.L})}))</script></div></div><div class="post-copyright__notice"><span class="post-copyright-info">本文是原创文章,采用<a target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans">CC BY-NC-SA 4.0</a>协议,完整转载请注明来自<a href="/">汐塔魔法屋</a></span></div></div><div class="post-tools-right"><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E7%AB%99%E7%82%B9%E6%8A%98%E8%85%BE/"><span class="tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>站点折腾<span class="tagsPageCount">14</span></span></a><a class="post-meta__tags" href="/tags/%E9%A1%B5%E9%9D%A2%E9%AD%94%E6%94%B9/"><span class="tags-punctuation"><i class="solitude fa-solid fa-hashtag"></i>页面魔改<span class="tagsPageCount">3</span></span></a></div></div></div><nav class="needEndHide pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/posts/61417/"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">自建Meting服务</div></div></a></div><div class="next-post pull-right"><a href="/posts/22945/"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">butterfly主题添加音乐页面(适配手机)</div></div></a></div></nav><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="solitude fa-solid fa-comment"></i> <span>评论</span> <span class="count">(<span class="artalk-count"></span>)</span></div></div><div class="comment-wrap"><div id="artalk-wrap"></div></div></div><hr><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i> <span>网络回响</span></div></div><div class="comment-wrap webmention-timeline"></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info h-card"><div class="card-content"><div class="card-info-avatar is-center"><div class="author-info__top-group"><div class="author-info__sayhi" id="author-info__sayhi" onclick="sco.changeWittyWord()"></div></div></div><div class="avatar-img-group"><img class="avatar-img" alt="头像" src="/img/avatar.webp"></div><div class="author-info__description_group"><div class="author-info__description">人生 没必要 想太多“为什么”<br>也 没必要 想太多乱七八糟的事情<br>而是应该想“怎么做”“怎么样”“会成功的”<br>给自己一些鼓励和关爱<br>才能遇到好的生活</div></div><div class="author-info__bottom-group"><span class="author-info__bottom-group-left"><div class="author-info__name p-name p-author">王九弦SZ·Ninty</div><div class="author-info__desc p-note">种下故事的种子,在光的照耀下生根发芽</div></span><div class="card-info-social-icons is-center"><a class="social-icon u-url" target="_blank" href="https://github.com/SinzMise" title="Github" rel="me noopener"><i class="solitude fab fa-github"></i></a><a class="social-icon u-url u-email" href="mailto:email@sinzmise.top" title="Email" rel="me"><i class="solitude fa fa-envelope"></i></a></div></div></div></div><div class="card-widget" id="card-widget-schedule"><div class="item-headline"><i></i><span></span></div><div class="item-content"><div id="schedule-area-left"><div id="schedule-title">距离除夕</div><div id="schedule-days"></div><div id="schedule-date">2025-01-28</div></div><div id="schedule-area-right"><div class="schedule-r0"><div class="schedule-d0">本年</div><div class="schedule-d1"><span id="p_span_year" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="365" id="pBar_year"></progress></div></div><div class="schedule-r1"><div class="schedule-d0">本月</div><div class="schedule-d1"><span id="p_span_month" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="30" id="pBar_month"></progress></div></div><div class="schedule-r2"><div class="schedule-d0">本周</div><div class="schedule-d1"><span id="p_span_week" class="aside-span1"></span> <span class="aside-span2">还剩<a></a>天</span><progress max="7" id="pBar_week"></progress></div></div></div></div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="solitude fa-solid fa-bars"></i><span>文章目录</span></div><div class="toc-content" id="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%89%8D%E8%A8%80"><span class="toc-text">前言</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%95%99%E7%A8%8B"><span class="toc-text">教程</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%90%8E%E7%AB%AF%E9%83%A8%E7%BD%B2"><span class="toc-text">后端部署</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="toc-text">配置数据库</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%83%A8%E7%BD%B2kkapi"><span class="toc-text">部署kkapi</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%83%A8%E7%BD%B2kkadmin"><span class="toc-text">部署kkadmin</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E9%85%8D%E7%BD%AE"><span class="toc-text">前端配置</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BF%9B%E5%85%A5%E5%90%8E%E5%8F%B0%EF%BC%8C%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BAID"><span class="toc-text">进入后台,查看个人ID</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%89%8D%E7%AB%AF%E5%BC%95%E5%85%A5"><span class="toc-text">前端引入</span></a></li></ol></li></ol></li></ol></div></div><div class="card-widget" id="card-widget-calendar"><div class="item-headline"><i></i><span></span></div><div class="item-content"><div id="calendar-area-left"><div id="calendar-week"></div><div id="calendar-date" style="font-size:48px"></div><div id="calendar-solar"></div><div id="calendar-lunar"></div></div><div id="calendar-area-right"><div id="calendar-main"></div></div></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="solitude fa-solid fa-map"></i><span>最近发布</span></div><div class="aside-list"><a class="aside-list-item" href="/posts/60486/" title="新的域名,新的故事"><div class="thumbnail"><img alt="新的域名,新的故事" src="https://images1.blog.sinzmise.top/azurlane/13.avif"></div><div class="content"><span class="title" href="/posts/60486/" title="新的域名,新的故事">新的域名,新的故事</span><span class="article-recent_post_categories" href="/posts/60486/">个人小记</span></div></a><a class="aside-list-item" href="/posts/23226/" title="很屑的2024年度总结("><div class="thumbnail"><img alt="很屑的2024年度总结(" src="https://images1.blog.sinzmise.top/20250121/再见2024,你好2025.39l9926twi.avif"></div><div class="content"><span class="title" href="/posts/23226/" title="很屑的2024年度总结(">很屑的2024年度总结(</span><span class="article-recent_post_categories" href="/posts/23226/">个人小记</span></div></a><a class="aside-list-item" href="/posts/65382/" title="圣诞快乐+12月小记"><div class="thumbnail"><img alt="圣诞快乐+12月小记" src="https://images1.blog.sinzmise.top/azurlane/421f8fbd754f7f6264cb40b78812cc5d60e5911b.avif"></div><div class="content"><span class="title" href="/posts/65382/" title="圣诞快乐+12月小记">圣诞快乐+12月小记</span><span class="article-recent_post_categories" href="/posts/65382/">个人小记</span></div></a><a class="aside-list-item" href="/posts/61713/" title="2024-11小记"><div class="thumbnail"><img alt="2024-11小记" src="https://images1.blog.sinzmise.top/azurlane/9.avif"></div><div class="content"><span class="title" href="/posts/61713/" title="2024-11小记">2024-11小记</span><span class="article-recent_post_categories" href="/posts/61713/">个人小记</span></div></a><a class="aside-list-item" href="/posts/61712/" title="2024-10小记"><div class="thumbnail"><img alt="2024-10小记" src="https://images1.blog.sinzmise.top/images/2024-10.9gwlrtheoo.webp"></div><div class="content"><span class="title" href="/posts/61712/" title="2024-10小记">2024-10小记</span><span class="article-recent_post_categories" href="/posts/61712/">个人小记</span></div></a></div></div><div class="card-widget card-tags card-archives card-webinfo card-allinfo"><div class="webinfo"><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon fa-solid fa-folder-closed"></i><div class="item-name">文章总数 :</div></div><div class="item-count">46</div></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-eye"></i><div class="item-name">总访问数 :</div></div><span id="busuanzi_site_pv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-user"></i><div class="item-name">总访客数 :</div></div><span id="busuanzi_site_uv"><i class="solitude fa-solid fa-spinner fa-spin"></i></span></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-calendar-day"></i><div class="item-name">建站天数 :</div></div><div class="item-count" id="runtimeshow"></div></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-arrows-rotate"></i><div class="item-name">最后更新 :</div></div><time class="item-count" datetime="2025-01-24T12:06:14.726Z"></time></div><div class="webinfo-item"><div class="webinfo-item-title"><i class="item-icon solitude fa-solid fa-file-word"></i><div class="item-name">全站字数 :</div></div><div class="item-count">46.4k</div></div></div></div></div></div></main><footer id="footer"><div id="footer_deal"><a class="deal_link" target="_blank" rel="noopener" href="https://github.com/SinzMise" title="Github"><i class="solitude fab fa-github"></i></a><a class="deal_link" href="mailto:email@sinzmise.top" title="Mail"><i class="solitude far fa-envelope"></i></a><div class="nolazyload footer_mini_logo" id="footer_mini_logo" title="返回顶部" onclick="sco.toTop()"><img src="/img/avatar.webp" alt="返回顶部"></div><a class="deal_link" target="_blank" rel="noopener" href="https://space.bilibili.com/479627766" title="Bilibili"><i class="solitude fab fa-bilibili"></i></a><a class="deal_link" target="_blank" rel="noopener" href="https://www.storical.space/" title="Home"><i class="solitude fa fa-home"></i></a></div><div id="st-footer"><div class="footer-group"><h3 class="footer-title">我加入的1</h3><div class="footer-links"><a class="footer-item" target="_blank" rel="noopener" href="https://zhblogs.ohyee.cc/" title="中文博客列表">中文博客列表</a><a class="footer-item" target="_blank" rel="noopener" href="https://storeweb.cn/member/o/1585" title="个站商店">个站商店</a><a class="footer-item" target="_blank" rel="noopener" href="https://bf.zzxworld.com/s/995" title="BlogFinder">BlogFinder</a><a class="footer-item" target="_blank" rel="noopener" href="https://sites.applinzi.com/site-info?siteType=life&siteId=64cb373190e35300a8eec654" title="站点聚合平台">站点聚合平台</a><a class="footer-item" target="_blank" rel="noopener" href="https://boke.lu/" title="博客录">博客录</a></div></div><div class="footer-group"><h3 class="footer-title">我加入的2</h3><div class="footer-links"><a class="footer-item" target="_blank" rel="noopener" href="https://rssblog.cn/member/d711afd659d65c2ba2d3b18697818cf7/" title="RssBlog">RssBlog</a><a class="footer-item" target="_blank" rel="noopener" href="https://blogscn.fun/" title="笔墨迹">笔墨迹</a><a class="footer-item" target="_blank" rel="noopener" href="https://daohang.lusongsong.com/" title="博客大全">博客大全</a><a class="footer-item" target="_blank" rel="noopener" href="https://www.blogsclub.org/blog/99.html" title="BlogsClub">BlogsClub</a><a class="footer-item" target="_blank" rel="noopener" href="https://ourblo.gs/blogs/55/" title="OurBlogs">OurBlogs</a></div></div><div class="footer-group"><div class="footer-title-group"><h3 class="footer-title">友链</h3><button class="random-friends-btn" onclick="randomLinksList()" title="友链"><i class="solitude fa-solid fa-arrows-rotate"></i></button></div><div class="footer-links" id="friend-links-in-footer"></div></div></div><div id="footer-bar"><div class="footer-bar-links"><div class="footer-bar-left"><div class="copyright">© 2023 - 2025 By <a class="footer-bar-link" href="/"><img class="author-avatar" src="/images/icon.png">王九弦SZ·Ninty</a></div><div class="beian-group"><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.gov.moe/?keyword=20231033" title="萌ICP备20231033号"><span class="beian-name">萌ICP备20231033号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.yuncheng.fun/id.php?keyword=20241025" title="团ICP备20241025号"><span class="beian-name">团ICP备20241025号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://beian.miit.cn.com/gov/search.php?query=20240818" title="MIIT备20240818号"><img class="beian-icon" src="https://beian.miit.cn.com/logo.svg" alt="MIIT备20240818号"><span class="beian-name">MIIT备20240818号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://guan.ma/hao/2024000155/" title="官码2024000155号"><span class="beian-name">官码2024000155号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.snzy.cc/?id=2024120181" title="梵AIA盟2024120181号"><img class="beian-icon" src="https://icp.snzy.cc/static/picture/icpba.png" alt="梵AIA盟2024120181号"><span class="beian-name">梵AIA盟2024120181号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://icp.sepocatch.xyz/search.php?keyword=blog.storical.space" title="SICP备20243448号"><span class="beian-name">SICP备20243448号</span></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://hexo.io/">框架:Hexo</a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://github.com/everfu/hexo-theme-solitude">主题:Solitude</a></div></div><div class="footer-bar-right"><a class="footer-bar-link" alt="<a href="https://xn--sr8hvo.ws/previous">←</a>&nbsp;An&nbsp;<a href="https://xn--sr8hvo.ws">IndieWeb Webring</a>&nbsp;🕸💍&nbsp;<a href="https://xn--sr8hvo.ws/next">→</a>"></a><a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws/previous">←</a> An <a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws">IndieWeb Webring</a> 🕸💍 <a target="_blank" rel="noopener" href="https://xn--sr8hvo.ws/next">→</a><a class="footer-bar-link" href="/atom.xml" alt="RSS">RSS</a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans" alt="License"><i class="solitude fas fa-copyright"></i><i class="solitude fab fa-creative-commons-by"></i><i class="solitude fab fa-creative-commons-nc"></i><i class="solitude fab fa-creative-commons-nd"></i></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://www.travellings.cn/go.html" alt="开往-友链接力"><img src="https://www.travellings.cn/assets/logo.gif" alt="开往-友链接力"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://boringbay.com/" alt="无聊湾 🥱 The Boring Bay"><img src="https://boringbay.com/api/badge/blog.storical.space" alt="无聊湾 🥱 The Boring Bay"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://blogscn.fun/" alt="本站已加入BLOGS·CN"><img src="https://photo.xiangming.site/img/blogscn.png" alt="本站已加入BLOGS·CN"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://blogscn.fun/random.html" alt="BLOGS·CN随机访问"><img src="https://photo.xiangming.site/img/footer.gif" alt="BLOGS·CN随机访问"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://www.blogsclub.org/go" alt="空间穿梭-随机访问BlogsClub成员博客"><img src="https://www.blogsclub.org/images/shuttle_1.png" alt="空间穿梭-随机访问BlogsClub成员博客"></a><a class="footer-bar-link" target="_blank" rel="noopener" href="https://http3.wcode.net/?q=blog.storical.space" alt="本站支持HTTP/3"><img src="https://http3.wcode.net/badges/http3.svg?host=blog.storical.space" alt="本站支持HTTP/3"></a></div></div></div><div class="comment-barrage needEndHide"></div></footer></div><div id="rightMenu"><div class="rightMenu-group rightMenu-small"><div class="rightMenu-item" id="menu-backward"><i class="solitude fa-solid fa-arrow-left"></i></div><div class="rightMenu-item" id="menu-forward"><i class="solitude fa-solid fa-arrow-right"></i></div><div class="rightMenu-item" id="menu-refresh"><i class="solitude fa-solid fa-arrows-rotate"></i></div><div class="rightMenu-item" id="menu-top"><i class="solitude fa-solid fa-arrow-up"></i></div></div><div class="rightMenu-group rightMenu-line rightMenuPlugin"><div class="rightMenu-item" id="menu-copytext"><i class="solitude fa-solid fa-clone"></i><span>复制选中文本</span></div><div class="rightMenu-item" id="menu-pastetext"><i class="solitude fa-solid fa-clipboard"></i><span>粘贴文本</span></div><div class="rightMenu-item" id="menu-commenttext"><i class="solitude fa-solid fa-comment-medical"></i><span>引用到评论</span></div><div class="rightMenu-item" id="menu-newwindow"><i class="solitude fa-regular fa-window-maximize"></i><span>新窗口打开</span></div><div class="rightMenu-item" id="menu-copylink"><i class="solitude fa-solid fa-link"></i><span>复制链接地址</span></div><div class="rightMenu-item" id="menu-copyimg"><i class="solitude fa-solid fa-clone"></i><span>复制此图片</span></div><div class="rightMenu-item" id="menu-downloadimg"><i class="solitude fa-solid fa-cloud-arrow-down"></i><span>下载此图片</span></div><div class="rightMenu-item" id="menu-search"><i class="solitude fa-solid fa-magnifying-glass"></i><span>站内搜索</span></div></div><div class="rightMenu-group rightMenu-line rightMenuOther"><div class="rightMenu-item" id="menu-commentBarrage" onclick="sco.switchCommentBarrage()"><i class="solitude fa-solid fa-comment"></i><span class="menu-commentBarrage-text">关闭热评</span></div><div class="rightMenu-item" id="menu-darkmode" onclick="sco.switchDarkMode()"><i class="solitude fa-solid fa-circle-half-stroke"></i><span class="menu-darkmode-text">深色模式</span></div><div class="rightMenu-item" id="menu-translate"><i class="solitude fa-solid fa-language"></i><span>轉為繁體</span></div></div></div><div id="rightmenu-mask"></div><div><script src="/js/utils.js?v=3.0.5"></script><script src="/js/main.js?v=3.0.5"></script><script src="/js/third_party/waterfall.min.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/pjax@0.2.8/pjax.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/qrcodejs@1.0.0/qrcode.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/typeit@8.8.7/dist/index.umd.min.js"></script><script src="/js/third_party/universe.min.js?v=3.0.5"></script><script>dark()</script><script src="/js/tw_cn.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/vanilla-lazyload@19.1.3/dist/lazyload.iife.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/node-snackbar@0.1.16/dist/snackbar.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/@fancyapps/ui@5.0.36/dist/fancybox/fancybox.umd.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/colorthief@2.6.0/dist/color-thief.min.js"></script><script src="/js/covercolor/local.js?v=3.0.5"></script><script>window.paceOptions={restartOnPushState:!1},utils.addGlobalFn("pjaxSend",(()=>{Pace.restart()}),"pace_restart")</script><script src="https://jsd.cdn.sinzmise.top/npm/pace-js@1.2.4/pace.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/instantsearch.js@4.75.6/dist/instantsearch.production.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/algoliasearch@5.18.0/dist/algoliasearch.umd.min.js"></script><script src="/js/right_menu.js?v=3.0.5"></script><script src="/js/schedule.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/chinese-lunar@0.1.4/lib/chinese-lunar.js"></script><script src="/chatroom/chatroom.js"></script><script async src="//at.alicdn.com/t/c/font_3586335_hsivh70x0fm.js"></script><script async src="//at.alicdn.com/t/c/font_4199232_wlo8truegv.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/aplayer/dist/APlayer.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/meting/dist/Meting.min.js"></script><script src="https://jsd.cdn.sinzmise.top/npm/@ruffle-rs/ruffle"></script><script src="/js/cenguigui.js"></script><div class="js-pjax"><script>(()=>{let t=null;const e=()=>{if(t=Artalk.init({el:"#artalk-wrap",server:"https://atk.pl.blog.sinzmise.top",site:"汐塔魔法屋",pageKey:location.pathname,darkMode:"dark"===document.documentElement.getAttribute("data-theme"),countEl:".artalk-count"},null),"null"===GLOBAL_CONFIG.lightbox)return;t.on("list-loaded",(()=>{const e=[];t.ctx.get("list").getCommentNodes().forEach((t=>{e.push({nick:t.data.nick,content:t.data.content_marked,mailMd5:t.data.email_encrypted});const a=t.getRender().$content;GLOBAL_CONFIG.lightbox&&utils.lightbox(a.querySelectorAll("img:not([atk-emoticon])"))})),sco.owoBig({body:".atk-grp",item:".atk-item"})&&barrageArtalk(e)}));utils.addGlobalFn("pjax",(()=>t.destroy()),"destroyArtalk"),document.addEventListener("pjax:complete",(function(){t.update({pageKey:window.location.pathname,pageTitle:document.title}),t.reload()}))},a=async()=>{"object"==typeof Artalk?e():(await utils.getCSS("https://jsd.cdn.sinzmise.top/npm/artalk@2.9.1/dist/Artalk.min.css"),await utils.getScript("https://jsd.cdn.sinzmise.top/npm/artalk@2.9.1/dist/Artalk.min.js").then(e))};utils.addGlobalFn("themeChange",(e=>{const a=document.getElementById("artalk-wrap");if(!a||!a.children.length)return;const n="dark"===e;t.setDarkMode(n)}),"artalk"),a()})()</script><script defer pjax="" src="https://jsd.cdn.sinzmise.top/npm/penndu/bsz.js"></script></div><script>var webmentionContext={baseUrl:"https://webmention.io"},webmentionEndpoint="https://webmention.io/blog.storical.space/webmention"</script><script data-pjax="" src="/js/webmention/webmention.js?v=3.0.5"></script><script data-pjax="" src="/js/webmention/webmention-timeline.js?v=3.0.5"></script><script src="https://jsd.cdn.sinzmise.top/npm/jquery@3.5.1/dist/jquery.min.js"></script></div><script>const links=[{name:"Hexo",link:"https://hexo.io/"},{name:"Solitude",link:"https://github.com/everfu/hexo-theme-solitude"},{name:"安知鱼",link:"https://blog.anheyu.com/"},{name:"轻笑Chuckle",link:"https://www.qcqx.cn"},{name:"SeaEpoch",link:"https://www.seayj.cn"},{name:"晓雨杂记",link:"https://lihaoyu.cn"},{name:"山岳库博",link:"https://kmar.top/"},{name:"Ariasakaの小窝",link:"https://blog.yaria.top"},{name:"勿埋我心",link:"https://www.skyqian.com"},{name:"iMaeGoo’s Blog",link:"https://www.imaegoo.com"},{name:"贰猹的小窝",link:"https://noionion.top/"},{name:"定の栈",link:"https://saop.cc"},{name:"Guoqi Sun",link:"https://blog.sunguoqi.com"},{name:"Echo 的小窝",link:"https://www.liveout.cn/"},{name:"米米的博客",link:"https://zhangshuqiao.org"},{name:"MHuiG",link:"https://mhuig.top"},{name:"杜老师说",link:"https://dusays.com"},{name:"Leonus",link:"https://blog.leonus.cn/"},{name:"小N同学",link:"https://www.imcharon.com/"},{name:"Android",link:"https://android99.com"},{name:"张洪Heo",link:"https://blog.zhheo.com/"},{name:"刘洪亮Leo",link:"https://lhliang.com"},{name:"张时贰",link:"https://zhsher.cn"},{name:"Tianli",link:"https://blog.tianli0.top/"},{name:"时光日志",link:"https://www.timelogs.cn"},{name:"葱苓sama",link:"https://blog.ciraos.top"},{name:"Wayne's Blog",link:"https://wrans.top"},{name:"铭心石刻",link:"https://blog.kouseki.cn/"},{name:"猫羽のブログす",link:"https://www.maoyv.cn/"},{name:"猫羽のブログす(新站)",link:"https://www.maoyv.com/"},{name:"风起",link:"https://www.fqxk.com.cn"},{name:"Mycpen",link:"https://blog.cpen.top/"},{name:"W4J1e's blog",link:"https://hin.cool"},{name:"Fomalhaut🥝",link:"https://www.fomal.cc/"},{name:"醉月酿星河",link:"https://blog.catrol.cn/"},{name:"CyanFalse's Weblog",link:"https://blog.eurekac.cn"},{name:"阿锋的小宇宙",link:"https://feng.pub"},{name:"白云苍狗",link:"https://www.imalun.com"},{name:"半方池水半方田",link:"https://uuanqin.top/"},{name:"朽丘秋雨",link:"https://koxiuqiu.cn/"},{name:"网友小宋",link:"https://xyzbz.cn/"},{name:"懋和道人",link:"https://www.dao.js.cn/"},{name:"青桔气球",link:"https://blog.qjqq.cn/"},{name:"微光档案",link:"https://bikari.top"},{name:"风记星辰",link:"https://www.thyuu.com"},{name:"甜鱼/Ayu",link:"https://ayu.land/"},{name:"小鹿的个人网站",link:"https://www.siena.zone"},{name:"Aciano",link:"https://aciano.top/"},{name:"奇思妙想录",link:"https://blog.nicebao.com"},{name:"喵二の小博客",link:"https://www.miaoer.net/"},{name:"Ordis",link:"https://imbhj.com"},{name:"ANXYの小窝",link:"https://blog.anxy.top/"},{name:"月光小镇",link:"https://mooncc.cn/"},{name:"希乐博客",link:"https://blog.xlenco.top/"},{name:"福福不服",link:"https://ffbf.top"},{name:"追梦幻境·云之都",link:"https://blog.dreamerhe.cn/"},{name:"Xiobb’s Blog",link:"https://www.i45s.com/?_ref=blog.sinzmise.top"},{name:"foxcat(狐狸猫的博客)",link:"https://blog.foxcat.eu.org/"},{name:"Gaspard の传火祭祀场",link:"https://www.gaspard.top/"},{name:"阿方的博客",link:"https://fang.blog.miri.site/"},{name:"落落のBlog",link:"https://www.whaleluo.top/"},{name:"俊逸的博客",link:"https://lijunyi.xyz/"},{name:"Calyee",link:"https://blog.calyee.top/"},{name:"小丁的屋舍",link:"https://xding.top/"},{name:"冬天的小窝",link:"https://www.iamdt.cn/"},{name:"郑文峰的博客",link:"https://www.zhengwenfeng.com"},{name:"Naive Koala 🐨",link:"https://www.xalaok.top/"},{name:"微霞",link:"https://yuuu.org"},{name:"孤熵小狼",link:"https://blog.furen.link"},{name:"奥奥の探索日记",link:"https://blog.shaoao.top/"},{name:"Daoker小站",link:"https://daoker.cc"},{name:"LZHの小窝",link:"https://blog.lzh.life/"},{name:"lveMonsiのBlog",link:"https://blog.lvems.top/"},{name:"彬彬加冰",link:"https://blog.wzwzx.cn"},{name:"Isoheptane",link:"https://blog.cascade.moe/"},{name:"雨宮千夏の博麗神社",link:"https://blog.uuz.moe/"},{name:"清羽飞扬",link:"https://blog.liushen.fun/"},{name:"杰帕斯の小窝",link:"https://japerz.com"},{name:"星の野",link:"https://blog.byer.top/"},{name:"Souiken’s Homepage",link:"https://souiken.moe/"},{name:"PuddingKCの小站",link:"https://www.puddingkc.com/"},{name:"MBRjun-Blog",link:"https://www.mbrjun.cn/"},{name:"Homulilly",link:"https://homulilly.com"},{name:"蓝调时刻",link:"https://www.landiaoshike.com/"},{name:"XenWayne’s Blog",link:"https://xenwayne.top"},{name:"白丁往事",link:"https://blog.rayvv.com/"},{name:"haohang",link:"https://www.shimmerl.top"},{name:"咖啡豆子coffee的小站",link:"https://blog.kfdzcoffee.cn"},{name:"雪萌天文台",link:"https://blog.snowy.moe"},{name:"澄沨的漫游茶记",link:"https://champhoon.xyz/"},{name:"VanllaOcap Blog",link:"https://blog.255650.xyz"},{name:"LeZi的猫窝",link:"https://leziblog.com"},{name:"雨滴思绪",link:"https://www.qunqin.net/"},{name:"Pinpe 的云端",link:"https://pinpe.top"},{name:"Debug客栈",link:"https://debuginn.com"},{name:"lhDream",link:"https://blog.luhua.site"},{name:"XingJiのBlog",link:"https://love.xingji.fun/"},{name:"无名博客",link:"https://wuminboke.site/"},{name:"murenyouの小窝",link:"https://murenyou.cn"},{name:"Elykia",link:"https://blog.elykia.cn/"},{name:"小妖客栈",link:"https://wangkay.top"},{name:"陵长镜的小博客",link:"https://r1n.top"},{name:"森尧记",link:"https://07111.cn"},{name:"厄尔科斯",link:"https://sikan.moe/"},{name:"萌!萝莉",link:"https://loliloli.moe"},{name:"洛卡日记",link:"https://luoca.cn/"},{name:"FloatSheep",link:"https://blog.hesiy.cn"},{name:"云团子的博客",link:"https://www.yuncheng.fun/"},{name:"亚斯之声",link:"https://we.owaii.net"},{name:"酸奶云✨",link:"https://blog.mcyogurt.cn/"},{name:"王鑫的小站",link:"https://wxweb.xyz"}],randomText="点击前往按钮进入随机一个友链,不保证跳转网站的安全性和可用性。本次随机到的是本站友链:⌈ ${name} ⌋";function travelling(){const n=links[utils.randomNum(links.length)];Snackbar.show({text:randomText.replace(/\$\{name}/,n.name),duration:8e3,pos:"top-center",actionText:"前往",onActionClick:function(t){t.style.opacity=0,window.open(n.link,"_blank")}})}</script><script>function randomLinksList(){const e=document.getElementById("friend-links-in-footer");if(null==e)return;let n="",t=[...links],l=Math.min(3,t.length);for(let e=0;e<l;e++){let e=utils.randomNum(t.length);const{link:l,name:o}=t[e];n+=`<a class="footer-item" href="${l}" target="_blank" rel="noopener noreferrer nofollow">${o}</a>`,t.splice(e,1)}e.innerHTML=n+'<a class="footer-item" href="/links/">更多</a>'}</script><script>const pjax=new Pjax({elements:'a:not([target="_blank"])',selectors:["title","#body-wrap","#site-config",'meta[name="description"]',".js-pjax",'meta[property^="og:"]',"#config-diff",".rs_show",".rs_hide"],cacheBust:!1,analytics:!1,scrollRestoration:!1});document.querySelectorAll("script[data-pjax]").forEach((e=>{const t=document.createElement("script"),a=e.text||e.textContent||e.innerHTML||"";Array.from(e.attributes).forEach((e=>t.setAttribute(e.name,e.value))),t.appendChild(document.createTextNode(a)),e.parentNode.replaceChild(t,e)})),document.addEventListener("pjax:complete",(()=>{window.refreshFn(),document.querySelectorAll("script[data-pjax]").forEach((e=>{const t=document.createElement("script"),a=e.text||e.textContent||e.innerHTML||"";Array.from(e.attributes).forEach((e=>t.setAttribute(e.name,e.value))),t.appendChild(document.createTextNode(a)),e.parentNode.replaceChild(t,e)})),GLOBAL_CONFIG.islazyload&&window.lazyLoadInstance.update()})),document.addEventListener("pjax:error",(e=>{404===e.request.status&&pjax.loadUrl("/404.html")}))</script><div id="algolia-search"><div class="search-dialog"><div class="algolia-navbar"><div class="search-dialog__title" id="algolia-search-title">搜索</div><div class="algolia-tips"><i class="solitude fab fa-algolia"></i><span class="algolia-tips-text">Algolia</span></div><span class="search-close-button"><i class="solitude fa-solid fa-xmark"></i></span></div><div id="algolia-input-panel"><div id="algolia-search-input"></div></div><div id="search-results"><div id="algolia-hits"></div></div><div id="algolia-tips"><div id="algolia-pagination"></div><div id="algolia-stats"></div></div></div><div id="search-mask"></div></div><script src="/js/search/algolia.js?v=3.0.5"></script></body></html><script>const posts=["posts/60486/","posts/23226/","posts/65382/","posts/61713/","posts/61712/","posts/10733/","posts/64856/","posts/15688/","posts/46640/","posts/15799/","posts/64935/","posts/10021/","posts/57692/","posts/15748/","posts/10996/","posts/13624/","posts/27762/","posts/15842/","posts/54787/","posts/52677/","posts/10045/","posts/45875/","posts/28536/","posts/27531/","posts/42580/","posts/56467/","posts/54386/","posts/29196/","posts/38917/","posts/18063/","posts/58203/","posts/50710/","posts/28733/","posts/12779/","posts/53662/","posts/20412/","posts/21375/","posts/646/","posts/42487/","posts/54481/","posts/48762/","posts/61417/","posts/38964/","posts/22945/","posts/23021/","posts/16107/"];function toRandomPost(){const s=posts[Math.floor(Math.random()*posts.length)];pjax.loadUrl(GLOBAL_CONFIG.root+s)}</script>
|