sinzmise-cetastories 2.0.0-1737855578277 → 2.0.0-1737857665913
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/index.html +1 -1
- package/js/webmention/webmention-timeline.js +52 -47
- 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/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//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/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-4q6Ku8Tvj6"><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>(()=>{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/OaBMl3SHl8e9fyMJ/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/OaBMl3SHl8e9fyMJ/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-26 01:38:19"><i class="post-meta-icon solitude fa-solid fa-arrows-rotate"></i><time class="dt-updated" datetime="2025-01-26T01:38:19.099Z">2025-01-26T01:38:19.099Z</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"><p>你有对这篇文章写<a href="https://indieweb.org/responses" target="_blank">回应</a>吗? 你可以在这里提交你的文章网址或推特链接(文章或推特内容需要包含这篇文章的地址,点击这里了解 <a href="https://indieweb.org/Webmention" target="_blank">Webmention</a>):</p><br><form class="form-webmention" action="https://webmention.io/blog.storical.space/webmention" method="post" target="_blank"><input id="form-webmention-source" name="source" placeholder="你的文章网址或推特链接" required type="url"><input name="target" type="hidden" value="https://blog.storical.space/posts/60486/"><input class="form-webmention-btn" type="submit" value="Send Webmention"></form><div class="webmention-timeline"></div></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/7.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/a9179659586ee509f27367a82c4d639b52ba1342.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/11.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-26T01:39:11.134Z"></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><script defer src="https://umami.status.sinzmise.top/a8f9c04189c7d6a2b6b03f4f3948ef41" data-website-id="f18a2137-2dfe-45b9-a524-21413e09bd68"></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-4q6Ku8Tvj6"><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>(()=>{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/OaBMl3SHl8e9fyMJ/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/OaBMl3SHl8e9fyMJ/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-26 02:13:09"><i class="post-meta-icon solitude fa-solid fa-arrows-rotate"></i><time class="dt-updated" datetime="2025-01-26T02:13:09.720Z">2025-01-26T02:13:09.720Z</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"><p>你有对这篇文章写<a href="https://indieweb.org/responses" target="_blank">回应</a>吗? 你可以在这里提交你的文章网址或推特链接(文章或推特内容需要包含这篇文章的地址,点击这里了解 <a href="https://indieweb.org/Webmention" target="_blank">Webmention</a>):</p><br><form class="form-webmention" action="https://webmention.io/blog.storical.space/webmention" method="post" target="_blank"><input id="form-webmention-source" name="source" placeholder="你的文章网址或推特链接" required type="url"><input name="target" type="hidden" value="https://blog.storical.space/posts/60486/"><input class="form-webmention-btn" type="submit" value="Send Webmention"></form><div class="webmention-timeline"></div></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/64cb52bd7052b3aa4868b906fab59f46cfa6acd0.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/15.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/8.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-26T02:13:58.099Z"></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><script defer src="https://umami.status.sinzmise.top/a8f9c04189c7d6a2b6b03f4f3948ef41" data-website-id="f18a2137-2dfe-45b9-a524-21413e09bd68"></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>
|