-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 176 KB
/
content.json
File metadata and controls
1 lines (1 loc) · 176 KB
1
{"meta":{"title":"Backup of old blog","subtitle":"Hajeekn's Blog","description":"梦中做梦,做了个白日梦","author":"Hajeekn","url":"https://blog.slqwq.cn","root":"/"},"pages":[{"title":"HajeeknのHelper","date":"2022-02-07T19:16:16.000Z","updated":"2023-02-01T11:29:35.177Z","comments":false,"path":"Helper/index.html","permalink":"https://blog.slqwq.cn/Helper/index.html","excerpt":"","text":"function Check(url) { var styleEnda = document.createElement('style'); var styleEnd = document.createElement('style'); var maining = new Image(); var Dates = new Date().getTime(); maining.src = url + \"?time=\" + Dates; var status = 'false'; maining.onload = function() { status = 'true'; console.log('检查成功,可以正常连接到服务器'); }; maining.onerror = function() { var timer = setTimeout(function() { if(!status) { status = 'false'; console.log('检查成功,无法正常连接到服务器'); } },1500); } if (status = 'true') { document.getElementById('statusing').innerHTML=\"服务器通信正常\"; styleEnda.innerHTML=\"#statusing{color: green;}\" document.head.appendChild(styleEnda); } else { document.getElementById('statusing').innerHTML=\"服务器通信异常\"; styleEnd.innerHTML=\"#statusing{color: red;}\" document.head.appendChild(styleEnd); }; }; 如果在浏览网页时莫名其妙出现 404 错误 | 无法访问 可以在此处查看请求 页面开发中... 刷新状态 当前与服务器的连接状态(静态页面):"},{"title":"about","date":"2023-02-01T11:29:35.177Z","updated":"2023-02-01T11:29:35.177Z","comments":false,"path":"about/index.html","permalink":"https://blog.slqwq.cn/about/index.html","excerpt":"","text":"@font-face{font-family:myfont;font-weight:700;src:url(https://cdn1.tianli0.top/gh/sviptzk/xiaokang.me/www/myfont.ttf)} Hajeekn 🍀 个人简介『初中 现居住:🌏 保持一颗充满童趣的心♥』 🌌 博客简介『全站HTTPS』『静态博客(Hexo) + 近完美主题(Butterfly)』『checkbox plus red checked, 博客中少部分图片收集于Network 侵删』 📞联系方式Twitter: @hajeekn Facebook: Hajeekn QQ: 3356620252 微信: 就不告诉你 微博: 就不告诉你 EMail: [email protected]/[email protected] Google Account: [email protected] Mojang Account / Minecraft Account: Hajeekn Xbox Account(Minecraft for Windows10): Super02Love"},{"title":"categories","date":"2020-05-12T08:38:20.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"categories/index.html","permalink":"https://blog.slqwq.cn/categories/index.html","excerpt":"","text":"目前鸣谢、隐私问题、合作般到这里啦~鸣谢:https://www.slblog.ga/网站鸣谢 隐私问题:https://www.slblog.ga/您的隐私问题 合作伙伴:https://www.slblog.ga/合作伙伴们 公益:https://www.slblog.ga/404 服务状态:https://status.ytuty-blog.ga/ 服务状态(新Beta):https://cdn.slblog.ga/Service/"},{"title":"友链们的朋友圈","date":"2021-02-10T12:10:38.000Z","updated":"2023-02-01T11:29:35.177Z","comments":false,"path":"circle/index.html","permalink":"https://blog.slqwq.cn/circle/index.html","excerpt":"","text":"var fdata = { apiurl: 'https://circle-3.api.slqwq.cn/api', initnumber: 20, stepnumber: 10, error_img: '/image/404.gif' } localStorage.setItem(\"fdatalist\",JSON.stringify(fdata))"},{"title":"叨叨","date":"2021-08-14T20:47:52.000Z","updated":"2023-02-01T11:29:35.177Z","comments":false,"path":"dder/index.html","permalink":"https://blog.slqwq.cn/dder/index.html","excerpt":"","text":"[data-theme='dark'] { --loger-ddcard: var(--loger-theme); } [data-theme='light'] { --loger-ddcard: #f7f9fe; } .item { order: 0; font-size: 1rem; font-weight: 700; color: var(--loger-fontcolor); width: 100%; line-height: 1.38; margin: 10px 0; background: var(--loger-ddcard); padding: 12px 16px; border-radius: 12px; } .fas{ margin: 3px; } 样式来自 Heo-bber"},{"title":"友情链接","date":"2020-05-17T15:43:50.000Z","updated":"2023-02-01T11:29:35.181Z","comments":false,"path":"link/index.html","permalink":"https://blog.slqwq.cn/link/index.html","excerpt":"","text":"document.querySelector('.flink').insertAdjacentHTML('afterbegin',\"\") xkFriend.init({ el: '#friend1', // 挂载容器 api: [ 'https://friends.hesiy.cn/', 'https://hamids.hesiy.cn/index.json' ], // 你的json链接列表,可以是多个。 loading_img: 'https://npm.elemecdn.com/[email protected]/photos/Okx1dLKT.webp', // 加载中的图片 fail_img: 'https://npm.elemecdn.com/[email protected]/photos/error.gif' // // 加载失败的图片 }) 1234name: SL's Bloglink: https://blog.slqwq.cnavatar: https://npm.elemecdn.com/perorepe-cdn/v1/bigger-photos/avatar.webpdescr: 梦中做梦,做了个白日梦 由于友链系统重写,所以你要用新的方法申请以前申请过的不需要重新转换申请方法: 按照以上步骤,在GitHub 上执行这些步骤 Tips: 0.yml | 2.yml | 3.yml 都不可用, 1.yml | 4.yml 推荐用 4.yml 但在这之前,请先确保您已添加本站友链! 详细申请方法已记载到仓库的README.md,按照MD指示方可完成"},{"title":"","date":"2021-01-24T13:52:14.000Z","updated":"2023-02-01T11:29:35.181Z","comments":true,"path":"messagesboard/index.html","permalink":"https://blog.slqwq.cn/messagesboard/index.html","excerpt":"","text":"这里是Hajeekn的留言板你可以在这里友好的留言或者留下你的小脚印🐱👣哦 /* 滚动条隐藏 */ ::-webkit-scrollbar { display: none; } /* 禁用图片点击,butterfly渲染后会给图片套上fancybox,点开后会造成信笺偏移*/ .formmain{ pointer-events: none !important; } /* top-img隐藏 */ #page-header { background: transparent !important; } /* 宽度小于530px隐藏信封 */ @media screen and (max-width: 530px) { #computer { display: none !important; } } @media screen and (min-width: 530px) { #mobile { display: none !important; } } #article-container img { margin: 0 auto 0rem; } #form-wrap { overflow: hidden; height: 447px; position: relative; top: 0px; transition: all 1s ease-in-out .3s; z-index: 0; } /* 调整信封划出高度,换信笺内容以后可在此设置height */ #form-wrap:hover { height: 1050px; top: -200px; } #beforeimg { position: absolute; bottom: 126px; left: 0px; background-repeat: no-repeat; width: 530px; height: 317px; z-index: -100; pointer-events: none; } #afterimg { position: absolute; bottom: -2px; left: 0; background-repeat: no-repeat; width: 530px; height: 259px; z-index: 100; pointer-events: none; } #envelope { position: relative; overflow: visible; width: 500px; margin: 0px auto; transition: all 1s ease-in-out .3s; padding-top: 200px; } #maincontent { width: 530px; margin: 20px auto 0; } .headerimg { width: 100%; overflow: hidden; pointer-events: none; } .formmain { background: white; width: 95%; max-width: 800px; margin: auto auto; border-radius: 5px; border: 1px solid; overflow: hidden; -webkit-box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.12); box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.18); } .title3 { text-decoration: none; color: rgb(246, 214, 175); } .comments { border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 20px; background-color: #eee; margin: 15px 0px; padding-left: 20px; padding-right: 20px; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 20px; font-family: \"Arial\", \"Microsoft YaHei\", \"黑体\", \"宋体\", sans-serif; } .bottomcontent { text-align: center; margin-top: 40px; } .bottomimg { width: 100%; margin: 5px auto 5px auto; display: block; pointer-events: none; } .bottomhr { font-size: 12px; text-align: center; color: #999; } /* 夜间模式 */ [data-theme='dark'] .formmain { background: rgb(50, 50, 50); } [data-theme='dark'] .comments { background: rgba(90, 90, 90, 0.8) } 来自Hajeekn的留言: 有什么想问的? 有什么想说的? 有什么想吐槽的? 小小书记人偶竭诚为您服务! 来自Hajeekn的留言: 有什么想问的? 有什么想说的? 有什么想吐槽的?"},{"title":"建立连接时出现了一些错误","date":"2022-02-07T11:53:47.000Z","updated":"2023-02-01T11:29:35.181Z","comments":false,"path":"offline/index.html","permalink":"https://blog.slqwq.cn/offline/index.html","excerpt":"","text":"Oops! 你似乎离线了 由于我们无法从任何服务器上获取网页内容,所以您可能离线了 如果你能看到这个页面,很大可能是从Service Worker跳转过来的 请检查你的本地网络,是否屏蔽了本站或者网络出错 当前连接状态: undefined function Check(url) { var styleEnda = document.createElement('style'); var styleEnd = document.createElement('style'); var maining = new Image(); var Dates = new Date().getTime(); maining.src = url + \"?time=\" + Dates; var status = false; maining.onload = function() { status = true; console.log('检查成功,可以正常连接到服务器'); }; maining.onerror = function() { var timer = setTimeout(function() { if(!status) { status = false; console.log('检查成功,无法正常连接到服务器'); } },1500); } if (status = true) { document.getElementById('statusing').innerHTML=\"服务器通信正常\"; styleEnda.innerHTML=\"#statusing{color: green;}\" document.head.appendChild(styleEnda); } else { document.getElementById('statusing').innerHTML=\"服务器通信异常\"; styleEnd.innerHTML=\"#statusing{color: red;}\" document.head.appendChild(styleEnd); }; }; Check('https://blog.slqwq.cn/favicon.ico')"},{"title":"标签","date":"2021-01-20T16:46:20.000Z","updated":"2023-02-01T11:29:35.181Z","comments":true,"path":"tags/index.html","permalink":"https://blog.slqwq.cn/tags/index.html","excerpt":"","text":""},{"title":"Speak","date":"2020-08-09T22:38:04.000Z","updated":"2023-02-01T11:29:35.181Z","comments":false,"path":"time/index.html","permalink":"https://blog.slqwq.cn/time/index.html","excerpt":"","text":"$(document).ready(function () { if(location.href.indexOf(\"#reloaded\")==-1){ location.href=location.href+\"#reloaded\"; location.reload(); } }) *{box-sizing:border-box;outline:0;margin:0;padding:0}#loading-bar-wrapper{position:fixed;width:100px;top:8px;left:50%;transform:translateX(-50%);height:8px;border-radius:8px;z-index:99999;background:0 0}#loading-bar-wrapper.nprogress-custom-parent{background:var(--color-card);box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}.loading-circle{display:none;height:100%;width:100%;position:fixed;top:0;left:0;z-index:999999;background-color:rgba(250,250,250,.9)}.loading-circle img{width:280px;height:210px;position:relative;top:45%;left:50%;margin-left:-140px;margin-top:-105px}#loader-circle{display:block;position:relative;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;border:3px solid transparent;border-top-color:#ff5a5a;animation:spin 1s linear infinite}#loader-circle:before{content:\"\";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:#5af33f;animation:spin 3s linear infinite}#loader-circle:after{content:\"\";position:absolute;top:15px;left:15px;right:15px;bottom:15px;border-radius:50%;border:3px solid transparent;border-top-color:#6dc9ff;animation:spin 2s linear infinite}.fa-cog:before{content:\"\\f013\";color:#0ee4e4}.fuck{color:#0ee4e4} .hljs{display:block;overflow-x:auto;padding:.5em;background:#23241f}.hljs,.hljs-subst,.hljs-tag{color:#f8f8f2}.hljs-emphasis,.hljs-strong{color:#a8a8a2}.hljs-bullet,.hljs-link,.hljs-literal,.hljs-number,.hljs-quote,.hljs-regexp{color:#ae81ff}.hljs-code,.hljs-section,.hljs-selector-class,.hljs-title{color:#a6e22e}.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic}.hljs-attr,.hljs-keyword,.hljs-name,.hljs-selector-tag{color:#f92672}.hljs-attribute,.hljs-symbol{color:#66d9ef}.hljs-class .hljs-title,.hljs-params{color:#f8f8f2}.hljs-addition,.hljs-built_in,.hljs-builtin-name,.hljs-selector-attr,.hljs-selector-id,.hljs-selector-pseudo,.hljs-string,.hljs-template-variable,.hljs-type,.hljs-variable{color:#e6db74}.hljs-comment,.hljs-deletion,.hljs-meta{color:#75715e} 🍭 欢迎你的来访啊 🍭 这里是SL的speak页面啊 已经有位可爱的用户访问这个页面了呀~</span>这个页面的访问量达到了欸!</span> new Speak({ per_page: 5, owner: 'slqwq', repo: 'speak', defaultLabelName: 'Deafult', defaultLabelColor: '#ffc107', });"},{"title":"","date":"2023-02-01T11:29:35.181Z","updated":"2023-02-01T11:29:35.181Z","comments":true,"path":"time/tagpl.css","permalink":"https://blog.slqwq.cn/time/tagpl.css","excerpt":"","text":"div.tabs { display: block; position: relative; margin-top: 0.5rem; margin-bottom: 0.5rem; border-radius: 4px; background: var(--color-card); border: 1px solid rgba(68,68,68,0.2); font-size: 0.9375rem; } div.tabs .highlight, div.tabs p, div.tabs ul, div.tabs ol, div.tabs div.note, div.tabs details { margin-top: 0.5rem; margin-bottom: 0.5rem; } div.tabs ul.nav-tabs { display: -ms-flexbox; display: flex; overflow-x: auto; white-space: nowrap; -ms-flex-pack: start; justify-content: flex-start; margin: 0 !important; padding: 8px 8px 0 8px; background: var(--color-block); border-radius: 4px 4px 0 0; line-height: 1.5; } div.tabs ul.nav-tabs li.tab { list-style-type: none; margin-top: 0; margin-bottom: 0; } div.tabs ul.nav-tabs li.tab:last-child { padding-right: 16px; } div.tabs ul.nav-tabs li.tab a { display: block; cursor: pointer; border-radius: 4px 4px 0 0; padding: 8px; text-align: center; font-size: 0.875rem; line-height: inherit; font-weight: bold; color: var(--color-meta); border: 1px solid transparent; } div.tabs ul.nav-tabs li.tab a:hover { color: var(--color-p); } div.tabs ul.nav-tabs li.tab a i { pointer-events: none; } div.tabs ul.nav-tabs li.tab.active a { cursor: default; color: var(--color-p); background: #fff; border: 1px solid rgba(68,68,68,0.2); border-bottom: 1px solid var(--color-card); } div.tabs .tab-content { border-top: 1px solid rgba(68,68,68,0.2); margin-top: -1px; } div.tabs .tab-content .tab-pane { padding: 16px; } div.tabs .tab-content .tab-pane:not(.active) { display: none; } div.tabs .tab-content .tab-pane.active { display: block; } div.tabs .tab-content .tab-pane > p:first-child, div.tabs .tab-content .tab-pane > .tabs:first-child, div.tabs .tab-content .tab-pane > ul:first-child, div.tabs .tab-content .tab-pane > ol:first-child, div.tabs .tab-content .tab-pane > .highlight:first-child, div.tabs .tab-content .tab-pane > .note:first-child, div.tabs .tab-content .tab-pane > .fancybox:first-child { margin-top: 0; } div.tabs .tab-content .tab-pane > p:last-child, div.tabs .tab-content .tab-pane > .tabs:last-child, div.tabs .tab-content .tab-pane > ul:last-child, div.tabs .tab-content .tab-pane > ol:last-child, div.tabs .tab-content .tab-pane > .highlight:last-child, div.tabs .tab-content .tab-pane > .note:last-child, div.tabs .tab-content .tab-pane > .fancybox:last-child { margin-bottom: 0; } div.timenode { position: relative; } div.timenode:before, div.timenode:after { content: ''; z-index: 1; position: absolute; background: rgba(68,215,182,0.5); width: 2px; left: 7px; } div.timenode:before { top: 0px; height: 6px; } div.timenode:after { top: 26px; height: calc(100% - 26px); } div.timenode:last-child:after { height: calc(100% - 26px - 16px); border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; } div.timenode .meta, div.timenode .body { max-width: calc(100% - 24px); } div.timenode .meta { position: relative; color: var(--color-meta); font-size: 0.875rem; line-height: 32px; height: 32px; } div.timenode .meta:before, div.timenode .meta:after { content: ''; position: absolute; top: 8px; z-index: 2; } div.timenode .meta:before { background: rgba(68,215,182,0.5); width: 16px; height: 16px; border-radius: 8px; } div.timenode .meta:after { background: #44d7b6; margin-left: 2px; margin-top: 2px; width: 12px; height: 12px; border-radius: 6px; transform: scale(0.5); transition: all 0.28s ease; -moz-transition: all 0.28s ease; -webkit-transition: all 0.28s ease; -o-transition: all 0.28s ease; } div.timenode .meta p { font-weight: bold; margin: 0 0 0 24px; } div.timenode .body { margin: 4px 0 16px 24px; padding: 16px; border-radius: 8px; background: var(--color-block); display: inline-block; } div.timenode .body:empty { display: none; } div.timenode .body p:first-child { margin-top: 0; } div.timenode .body p:last-child { margin-bottom: 0; } div.timenode .body .highlight { border: 1px solid #e4e4e4; } div.timenode:hover .meta { color: var(--color-text); } div.timenode:hover .meta:before { background: rgba(255,87,34,0.5); } div.timenode:hover .meta:after { background: #ff5722; transform: scale(1); }"},{"title":"update","date":"2020-05-15T10:02:18.000Z","updated":"2023-02-01T11:29:35.181Z","comments":false,"path":"update/index.html","permalink":"https://blog.slqwq.cn/update/index.html","excerpt":"","text":"小动作2022/04/05 改动 升级主题 删除所有外挂标签 添加主题为子模块 添加 Giscus 评论系统 2021/2/3 升级主题 将主题的大部分魔改搬移到了Butetrfly3.6.1,真的佩服杰瑞啊,3.6.1重写了很多代码,烦死了😂在今天弄完后看到杰瑞更新了3.6.2😂 2021/1/24 压缩博客 使用gulp工具对博客进行压缩 移除Gitalk评论系统 2021/1/20 对博客做了一些很小的改动 移除音乐播放器 新增语雀文章同步到Hexo的功能!(重磅更新) 移除Valine评论系统 新增Waline评论系统 2020/8/18 CDN更换 更换cdn.slblog.ga的节点提供商 添加APlayer播放器 2020/8/16 友链申请方式改变 更换友链申请方式为添加Issues(只需博主审核,其他不用操作) 2020/8/8 做了一些小改动 移除Aplayer播放器 公告栏更变🤭 2020/8/1 做了一些小改动 更改Valine评论系统字体颜色 更改一些小细节 2020/7/8 做了一些小改动 升级主题为Pjax分支 添加Aplayer播放器 移除Hexo-neat压缩工具🗜,否则会造成主题报错💀 2020/6/29 做了一些小改动 删除音乐播放器 更新全局字体 使用Hexo-Neat压缩 关闭侧边栏的Discord功能 提高加载速度 2020/6/8 做了一些小改动 新增文件CDN(每月15GB流量) 侧边栏新增访客信息 移除阿里云(大陆)CDN 2020/6/2 做了一些小改动 将slblog.ga跳转到blog.slqwq.cn 实验室新增音乐播放器功能 替换新的播放器 2020/6/2 做了一些小改动 更换新的域名-blog.slqwq.cn 2020/5/23 做了一些小改动 新增阿里云大陆CDN 2020/5/16 做了一些小改动 新增cdn.slblog.ga CDN 2020/5/15 由于CloudFlare回源故障,现删除CloudFlare"}],"posts":[{"title":"将你的网站部署到 Cloudflare 加快访问速度","slug":"lyr15g","date":"2023-02-01T11:29:35.177Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2023/posts/lyr15g/index.html","link":"","permalink":"https://blog.slqwq.cn/2023/posts/lyr15g/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客上篇我们介绍了 Cloudflare Argo Tunnel 的玩法本篇讲述如何部署网站到 Cloudflare 加快速度 配置 Cloudflare Pages本文章基于 Cloudflare Pages,如果没有请用 GitHub + Cloudflare CDN首先打开你的 Cloudflare 账户 Pages 页面选择新建项目授权应用完成后选择储存库为了减少部署时间,推荐使用编译仓库(也就是 Hexo 生成 HTML 的仓库)选择后无脑下一步之后 Cloudflare Pages 就会开始部署你的 Hexo 了 自定义域名打开 Cloudflare Partner 平台和你的 DNS 解析商这里用辣椒和 DNS.LA 演示新建一条解析(两边都是)记录名写你博客的子域名,一般都是 blog你的 DNS 解析商的 CNAME 海外写 blog.xxx.xx.cdn.cloudflare.net默认和国内选择几个好用的自选 Cloudflare CDN 节点就行辣椒的记录名也写 blog记录类型选 CNAMECloudflare Pages 部署完成后会分给你一个xxxx.pages.dev把他复制填写进记录值然后保存就行接着打开你的 Cloudflare Pages 页面选择刚部署好的项目进入自定义域点击添加,自定义域就写 记录值.域名然后等待 SSL 的启用就行了 配置缓存打开 Cloudflare 的缓存配置页面点击配置Always Online 设置为 true缓存级别 设置为标准浏览器缓存 TTL 设置成 4 小时然后打开规则创建页面规则这样写就行记得把博客记录名.域名替换成你自己的比如我的是 blog.slqwq.cn就写 blog.slqwq.cn今天又水了一篇文章,真棒(๑•̀ㅂ•́)و✧","categories":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/categories/cloudflare/"}],"tags":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/tags/cloudflare/"}],"author":"Hajeekn"},{"title":"侧载 IPA 的另外方案 - SideStore","slug":"侧载-IPA-的另外方案-SideStore","date":"2023-01-23T12:08:00.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2023/posts/96d1f24e/index.html","link":"","permalink":"https://blog.slqwq.cn/2023/posts/96d1f24e/index.html","excerpt":"","text":"在 iOS 上侧载 IPA 文件,是一个令人头疼的问题 TrollStore 但是 iOS 16 不支持 我们可以使用 Sideloadly 但是续签需要电脑 我们也可以使用 AltStore 但是续签也需要电脑 我们还可以使用爱思助手但是续签同样需要电脑 有什么方法可以在手机上续签? SideStore! 下载 SideStore IPA进入 SideStore 官网 开始下载 此处有两个选项 第一个选项会下载稳定版 SideStore 第二个选项会下载每夜(测试)版 SideStore 下载好后放在一个文件夹里面 下载 SideStore Downloader加入 JitStreamer 在 downloads 频道中下载 下载完后打开 预处理 SideStore IPA 此处选择本地文件 这里直接粘贴 IPA 文件 然后一直默认就行 在配对设备的步骤中将你的 iPhone 插入电脑并信任 然后输入你的设备 IP 地址就行 稍等片刻,你就会拥有一个以 SideStore-设备名称命名的 IPA 文件 下载 AltStore 并安装 SideStoreSideStore 需要使用 AltStore 安装 AltStore 链接贴在这里,直接下载安装即可 然后是 Windows 11 的解决办法 (来自 JitStreamer) Windows 11 - AltServer Workaround Step 1 - Download the vivetool from here !👉🏻 https://github.com/thebookisclosed/ViVe/releases Step 2 - Create a folder name vivetool without any spaces in the name, in C Drive. Step 3 - Now Extract all the files from the zip to That vivetool folder you had created in Step 2. Step 4 - Open Up the CMD (Run as Administrator). Step 5 - Copy Paste & Run this Command in CMD !👉🏻 c:\\vivetool\\vivetool.exe /disable /id:26008830 Step 6 - After Running the Command it will Show you a Message saying 👉🏻Successfully Set Feature Configuration ) which means the command is successfully implemented. Step 7 - Now the only thing you need to do afterwards is that restart your PC. Step 8 - After Restarting your PC, Launch the AltServer as Administrator, Guess what, !!!Boom!!!!🎆) u can see the AltServer Icon in your taskbar tray bar. Instructions courtesy of RyzenGaming#5928 - thank you! 安装之后查看任务栏,按住 Shift 的同时点击 AltStore 选择 Sideload .ipa Windows 用户请安装非 Microsoft Store 的 iTunes 和非 Microsoft Store 的 iCloud 配置 WireGuard注册一个非国区 Apple ID 并获取 WireGuard 然后去 SideStore 获取 WireGaurd 配置 下载完成之后导入 WireGuard 并启用即可 然后你的 SideStore 就可以正常使用了 如果有需要你可以自定义 Anisette 服务器 搭建 Anisette 服务器(非必须)详情请看文档 Custom Anisette Server | SideStore Docs","categories":[{"name":"ios","slug":"ios","permalink":"https://blog.slqwq.cn/categories/ios/"},{"name":"ipa","slug":"ios/ipa","permalink":"https://blog.slqwq.cn/categories/ios/ipa/"}],"tags":[{"name":"ios","slug":"ios","permalink":"https://blog.slqwq.cn/tags/ios/"},{"name":"ipa","slug":"ipa","permalink":"https://blog.slqwq.cn/tags/ipa/"}]},{"title":"小米路由器 AX9000 开发版固件获取 SSH / 安装 MIXBOX & ENTWARE","slug":"小米路由器-AX9000-开发版固件获取-SSH-安装-MIXBOX-ENTWARE","date":"2023-01-17T15:50:35.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2023/posts/31c5538d/index.html","link":"","permalink":"https://blog.slqwq.cn/2023/posts/31c5538d/index.html","excerpt":"","text":"既然 AX9000 有了 Docker 那我们打开 SSH 的方式就很多了 Portainer 部署 BusyBox这边我们通过 BusyBox 打开 SSH 权限 首先进入 Portainer 后台 创建一个容器 镜像使用 busybox 在 Advanced container settings 中开启 tty 然后挂载路由器的根目录 然后部署容器 Attch 修改配置之后回到容器列表,选择刚创建的容器 使用 attch 进入容器 chroot到主机根目录并且修改 dropbear 12chroot /mntvi /etc/init.d/dropbear 找到如下内容 123456789start_service(){ flg_ssh=`nvram get ssh_en` channel=`/sbin/uci get /usr/share/xiaoqiang/xiaoqiang_version.version.CHANNEL` if [ "$flg_ssh" != "1" -o "$channel" = "release" ]; then return 0 fi···} 将它注释掉 123456789start_service(){ #flg_ssh=`nvram get ssh_en` #channel=`/sbin/uci get /usr/share/xiaoqiang/xiaoqiang_version.version.CHANNEL` #if [ "$flg_ssh" != "1" -o "$channel" = "release" ]; then #return 0 #fi···} 然后启动一下 dropbear 1/etc/init.d/dropbear start 修改 root 密码(或者添加 RSA的authorized_keys) 1passwd root 1vi /etc/dropbear/authorized_keys 固化 SSH(有变砖风险,可以跳过)使用 mitool 先查看 bdata 分区 1cat /proc/mtd 然后备份 bdata 1nanddump -f /mnt/docker_disk/bdata.img /dev/mtd18 固化 SSH 1/tmp/mitool.sh unlock SSH 权限就开启了 安装 MIXBOX1export MB_URL=https://gcore.jsdelivr.net/gh/monlor/mbfiles && sh -c "$(curl -kfsSl ${MB_URL}/install.sh)" && source /etc/profile &> /dev/null 一串命令就行 之后在命令行使用mixbox 就能使用了 手动更新 1sh -c "$(curl -kfsSl https://gcore.jsdelivr.net/gh/monlor/mbfiles/update.sh)" && source /etc/profile &> /dev/null 手动卸载 1sh -c "$(curl -kfsSl https://gcore.jsdelivr.net/gh/monlor/MIXBOX/apps/mixbox/scripts/uninstall.sh)" && source /etc/profile &> /dev/null 安装 Entware首先备份 12mv /bin/opkg /bin/opkg.bakmv /opt /data/opt_bak 123456mkdir /data/optln -s /data/opt /curl http://bin.entware.net/aarch64-k3.10/installer/alternative.sh | shecho 'export PATH=$PATH:/opt/bin:/opt/sbin' >> /etc/profilesource /etc/profile/opt/etc/init.d/rc.unslung start 如果你想要安装在外置存储(USB) 123456mkdir /mnt/docker_disk/entwareln -s /mnt/docker_disk/entware /curl http://bin.entware.net/aarch64-k3.10/installer/alternative.sh | shecho 'export PATH=$PATH:/opt/bin:/opt/sbin' >> /etc/profilesource /etc/profile/opt/etc/init.d/rc.unslung start 如果已经安装完了要更改路径 123mv /data/opt 新路径rm -f /data/optln -s 新路径 /opt 参考内容小米路由器 AX9000 开发版固件直接获取 SSH - 南浦月 (nanpuyue.com) AX9000官方固件一些ssh配置分享(静态路由,巨型帧,彻底关闭无线,Godaddy DDNS等)-小米无线路由器以及小米无线相关的设备-恩山无线论坛 (right.com.cn) monlor/MIXBOX-ARCHIVE: 一款基于Shell的小米路由器工具箱,原为Monlor-Tools,A tool box for XiaoMi Router base on Shell. (github.com)","categories":[{"name":"ax9000","slug":"ax9000","permalink":"https://blog.slqwq.cn/categories/ax9000/"},{"name":"docker","slug":"ax9000/docker","permalink":"https://blog.slqwq.cn/categories/ax9000/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/tags/docker/"},{"name":"ax9000","slug":"ax9000","permalink":"https://blog.slqwq.cn/tags/ax9000/"}]},{"title":"AX9000 Docker - Cloudreve 搭建并打洞","slug":"AX9000-Docker-Cloudreve-搭建并打洞","date":"2022-12-10T12:31:55.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/4e18cfcd/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/4e18cfcd/index.html","excerpt":"","text":"接上次,我们在 AX9000 中安装了 Docker,我们可以用它搭建一个网盘,并且打洞映射到外网(Cloudflare Argo Tunnel) 打洞使用 Cloudflare Argo Tunnel / 和 Cloudflare 零信任使用同一个程序 Cloudreve 的配置进入 快速开始 - Cloudreve 找到 Docker Compose 安装方式 为什么不使用传统安装方式? AX9000 虽然开启了 Docker,但是不提供 SSH 所以我们无法通过命令行的方式安装 Cloudreve 复制 Compose 文件 123456789101112131415161718192021222324252627282930313233version: "3.8"services: cloudreve: container_name: cloudreve image: cloudreve/cloudreve:latest restart: unless-stopped ports: - "5212:5212" volumes: - temp_data:/data - ./cloudreve/uploads:/cloudreve/uploads - ./cloudreve/conf.ini:/cloudreve/conf.ini - ./cloudreve/cloudreve.db:/cloudreve/cloudreve.db - ./cloudreve/avatar:/cloudreve/avatar depends_on: - aria2 aria2: container_name: aria2 image: p3terx/aria2-pro restart: unless-stopped environment: - RPC_SECRET=your_aria_rpc_token - RPC_PORT=6800 volumes: - ./aria2/config:/config - temp_data:/datavolumes: temp_data: driver: local driver_opts: type: none device: $PWD/data o: bind 在桌面新建一个 yml 文件并用 VSCode 打开 看到 Cloudreve 的文件映射,我们要将 ./cloudreve 前面全部加上 /mnt/docker_disk/mi_docker/ 123456789101112131415161718192021222324252627282930313233version: "3.8"services: cloudreve: container_name: cloudreve image: cloudreve/cloudreve:latest restart: unless-stopped ports: - "5212:5212" volumes: - temp_data:/data - /mnt/docker_disk/mi_docker/cloudreve/uploads:/cloudreve/uploads - /mnt/docker_disk/mi_docker/cloudreve/conf.ini:/cloudreve/conf.ini - /mnt/docker_disk/mi_docker/cloudreve/cloudreve.db:/cloudreve/cloudreve.db - /mnt/docker_disk/mi_docker/cloudreve/avatar:/cloudreve/avatar depends_on: - aria2 aria2: container_name: aria2 image: p3terx/aria2-pro restart: unless-stopped environment: - RPC_SECRET=your_aria_rpc_token - RPC_PORT=6800 volumes: - /mnt/docker_disk/mi_docker/aria2/config:/config - temp_data:/datavolumes: temp_data: driver: local driver_opts: type: none device: $PWD/data o: bind 然后在 Windows 资源管理器 中进入路由器的 SMB 请对你的设备在米家中开启全盘访问 新建一个 cloudreve 文件夹 在其中新建 aria2 | avatar | uploads 三个文件夹 并创建 cloudreve.db | conf.ini 两个空文件 然后返回到 mi_docker 文件夹 新建 aria2 文件夹 并在其中新建 config 文件夹 这样就完成了文件映射~ 部署 Cloudreve进入 Portainer 中的 Stacks 新建一个 Stacks 将本地修改好的 yml 直接粘贴到输入框中 然后点击 Deploy the stack 稍等片刻,你就能在 Stacks 中看见你部署的容器了 容器后面的 IP Address 就是你的容器内网地址 aria2 没有映射端口,我们只要复制 cloudreve 的地址加上 5212 端口就行 接下来我们去 cloudreve 的日志中获取管理员密码 (这里是我配置好的网盘) 打洞映射 此处我们需要创建一个 Ubuntu 容器用来映射 进入 App Templates 界面 找到 Ubuntu 并部署 部署完成之后进入容器详情 找到 Connected networks 在这里加入 Cloudreve Stack 的网络 然后找到 Console 连接到容器 配置 Cloudflared 此处假设你拥有 Cloudflare 账号,并添加好了域名 首先换源 因为这个系统太迷你了 先升级 ca-certificates 12$ apt-get update$ apt-get install ca-certificates 然后安装必要工具 12$ apt-get install vim$ apt-get install systemctl 网络差用户对于网络环境差的用户,请先用 sed 替换源,在进行操作 现在我们下载 Cloudflared 1$ wget https://github.com/cloudflare/cloudflared/releases/download/2022.11.1/cloudflared-linux-arm64.deb cloudflared.deb 网络不好可以上传到你刚才搭建的 Cloudreve 中,然后 wget 下载下来 安装 Cloudflared 1$ dpkg -i ./cloudflared.deb 然后我们需要设置隧道 1$ cloudflared tunnel login 这时候终端里面会出现一串 URL,复制在浏览器里访问并授权就好了 创建一个隧道 1$ cloudflared tunnel create <隧道名> 记录下隧道 ID 创建路由 1$ cloudflared tunnel route dns <隧道名> <主机名> 然后我们需要创建配置文件 1$ touch ~/.cloudflared/config.yml 内容大概如下 123url: http://localhost:8080tunnel: xxxxxxx-5b0e-xxxx-8034-xxxxxxxcredentials-file: ~/.cloudflared/xxxxxxx-5b0e-xxxx-8034-xxxxxxx.json url 替换成你要映射的 cloudreve 地址 tunnel 和 credentials-file 中的 xxxxxxx-5b0e-xxxx-8034-xxxxxxx 替换成你的隧道 ID 作为服务运行不知道为什么, screen 在容器上面是用不了的,所以我们只能用 systemctl 作为服务运行 两步走起 12$ cloudflared service install$ systemctl start cloudflared 等 Cloudflared 连接到了 HKG 节点之后,你的 Cloudreve 就被映射出去辣~","categories":[{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/tags/docker/"}]},{"title":"Electron + Vue + Mdui","slug":"Electron-Mdui","date":"2022-07-22T16:23:03.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/6bd0d2ac/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/6bd0d2ac/index.html","excerpt":"","text":"开始前注意,这是将 Electron 集成到 Vue 项目中的演示,如果你没有基础,建议使用样板代码 Part 0.1: 什么是 ElectronElectron 可以让你使用纯 JavaScript 调用丰富的原生 APIs 来创造桌面应用。你可以把它看作一个专注于桌面应用的 Node.js 的变体,而不是 Web 服务器。 这不意味着 Electron 是绑定了 GUI 库的 JavaScript。相反,Electron 使用 web 页面作为它的GUI,所以你能把它看作成一个被 JavaScript 控制的,精简版的 Chromium 浏览器。 Part 0.5: 先决条件 [x] 良好的网络 Part 1: 安装 Node.jsElectron 是基于 Node.js 构建的 / 并且使用 Node.js 还能完成平时 Web 程序所做不到的事情: 与系统打交道 Node.js 进入上述地址下载并安装 Node.js Part 2: 安装 Vue-cli由于我更喜欢 Vue,所以我选择用 Vue 创建项目 1$ npm install @vue/cli --global 安装 vue-cli Part 3: 创建项目1$ vue create electron-vue-mdui 创建自己的项目 这里选择最后一项(Manually select features) 这里依照自己的需要,我选择了 Babel(语法编译器) | Router(Vue 路由) | CSS Pre-processors(CSS预处理器) Linter / Formatter(代码风格、格式校验) 这一步选择 3.x(或更高版本) History 模式选择 Y CSS 预处理器我更喜欢 Stlyus, 这里依照自己的喜好选择 这里墙裂建议使用 ESLint 我选择的是 ESLint + Prettier 在这一步建议两个都选择 这一步我们选择单独放置在文件夹下 然后这里是最后一步,让你选择下一次是否要用同样的配置, 我选择的是 N 等待安装完成就创建好了一个 Vue 项目 Part4: 集成 Electron 至 Vue 项目中进入项目文件夹,打开终端 安装 electron 插件 1$ vue add vue-cli-plugin-electron-builder 版本选择 ^13.0.0 就可 等待它安装完成,在安装的过程中它会重构项目架构 等到安装完成你就拥有了一个 Electron + Vue 的 App 运行 Electron 试试看吧! 1$ yarn electron:serve 如果弹出一个程序就成功了 Part 5: 用 MDUI 写前端MDUI - Material Design 样式的前端框架 MDUI 漂亮、轻量且好用,它能让你更轻松地开发 Material Design 网页应用 首先安装它 1$ yarn add mdui 然后我们需要引用它 编辑入口文件 加入一些代码 12import mdui from 'mdui';import '../vendor/mdui/css/mdui.css'; // 注意修改 css 文件的路径 在其他需要使用 MDUI 提供的 api 的 JS 文件头部导入 mdui 的 JS 文件 (来自 MDUI 作者) 然后 MDUI 就已经添加进你的项目了,接下来只需要简单写一下,就可以让你的项目使用上 MDUI 比如添加一个按钮 1<button @onclick="javascript;;" class="mdui-btn mdui-color-teal mdui-ripple">button</button> 或者一个导航栏 12345678910111213141516<div class="mdui-toolbar mdui-color-teal"> <a href="javascript:;" class="mdui-btn mdui-btn-icon"> <i class="mdui-icon material-icons">menu</i> </a> <span class="mdui-typo-title">Test App</span> <div class="mdui-toolbar-spacer"></div> <a href="javascript:;" class="mdui-btn mdui-btn-icon"> <i class="mdui-icon material-icons">search</i> </a> <a href="window.onload();" class="mdui-btn mdui-btn-icon"> <i class="mdui-icon material-icons">refresh</i> </a> <a href="javascript:;" class="mdui-btn mdui-btn-icon"> <i class="mdui-icon material-icons">more_vert</i> </a></div> (代码从 VSCODE 编辑) Part 6: 打包在终端内输入打包命令进行打包 1$ yarn electron:build 请注意,在打包过程中需要下载一些文件,但由于天朝网络特性,可能会 timeout,请自行替换源或使用科学上网","categories":[{"name":"electron","slug":"electron","permalink":"https://blog.slqwq.cn/categories/electron/"}],"tags":[{"name":"electron","slug":"electron","permalink":"https://blog.slqwq.cn/tags/electron/"}]},{"title":"AX9000 Docker 部署指南","slug":"AX9000-Docker-部署指南","date":"2022-07-22T11:26:53.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/e443d51d/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/e443d51d/index.html","excerpt":"","text":"废话不多说,先看配置 作为小米家主打电竞的路由器,AX9000 的配置还是非常强劲的 硬件参数处理器 Qualcomm IPQ8072A 4核 A53 2.2GHz CPU ⽹络加速引擎 双核 1.7GHz NPU 内存 1GB 2.4G Wi-Fi 4×4(最高支持 IEEE 802.11ax协议,理论最高速率可达 1148Mbps) 5.2G Wi-Fi 4×4(最高支持 IEEE 802.11ax协议,理论最高速率可达 4804Mbps) 5.8G Wi-Fi 4×4(最高支持 IEEE 802.11ax协议,理论最高速率可达 2402Mbps) 产品天线 外置高增益天线 + 内置 AIoT天线 产品散热 主动散热 整机接口 1个10/100/1000/2500M 自适应 WAN/LAN口(Auto MDI/MDIX)1个10/100/1000M 自适应 WAN/LAN口(Auto MDI/MDIX)3个10/100/1000M 自适应 LAN口(Auto MDI/MDIX) LED指示灯 8个(SYSTEM指示灯×1,INTERNET指示灯×1,网口灯×5,氛围灯×1) 系统重置键 1个 USB3.0接口 1个 Mesh组网按键 1个 电源按键 1个 电源输入接口 1个 协议标准 IEEE 802.11a/b/g/n/ac/ax,IEEE 802.3/3u/3ab 认证标准 GB/T9254-2008;GB4943.1-2011 保修信息 整机保修1年 可以看到,AX9000 拥有频率为 2.2GHz(arm64) 的4核高通 CPU 还是非常适合搞事情的 并且小米官方也在 2021年11月12日 发布了第一个开发版 ROM 而且还有虚拟内存功能 硬盘准备 启用 Docker 需要至少 64GB 的 硬盘/ U 盘 对于体验上来说,使用硬盘明显比 U 盘好得多 我准备的是夏科的移动硬盘(支持 USB3.1) 首先下载 DiskGenius 在右侧位置选择你的硬盘 然后选择格式化 格式化为 EXT4 这里需要注意,如果你的硬盘还要用来储存文件,你需要把第一个分区(序号为1)格式化为 EXT4,其他分区可以保持不动 接着保存更改,拔出硬盘 路由器配置首先下载小米官方提供的开发版 ROM 进入常用设置 -> 系统状态中进行升级就行 接着插入硬盘 AX9000 的 USB 3.1 口 位置在指示灯面左侧(也就是有 Mesh 组网按钮的那一面) 插入之后重启路由器(因为 AX9000 的 USB3.1 口似乎是不支持热插拔的) PS: 也有可能是我的问题 具体操作就是登陆后台选择路由器,点击重启 当然你也可以直接按 Power 按钮 接着进入储存状态 找到虚拟内存 创建虚拟内存,这里最好选 4069MB (4G) 以给 Docker 留出足够的内存 等待创建完成 进入高级设置 -> Docker 然后你会进入这个页面 点击安装 Docker 等待安装完成 然后运行 Docker 并安装第三方管理(Portainer) 安装第三方管理时有 ipv6 会比较快,如果没有 ipv6 就得忍受天朝网络,时不时还能安装失败几十次 安装完成进入 Portainer 完成他的配置 然后你就能进入这个页面了 Portainer 配置首先是新建自己的镜像源 进入 Registries 选项卡新建自己的源 然后去 App templates 找模板安装 没错你没看错,AX9000 的 Docker 是支持 Ubuntu 的! 演示:安装 Ubuntu选择 Ubuntu 名字随意 然后重点来了 点击 Show adbanced options 添加映射 然后部署即可 演示:Ubuntu 配置部署完后进入容器,选择 Console 进入控制台 先安装 vim 和 ca-certificates (没错,这个系统非常精简) 123$ apt-get update$ apt-get install vim$ apt-get install ca-certificates 然后换源 1$ vim /etc/apt/sources.list 进入 Vim 界面后不要忙着进入编辑模式,输入 gg 然后输入 dG 就可以方便的删除所有内容了 接着粘贴清华镜像源 123456789101112deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiversedeb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse# 预发布软件源,不建议启用# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse 然后更新源 1$ apt-get update 接着去除最小化 1$ unminimize 演示:Ubuntu SSH先更新源 1$ apt-get upgrade 然后安装 openssh 1$ apt-get install openssh-server 设置一个 ROOT 密码 1$ passwd 修改 SSH 的配置文件 1$ vim /etc/ssh/sshd_config 因为默认是注释了 PermitRootLogin prohibit-password 的,所以只需要允许 Root 登录就行 添加这一行 PermitRootLogin yes 重启服务 1$ /etc/init.d/ssh restart 然后就可以 SSH 了","categories":[{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/categories/docker/"}],"tags":[{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/tags/docker/"}]},{"title":"适用于 Android™ 的 Windows 子系统 Magisk + LSPosed 指南","slug":"适用于-Android™-的-Windows-子系统-Magisk-LSPosed-指南","date":"2022-06-25T19:10:05.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/e5bb64/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/e5bb64/index.html","excerpt":"","text":"⚠ 更新于2022/12/28 19:28 注意,MagiskOnWSA 已经被 GitHub 封禁 如果有需要,可以尝试另一个项目 PeterNjeim/MagiskOnWSA 此 repo 已经禁止 fork 有需要可以使用 GitHub 的 import 导入 如题,这篇文章讲一讲 WSA 怎么样拥有 Magisk + LSPosed 构建并安装你自己的 WSAhttps://github.com/LSPosed/MagiskOnWSA 这是 LSPosed 官方发布的 MagiskOnWSA 的 Actions 进入后 Fork 仓库 Fork 完后进入 Actions 按钮点上 然后进入 Build WSA 这个 Workflow 运行 Workflow 要这样配置 如果你要更改也是可以的 Build arch 代表构建的 WSA 版本,一般都是 x64 WSA release type 是 WSA 发布的通道,我一般选择Slow Magisk version 是面具的版本,一般 Stable 就够用了,要尝鲜的可以用 Beta 或者 Canary Variants of gapps 要选择 Pico,选其他的也可以,不过工作流结束完后会有提示,OpenGapps 不支持 Android 12 Remove Amazon AppStore 这个选 remove 就好,把亚马逊商店删掉 Root solution 选 Magisk / None 就不会 Root 选好之后点击 Run Workflow 运行好后进入 Artifacts 下载构建产物 这里的 1.95 GB 是源文件大小,用我的配置下载下来差不多是 870 MB 左右 下载完后解压 运行 Install.ps1 等到部署完成 这里 WSA 就安装完成了 配置 WSA打开 WSA 设置 先配置图形 ⚠ Tips: Android 子系统目前 GPU 利用还不是很好,不要想着玩游戏 转到开发人员 打开开发人员模式 安装 ADBAndroid Platform Tools 安装 ADB,解压到C盘 进入高级系统设置 -> 环境变量 -> Path 把 ADB 目录写进去 配置 Magisk打开 Magisk 点击小齿轮 把Systemless hosts和Zygisk打开 重启子系统 如果主页这样显示就 OK 了 安装 LSPosedLSPosed Repo 下载最新的 Release中的 Zygisk 版本 放到一个位置,右键复制文件位置 进入 Terminal 连接到 WSA 1adb connect 127.0.0.1:58526 然后上传文件 1adb push <文件位置> /sdcard/ <文件位置> 记得替换成你自己的 打开 Magisk 中的模块 从本地安装 选择 Pixel 5 点击刚上传的 LSPosed 等待安装完成即可 安装酷安CoolAPK 下载酷安安装包 终端命令: 1adb install <文件位置> 安装 MT管理器打开酷安 搜索 MT管理器,下载并安装 安装 LSPosed Manager打开 MT管理器,先授权超级用户权限 然后找到之前上传的 LSPosed 压缩包 右键长按并解压 进入解压后的文件夹,找到 Daemon.apk 点击它,然后点击功能 - > 签名 -> V3 签名完成后安装 Daemon_sign.apk 接着找到 Manager.apk 安装它即可 这样就安装完成了 怎样安装 Magisk / LSPosed 模块先下载模块,用 adb push <文件位置> /sdcard/ 上传,然后安装即可 LSPosed 模块安装方法进入 MT管理器,找到上传的的模块(APK),安装他 然后进入 LSPosed Manager 启用即可","categories":[{"name":"Magisk","slug":"Magisk","permalink":"https://blog.slqwq.cn/categories/Magisk/"}],"tags":[{"name":"Windows11","slug":"Windows11","permalink":"https://blog.slqwq.cn/tags/Windows11/"},{"name":"Android","slug":"Android","permalink":"https://blog.slqwq.cn/tags/Android/"},{"name":"Magisk","slug":"Magisk","permalink":"https://blog.slqwq.cn/tags/Magisk/"}]},{"title":"那些奇奇怪怪的图床","slug":"nvz8s3","date":"2022-05-15T11:17:12.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/nvz8s3/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/nvz8s3/index.html","excerpt":"","text":"本文章首发于语雀! 通过各种高科技功能同步到Hajeekn的博客 最近想用 IPFS 做图床但是发现的一堆奇奇怪怪的图床 (PS: 不会介绍传统的 GitHub + JSdelivr / SM.MS / 路过图床) Bilibili 图床十分简单 PicGO 搜索 bilibili 接着配置 Bilibili 图床 SESSDATA 可以登录哔哩哔哩后查看 进入哔哩哔哩,按下 F12 定位到应用 -> COOKIE 选择 https://www.bilibili.com 在名称内找到 SESSDATA 点击它 然后在 Cookie Value 中复制值,粘贴进去 之后确定,设置默认图床即可 良心的处理参数哔哩哔哩图床有十分良心的处理参数 Type URL 原图 不做更改 原分辨率, 质量压缩 原链接 + @1e_1c.jpg 原分辨率, 质量压缩(WEBP) 原链接 + @1e_1c.webp 规定宽, 高度自适应, 质量压缩(可变 WEBP) 原链接 + @104w_1e_1c.jpg 规定高, 宽度自适应, 质量压缩(可变 WEBP) 原链接 + @104h_1e_1c.jpg 规定高宽, 质量压缩(可变 WEBP) @104w_104h_1e_1c.jpg 原分辨率(WEBP) @104w_104h_1e_1c.webp 这是 哔哩哔哩 的处理参数 哔哩哔哩还有许多节点可以选择 自定义 CDN金山 CDN 路线: i0.hdslb.com i2.hdslb.com 阿里 CDN 路线: i1.hdslb.com 14.hdslb.com s1.hdslb.com s3.hdslb.com 腾讯 CDN 路线: 13.hdslb.com 未知 CDN 路线: s2.hdslb.com Bilibili 图床有防盗链,如果你要在你自己的网站中用 Bilibili 图床,得先配置头 1<meta name="referrer" content="no-referrer"> 如果你用的 Hexo - Butterfly 则可以在配置文件中这样配置 123inject: head: - <meta name="referrer" content="no-referrer"> 配套食用浏览器插件 Typora 插件 配合 typora 食用更佳 如果用了很久之后,在上传时出现了错误,那就是 SESSDATA 过期了,重新去生成一个就好 NPM + UNPKG 镜像 使用这个方法前记得切换回原来 NPM 的注册表.因为其他镜像没有发布这个功能 十分简单 本地先登录,接着创建包,然后初始化版本,最后发布 指令: 1234$ npm login$ npm init -y$ npm version patch$ npm publish 这样一个 npm 包就发布完了 接下来是收集的一些镜像 https://npm.elemecdn.com/ 饿了么(阿里 CDN) https://unpkg.zhimg.com/ 知乎(阿里 CDN) https://shadow.elemecdn.com/ 饿了么(阿里)(这个停止维护了) https://code.bdstatic.com/npm/ 百度(百度 CDN) https://cdn1.tianli0.top/npm/ Jsdelivr(备案没封前是网宿 CDN | 后来备案封后是 Cloudflare + Fastly + Gcore)(可以自定义节点) Jsdelivr 自定义节点只需要: gcore.jsdelivr.net fastly.jsdleivr.net 即可 4EVERLAND BUCKET 这应该是 IPFS 的另一个方案(但是最多 1G) PicGo 插件安装 搜索 s3 并安装 然后就去 4EVERLAND 注册一个账户 https://4everland.org/ 这个网站似乎只能用以太坊钱包登录,GitHub 登录会提示不支持了( 我用的 MetaMask 注册之后创建一个桶 生成 API TOKEN点击你账户, 选择设置 转到 Auth Token 选择 Bucket Auth Tokens 点击 Generate 即可 本文章的 Key 在发布之前就删掉了,不要想着搞坏事 之后进入 PicGo 配置下 转到 Amazon S3 ID 和 密钥粘贴进去 桶写你创建桶的时候的名字 节点用 https://endpoint.4everland.co 自定义域名是 桶名.4everland.store 最后记得把这两个选项打开 IPFSUPLOAD(真正意义上的 IPFS 图床)本地装一个 IPFS DESKTOP 等他启动后先看端口 图中圈着的就是端口,然后去浏览器访问一下看看正不正常 http://localhost:5001/api/v0/add?pin=true 如果正常应该会提示 405 - Method Not Allowed 接着就是上传了 PicGo 安装一个 web-uploader 然后配置如图 IPFS网关我是用的我自己的,所以打了马赛克,你们可以自己先用 workers 反代一次,然后再用 CDN 过墙 你也可以直接 CDN 我代理好的 worker (IPFS 官网) PS :我没有反代 IPFS 网关 回源: dl2p.taiyu.workers.dev 回源 HOST: dl2p.taiyu.workers.dev 回源端口: 443 回源协议: HTTPS 速度测试: 不给滥用,我设置了防盗链 DogeDoge 图床没有什么说的,速度炒鸡快,使用要申请,现在应该申请不到了 有的可以用 BACKBLAZE B2 + Cloudflare首先猜到有人要提问: 为什么要加 Cloudflare? 因为 BACKBLAZE 有流量计费,但是他加入了带宽联盟,再加上 Cloudflare 超长缓存,≈ 完全免费 但是有10G空间 这是超出10G的价格 注册方法 ChenYFan 大佬已经写过了,与其再写一篇问文章,不如直接用他的(其实就是懒) 直接贴: https://blog.cyfan.top/p/ce240368.html 云存储做图床 用 OneDrive Google Drive 做图床真的是闲 OneDrive参考 Spencer Woo 去搭建一个 onedrive-vercel-index 就行 Google Drive参考 ChenYFan 搭建一个 GDIndex 即可 大厂的对象储存阿里云 OSS 有很多人写,自己谷歌,反正价格挺便宜的 腾讯云 COS 🤢 这东西不推荐,计费十分离谱,而且配置头超长缓存后 COS 会在用户请求时悄悄篡改 max-cache 新用户有 6 个月免费额度,之后就要开始付费了( ⚠ 流量包和储存包都很贵 又拍云 UOS 又拍云似乎是没有免费额度的,但是又拍云有开发者联盟,只需要把他的 Logo 挂在你的网站页脚就行,甚至还能用一个徽章 徽章这样配置就行了 1<img src="https://img.shields.io/badge/CDN-%E5%8F%88%E6%8B%8D%E4%BA%91-00b6ff?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAABS2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDIgNzkuMTYwOTI0LCAyMDE3LzA3LzEzLTAxOjA2OjM5ICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIi8+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJyIj8+nhxg7wAABs1JREFUSInllv2PVFcZxz/n3LfZmdmd3ZndZWGhhV0qYLaFEgzQpog12tZYbVRCSa00mLap6Q+aNERp5QcVlRhi0GjaGElromI08aU1tMRXWmspRaEVbIDtdimwy77M7uy83Xvn3nP84c7b7oD/QE8yyT13znO/z/f7nOcF3m9L1B4OnNYYEoSG165kGZkukLLjdEmXiew4yum7+4qK31u2rduLFXOgEEoQCrQs9RjepaW2f35Nu/9QqRh4Fi4jrkHCMmhTitlCBcOIoP768CoAzGt5owFLQBKfad/Yflau+Mo4qY0IE8qAUbXUgKT9ctFZVJAzqzcivLN+/JGY0H6HKD0riKGvw7gFWAFtUmMTyFPF5C+Gded2LBmBaB2BAigRyeMJ0jGPgxtiyX+MtW18/ZL1DLEMK/TER9eb+Z2GQGU1CK0b8gKy9uCYYJmQcUCgUm+U0qeGw/R2pIwAdbPvAiE0aAGux0MDc7eJAJ57V7+GZYAQjLDo8yd0z6lAqQ5bBbh+iF8JWxmP5XwSJrhCyz9NJU7mdHwwknOBWEKAAq0EuIrPrKp8d3lb+M/HT/qvlsN2pKNRSoDUXAxSN+eKlWMPD7jrFi3pZc4NeHUh4+zcNMW5q/z47dLhi4X4IHYt2hFDBBFDpUmYJXoNb+y23tzPHlgRfu2F8bZ9s4W2zdgSpap2OopbzsysPUHX85YIcdU1YnxLX5pT0+59w+X4NqwmpgIIgUCxNF4+vsaY2bsknjtq+yYTnsGhMx33H8127SFp03KTBBAT/H3U+qTIZe9ambFfagHOl0OOjJs/wjCZdwtCARI2d899Z0iP7Rkv2J0ngu49xUCvu1R2+sJS6g4MAyF11deasY5+CjBs3jE6f3KrMXlDC/Cfr0xuuegtWYIpmjwXUA7YcbP69tb2ypPfO5naPyJ7d4fKioLUDihdVxZEpI4ApGiEyoKLM8aydyx5J/CXeTE+m5PbkFZV4qpBoPlAJnh7R7rw5G8vm9+/4PfvDg0rSiMdgYraeQ0xGVZu78o9tSUx9ViK0pUGc0CbTNtdu1oYG7Geu+vFAaLbqz0+3B1sf2WKnhcvJ79MvCn21JiKiGIAt6amn9scK+4brpiskOHMKRU/jCSS2xG8ddVbVcOrM54KrBvqoERyO4YqLTaKb76ct7+JtufHfuEyYKIkeoKKpN12ySs1QF28qkJmrL8FuBwqv7HTEELC4b/Fks/EjPgcDq05TeO8EJrhSten35KLDjpmhfd8/QBNYY6clp0twC1LAmGQLJdyCF08gub/MtYCECZni+JBTyYwrKS7ML2UbrxplEwpHeoJHkk9IPO/z3QluKen/GC/MXuM8PrIQkc3+sY298hAwsIQbSvnAWuwpSq3AGesyhhh08EwZKBdHi+EDjEkyxLBm9dtNYjqXx5DTnHvsCeXFCoi1fh6VPEsEYy3ACf1zN9qlRE0whAcdzM/GCk5Hz+W1dv+U0jubFy+aqdpFsCD9en8r4ba9fDLU6mfI8wo7Zqc65Ccru3q6dQtC79EVb6AUc1lQzJakP2jOvUSZrqKUgu0QMvqNgBkyOpk7ndfXKruP+11Pf5uwdgqHYWqHwIIGTTLh88tBN7a3/3i+VF/ZtyzujAFut57a0d0A1sDpdzoUkfMdCTNs4Pm3MG1nfL1Fy7bjxwtxn6IXfOzauNDZ6w8u67Pf/7IQuDB3hSfCMtPHDoX/hTDaJKxXgzR1ca/PjnzxOL47IGgXOYG2+U9f/Gyw1Op31yYsz6LKcEEpZryyPe5d1B+dWnf4rrwdeATo+P0yfBQr53cOVHp2oIjWpo/LgwlZp/etdo78MeJ9DeO5cUmM+fflNcdy9E2ONGkoWvZIQSUFGt63ZNb+hPPzPr1S9KUTlYndizDl1Zan+qOlXNUqobVD2gPMubcyP4PlR57Ix979MhI+9fLRsfH8qJ7OYYNhkZo1dRfNATQ3ebmdq2073KFQTmgFfjG7jjprjgrMsncPb2FDXEKkwRV8BCEGbD7g2LNmdnYwLPn257Gro6kNMaixlQlwJckVXbyvszsBseJTU+VqA4JC4DdisavwNUy2Ia4sCk5OdRvzLxCBXAVj64NdvTGtbf337ETaBvMa3V9EQ2BFbgpkf/XnbHpIUuHF2YrYMqGgPNi3OxJIZQgjYmNidIdYwHfyjpZ3ZGtHN6fXXbOVfE0MebncHXMAUiL4uRHlpQP3pJW+04OC3KhST+tw8k152oJeEpQNGxWx0tP+WGeK0Xbcb3SWCYpTS80ul0lECi0EF6n8LNJOzjThvuHobj/603dTnFcORQDQcf1y937bP0Pc6b8FW3Czt0AAAAASUVORK5CYII="> 但是这个网站似乎有点慢,你可以把他的 SVG 下载下来放在本地引用 1<img src="本地位置.svg"> 总结好用的图床千千万,你要自己去发现 我总结了 7 个免费图床,其中 DogeDoge 图床需要申请 如果细数的话,共有 8 个免费图床(每个云存储单独算一个)","categories":[{"name":"picgo","slug":"picgo","permalink":"https://blog.slqwq.cn/categories/picgo/"}],"tags":[{"name":"picgo","slug":"picgo","permalink":"https://blog.slqwq.cn/tags/picgo/"}],"author":"Hajeekn"},{"title":"GitHub 的多种访问方式","slug":"gd503y","date":"2022-05-14T07:53:12.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/gd503y/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/gd503y/index.html","excerpt":"","text":"Dev-Sidecar 请注意,由于开发者边车的 Gitee 仓库被封锁,所以这个项目不再更新了 在使用之前,请观看知乎的一个讨论如何评价《网络数据安全管理条例(征求意见稿)》第四十一条和第六十六条:建立数据跨境安全网关? 进入开发者边车的 Release找到符合自己系统的版本,点击下载下载完成后安装,打开系统代理建议不要开启加速服务可以设置端口其他的就没什么好设置的了,只需要把 NPM 加速和 Git 加速打开即可But 因为这个软件已经停更了,所以我非常不建议各位用 SwitchHosts + GitHub520这个项目是以 Hosts 来加速的首先去 SwitchHosts 的 Release接着下载安装SwitchHosts 这样配置即可如果遇到没有写入权限,就进入 Hosts 文件的属性,配置一下权限和去掉只读,玩 Windows 的应该都知道提权这东西吧 Watt Toolkit ⚠ 更新: 2022/12/28 19:53 新版的 Watt Toolkit 已经去掉了 Socks 设置 Watt Toolkit 下载安装没什么好说的 进入软件勾选上所有的加速选项,然后选择 Hosts 加速模式 即可如果怕加速不了的话就勾上加速选项里的 Socks5 代理然后配置一下 12sudo git config --global http.proxy 'socks5://127.0.0.1:8868'sudo git config --global https.proxy 'socks5://127.0.0.1:8868' 8868 记得替换成你自己的端口 题外话加速 npm 还是 Dev-Sidecar 和 local-npm 好用一点","categories":[{"name":"github","slug":"github","permalink":"https://blog.slqwq.cn/categories/github/"}],"tags":[{"name":"github","slug":"github","permalink":"https://blog.slqwq.cn/tags/github/"},{"name":"gfw","slug":"gfw","permalink":"https://blog.slqwq.cn/tags/gfw/"}],"author":"Hajeekn"},{"title":"IPFS - 一个基于点对点网络的超媒体协议","slug":"ys6wh9","date":"2022-05-03T20:00:46.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/ys6wh9/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/ys6wh9/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客 IPFS’s AuthorIPFS’s Author 是 Juan BenetJuan Benet在 2014 年创建了 Protocol Labs (协议实验室)协议实验室旗下的项目: IPFS FileCoin 协议实验室旨在如何构建下一代互联网 What’s IPFS?依照官网的介绍,总的来说,IPFS 就是一种点对点超媒体协议,它可以使网络更快、更安全、更开放本质上来说,它就是一种去中心化互联网(Peer to Peer) ≈ P2P没错,就是孽种 P2P 下载器这么牛的项目怎么是 P2P 下载器呢? P2P 下载器只是个披着羊皮的狼P2P(Peer to Peer)依靠用户群交换信息以 number.exe 为例当你上传后,无数个 Node(用户) 会瓜分你的 number.exe他们将你的文件分成许多分片,瓜分分片他们在瓜分的同时会获得奖励 是不是听起来很神奇?对的,你没有付出任何东西,别人却能获得奖励,而且你既满足储存文件的需求,储存你文件的人也能得到金钱.这种机制,叫做 FileCoin.你可以把它想象成 Bittorrent+BitCoin 的结合物,实际上他就是这样的.当然不完全是,但核心理念就是这样的.只不过,BitCoin 付出的是算力,而 FileCoin 付出的是硬盘. 摘自 ChenYFan の Blog这是 IPFS の不权威原理图(来自 ChenYFan の Blog)所以,IPFS 相对于响应式请求(HTTP(S) / FTP)不同传统的响应式请求由一个主服务器(或主集群)处理每一个请求,并贡献内容而 IPFS 基于 Peer to Peer 技术,让每个 Node 都贡献,没有中心服务器(去中心化) 更细致的解释IPFS 是一个基于 Git 模型版本管理 & DHT & CBA & Hash 等的产物它基于 DHT(分布式哈希表) 进行寻址而传统的响应式请求由 LBA(基于位置的寻址)而这样,响应式请求的缺点就暴露了出来LBA(基于位置的寻址) 它在查找时所看重的信息是位置,就好比一个网址 https://blog.slqwq.cn/link/如果这个位置被删除了,链接位置转移了,他就会暴露出404 Not Found 错误而 IPFS 所采用的 DHT(CBA 基于内容的寻址)就没有这个缺点它在查找时所看重的信息是内容,不管你位置在哪里,只要找到的内容符合要查找的信息,那他就是正确的 最后基于响应式请求(中心化网络)还有一个超级大大大大的弊端那就是非常容易引入审查也就是类似于我们国家的 **Great Firewall of China** (GFW 是一个分布式的入侵检测系统,并不是一个严格意义上的防火墙)每个国家的 **gov** 可以很方便的 **BAN** 掉某个网站或者应用引入一个具体事例在 2017 年, **Turkey's GOV**就用国家安全的理由禁掉了维基百科当然,去中心化也不能避免掉 Firewall 的屏蔽,只是不那么容易屏蔽掉罢了 Use IPFS - IPFS Client进入 IPFS-Desktop の Releases找到需要的客户端下载并安装弹出防火墙警报请一定要允许在文件处可以上传文件上传点击导入即可 接下来,重点来了! > ipfs 分享文件有两种方式,是 ipfs 和 ipns,前者采用文件 hash 辨别文件,文件内容一旦改变,原来的链接无法更新,链接格式为 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL ;后者采用用户 id 辨别,内容允许更新,但是用户在线时间过短会导致无法同步,并且有可能暴露用户信息,后者格式为: https://ipfs.io/ipfs/QmQQKZphgJdEGhTp18NRvVdSJ3RJArRst2keKk3tZvmfPz?filename=index.html . > 如果你只是单个文件网页,此处比较建议使用 ipfs,ipns 可能离线时间过长导致无法下载。具体看个人所好。 > ipfs 链接获取:点击 ··· ,选择复制哈希,在前面加上网关域名即可。 > ipns 连接获取:点击 ··· ,选择分享,复制链接即可。 > 在善用技术上网的前提下访问 https://ipfs.io/ipfs/QmZCvMHrE56VqsejmG53xd9bW4RZjtFpLz46QMQjA81orL 显示目标界面 > 请注意,每次上传后一定要先访问一遍资源,否则文件是不会上传到 ipfs 服务器的! 摘自 ChenYFan の Blog Use IPFS - IPFS GatewayJSProxy - IPFS Gateway因为 IPFS 默认的网关被 FW 了所以我们可以通过 Worker JSProxy 的方式解锁你自己的网关 123456addEventListener("fetch", (event) => { let url = new URL(event.request.url); url.hostname = "werevless.herokuapp.com"; let request = new Request(url, event.request); event.respondWith(fetch(request));}); 粘贴进去,访问 Worker 地址就能看到 404 了然后在 IPFS Client 里复制地址,接在后面就能打开你上传的文件了 JSProxy - Cloudflare IPFS Gateway我们可以通过 Worker JSProxy 的方式解锁你自己的 CNAME 123456addEventListener("fetch", (event) => { let url = new URL(event.request.url); url.hostname = "cloudflare-ipfs.com"; let request = new Request(url, event.request); event.respondWith(fetch(request));}); 粘贴进去,就变成了基于 CIG 的你自己的 IPFS 网关 Use IPFS - Build Blog搭建博客就等下次吧","categories":[{"name":"p2p","slug":"p2p","permalink":"https://blog.slqwq.cn/categories/p2p/"},{"name":"ipfs","slug":"p2p/ipfs","permalink":"https://blog.slqwq.cn/categories/p2p/ipfs/"}],"tags":[{"name":"p2p","slug":"p2p","permalink":"https://blog.slqwq.cn/tags/p2p/"},{"name":"peertopeer","slug":"peertopeer","permalink":"https://blog.slqwq.cn/tags/peertopeer/"}],"author":"Hajeekn"},{"title":"未备案使用国内服务器 & Cloudreve 部署指南","slug":"phiyrf","date":"2022-05-02T10:26:46.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/phiyrf/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/phiyrf/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客正如标题所说若欲正事未备案用国服务器,则不可得,故可以阿里云主机漏洞跳备案跳备案仅适用于 CN 域名,其他域名请自己尝试首先我们需要一个阿里云账户(废话)然后实名认证(汝可用支付宝实名,或旧法实名) 云服务器配置在创建云服务器时这样配置实例选 n4.small地域上海 A 区带宽根据自己的需要调然后典型 1h2g 宝塔安装登陆上服务器Ubuntu / Deepin: 1$ wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec CentOS: 1$ yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec Debian: 1$ wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh ed8484bec 不知道自己是什么系统?那你就干脆别用了这是万能安装脚本: 1$ if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec 登上主机后安装 Nginx 安装 Cloudreve去 Cloudreve 的 GitHub 中找安装包登录宝塔创建一个文件夹创建完后选择远程下载把地址粘贴进去,等待下载完成然后点击 tar.gz 后面的解压之后给解压出来的文件给 777 权限然后进入终端安装 Screen 12$ apt-get update$ apt-get install screen 命令行启动 Screen 1$ screen 用 cd 命令进入文件夹 1$ ./cloudreve 启动 Cloudreve 配置反向代理 & SSL启动完后回到宝塔,添加站点创建完后进入反向代理新建反向代理目标 URL 写 cloudreve 启动的地址配置完后提交转到 SSL选择 Let’s Encrypt选择 DNS 验证(因为我们开了反向代理,不能用文件验证)DNS 接口根据自己选择并配置如果没有你的 DNS 提供商,就手动解析配置完后勾选要申请 SSL 的域名点击申请这样就部署好了之后记得在 DNS 提供商解析一下主机A 记录到你鸡子的 IP 关于账户看启动 cloudreve 时终端提示的管理员账户与密码即可","categories":[{"name":"cloudreve","slug":"cloudreve","permalink":"https://blog.slqwq.cn/categories/cloudreve/"}],"tags":[{"name":"cloudreve","slug":"cloudreve","permalink":"https://blog.slqwq.cn/tags/cloudreve/"}],"author":"Hajeekn"},{"title":"短链接的解决方案","slug":"zroiti","date":"2022-02-03T16:40:42.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2022/posts/zroitiai/index.html","link":"","permalink":"https://blog.slqwq.cn/2022/posts/zroitiai/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客方便跳转,所以有了短链接,这篇文章带来短链接的几个解决方案 GitHub issues + HTML(Free)示例: Click Me 实现方法进入 Shortener 的仓库Fork 仓库然后部署到各种平台以 CloudFlare 为例子进入 CloudFlare Dashbord选择 Pages选择存储库选择 Fork 的仓库然后一直下一步,等到部署完成就可以访问了 添加 DNS如果你不想要 ‘pages.dev’ 长地址,可以自定义域名进入刚才部署好的项目的管理页面选择自定义域添加你的域名接着做好 CNAME 解析即可 issues 配置新建一个 GitHub 仓库存放你的 issues 数据创建好后进入 issues 选项选择 New issue标题就写想要定向的网站内容可以记录下 ID创建好后 issues 的 id 就是重定向的钥匙你创建了第一个 issues你的重定向地址就是域名/1记录下仓库名备用 请求配置进入 Fork 的仓库编辑 404.html在此处把/repos/*/issues/的****改为你的用户名/仓库然后提交等待 CloudFlare 部署完成即可ChenYFan 666ChenYFan yyds","categories":[{"name":"link","slug":"link","permalink":"https://blog.slqwq.cn/categories/link/"}],"tags":[{"name":"link","slug":"link","permalink":"https://blog.slqwq.cn/tags/link/"}],"author":"Hajeekn"},{"title":"Windows Subsystem for Android™ 安装教程","slug":"yoelgh","date":"2021-10-29T19:05:11.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/yoelghal/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/yoelghal/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客微软的安卓子系统已经发布很久了,这篇文章教大家如何免美区免亚马逊安装 Windows Subsystem for Android™ 获取并安装 Windows Subsystem for Android™ 包https://www.microsoft.com/en-us/p/windows-subsystem-for-android-with-amazon-appstore/9p3395vx91nr?activetab=pivot:overviewtab这是 Windows Subsystem for Android™ 的微软应用商店地址,但是显然是不能在国区安装的所以我们需要对它进行抓包https://store.rg-adguard.net/进入这个网站将商店地址填写进去保证填写后的配置如下这边注意通道选择 Slow(Windows Insider Slow) 配置好后点击旁边的”√”稍等一会儿列表就出来了出来之后划到最下方,找到 1.21GB 的包,点击它下载下来下载可以使用多线程软件加快速度下载好后你会得到一个 msixbundle这个包不能直接安装,直接安装会报错我们需要使用 Powershell 安装用管理员打开 Powershell用这个指令安装 1add-appxpackage "文件地址" 对于 Windows 11你获取文件地址可以右键文件选择获取文件地址 安装好后任务栏会出现 Windows Subsystem for Android™这时已经安装完成了 配置 Windows Subsystem for Android™配置 ADB打开 Windows Subsystem for Android™将子系统资源调整为持续接着打开开发者模式然后我们需要安装 ADBSDK Platorm Tools进入后依照系统版本选择 ADB将下载好的 ADB 解压到一个你不会动到的地方我放在了系统盘根目录接着打开高级系统设置选择环境变量在系统变量内新建一个变量叫做 “adb”变量值写你放 adb 的文件夹比如我的是 C:\\adb 这里就写 C:\\adb接着双击用户变量的 Path在这里新建一个值写 %adb% 驱动安装在极少数情况下,会出现与驱动有关的错误,这可能就是你没有安装 adb 驱动资源 by: 晨中网络科技进入 https://cz-jam.lanzoui.com/iTbJrtpfa5e (提取码 intr)下载.7z 文件并解压在里面根据系统型号选择程序32 选择 x3264 选择 x64这时问题应该就解决了 调整内存(非必须)微软官方给的推荐要求是内存为 16GB我的机带内存是 8GB所以就要通过虚拟内存来增加了进入高级系统设置选择性能设置进入高级选项卡,点击虚拟内存下的更改将自动管理所有驱动器的分页文件大小取消选择一个空间够的盘,选择自定义大小,根据需要调整注意 GB 和 MB 之间的进率是 10241GB = 1024MB1024GB = 1024*1024MB调整完后别忘了点击设置然后在点击确定 使用 Windows Subsystem for Android™安装 APKWindows Subsystem for Android™ 是支持安装第三方 APK 的,需要通过 ADB 来安装在安装 APK 之前你需要点击”文件”启动一次 Windows Subsystem for Android™出现这个界面后就可以关闭窗口了打开开发者模式后会出现一行小字于是我们可以通过 127.0.0.1:58526 连接 Windows Subsystem for Android™打开终端输入指令: 1adb connect 127.0.0.1:58526 其中地址要根据提示来改变当出现 “connected to 127.0.0.1:58526” 提示时就说明已经连接到 Windows Subsystem for Android™ 了我们可以安装一个[酷安]以便下次安装不用指令安装 apk 使用这个指令: 1adb install "文件地址"","categories":[{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/categories/Windows/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/tags/Windows/"}],"author":"Hajeekn"},{"title":"Windows 使用 Scoop 管理软件","slug":"kmlrip","date":"2021-08-22T14:08:23.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/kmlrip/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/kmlrip/index.html","excerpt":"","text":"本篇文章参考 Dejavu 的文章和 Scoop 官方文档Windows 和 MacOS Linux 不一样Windows 安装软件的途径一般是搜索引擎/软件管家 而 MacOS Linux 有自己的包管理器MacOS 是 HomebrewLinux 是 aptWindows 下其实也有包管理器,比较流行的是 Scoop Chocolatey Winget-cli Scoop 和 Chocolatey 都是比较出名的第三方包管理器了,Winget 是微软整的一个新活但是严格来说,Scoop 并不算是 “包管理器”,Scoop 官方解释为 “Scoop 是 Windows 的命令行安装程序”,但是它基本实现了一个包管理器的功能 系统要求 Windows 7 SP1+ / Windows Server 2008+ PowerShell 5 / PowerShell Core 和 .NET Framework 4.5 (或更高版本) 配置 Scoop 目录Scoop 默认的安装本体和软件目录为:C:\\Users\\%username%\\scoop\\Scoop 默认安装全局软件的目录为: C:\\ProgramData\\scoop\\在我们安装 Scoop 前,我们应该使用环境变量配置安装目录配置本体和软件目录: 12$env:SCOOP='<盘符>:\\Scoop'[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User') 配置全局软件目录: 12$env:SCOOP_GLOBAL='<盘符>:\\Scoop\\Global'[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine') 配置完成后就可以开始安装 Scoop 了 安装 Scoop打开你的 Windows Terminal / Powershell 5输入安装指令: 1iwr -useb get.scoop.sh | iex 安装时鉴于国内防火长城,推荐打开全局代理当提示 successfully 的时候就安装完成了 安装 GitGit 是 Scoop 必须的组件,现在你可以通过一个简单指令安装 1scoop install git openssh 安装 Aria2接着我们需要安装 Aria2 让 Scoop 以多线程下载你也可以通过一个简单的指令下载 1scoop install aria2 安装完成后需要配置一下 Aria2 的参数 12345678# 启用 Aria2scoop config aria2-enabled true# 设置单任务最大线程为 16scoop config aria2-split 16# 设置单服务器最大线程为 16scoop config aria2-max-connection-per-server 16# 设置文件最小切片大小为 1Mscoop config aria2-min-split-size 1M 安装 Sudo如果你使用 Scoop 全局安装软件(如 Node.js)你便需要管理员权限安装 Sudo 可以简化提取权限步骤同样,你也可以通过一个简单指令安装 Sudo 1scoop install sudo 常用 Scoop Bucket Main Windows 的命令行安装程序 extras 包含不太符合主存储桶标准的应用 main 下一代的 Scoop 默认 Bucket chawyehsu/dorado 🐟 又是一个可爱的 Scoop 的 Bucket Ash258/Scoop-Ash258 个人 Bucket,包含各种应用 nerd-fonts 一个用于安装 Nerd Fonts 字体的 Bucket java 用于 Oracle Java, OpenJDK, Zulu, ojdkbuild, AdoptOpenJDK, Amazon Corretto, BellSoft Liberica, SapMachine 和 Microsoft JDK 的 Bucket borger/scoop-galaxy-integrations 提供安装、附加和更新 GOG Galaxy 2 号集成的简单方法 TheRandomLabs/Scoop-Spotify 一个用于 Spotify、Spicetify 和相关软件包的 Bucket nonportable 一个用于非可移植应用程序的 Bucket games 开源/免费游戏和游戏相关工具的 Bucket TheCjw/scoop-retools 逆向工程工具的 Bucket jetbrains 包含 Jetbrians IDE 的 Bucket integzz/scoopet 包含学术研究应用的 Bucket Versions 包含一些知名软件包的旧版本的 Bucket Ash258/GenericBucket 通用的 Bucket 模板 kidonng/sushi 一个美味的、包容的 Bucket rasa/scoops 一个美味的的 Bucket littleli/scoop-clojure 安装 Clojure 的 Bucket MCOfficer/scoop-nirsoft 个人收藏的 nirsoft.net-bucket,总共包含了 250 多个程序 kkzzhizhou/coop-apps 合并多个 Scoop 仓库,使用 Github Action 自动更新 KNOXDEV/wsl 一个用于 WSL 的 Bucket,不需要 Windows UWP 应用商店 Ash258/Scoop-Sysinternals 所有分开的 Sysinternals 工具的 Bucket TheRandomLabs/Scoop-Bucket 个人收藏的 Bucket cderv/r-bucket R 语言用户和软件工程师使用的个人 Bucket kkzzhizhou/scoop-zapps 自用 Scoop 仓库,使用 Github Actions 自动更新 tetradice/scoop-iyokan-jp 日本語環境に最適化された scoop bucket rkbk60/scoop-for-jp 适合小日子过得不错的日本人的 Bucket ZvonimirSun/scoop-iszy ZvonimirSun 个人收藏的 Bucket php PHP 的 Bucket 你可以通过以下指令添加 Bucket 1scoop bucket add <name> <repo>","categories":[{"name":"windows","slug":"windows","permalink":"https://blog.slqwq.cn/categories/windows/"}],"tags":[{"name":"windows","slug":"windows","permalink":"https://blog.slqwq.cn/tags/windows/"}],"author":"Hajeekn"},{"title":"Cloudflare 的 Argo Tunnel 使用","slug":"fktz6u","date":"2021-08-06T18:38:20.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/fktz6u/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/fktz6u/index.html","excerpt":"","text":"Cloudflare 是一个知名的老牌 CDN 厂商了,相信很多人应该都知道,今天我在逛 Cloudflare の Docs 时发现了个 Argo Tunnel 试用了一下,还可以,并且免费,于是水写了一篇文章介绍给大家 安装 Argo Tunnel本次以 Windows 11 演示通过GitHub下载适用于 Windows 的安装包这里包含了两种版本386=i1386 也就是 32 位的 Windows 系统amd64 也就是 64 位的 Windows 系统我们下载.exe 可执行文件,msi 属于安装文件,也可以下载(但是我这里没安装成功) 配置 Argo Tunnel下载好后把文件改名为 cloudflared.exe然后把他复制到一个合适的目录,我这里是 D 盘打开 Windows Terminal ,如果你没有也可以用 Powershell 和 cmd通过 cd 进入到放置 cloudflared.exe 的文件夹如果你是 Windows 11 系统,可以直接在目录右键,点击 Open in Windows Terminal然后在终端输入 1./cloudflared.exe --version 如果跳出版本号就成功了接着你需要打开Cloudflare Argo Tunnel 的授权页面在里面点击你要授权 Argo Tunnel 的域名接着会弹出来一个弹窗提示你点击授权,照着文字点就行然后你的浏览器会自动下载一个叫 cert.pem 的文件复制它然后进入到你的用户文件夹,创建一个.cloudflared 文件夹将文件粘贴进去这样就完成了对 Argo Tunnel 的配置 创建 Argo 隧道打开终端,输入以下指令 1./cloudflared.exe tunnel create <你想要的隧道名称> 创建一个隧道然后你需要配置域名方面打开 Cloudflare 的 DNS 面板,如果你是第三方托管打开第三方 DNS 面板新建一个 CNAME 记录记录名随便记录类型选择 CNAME记录内容写 你刚才从终端创建隧道时的 ID.cfargotunnel.comID 怎么获取呢?你创建隧道时的 xxxxx.json 去掉.json 就是你的隧道 ID然后保存如果你是第三方托管,你还要去你的域名管理商新建一样的记录,但是 CNAME 值写<记录名.域名.cdn.cloudflare.net>之后你就可以连接 Argo 隧道了 连接 Argo 隧道在终端里面输入以下指令 1./cloudflared tunnel --config path/config.yaml run <刚刚的隧道名> --url <本地URL(可以带端口)> 其中你要填写隧道名和本地 URL比如你想让 Argo 映射你的 Hexo,你就可以在本地先启动 Hexo 查看他的地址Hexo 一般是 localhost:4000其他项目就填进去就好了,记住不带 http 和 https 的协议头,也不带后缀 /填写完成后回车,等它连接好然后你打开你刚才创建的子域名,就会出现页面了今天又水了一篇文章","categories":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/categories/cloudflare/"}],"tags":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/tags/cloudflare/"}],"author":"Hajeekn"},{"title":"物理机安装 Windows 11","slug":"hv5zso","date":"2021-07-10T20:55:32.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/alioalnh/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/alioalnh/index.html","excerpt":"","text":"最近 Windows 11 发布了,我趁机白嫖了个预览版镜像在虚拟机里面装着玩玩,之后便给实体机也装上了本文章说说如何安装 Windows 11 和对于笔记本如何优化动效 安装 Windows 11获取 Windows 11 预览版镜像天翼云:https://cloud.189.cn/t/bYbEzq7vAVra 访问码:q2rt迅雷:https://pan.xunlei.com/s/VMdJtc5D8h_Yau9M19fH6mNiA1 提取码:p5f9UUP(arm64_zh cn):https://pan.baidu.com/s/129jQDRLGqn2dMq7tEifRFg 提取码: uyq8UUP(amd64_zh cn):https://pan.baidu.com/s/14x2a2VhopRAS3ZOYhkBQBA 提取码:8wy5通过这些地址获取预览版镜像 安装 Windows 11下载之后解压镜像双击运行 setup.exe 进行安装如果你的电脑不满足 Windows 11 的要求,你可以使用 PE 安装如果你下载了一个自带中文语言包的镜像,那么你看到的就是中文的安装界面按照步骤安装完成后应该会跳出 OOBE 界面在这个界面选择 China然后点击 Yes然后会提示选择键盘布局 如果你下载了包含中文包的镜像那么这里可以选择中文输入法之后你要配置账户,我用的是 Microsoft 365 E5 的组织账号之后按照步骤提示配置完成后就可以了安装完成后界面大概是这样","categories":[{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/categories/Windows/"},{"name":"Windows11","slug":"Windows/Windows11","permalink":"https://blog.slqwq.cn/categories/Windows/Windows11/"}],"tags":[{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/tags/Windows/"},{"name":"Windows11","slug":"Windows11","permalink":"https://blog.slqwq.cn/tags/Windows11/"}],"author":"Hajeekn"},{"title":"Floccus 食用教程","slug":"eur9h5","date":"2021-04-18T10:49:42.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/eur9h5la/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/eur9h5la/index.html","excerpt":"","text":"演示过程基于 Twinkstar(星愿)浏览器,其他浏览器可能大致步骤一样 什么是 FloccusFloccus 是一个在 GitHub 上的开源项目,该项目的官方简介如下 Sync your bookmarks across browsers via Nextcloud, WebDAV or a local file (and thus any file sync solution).简单的说它就是一个支持 Google Chrome 和 Mozilla Firefox 跨平台同步的一个插件,依赖于 WebDAV、nextcloud、本地文件等 下载并安装 Floccus 插件Chrome Store DownloadGitHub Release 下载 配置坚果云坚果云支持 WebDAV,并且在国内,速度快,所以我们就选用了坚果云如果你有账号点击登录如果你没有账号点击注册我有账号就直接登录了进入后可以看见这些东西sync 刚开始是没有的接下来我们可以创建一个文件夹用于存放书签文件这边命名为 sync,你也更改在坚果云刚刚创建的文件夹中创建一个名为 bookmarks.xbel 的文件,文件内放入这些内容: 12345<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xbel PUBLIC "+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML" "http://pyxml.sourceforge.net/topics/dtds/xbel.dtd"><xbel version="1.0"></xbel> 然后保存就可以了接下来进入账号信息安全选项点击添加第三方应用点击生成密码 配置 Floccus 插件打开 Floocus 选择新建账户WEBDAV URL 写: https://dav.jianguoyun.com/dav/用户名写示例里面的密码写你的用户密码书签路径写自己新建的文件夹/bookmarks.xbel接下来点击保存即可","categories":[{"name":"书签同步","slug":"书签同步","permalink":"https://blog.slqwq.cn/categories/%E4%B9%A6%E7%AD%BE%E5%90%8C%E6%AD%A5/"}],"tags":[{"name":"书签同步","slug":"书签同步","permalink":"https://blog.slqwq.cn/tags/%E4%B9%A6%E7%AD%BE%E5%90%8C%E6%AD%A5/"}],"author":"Hajeekn"},{"title":"如何给自己的网站添加音乐播放器","slug":"puchmt","date":"2021-02-24T11:00:47.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/adlloiau/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/adlloiau/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客 本文章为以前文章的重制版本,会详细说明 开始前言首先,这篇文章所写的教程适用于大部分主题和网站本篇文章会提供 HTML/YML 引用方法,可以将 HTML 引用方法转换成你主题所提供的自定义 head 方法 开始首先打开你的 Butterfly 配置文件一般为以下几个名称 _config.butterfly.yml(存在于根目录下) butterfly.yml(存在于 source/_data 目录下) _config.yml(存在于主题目录下) 找到 inject在 head 部分粘贴以下内容 12- <link rel="stylesheet" href="https://cdn1.tianli0.top/npm/aplayer/dist/APlayer.min.css" media="defer" onload="this.media='all'">- <meting-js server='tencent' type='playlist' id='3813658180' fixed='true'></meting-js> 在 bottom 部分粘贴以下内容 12- <script async src="https://cdn1.tianli0.top/npm/aplayer"></script>- <script async src="https://cdn1.tianli0.top/npm/meting/dist/Meting.min.js"></script> HTML 引入方法:在 head 添加 123456789101112<link rel="stylesheet" href="https://cdn1.tianli0.top/npm/aplayer/dist/APlayer.min.css" media="defer" onload="this.media='all'"/><meting-js server="tencent" type="playlist" id="3813658180" fixed="true"></meting-js> 在/body 前添加 12345<script async src="https://cdn1.tianli0.top/npm/aplayer"></script><script async src="https://cdn1.tianli0.top/npm/meting/dist/Meting.min.js"></script> 其中server='tencent' type='playlist' id='3813658180' fixed='true'可以自定义自定义方法可参照 MetingJS 官方 READMEhttps://github.com/metowolf/MetingJS/blob/master/README.md水完了,溜了溜了 说明如果你要达到本博客的刷新不断歌(除主动刷新或刷新 JavaScript 脚本)需要开启 Pjax 功能","categories":[{"name":"Butterfly","slug":"Butterfly","permalink":"https://blog.slqwq.cn/categories/Butterfly/"},{"name":"Custom","slug":"Butterfly/Custom","permalink":"https://blog.slqwq.cn/categories/Butterfly/Custom/"}],"tags":[{"name":"Butterfly","slug":"Butterfly","permalink":"https://blog.slqwq.cn/tags/Butterfly/"},{"name":"Custom","slug":"Custom","permalink":"https://blog.slqwq.cn/tags/Custom/"}],"author":"Hajeekn"},{"title":"Waline评论系统部署日志","slug":"gxgg0l","date":"2021-02-21T19:46:58.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/rbblakpo/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/rbblakpo/index.html","excerpt":"","text":"本文基于@CCKNBC的日志@Waline 官方文档和博主自己部署时的实际情况编写如果需要最详细的配置请前往 @Waline 官方文档 评论系统特性 快速 真·安全 Markdown 语法支持 轻量易用 免费部署 多种部署方式和存储服务支持,每列选择一项多达 48 种部署方式任君选择 Waline 客户端脚本 服务端部署 数据存储 @waline/client Vercel LeanCloud MiniValine CloudBase CloudBase Docker MongoDB 独立部署 MySQL SQLite PostgreSQL Github Todo [x] 微信通知 [x] QQ 通知 [x] Telegram 通知 [x] Akismet [x] 文章统计 [x] 多语言同步 [x] 自定义语言支持 [x] 登录支持 [x] 评论管理 [x] 评论删除 [x] 其它数据库支持 [x] 基于 IP 的发布评论频率限制 [x] 基于关键词的评论过滤限制 [x] IP 黑名单 [x] 重复内容检测 [x] CloudBase 腾讯云开发部署支持 [x] 社交登录 [ ] AWS, GCP, Azure 部署支持 [ ] 置顶评论 [ ] 评论赞踩 如果您要获得来自 Waline 群友或公子大佬的支持,可以在Github Discussions 中发布问题获取支持。当然你也可以加入 Waline 的 Telegram 小组或者是加入我们的 Waline 用户交流 QQ 群获取更多的支持。 上手博主采用 Butterfly 主题,已经内置 Waline 评论系统 Vercel + LeanCloud博主就使用了这种方式(毕竟能白嫖谁还要花钱啊?博主推荐使用LeanCloud 国际版本,如果您使用的是LeanCloud 中国版本,除了本文介绍的环境变量,还需要绑定 LeanCloud 域名配置方式: 设置 > 域名绑定 > API 访问域名 绑定新域名 > 输入需要绑定的已备案域名点击 确定。之后按照页面上的提示去 DNS 上做正确的 CNAME 解析即可。 点击上面的 Deploy 按钮就可以快速跳转到 Vercel 部署辣如果你没有 Vercel 账号,可能提示你需要注册一个,这里不要用 QQ 邮箱因为他们会认为 QQ 邮箱是一个垃圾邮箱PROJECT NAME 可以随便填写一个这就是项目名称,不过为了之后好辩别,还是写一个方便记住的吧输入了你的项目名称后点击 Continue 进入下一步不过可能会提示你要选择一个随便来一个就是(前提是你有对应的账号,否则老老实实选择 GitHub进入下一步后会让你填写创建的 Git 仓库名称点击你的用户名可以显示出你账号绑定的 GitHub 账号这样就可以自定义创建的账号 下方 👇 的 Create private Git Repository 如果勾选上创建的时候就会创建一个私有仓库然后再次点击 Continue 进行下一步然后就会出现这个页面不管他,下滑找到 Environment Variables 配置环境变量默认需要的环境变量如下: LEAN_ID LEAN_KEY LEAN_MASTER_KEY 它们的值分别对应上一步在 LeanCloud 中获得的 APPID APPKEY MasterKey获取方法:进入 LeanCloud这边用国际版演示进入选择 Console如果没有创建一个应用注意 ⚠: 如果您之前用了 Valine 评论系统 就不用创建了,因为 Waline 评论数据与 Valine 评论数据可以共用进入应用设置后选择 设置 -> 应用 Keys复制并保存 Credentials 的所有配置然后把获取到的变量依次填入环境变量中设置都完成后就可以点击 Deploy 了在这里稍等一会儿就可以部署完成部署完成后在接下来的页面点击 Visit就可以打开部署好的示例网页然后你需要注册一个账号在 Vercel 分配的域名后面加上/ui/register第一个注册的会成为管理员哦~如果你想要自定义管理员头衔可以在客户端脚本中用langMode.admin配置哦例如: 12345678910111213function waline() { const Waline = require("@waline/client"); new Waline({ el: "#waline-comment", serverURL: %WALINEURL%, path: window.location.pathname, visitor: true, lang: location.pathname.startsWith("/en/") ? "en" : "zh-CN", langMode: { admin: location.pathname.startsWith("/en/") ? "Admin" : "Hajeekn", }, });} 按这样来说,你还可以配置访客的角标(头衔)具体去看看Waline 文档或者@CCKNBC当然如果你和我一样用的是 Butterfly那么可以找到 Waline 配置项在option配置项加入配置即可 langMode: admin: Hajeekn 示例: 12345option: pageSize: 10 ····· langMode: admin: Hajeekn 当然 Waline 现在也可以更改邮件模板只需要在环境变量内写入就行但是环境变量限制大小,推荐按照issues/106配置当然如果你的评论不是很多,并且之前配置过 Valine-Admin,那么你仍然可以使用 LeanCloud 异步发送通知 表情包配置(Butterfly)这部分和 Valine 没多大差别,格式也可以直接复制粘贴 Valine 的只需要把名字改为 waline.json具体可以查看主题文档 CloudBase 云开发部署可以去看看@CCKNBC(CC)大佬写的 升级Vercel所需要的工具 Renovate Mergify !在这之前仓库必须公开!安装完成后就可以删除 Waline 仓库,再 fork CC 的仓库,之后绑定到 fork 的仓库并重新部署即可 但是如果你没用 腾讯云开发 就把 .github/workflows/Update Waline TCB.yml 里的文件删掉,因为涉及到自动部署更新云开发,还有环境变量,如果没设定会导致报错 Tencent Cloudbase和上面一样Fork CC 的仓库 然后新建几个变量进入你的仓库/settings/secrets/actions 变量名 变量解释 SECRETID API 访问密钥 ID,可点击这里 新建/查看 SECRETKEY API 访问密钥 KEY,可点击这里 新建/查看 TCBFUNNAME(没什么好加密的,就叫 waline 算了) 你想要新建/已有函数的名称,比如 Waline TCBENVID 环境 ID,可点击这里 或这里查看,地址栏后也会显示,反正就是很多地方都在上面点一下就能看到 | AD! 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3gll8aqhc2kgg","categories":[{"name":"评论","slug":"评论","permalink":"https://blog.slqwq.cn/categories/%E8%AF%84%E8%AE%BA/"},{"name":"部署日志","slug":"评论/部署日志","permalink":"https://blog.slqwq.cn/categories/%E8%AF%84%E8%AE%BA/%E9%83%A8%E7%BD%B2%E6%97%A5%E5%BF%97/"}],"tags":[{"name":"评论","slug":"评论","permalink":"https://blog.slqwq.cn/tags/%E8%AF%84%E8%AE%BA/"},{"name":"部署日志","slug":"部署日志","permalink":"https://blog.slqwq.cn/tags/%E9%83%A8%E7%BD%B2%E6%97%A5%E5%BF%97/"}],"author":"Hajeekn"},{"title":"使用语雀随时编写文章","slug":"gklcuf","date":"2021-02-20T11:41:21.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/gklcufla/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/gklcufla/index.html","excerpt":"","text":"本文章基于冰卡诺老师的教程编写「语雀」是一个「专业的云端知识库」,孵化自 蚂蚁金服 ,是 体验科技 理念下的一款创新产品,已是 10 万阿里员工进行文档编写、知识沉淀的标配。语雀诞生伊始,只是希望能给工程师提供一个好用的工具用来写技术文档,达成「用 Markdown 写文档」这个小目标。但在产品研发的过程中,我们发现其实身边的每个人、每个团队、每个组织都有很多知识,但一直以来缺少一个好用的工具让这些知识不只是留在每个人的大脑或电脑里,还可以被记录、分享和交流。所以,带着这颗初心,我们觉得语雀不应止步于服务工程师,应该致力于为每个想表达所思所想的人提供一款顺手的工具,让知识能得以记录和传播,让人们可以在「语雀」中平等快乐地创作和交流知识,让再小的个体也可以拥有自己的知识库。 部署流程在语雀上编写文章并发布 -> 通过 Webhook 触发 serverless 云函数的部署 — serverless 云函数使用 token 等数据调用 GitHub API -> GitHub Actions 脚本运行(包括安装依赖与 Hexo / 同步语雀文章到本地 / 执行部署) 教前准备 一个语雀账号 Click Me Vercel 账号 GitHub 私钥 GitHub 私钥的获得Click Me 进入以上地址 选择 Generate new tokenNote 随便填写Select scopes 选择 repo / 或者宁可以全选,但是泄露了你就完蛋了(哭笑)生成好后复制这一串(避免有人手贱,推荐点击后面的蓝色按钮然后我们可以新建个 txt 记录下来,避免老年痴呆忘记(不是) 仓库新建进入 GitHub 新建仓库点我传送创建仓库时,权限请选择 Private(否则后续会很麻烦的) 开始工作创建知识库登录语雀,进入工作台进入个人知识库选择创建知识库归属选择你自己,类型选择文档知识库点击下一步名称随便填写,可见范围选择互联网可见公开内容是否允许搜索引擎收录选择允许(其实允许不允许也没关系)然后我们点击三个点 - 管理文档新建 - 导入类型选择 Markdown为了方便以后文档的撰写,可以新建模板。注意图片链接需要加上’’防止被渲染成链接。盗一下冰老师的图 如果你使用了 abbrlink,请手动填写 abbrlink。这里提供一套语雀模板 12345678910111213141516---title: 使用语雀随时编写文章sticky: 1tags: [云端写作,语雀]description: 蛤,台式机不好带?GitHub上不去?用语雀写文章鸭categories: [云端写作,语雀[cover:photos: abbrlink: gklcufladate: 2021-02-20 11:41:21copyright_author_href: https://blog.slqwq.cnauthor: Hajeeknid: 32--- tags 配置和 categories 配置推荐用数组格式 安装语雀插件进行本地调试为了确保在云端能够正常生成博客,需要首先在本地进行调试。打开你的终端使用 1npm i -g yuque-hexo 全局安装 yuque-hexo 插件 修改 package.json在第一个对象代码块后增加”yuqueConfig”代码块。 1234567891011121314151617181920212223{ "name": "hexo-site", "version": "0.0.0", "private": true, "scripts": { "build": "hexo generate", "clean": "hexo clean", "deploy": "hexo deploy", "server": "hexo server"}, "yuqueConfig": { "postPath": "source/_posts", "cachePath": "yuque.json", "mdNameFormat": "slug", "adapter": "markdown", "concurrency": 5, "baseUrl": "https://www.yuque.com/api/v2", "login": "bingkanuo", "repo": "sffipz", "token": "***********************", "onlyPublished": true, "onlyPublic": true }, 其中的 login repo token 需要自己更改login:框起来的这一段(不要/和https://www.yuque.com)token 是在右上角头像 -> 账户设置 -> Token 添加的,权限的话只给读取就可以。复制粘贴获取的”token”字段。再次盗图 添加完成后保存,在执行命令前,请先备份自己的_post 文件夹,因为语雀的下载操作会覆盖原有的_post 文件夹。在终端中输入‘yuque-hexo sync’就会把语雀的文章给下载下来。然后通过‘hexo g&hexo s’进行调试。ps:输入‘yuque-hexo clean’就会清除_post 下的所有文章。如果存在外挂标签,请确保外挂标签格式的书写规范,否则容易报错。 配置 GitHub Actions删除主题的.git(使用 npm 安装请忽略)因为在仓库里面再放一个仓库是没法把里面那个仓库 push 到 github 的,只会传一个空文件夹,会导致后期博客成了空白页面,需要把 git clone 的 hexo 主题里的.git 文件夹给删掉。 修改 hexo 主题文件中的 meta以 Butterfly 主题为例进入%brt%/themes/butterfly/layout/includes/head.pug (Windows 用户请替换 / 为 \\ )在 meta(name=”theme-color” content=themeColor)后方添加 meta(name=”referrer” content=”no-referrer”)。该步骤是确保语雀中的图片可以正常加载。 12meta(name="theme-color" content=themeColor)meta(name="referrer" content="no-referrer") 修改 hexo 的_config,yml前往博客的根目录,修改 hexo 的_config,yml 中关于 develop 的配置 123456789# Deployment## Docs: https://hexo.io/docs/deployment.htmldeploy: type: git repository: github: https://用户名:保存在txt中的密钥@github.com/用户名/仓库名.git branch: master #例子:https://ladjeek-actions:*******@github.com/slblog-github/Blog.git 创建 GitHub Actions 脚本在博客根目录下新建.github 文件夹(点不要漏掉了),在该文件夹下新建 workflows 文件夹。在 workflows 文件夹下新建 autodeploy.yml。并填入以下代码。将下面那个 user.name 和 user.email 修改为自己的信息,注意对齐。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465name: 自动部署# 当有改动推送和语雀发布时,启动Actionon: [push, repository_dispatch]jobs: deploy: runs-on: ubuntu-latest steps: - name: 检查分支 uses: actions/checkout@v2 with: ref: master - name: 安装 Node uses: actions/setup-node@v1 with: node-version: "12.x" - name: 安装 Hexo run: | export TZ='Asia/Shanghai' npm install hexo-cli -g #npm install gulp-cli -g #如果你有使用gulp的话,打开上面这一行 npm install yuque-hexo -g yuque-hexo clean yuque-hexo sync - name: 缓存 Hexo uses: actions/cache@v1 id: cache with: path: node_modules key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}} - name: 安装依赖 if: steps.cache.outputs.cache-hit != 'true' run: | npm install --save - name: 更新 语雀拉取缓存及文章 #更新yuque 拉取的文章到GitHub仓库 run: | echo `date +"%Y-%m-%d %H:%M:%S"` begin > time.log git config --global user.email "[email protected]" git config --global user.name "Zfour" git add . git commit -m "Refresh yuque json" -a - name: 推送 语雀拉取缓存及文章 #推送修改后的yuque json uses: ad-m/github-push-action@master with: github_token: ${{ secrets.GITHUB_TOKEN } - name: 生成静态文件 run: | hexo clean hexo g #gulp # 使用Gulp压缩取消#号并和上面命令对齐 - name: 部署 run: | git config --global user.name "slblog-github" git config --global user.email "[email protected]" hexo deploy 上传博客源码在你的终端输入: 12345git initgit add .git commit -m "first commit"git remote add origin https://github.com/你的用户名/你的私有博客源码仓库名.gitgit push -u origin master 进行云端调试上传后你会发现 github action 生效。等待几分钟后,如果打勾,就说明部署成功。如果未打勾请检查出错的步骤。 配置云函数以下采用 Vercel 示范,其他云函数请看详细步骤:https://zfe.space/post/554e.html为了方便调用,冰老师写了一个 API调用方式如下 1https://yuque-vercel-webhook-api.vercel.app/api?token='{填写你的github私钥}'&user='{填写你的github用户名}'&source='{填写你的github仓库地址}' 你需要传递的参数有 token,user,source。当然你也可以直接 Fork 冰老师的项目自己搭建https://github.com/Zfour/yuque_vercel_webhook_api部署完成后将https://yuque-vercel-webhook-api.vercel.app换成你搭建好的地址 配置语雀的 webhook设定触发规则在知识库中选择设置 -> 开发者添加一个 WebHook推送方式选择发布文档 更新文档 删除文档然后名称随便写,URL 就把上面的调用方式补充完成放上去就行设置完毕后,你可以尝试发布一篇文章进行测试。如果 github action 执行则说明配置成功。 Thanks for you~","categories":[{"name":"云端写作","slug":"云端写作","permalink":"https://blog.slqwq.cn/categories/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"},{"name":"语雀","slug":"云端写作/语雀","permalink":"https://blog.slqwq.cn/categories/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/%E8%AF%AD%E9%9B%80/"}],"tags":[{"name":"云端写作","slug":"云端写作","permalink":"https://blog.slqwq.cn/tags/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"},{"name":"语雀","slug":"语雀","permalink":"https://blog.slqwq.cn/tags/%E8%AF%AD%E9%9B%80/"}],"author":"Hajeekn"},{"title":"部署你的RSS机器人","slug":"qc98ob","date":"2021-02-18T17:03:01.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/yllqclb9/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/yllqclb9/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客flowerss bot挺好用的,今天给大家安利一下搭建方法( 白 嫖 )首先呢,各位要注意下,flowerss bot 需要依赖一个 VPS,我知道你没钱买其实我也是辣,所以这篇教程用 Euserv 示范白嫖 Euserv 鸡子的教程挺多的,各位可以自行 Bing 一下这边就不讲了。 开始首先连接上 Euserv(我用的是嘿哟终端)接着用 12$ mkdir flbot$ cd flbot 然后根据你的系统版本安装对应的版本我是 64 就用 1$ curl -LJO https://github.com/indes/flowerss-bot/releases/download/v0.8.3/flowerss-bot-v0.8.3-linux-amd64.tar.gz 如果你的 32 就用 1$ curl -LJO https://github.com/indes/flowerss-bot/releases/download/v0.8.3/flowerss-bot-v0.8.3-linux-386.tar.gz 然后用 tar 命令解压包 1$ tar zxvf flowerss-bot-v0.8.3-linux-amd64.tar.gz 如果是 32 位请用 1$ tar zxvf flowerss-bot-v0.8.3-linux-amd386.tar.gz 再用 rm 命令删除包 1$ rm flowerss-bot-v0.8.3-linux-amd64.tar.gz 如果是 32 位请用 1$ rm flowerss-bot-v0.8.3-linux-amd386.tar.gz 然后执行 ls 查看文件如果正确的话,目录结构应该如下 1234flbot # 文件所在的目录| |——README.md # 项目的README| |——config.yml.sample # 配置文件示例| |——flowerss-bot # 程序的文件 然后你需要用 mv 指令去重命名 config.yml.sample 1$ mv config.yml.sample config.yml 然后你就可以用 vim 编辑配置文件了 1$ vim config.yml 配置项如下: 1234567891011121314151617181920212223242526# 这是配置文件示例bot_token: XXX#多个telegraph_token可采用数组格式:# telegraph_token:# - token_1# - token_2telegraph_token: xxxxuser_agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36preview_text: 0disable_web_page_preview: falsesocks5: 127.0.0.1:1080update_interval: 10error_threshold: 100telegram: endpoint: https://xxx.com/mysql: host: 127.0.0.1 port: 3306 user: mysql_username password: mysql_password database: flowersssqlite: path: ./data.dballowed_users: - 123 - 234 注意 ⚠: 如果您想要关闭终端后保持机器人的运行,请一定注意按以下步骤来安装 screen 12$ apt-get update$ apt-get install screen 在终端执行 1$ screen 创建一个 screen 窗口然后在里面启动就可以了 配置项说明bot_token(Telegram Bot Token)(必填)telegraph_token(Telegraph Token 用于转存原文到 Telegraph)(可忽略)preview_text(纯文字预览字数)(可忽略)user_agent(User Agent)(可忽略)disable_web_page_preview(是否禁用 web 页面预览)(可忽略)update_interval(RSS 源扫描间隔/分钟)(可忽略)error_threshold(源最大出错次数)(可忽略)socks5(用于无法正常 Telegram API 的环境)(可忽略)mysql(MySQL 数据库配置)(可忽略)sqlite(SQLite 配置)(可忽略(已配置 mysql 时,该项失效))telegram.endpoint(自定义 telegram bot api url)(可忽略)allowed_users(允许使用 bot 的用户 telegram id)(可忽略(为空时所有用户都能使用 bot)) 项 说明 状态 bot_token Telegram 机器人令牌 必须 telegraph_token 转存原文到 Telegraph 可选 preview_text 纯文字预览字数 可选 user_agent 用户代理 可选 disable_web_page_preview 禁用 Web 页面预览 可选 update_interval RSS 源扫描间隔(单位: 分钟) 可选 error_threshold RSS 源最大出错次数 可选 socks5 代理(适用于无法访问 Telegram 的机器) 可选 mysql 数据库配置(二选一) 可选 sqlite 数据库配置(二选一) 失效 telegram.endpoint 自定义 Telegram API 地址(用于反代 API 给国内机器使用) 可选 allowed_users 允许的用户,不填写代表所有用户均可以使用 可选 申请 Telegram Bot Token以下截图和内容来自Spoience 的博客打开 Telegram 搜索 @BotFather 点击 Start,发送 /newbot 然后给你的 Telegram Bot 取一个昵称和名字,框中马赛克部分就是创建的 Telegram Bot Token,请妥善保管该 Token: 申请 Telegraph Token| Telegram 应用内预览需要 Telegraph Api,所以我们还需要申请个 Telegraph Token在终端中执行下面命令,会返回一段 json 格式的文本,其中的 access_token 字段值即为 Telegraph Token,请妥善保存 1curl https://api.telegra.ph/createAccount?short_name=DaiRSS_Bot&author_name=Spoience&author_url=https://spoience.com 其中的 short_name author_name author_url 请替换成自己的 查看 Telegram ID| 默认的配置是允许所有用户使用我们刚刚创建的 Telegram RSS Bot,但为了安全、防止被滥用我们可以设置指定 ID 的 Telegram 用户能够使用该 Bot,获取允许使用用户(比如自己)的 Telegram ID 并填入配置文件的 allowed_users 字段获取 Telegram ID:https://t.me/getmyid_bot?start=botostore 使用将 Bot 添加到您的频道中,并设置为管理员,Bot 的管理命令如下: 12345678910/sub @ChannelID [url] 订阅/unsub @ChannelID [url] 取消订阅/list @ChannelID 查看当前订阅/check @ChannelID 检查当前订阅/unsuball @ChannelID 取消所有订阅/activeall @ChannelID 开启所有订阅/setfeedtag @ChannelID [sub id] [tag1] [tag2] 设置订阅标签(最多设置三个Tag,以空格分隔)/import 导入 OPML 文件/export @ChannelID 导出 OPML 文件/pauseall @ChannelID 暂停所有订阅 然后这样一个机器人就配置好啦,你可以把它拉入你的频道,然后自己配置下 RSS配置完成后你就可以看到更新文章时你的频道会有提示","categories":[],"tags":[{"name":"VPS","slug":"VPS","permalink":"https://blog.slqwq.cn/tags/VPS/"}],"author":"Hajeekn"},{"title":"搭建 YesPlayMusic 网页版","slug":"oc1hvk","date":"2021-02-11T11:39:55.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/oc1hvkia/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/oc1hvkia/index.html","excerpt":"","text":"本文章首发于语雀!通过各种高科技功能同步到Hajeekn 的博客最近在看 Spoience 的博客时看到了一篇文章: “一款高颜值跨平台的第三方网易云播放器 YesPlayMusic”于是便看了看看完后我进入了 YesPlayMusic 的 GitHub,突然我看到了这个可以直接将这个项目部署至云端,于是便抱着好奇的心试了试以下是搭建步骤 搭建网易云 API考虑到大部分人没有钱买服务器,抱着白嫖的心态部署在了 leancloud 尝试,没想到竟然可以以下就是步骤喽 登录 Leancloud进入leancloud 的国际版官网有账号的点击 Console没有账号的选择中间的 Get started for free 创建应用进入控制台后创建一个应用⚠ 注意: 现在必须写入应用描述,否则无法创建 部署 API创建成功后进入你创建的应用后台选择云引擎 -> WEB -> 部署选择部署项目 -> Git 部署 -> 配置 Git在配置 Git 处填入https://github.com/ChenYFan-Tester/NeteaseCloudMusicApi.git然后点击保存保存完成之后再次进入部署项目选择手动部署 -> 生产环境 -> 部署稍等片刻即可部署完成 完成后关闭部署日志窗口选择设置 -> 域名绑定 -> 绑定新域名在域名处填入自己准备绑定的域名,然后其他的原封不动,选择绑定这时候会给你分配一个 cname 域名进入你的域名解析商添加一个解析解析记录选择 CNAME主机记录填写刚才填写的域名(去掉.xxx.xx)记录值填写刚才 leancloud 分配的 CNAME 域名填写完成后大概的样子是这样的保存,稍等片刻 leancloud 处就会显示部署完成然后就可以部署主程序了 部署主程序首先克隆云端仓库下来构建在终端输入以下命令 12git clone https://github.com/qier222/YesPlayMusic.gitcd YesPlayMusic 然后你需要安装依赖在终端输入以下命令 1yarn install 依赖安装完成后把目录下的.env.example 改成.env修改 VUE_APP_NETEASE_API_URL=后的数据为你刚才部署的 API 的地址例如我的是https://testapi.slqwq.cn就填写进去VUE_APP_ELECTRON_API_URL=后的数据填写/然后就可以用 yarn serve 查看查看后觉得效果不错就可以用 yarn build 进行构建了构建完成后上传到 GitHub 启动 Pages 服务就可以愉快的用了如果想让这个 YesPlayMusic 支持播放灰色音乐还需要搭建 UnlockNeteaseMusic各位可以自行去摸索 啊对了,今天是新年,祝各位新年快乐哦!","categories":[{"name":"Leancloud","slug":"Leancloud","permalink":"https://blog.slqwq.cn/categories/Leancloud/"}],"tags":[{"name":"Leancloud","slug":"Leancloud","permalink":"https://blog.slqwq.cn/tags/Leancloud/"}],"author":"Hajeekn"},{"title":"Hexo-Butterfly主题魔改","slug":"efp1yi","date":"2021-01-26T20:00:46.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/bbr35lia/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/bbr35lia/index.html","excerpt":"","text":"由于每个人的博客目录都不相同,这里博客目录使用%brt%代替本文章除 Pace wowjs 普通引入法以外,其他魔改都不适合 Butterfly3.6.0 及以上 通过 wowjs 给博客添加好看的样式基础样式篇 1.创建 JS 前往%brt%\\themes\\butterfly\\source\\js\\新建一个 js,名称为wow-init.js其 JS 内部写入如下内容 12345678910111213wow = new WOW({ boxClass: "wow", // 用户滚动时显示隐藏框的类名称(可以自行配置) animateClass: "animate__animated", // 触发 CSS 动画的类名称(动画库默认为"animate.css"库)(可以自行配置) offset: 0, // 定义浏览器视口底部与隐藏框顶部之间的距离。 // 当用户滚动并到达此距离时,将显示隐藏的框。 // 可以自行配置 live: true, // 在页面上检查新的 wow.js元素。});wow.init(); 如果您觉得不想出现注释,也可以删掉注释。 2.前往%brt%\\themes\\butterfly\\layout\\includes\\third-party\\目录,新建一个名为wow-js.pug的文件 其文件内部写入如下代码: 123456789101112131415.pjax-reload if theme.wowjs.animateitem each item in theme.wowjs.animateitem script(async). var arr = document.getElementsByClassName('!{item.class}'); for(var i = 0;i<arr.length;i++){ arr[i].classList.add('wow'); arr[i].classList.add('!{item.style}'); arr[i].setAttribute('data-wow-duration', '!{item.duration}'); arr[i].setAttribute('data-wow-delay', '!{item.delay}'); arr[i].setAttribute('data-wow-offset', '!{item.offset}'); arr[i].setAttribute('data-wow-iteration', '!{item.iteration}'); }script(defer src=url_for(theme.CDN.wowjs))script(defer src=url_for(theme.CDN.wowjs_init)) 3.修改%brt%\\themes\\butterfly\\layout\\includes\\head.pug的内容 在 //- font 的配置下//- global config 的配置上的空白部分写入以下代码(请直接复制粘贴,避免出现缩进错误 ❌) 123//- animate_cssif theme.wowjs.enable link(rel='stylesheet' href=url_for(theme.CDN.animate_css) media="print" onload="this.media='all'") 4.修改%brt&\\themes\\butterfly\\layout\\includes\\additional-js.pug文件内部的内容 在 if theme.pjax.enable 配置大项的 baidu-push 小项下写入一下代码(请直接复制粘贴,避免出现缩进错误 ❌)V3.4.0 以下(不包括 3.4.0):将其中的 1$('script[data-pjax]').each(function () { 删除,并修改为: 123$("script[data-pjax], .pjax-reload script").each(function () { $(this).parent().append($(this).remove());}); V3.4.0 以上(包括 3.4.0):找到 1document.querySelectorAll('script[data-pjax]').forEach(item => { 删除它,并写入以下代码(请直接复制粘贴,避免缩进错误 ❌) 1234567891011document .querySelectorAll("script[data-pjax], .pjax-reload script") .forEach((item) => { const newScript = document.createElement("script"); const content = item.text || item.textContent || item.innerHTML || ""; Array.from(item.attributes).forEach((attr) => newScript.setAttribute(attr.name, attr.value) ); newScript.appendChild(document.createTextNode(content)); item.parentNode.replaceChild(newScript, item); }); 5.修改%brt\\%config%\\_config.butterfly.yml(请将%config%替换为你主题配置文件的位置,如果在根目录请无视) 找到 CDN 配置项在 1utils: /js/utils.js 的配置项下添加 wowjs、wowjs-init、animate 的库(请直接复制粘贴以下代码,避免格式缩进导致的错误 ❌) 123wowjs: https://cdn1.tianli0.top/gh/graingert/[email protected]/dist/wow.min.jswowjs_init: /js/wow_init.jsanimate_css: https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css 6.修改%brt\\%config%\\_config.butterfly.yml(请将%config%替换为你主题配置文件的位置,如果在根目录请无视) 在该配置文件内部添加 wow 的开关,其中 class 和 style 配置为必填项 1234567891011wowjs: enable: true #控制动画开关。true是打开,false是关闭 animateitem: - class: recent-post-item #必填项,需要添加动画的元素的class style: animate__zoomIn #必填项,需要添加的动画 duration: 3s #选填项,动画持续时间,单位可以是ms也可以是s。例如3s,700ms。 delay: 1s #选填项,动画开始的延迟时间,单位可以是ms也可以是s。例如3s,700ms。 offset: 100 #选填项,开始动画的距离(相对浏览器底部) iteration: 2 #选填项,动画重复的次数 - class: CoolButton style: animate__zoomIn 运行hexo clean && hexo g后方可看到效果,更多 animate 动画样式可查看animate 官方文档 浮动样式篇浮动样式篇参考Aklilar大佬的文章给博客元素添加浮动特效和洪哥的博客效果 1.前往%brt%\\themes\\butterfly\\source\\js\\目录,新建一个名为floatpanel.js的文件 在内部写入以下代码: 123456789101112131415161718192021222324var ANGLE = 45; //控制浮动角度,数值越大,浮动幅度越大。var panel = document.getElementsByClassName("wowpanels");for (var i = 0; i < panel.length; i++) { floatable(panel[i]);}function floatable(content) { content.addEventListener("mouseout", (e) => { content.style.transform = `perspective(300px) rotateX(0deg) rotateY(0deg) rotateZ(0deg)`; }); content.addEventListener("mousemove", (e) => { var w = content.clientWidth; var h = content.clientHeight; var y = ((e.offsetX - w * 0.5) / w) * ANGLE; var x = ((1 - (e.offsetY - h * 0.5)) / h) * ANGLE; content.style.transform = `perspective(300px) rotateX(${x}deg) rotateY(${y}deg)`; });} 2.修改%brt\\%config%\\_config.butterfly.yml(请将%config%替换为你主题配置文件的位置,如果在根目录请无视) 在 inject 大项的 bottom 小项中添加 script 引入项: 1- <script async data-pjax src="/js/floatpanel.js"></script> 3.给你想要特效的类元素添加 wowpanels 属性,修改 floatpanel.js 的代码如下: 123456789101112131415161718192021222324252627282930// 新增的内容var arr = document.getElementsByClassName('element-class');//把element-class替换成你想要添加特效的元素的类名for(var i = 0;i<arr.length;i++){arr[i].classList.add('wowpanels');}// 原来的内容var ANGLE = 45; //控制浮动角度,数值越大,浮动幅度越大。var panel= document.getElementsByClassName('wowpanels');for(var i = 0;i<panel.length;i++){floatable(panel[i]);}function floatable (content) {content.addEventListener('mouseout', e => {content.style.transform = `perspective(300px)rotateX(0deg)rotateY(0deg)rotateZ(0deg)`;});content.addEventListener('mousemove', e => {var w = content.clientWidth;var h = content.clientHeight;var y = (e.offsetX - w * 0.5) / w * ANGLE;var x = (1 - (e.offsetY - h * 0.5)) / h * ANGLE;content.style.transform = `perspective(300px)rotateX(${x}deg)rotateY(${y}deg)`;});} 当你完成了基础样式篇时,其实你可以直接将浮动效果看成一个动画样式在之前的配置下直接添加以下配置项: 12- class: #你想要更改的class类名 style: wowpanels 添加完成后 wowjs 的配置项应该与下面的截图类似如果报错,请检查你的配置缩进是否正确 ✔,这里博主推荐使用微软爸爸出品的 VSC 编辑对于缩进格式邀请很强的文件格式以下代码供您用来参考: 123456789101112131415161718192021222324# wowjswowjs: enable: true #控制动画开关。true是打开,false是关闭 animateitem: - class: recent-post-item #必填项,需要添加动画的元素的class style: animate__zoomIn #必填项,需要添加的动画 duration: 3s #选填项,动画持续时间,单位可以是ms也可以是s。例如3s,700ms。 delay: 0.5s #选填项,动画开始的延迟时间,单位可以是ms也可以是s。例如3s,700ms。 offset: 100 #选填项,开始动画的距离(相对浏览器底部) iteration: 1 #选填项,动画重复的次数 - class: card-widget #必填项,需要添加动画的元素的class style: animate__zoomInUp #必填项,需要添加的动画 duration: 3s #选填项,动画持续时间,单位可以是ms也可以是s。例如3s,700ms。 delay: 0.5s #选填项,动画开始的延迟时间,单位可以是ms也可以是s。例如3s,700ms。 offset: 100 #选填项,开始动画的距离(相对浏览器底部) iteration: 1 #选填项,动画重复的次数 - class: layout hide-aside #必填项,需要添加动画的元素的class style: animate__flipInY #必填项,需要添加的动画 duration: 3s #选填项,动画持续时间,单位可以是ms也可以是s。例如3s,700ms。 delay: 0.5s #选填项,动画开始的延迟时间,单位可以是ms也可以是s。例如3s,700ms。 offset: 100 #选填项,开始动画的距离(相对浏览器底部) iteration: 1 #选填项,动画重复的次数 - class: CoolButton style: wowpanels 如果您想让动画更滑丝滑流畅,可以新建 css,在内部写入以下代码: 123.wowpanels { transition: all 0.4s cubic-bezier(0.39, 0.575, 0.565, 1);} 添加 BiliBili 同款的动态 Banner由于每个人的博客目录都不相同,这里博客目录使用%brt%代替 下载Bilibili的Banner 1.前往%brt%\\themes\\butterfly\\layout\\includes\\header\\新建一个名为bilibili-banner.pug的文件 在其内部写入 1234567891011121314151617181920212223242526272829if (!is_home()) - var banner_style = (typeof(page.bilibili_banner) != "undefined" && page.bilibili_banner!=null) ? page.bilibili_banner : theme.bilibili_banner.style if (banner_style === 'autumn') #autumnBanner div img(src='/bilibiliBanner/autumn/bilibili-autumn-1.png') div img(src='/bilibiliBanner/autumn/bilibili-autumn-2.png') div img(src='/bilibiliBanner/autumn/bilibili-autumn-3.png') div img(src='/bilibiliBanner/autumn/bilibili-autumn-4.png') div img(src='/bilibiliBanner/autumn/bilibili-autumn-5.png') div img(src='/bilibiliBanner/autumn/bilibili-autumn-6.png') else if (banner_style === 'winter') #winterBanner .view img.morning(src='/bilibiliBanner/winter/bilibili-winter-view-1.png' alt='') img.afternoon(src='/bilibiliBanner/winter/bilibili-winter-view-2.png' alt='') video.evening(autoplay='' loop='' muted='') source(src='/bilibiliBanner/winter/bilibili-winter-view-3.webm' type='video/webm') img.window-cover(src='/bilibiliBanner/winter/bilibili-winter-view-3-snow.png' alt='') .tree img.morning(src='/bilibiliBanner/winter/bilibili-winter-tree-1.png' alt='') img.afternoon(src='/bilibiliBanner/winter/bilibili-winter-tree-2.png' alt='') img.evening(src='/bilibiliBanner/winter/bilibili-winter-tree-3.png' alt='') script(async data-pjax src=url_for(theme.CDN.bilibili_banner)) 2.前往%brt%\\themes\\butterfly\\source\\css\\新建一个名为bilibiliBanner.css的文件 在其内部写入以下代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111/* autumnBanner */@media screen and (max-width: 1000px) { #autumnBanner { display: none !important; }}#autumnBanner { height: 100%; position: relative; overflow: hidden; filter: brightness(70%);}#autumnBanner > div { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; --offset: 0px; --blur: 2px;}#autumnBanner > div > img { display: block; width: 110%; height: 100%; object-fit: cover; transform: translatex(var(--offset)); filter: blur(var(--blur));}/* winterBanner */@media screen and (max-width: 1000px) { #winterBanner { display: none !important; }}#winterBanner { height: 100%; position: relative; width: 100%; overflow: hidden; --percentage: 0.5;}#winterBanner .view,#winterBanner .tree { position: absolute; top: 0; right: 0; bottom: 0; left: 0; display: flex; justify-content: center; align-items: center;}#winterBanner img,#winterBanner video { position: absolute; display: block; max-width: 120% !important; width: 120% !important; height: 100%; object-fit: cover; filter: brightness(70%);}#winterBanner .morning { z-index: 20; opacity: calc(1 - (var(--percentage) - 0.25) / 0.25);}#winterBanner .afternoon { z-index: 10; opacity: calc(1 - (var(--percentage) - 0.5) / 0.5);}#winterBanner .view { transform: translatex(calc(var(--percentage) * 100px));}#winterBanner .tree { transform: translatex(calc(var(--percentage) * 50px)); filter: blur(3px);}#winterBanner .view,#winterBanner .tree,#winterBanner .morning,#winterBanner .afternoon { transition: 0.2s all ease-in;}#winterBanner.moving .view,#winterBanner.moving .tree,#winterBanner.moving .morning,#winterBanner.moving .afternoon { transition: none;}#winterBanner .window-cover { opacity: calc((var(--percentage) - 0.9) / 0.1);} 3.前往%brt%\\themes\\butterfly\\source\\js\\新建一个名为bilibili-banner.js的文件 在其内部写入以下代码 1234567891011121314151617181920212223242526272829303132333435363738394041//autumn_bannervar autumnBanner = document.querySelector("#autumnBanner");if (autumnBanner) { var images = document.querySelectorAll("#autumnBanner > div > img"); autumnBanner.addEventListener("mousemove", (e) => { let percentage = e.clientX / window.outerWidth; let offset = 10 * percentage; let blur = 20; for (let [index, image] of images.entries()) { offset *= 1.3; let blurValue = Math.pow(index / images.length - percentage, 2) * blur; image.style.setProperty("--offset", `${offset}px`); image.style.setProperty("--blur", `${blurValue}px`); } });}//winter_bannervar winterBanner = document.querySelector("#winterBanner");if (winterBanner) { var startingPoint; winterBanner.addEventListener("mouseenter", (e) => { startingPoint = e.clientX; winterBanner.classList.add("moving"); }); winterBanner.addEventListener("mouseout", (e) => { winterBanner.classList.remove("moving"); winterBanner.style.setProperty("--percentage", 0.5); }); winterBanner.addEventListener("mousemove", (e) => { let percentage = (e.clientX - startingPoint) / window.outerWidth + 0.5; winterBanner.style.setProperty("--percentage", percentage); });} 4.在主题的 source 文件夹下新建bilibiliBanner文件夹,将我所提供的资源解压,直接放入进去(里面一定只有两个目录) 5.进入%brt%\\themes\\butterfly\\layout\\includes\\header\\文件夹,找到index.pug在内部注入 bilibili_banner 组件 在 include ./nav.pug 配置下 if is_post()配置上添加以下配置(请直接复制粘贴,避免代码缩进导致的错误 ❌) 123- var bilibili_banner = (typeof(page.bilibili_banner) != "undefined" && page.bilibili_banner!=null) ? page.bilibili_banner : theme.bilibili_banner.enableif (bilibili_banner) include ./bilibili-banner.pug 6.修改%brt\\%config%\\_config.butterfly.yml(请将%config%替换为你主题配置文件的位置,如果在根目录请无视) 找到 CDN 配置,在 utils: /js/utils.js 配置的后面添加以下配置 1bilibili_banner: /js/bilibili-banner.js 添加 _**css**_ 配置项。此处使用了异步加载,同时做了媒体选择,对手机是不会生效的。因为手机的 _**banner**_ 高度会导致适配效果很差。 我们找到 inject 配置大项的 head 小项,在其内部添加以下配置: 1- <link rel="stylesheet" href="/css/bilibiliBanner.css" media="defer" onload="this.media='screen'"> 7.添加控制开关 在 butterfly 主题配置中添加以下配置: 1234# banner样式bilibili_banner: enable: true # 开关banner style: winter # autumn 秋季样式 ;winter 冬季样式 除了在主题配置文件通过配置 bilibili_banner: 的默认项,还可以在每个页面的 markdown 文件中通过 front-matter 控制单页配置。提供了三个选项: false : 关闭该页面的动态 banner 显示 autumn : 开启该页面的动态 banner,并设置主题为秋季 winter : 开启该页面的动态 banner,并设置主题为冬季页面配置项优先级高于主题配置 悬停左上角时在网站顶部中间位置会出现描述 1.进入%brt%\\themes\\butterfly\\layout\\includes\\header\\修改名为nav.pug的文件 找到 12span#blog_namea#site-name(href=url_for('/')) #[=config.title] 将它们删除,并替换为以下代码(请直接复制粘贴,避免缩进错误 ❌): 12345678910- var pagedescr = (typeof(page.description) != "undefined" && page.description!=null) ? page.description : '欢迎您来到了Hajeekn的小木屋呢,不过看起来有点漏水🐕' if is_post() span#blog_name a#site-name(onclick='btf.scrollToDest(0,500)' data-title=pagedescr) #[=config.title] else if is_page() span#blog_name a#site-name(href=url_for('/') data-title=pagedescr) #[=page.title] else span#blog_name a#site-name(href=url_for('/') data-title=pagedescr) #[=config.title] 2.因为 hexo 自带缓存的关系,如果我们用的是缓存式引入的话,nav 的刷新是惰性的,我们需要它根据文章和页面的切换实时变动。所以需要改动一下引入逻辑。打开%brt%\\themes\\butterfly\\layout\\includes\\header\\index.pug 找到 1!=partial('includes/header/nav', {}, {cache:theme.fragment_cache}) 删除,并将它修改为以下代码(请直接复制粘贴,避免缩进错误 ❌): 1234include ./nav.pugif top_img !== false if is_post() include ./post-info.pug (如果您添加了 BiliBili 动态 banner,请将它放置在在 if is_post()的前面 if top_img !== false 的后面,避免报错) 3.进入%brt%\\themes\\butterfly\\source\\css\\_layout\\新建_custom.styl 在其内部输入以下代码(请直接复制粘贴,避免缩进错误 ❌): 1234567891011121314151617181920212223242526272829303132/*标题悬停显示文章描述*/#site-name &:hover &:before position: fixed width:fit-content margin:auto left:0; right:0 top:10% border-radius: 10px text-align: center z-index: 100 content: attr(data-title) font-size: 20px color: #fff padding: 10px background-color: rgba(#49B1F5,0.9)/* 夜间模式适配 */[data-theme=dark] a#site-name &:hover &:before background-color: rgba(#121212,0.8)/*标题超过隐藏并显示省略号*/@media screen and (max-width: 768px) a#site-name -webkit-line-clamp 1 word-break break-all display -webkit-box -webkit-box-orient vertical overflow hidden 主页置顶的 ♂gitcalendar♂哪个男孩纸不想拥有一个状态显示呢?这个模块就会教大家在 Butterfly 使用 gitcalendar 准备好了吗?Go Go! 1.前往%brt\\themes\\butterfly\\layout\\includes\\新建一个名为gitcalendar.pug的文件 在其内部添加以下代码(请直接复制粘贴,避免缩进错误 ❌): 12345678910111213141516171819202122232425262728293031323334353637383940414243444546#gitcalendar.gitcalendar #gitmessage(:style='{top:y+px,left:x+px,position: fixed,zIndex:9999}') .angle-wrapper span {{span1}} &nbsp; span {{span2}} 次上传 .position-relative .border.py-2.graph-before-activity-overview .js-gitcalendar-graph.mx-md-2.mx-3.d-flex.flex-column.flex-items-end.flex-xl-items-center.overflow-hidden.pt-1.is-graph-loading.graph-canvas.gitcalendar-graph.height-full.text-center #gitcalendarcanvasbox(v-if='simplemode') canvas#gitcanvas(style='animation: none;') svg.js-gitcalendar-graph-svg(width='100%', viewBox='0 0 770 128', v-if='!simplemode') text.month(:x='32 + monthindex*64', y='20', v-for='(month,monthindex) in monthchange') {{month}} text.wday(text-anchor='start', dx='0', dy='40') 日 text.wday(text-anchor='start', dx='0', dy='65') 二 text.wday(text-anchor='start', dx='0', dy='90') 四 text.wday(text-anchor='start', dx='0', dy='115') 六 g(v-for='(weekitem,weekIndex) in data', :transform='\\'translate(\\'+ (16 + weekIndex*14) + \\',\\' + \\'0)\\'') rect(@mouseover="selectStyle(dayitem,$event)" @mouseleave="outStyle()" v-for='(dayitem,dayIndex) in weekitem', :style='{fill:thiscolor(dayitem.count),shapeRendering:crispedges}', :data-score='dayitem.count', :data-date='dayitem.date', x='0', :y=' 30 + dayIndex*13 ', width='11', height='11') .contrib-footer.clearfix.mt-1.mx-3.px-3.pb-1 .float-left.text-gray | 数据来源 a(:href="'https://github.com/'+ user ", target='blank') @{{user}} .contrib-legend.text-gray | Less ul.legend li(:style='{backgroundColor:color[0]}') li(:style='{backgroundColor:color[2]}') li(:style='{backgroundColor:color[4]}') li(:style='{backgroundColor:color[6]}') li(:style='{backgroundColor:color[8]}') | More .contrib-column.contrib-column-first.table-column span.text-muted 过去一年提交 span.contrib-number {{total}} span.text-muted {{oneyearbeforeday}}&nbsp;-&nbsp;{{thisday}} .contrib-column.table-column span.text-muted 最近一月提交 span.contrib-number {{thisweekdatacore}} span.text-muted {{amonthago}}&nbsp;-&nbsp;{{thisday}} .contrib-column.table-column span.text-muted 最近一周提交 span.contrib-number {{weekdatacore}} span.text-muted {{aweekago}}&nbsp;-&nbsp;{{thisday}} 2.继续在这个目录下新建一个名为gitcalendar-js.pug的文件 在内部写入以下代码(请直接复制粘贴,避免缩进错误 ❌): 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245script. var gitcalendar = new Vue({ el: '#gitcalendar', data: { simplemode: !{theme.gitcalendar.simplemode}, user: '!{theme.gitcalendar.user}', fixed: 'fixed', px: 'px', x: '', y: '', span1: '', span2: '', month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], monthchange: [], oneyearbeforeday: '', thisday: '', amonthago: '', aweekago: '', weekdatacore: 0, datacore: 0, total: 0, datadate: '', data: [], positionplusdata: [], firstweek: [], lastweek: [], beforeweek: [], thisweekdatacore: 0, mounthbeforeday: 0, mounthfirstindex: 0, crispedges: 'crispedges', thisdayindex: 0, amonthagoindex: 0, amonthagoweek: [], firstdate: [], first2date: [], montharrbefore: [], monthindex: 0, color: !{theme.gitcalendar.color} }, methods: { selectStyle(data, event) { document.querySelector('.angle-wrapper').style.display = 'block' this.span1 = data.date; this.span2 = data.count; this.x = event.clientX - 100; this.y = event.clientY - 60 }, outStyle() { document.querySelector('.angle-wrapper').style.display = 'none' }, thiscolor(x) { if (x === 0) { let i = parseInt(x / 2); return this.color[0] } else if (x < 2) { return this.color[1] } else if (x < 20) { let i = parseInt(x / 2); return this.color[i] } else { return this.color[9] } }, } }); var apiurl = '!{theme.gitcalendar.apiurl}' ? 'https://!{theme.gitcalendar.apiurl}/api?' : 'https://githubapi.ryanchristian.dev/user/' var githubapiurl = apiurl + gitcalendar.user; //canvas绘图 function responsiveChart() { let c = document.getElementById("gitcanvas"); if (c) { let cmessage = document.getElementById("gitmessage"); let ctx = c.getContext("2d"); c.width = document.getElementById("gitcalendarcanvasbox").offsetWidth; let linemaxwitdh = 0.96 * c.width / gitcalendar.data.length; c.height = 9 * linemaxwitdh; let lineminwitdh = 0.8 * linemaxwitdh; let setposition = { x: 0.02 * c.width, y: 0.025 * c.width }; for (let week in gitcalendar.data) { weekdata = gitcalendar.data[week]; for (let day in weekdata) { let dataitem = { date: "", count: "", x: 0, y: 0 }; gitcalendar.positionplusdata.push(dataitem); ctx.fillStyle = gitcalendar.thiscolor(weekdata[day].count); setposition.y = Math.round(setposition.y * 100) / 100; dataitem.date = weekdata[day].date; dataitem.count = weekdata[day].count; dataitem.x = setposition.x; dataitem.y = setposition.y; ctx.fillRect(setposition.x, setposition.y, lineminwitdh, lineminwitdh); setposition.y = setposition.y + linemaxwitdh }; setposition.y = 0.025 * c.width; setposition.x = setposition.x + linemaxwitdh }; ctx.font = "600 Arial"; ctx.fillStyle = '#aaa'; ctx.fillText("日", 0, 1.9 * linemaxwitdh); ctx.fillText("二", 0, 3.9 * linemaxwitdh); ctx.fillText("四", 0, 5.9 * linemaxwitdh); ctx.fillText("六", 0, 7.9 * linemaxwitdh); let monthindexlist = c.width / 24; for (let index in gitcalendar.monthchange) { ctx.fillText(gitcalendar.monthchange[index], monthindexlist, 0.7 * linemaxwitdh); monthindexlist = monthindexlist + c.width / 12 }; cmessage.onmousemove = function(event) { document.querySelector('.angle-wrapper').style.display = 'none' }; c.onmousemove = function(event) { document.querySelector('.angle-wrapper').style.display = 'none' getMousePos(c, event); }; function getMousePos(canvas, event) { var rect = canvas.getBoundingClientRect(); var x = event.clientX - rect.left * (canvas.width / rect.width); var y = event.clientY - rect.top * (canvas.height / rect.height); //console.log("x:"+x+",y:"+y); for (let item of gitcalendar.positionplusdata) { let lenthx = x - item.x; let lenthy = y - item.y; //console.log(lenthx,lenthy); if (0 < lenthx && lenthx < lineminwitdh) { if (0 < lenthy && lenthy < lineminwitdh) { //console.log(item.date,item.count) document.querySelector('.angle-wrapper').style.display = 'block' gitcalendar.span1 = item.date; gitcalendar.span2 = item.count; gitcalendar.x = event.clientX - 100; gitcalendar.y = event.clientY - 60 } } //if(0< x - item.x <lineminwitdh&&0< y - item.y <lineminwitdh){ //console.log(item.count,item.date); //} } } } } //数据统计算法 function addlastmonth() { if (gitcalendar.thisdayindex === 0) { thisweekcore(52); thisweekcore(51); thisweekcore(50); thisweekcore(49); thisweekcore(48); gitcalendar.thisweekdatacore += gitcalendar.firstdate[6].count; gitcalendar.amonthago = gitcalendar.firstdate[6].date } else { thisweekcore(52); thisweekcore(51); thisweekcore(50); thisweekcore(49); thisweek2core(); gitcalendar.amonthago = gitcalendar.first2date[gitcalendar.thisdayindex - 1].date } }; function thisweek2core() { for (let i = gitcalendar.thisdayindex - 1; i < gitcalendar.first2date.length; i++) { gitcalendar.thisweekdatacore += gitcalendar.first2date[i].count } }; function thisweekcore(index) { for (let item of gitcalendar.data[index]) { gitcalendar.thisweekdatacore += item.count } }; function addlastweek() { for (let item of gitcalendar.lastweek) { gitcalendar.weekdatacore += item.count } }; function addbeforeweek() { for (let i = gitcalendar.thisdayindex; i < gitcalendar.beforeweek.length; i++) { gitcalendar.weekdatacore += gitcalendar.beforeweek[i].count } }; function addweek(data) { if (gitcalendar.thisdayindex === 6) { gitcalendar.aweekago = gitcalendar.lastweek[0].date; addlastweek() } else { lastweek = data.contributions[51]; gitcalendar.aweekago = lastweek[gitcalendar.thisdayindex + 1].date; addlastweek(); addbeforeweek() } } fetch(githubapiurl) .then(data => data.json()) .then(data => { gitcalendar.data = data.contributions; gitcalendar.total = data.total; gitcalendar.first2date = gitcalendar.data[48]; gitcalendar.firstdate = gitcalendar.data[47]; gitcalendar.firstweek = data.contributions[0]; gitcalendar.lastweek = data.contributions[52]; gitcalendar.beforeweek = data.contributions[51]; gitcalendar.thisdayindex = gitcalendar.lastweek.length - 1; gitcalendar.thisday = gitcalendar.lastweek[gitcalendar.thisdayindex].date; gitcalendar.oneyearbeforeday = gitcalendar.firstweek[0].date; gitcalendar.monthindex = gitcalendar.thisday.substring(5, 7) * 1; gitcalendar.montharrbefore = gitcalendar.month.splice(gitcalendar.monthindex, 12 - gitcalendar.monthindex); gitcalendar.monthchange = gitcalendar.montharrbefore.concat(gitcalendar.month); addweek(data); addlastmonth(); responsiveChart(); }) .catch(function(error) { console.log(error); }); //手机版更换为svg绘制 if (document.getElementById("gitcalendarcanvasbox").offsetWidth < 500) { gitcalendar.simplemode = false } //当改变窗口大小时重新绘制canvas window.onresize = function() { if (gitcalendar.simplemode) responsiveChart() } //解决滚动滑轮时出现的标签显示 window.onscroll = function() { if (document.querySelector('.angle-wrapper')) { document.querySelector('.angle-wrapper').style.display = 'none' } }; 然后你要去创建 Stylus 样式辣 3.进入%brt%\\themes\\butterfly\\source\\css\\_layout\\新建一个名为gitcalendar.styl的文件 用 编 辑 器 打开在文件内部 植 入 以下代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178if hexo-config('gitcalendar.enable') .gitcalendar font-family SourceHanSans-Medium border 1px solid #DDDDDD border-radius 3px min-height 120px text-align center margin 0 auto border-width 0px width 100% display flex display -webkit-flex justify-content center align-items center flex-wrap wrap img &.spinner width 70px margin-top 50px min-height 70px .gitcalendar-graph text.wday, .gitcalendar-graph text.month font-size 10px fill #aaa .contrib-legend text-align right padding 0 14px 10px 0 display inline-block float right .legend display inline-block list-style none margin 0 5px position relative bottom -1px padding 0 li display inline-block width 10px height 10px .text-small font-size 12px color #767676 .gitcalendar-graph padding 15px 0 0 text-align center .contrib-column text-align center border-left 1px solid #ddd border-top 1px solid #ddd font-size 11px .contrib-column-first border-left 0 .table-column padding 10px display table-cell width 33% vertical-align top .contrib-number font-weight 300 line-height 1.3em font-size 24px display block .monospace text-align center color #000 font-family monospace a color #1D75AB text-decoration none .contrib-footer font-size 11px padding 0 10px 12px text-align left width 100% box-sizing border-box height 26px .left &.text-muted float left margin-left 9px color #767676 a color #4078c0 text-decoration none .left.text-muted a:hover, .monospace a:hover text-decoration underline h2 &.f4 &.text-normal &.mb-3 display none .float-left &.text-gray float left #user-activity-overview display none .day-tooltip white-space nowrap position absolute z-index 99999 padding 10px font-size 12px color #959da5 text-align center background rgba(0,0,0,.85) border-radius 3px display none pointer-events none strong color #dfe2e5 &.is-visible display block &:after position absolute bottom -10px left 50% width 5px height 5px box-sizing border-box margin 0 0 0 -5px content " " border 5px solid transparent border-top-color rgba(0,0,0,.85) .position-relative width 100% padding-left 20px padding-right 20px @media screen and (max-width: 650px) .contrib-column display none .angle-wrapper z-index 9999 display inline display none width 200px height 40px position relative padding 5px 0 background rgba(0, 0, 0, 0.8) border-radius 8px text-align center color white span padding-bottom 1em &:before content '' width 0 height 0 border 10px solid transparent border-top-color rgba(0, 0, 0, 0.8) position absolute left 47.5% top 100% .angle-box position fixed padding 10px 4.快马加鞭的前往%brt%\\themes\\butterfly\\layout\\找到我们的 食 物 index.pug 为了方便我们食用,找到#recent-posts.recent-posts 在下面插入一段代码 123456if theme.gitcalendar.enable .recent-post-item(style='width:100%') !=partial('includes/gitcalendar', {}, {cache:theme.fragment_cache})if theme.categoryBar.enable .recent-post-item(style='height:auto;width:100%;padding:0px;') #categoryBar!= list_categories(site.categories,{class: 'categoryBar',depth: 1}) 记得一定要放在+postUI 的前一行哦- 5.进入%brt%\\themes\\butterfly\\layout\\includes\\的additional-js.pug文件在 script(src=url_for(theme.CDN.utils))的上面加入以下内容 1script((src = url_for(theme.CDN.vue))); 然后再找到 script(defer src=url_for(theme.CDN.busuanzi))配置项在这下面放入以下代码 123 if theme.gitcalendar.enable !=partial('includes/gitcalendar-js', {}, {cache:theme.fragment_cache})!=partial('includes/third-party/prismjs', {}, {cache:theme.fragment_cache}) 好的,修改完了,接下来我们就可以去添加 CDN 配置项和 gitcalendar 配置项了进入%brt%\\_config.butterfly.yml找到 CDN 配置项在 utils: /js/utils.js 配置项的下面插入以下代码 1vue: https://cdn1.tianli0.top/npm/[email protected] 然后随便找一个屑位置,插入以下代码: 123456789101112131415#gitcalendargitcalendar: enable: true simplemode: true #设为true时使用canvas绘制gitgitcalendar, #设为false时使用svg绘制gitgitcalendar #canvas:dom数少,但图像会发生模糊,自适应一般 #svg:dom数多,图像清晰,自适应更佳 user: slblog-github #这里填写你的github用户名 apiurl: # 留空为默认公共API # 以下色调选择喜欢的一行保留即可。其余注释。 color: "['#e4dfd7', '#f9f4dc', '#f7e8aa', '#f7e8aa', '#f8df72', '#fcd217', '#fcc515', '#f28e16', '#fb8b05', '#d85916', '#f43e06']" #橘黄色调 # color: "['#ebedf0', '#fdcdec', '#fc9bd9', '#fa6ac5', '#f838b2', '#f5089f', '#c4067e', '#92055e', '#540336', '#48022f', '#30021f']" #浅紫色调 # color: "['#ebedf0', '#f0fff4', '#dcffe4', '#bef5cb', '#85e89d', '#34d058', '#28a745', '#22863a', '#176f2c', '#165c26', '#144620']" #翠绿色调 # color: "['#ebedf0', '#f1f8ff', '#dbedff', '#c8e1ff', '#79b8ff', '#2188ff', '#0366d6', '#005cc5', '#044289', '#032f62', '#05264c']" #天青色调 然后参照上面的配置就行辣~关于配置 apiurl 可以参照Akilar 大佬的文章自建 API 哦各位有什么想魔改的可以评论以一下(只要不太难,毕竟我还是个 初 中 生) 在你的网站添加一个 ♂ 美妙 ♂ 的 PACE 加载进度条这个很简单,只需要一个 JS 和一个 CSS 就可以了现在我们开始吧首先进入%brt%\\_config.butterfly.yml找到 inject 大项在 bottom 配置项下面添加如下配置: 12- <script async data-pjax src="https://cdn1.tianli0.top/gh/HCLonely/[email protected]/js/custom/pace.min.js"></script>- <link rel=stylesheet href="https://cdn1.tianli0.top/gh/HCLonely/[email protected]/css/custom/pace-theme-flash.min.css"> 然后就行了,哈哈其实是用来水一下字数的 备用引入备用 1 12- <script async data-pjax src="https://static.slqwq.cn/script/pace-main.min.js"></script>- <link rel=stylesheet href="https://static.slqwq.cn/styles/pace-theme-flash.min.css"> 备用 2 12- <script async data-pjax src="https://static-2.slqwq.cn/script/pace-main.min.js"></script>- <link rel=stylesheet href="https://static-2.slqwq.cn/styles/pace-theme-flash.min.css"> 备用 3 12- <script async data-pjax src="https://static-3.slqwq.cn/script/pace-main.min.js"></script>- <link rel=stylesheet href="https://static-3.slqwq.cn/styles/pace-theme-flash.min.css"> 备用 4 12- <script async data-pjax src="https://cdn1.tianli0.top/gh/slblog-github/Static@main/script/pace-main.min.js"></script>- <link rel=stylesheet href="https://cdn1.tianli0.top/gh/slblog-github/Static@main/styles/pace-theme-flash.min.css">","categories":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/categories/Hexo/"},{"name":"主题魔改","slug":"Hexo/主题魔改","permalink":"https://blog.slqwq.cn/categories/Hexo/%E4%B8%BB%E9%A2%98%E9%AD%94%E6%94%B9/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/tags/Hexo/"},{"name":"主题魔改","slug":"主题魔改","permalink":"https://blog.slqwq.cn/tags/%E4%B8%BB%E9%A2%98%E9%AD%94%E6%94%B9/"}],"author":"Hajeekn"},{"title":"使用Cloud Studio在云端写作✍","slug":"af1bhg","date":"2021-01-21T20:00:46.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2021/posts/2ir0l12g/index.html","link":"","permalink":"https://blog.slqwq.cn/2021/posts/2ir0l12g/index.html","excerpt":"","text":"Hey,这篇文章我们会为你介绍一个写作的新方法———Cloud Studio 云写作(不是广告) 初始化 Cloud Studio 工作空间想要在 Cloud Studio 云写作,首先你要上传源码到仓库。你可以上传到 GitLab、GitHub、Coding 等代码托管商首先我们打开 Cloud Studio地址为 %PROJECTNAME%.cloudstudio.net/dashboard/workspace进入后选择新建工作空间工作空间名可以随便填运行环境选择 Node.js代码来源可以选择空 同步仓库现在进入工作空间后我们选择上栏的终端新建终端然后在下面就会出现类似这样的东西这就是我们的终端了,现在你要把你博客上传到 GitHub 之类的代码托管网站上,方便我们同步。在你的终端内输入 1$ git clone %REPOURL% . 仓库克隆完后在列表会出现你的文件,这时候你就可以像本地一样正常写文章了(其实我还是觉得 GitHub Actions 自动部署好一点) %REPOURL%. 仓库地址 ↩ %PROJECTNAME%. 项目名称 ↩","categories":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/categories/Hexo/"},{"name":"云端写作","slug":"Hexo/云端写作","permalink":"https://blog.slqwq.cn/categories/Hexo/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/tags/Hexo/"},{"name":"云端","slug":"云端","permalink":"https://blog.slqwq.cn/tags/%E4%BA%91%E7%AB%AF/"},{"name":"高效写作","slug":"高效写作","permalink":"https://blog.slqwq.cn/tags/%E9%AB%98%E6%95%88%E5%86%99%E4%BD%9C/"}],"author":"Hajeekn"},{"title":"使用Vercel搭建一个静态网站","slug":"vxyp0t","date":"2020-12-11T21:53:28.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/98e384e2/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/98e384e2/index.html","excerpt":"","text":"提供免费搭建网站的服务有很多,像热铁盒主机、Coding Pages、GitHub Pages······Vercel 也是其中之一,今天教大家使用 Vercel 搭建一个静态网站。 登录账号前往 Vercel 官网 点击 Login 按钮 点击后会跳转至这个页面 授权服务选择一个你有的账号 按钮 1.连接到 GitHub 按钮 2.连接到 GitLab 按钮 3.连接到 Bitbucket 如果你都没有就可以点击下面的 Don’t have an account? Sign Up(没有一个账号?注册) 这里用 GitHub 来演示 登录完成后会跳转到仪表盘 这时候我们先回到 GitHub,我们先创建一个仓库放入测试 html 导入项目接着我们复制刚创建的仓库的 git 地址 进入这个页面的时候注意,由于我们的仓库里放了一个 html,所以这里不要做任何设置直接点击蓝色的 Deploy 按钮 出现这个页面就代表你的网页成功部署了 我们点击 Visit 按钮去测试一下 成功! 这样就可以搭建一个简单的静态网站了。 对于 Hexo 你可以直接放源码上去,然后配置构建命令,不过这个内容不属于本文范围之类,所以就不讲了。 Thanks For You","categories":[{"name":"Vercel","slug":"Vercel","permalink":"https://blog.slqwq.cn/categories/Vercel/"}],"tags":[{"name":"网站","slug":"网站","permalink":"https://blog.slqwq.cn/tags/%E7%BD%91%E7%AB%99/"},{"name":"Free","slug":"Free","permalink":"https://blog.slqwq.cn/tags/Free/"}],"author":"Hajeekn"},{"title":"如何使用在线工具 - Photopea","slug":"gkg19k","date":"2020-10-02T17:24:42.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/c9f23913/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/c9f23913/index.html","excerpt":"","text":"众所周知,Adobe 全家桶的”PS”是处理图片不可缺少的一款工具 可稍不注意就会 无响应警告 不过国外有一位大神开发出了在线版本的”PS”,并且将”PS”的大部分功能都给还原了 这是由 Ivan Kuckir 大神开发的Photopea 我们首先打开这个网站 点击新建项目,当然也可以从电脑打开 接下来它会让我们选择项目大小和模板之类的 这里可以直接不选择模板直接选择大小,然后填写一下名字就创建 进入项目后可以看到这样的界面 接下来我演示怎么做一个简单的 Logo 首先点击左边工具栏的”T”(文字工具) 接着在上方会出现 这里我们可以自己调节字体、文字大小、文字颜色等 这里我选的是 Hanalei Fill 字体 大小我调节的是 499px 然后写入自己想要的文字 写入完成后是这个样子的 接下来我们贴个图 去iconfont找个好康的图标,下载下来 svg 下载下来 svg 后将这个图片拖进 Photopea 然后调好大小就完成了 接着点击文件-另存为 PSD 保存这个工程文件,方便下次修改 然后点击 然后就可以下载下来 Logo 了 顺便这个网站还提供 SVG 下载哦","categories":[{"name":"实用工具","slug":"实用工具","permalink":"https://blog.slqwq.cn/categories/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/"},{"name":"在线工具","slug":"实用工具/在线工具","permalink":"https://blog.slqwq.cn/categories/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7/"}],"tags":[{"name":"实用工具","slug":"实用工具","permalink":"https://blog.slqwq.cn/tags/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/"}],"author":"Hajeekn"},{"title":"推荐一些实用工具","slug":"qqzb5p","date":"2020-08-28T10:09:19.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/c5ef192c/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/c5ef192c/index.html","excerpt":"","text":"RaiDrive官网:https://www.raidrive.com/download 这款软件可以帮你把 NAS、OneDrive、Google Drive 等网盘映射到本地,目前博主正在用,非常好评! IDM官网:http://www.internetdownloadmanager.com/ 这是一款多线程下载器,最高支持 32 线程 下载速度杠杠滴! Typora官网:https://www.typora.io/ 一款 MarkDown 写作工具,支持自定义主题 也支持使用 CSS 自构建一款心爱的主题 ScreenToGif官网:https://www.screentogif.com/ GitHub:https://github.com/NickeManarin/ScreenToGif 可以录制高帧率的 GIF OBS官网:https://obsproject.com/ 主播都在用的推流/录制软件,支持自定义推流服务器 也可以使用内置的 落雪音乐GitHub:https://github.com/lyswhut/lx-music-desktop 支持酷我、酷狗、企鹅、网易等音乐平台的歌曲搜索 还支持显示歌词、下载歌词、收藏等操作 BlockbenchGitHub:https://github.com/JannisX11/blockbench 一款模型制作工具 支持制作著名游戏 Minecraft 的模型和制作其它引擎的模型","categories":[{"name":"实用工具","slug":"实用工具","permalink":"https://blog.slqwq.cn/categories/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/"}],"tags":[{"name":"干货","slug":"干货","permalink":"https://blog.slqwq.cn/tags/%E5%B9%B2%E8%B4%A7/"}],"author":"Hajeekn"},{"title":"使用 Travis CI 持续集成工具自动化部署 Hexo","slug":"db36zg","date":"2020-08-19T16:02:36.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/9ed5997f/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/9ed5997f/index.html","excerpt":"","text":"众所周知,Hexo 是一款免费开源的静态博客生成工具,使用它可以快速生成一个博客。但随着文章之类的东西增加,生成的速度也会逐渐变慢,如果你配置不够,那搞不好就要几小时才能生成,并且还有一个好处: 即走即编辑,就算你是手机也可以在线编辑文件,免去配置环境。 所以今天我教大家如何使用持续集成工具 — Travis CI 来部署 Hexo 创建仓库我们首先打开GitHub 选择 仓库名称可以随意 但是一定要选择 Private,不然你的博客源码就会被别人看到,到时候使用 Token 提交的各位小伙伴的仓库就不保喽 创建完成后复制你的仓库克隆地址 在 Hexo 根目录下打开终端 输入 1git add travis 复制的仓库克隆地址 创建 Travis CI 配置接着去创建一个文件:.travis.yml 里面输入 123456789101112131415161718192021222324252627282930language: node_jsnode_js: stablesudo: required# Travis-CI Cachingcache: directories: - node_modules# S: Build Lifecycleinstall: - npm installscript: - hexo clean && hexo g - cd ./public - git init - git config user.name "NAME" - git config user.email "EMAIL" - git add . - git commit -m "Update" - git push --force --quiet "XXX" master:master - git push --force --quiet "XXX" master:master# after_script:branches: only: - master 其中 NAME 改为 git 用户名 EMAIL 改为邮箱 XXX 改为 GitHub/Coding 的部署地址(Token)(下文会讲到) 配置 GitHub Token写完之后去GitHub创建一个 Token 权限直接全选 然后把你 Hexo 配置 GitHub 的 SSH/HTTPS 部署地址改为 1https://你的[email protected]/用户名/仓库.git 配置 Coding Token(有就使用,没有就不使用)进入 Coding 企业 右上角找到个人账户设置 进入访问令牌设置 新建令牌 权限依然全选 选择完后将你 Hexo 的 coding SSH/HTTPS 部署地址改为 1https://username:[email protected]/用户名/仓库名.git 注册 Travis首先我们要打开Travis 官网 然后注册一个账户 注册完成后会跳转到仪表盘 我们点击那个小加号 找到从跳转的页面找到我们刚才创建的仓库 可以看到没有构建接下来我们 在终端内输入 123git add --allgit commit -m "这里随便"git push -u travis master -f 提交完成后稍等片刻,在 Travis 后台就会出现部署了","categories":[],"tags":[],"author":"Hajeekn"},{"title":"搭建 Hexo","slug":"vb1ze2","date":"2020-08-19T15:29:37.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/731e29be/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/731e29be/index.html","excerpt":"","text":"本期教大家如何搭建 Hexo 首先需要准备的东西如下: 1.电脑 2.手 3.脑袋 好了没了 安装 Node.js由于 Hexo 这款博客程序是基于 Node.js 所构建的,所以我们需要下载 Node.js 打开Node.js 官网 选择下载稳定版(LTS):12.18.3 下载并安装完成后验证是否安装好了的方法 打开终端 输入 node -v 和 npm -v 如果出现版本号 v….就说明安装成功 安装 Git使用 Hexo 呢 Git 也是必不可少的 打开Git 官网 点击 Donload 2.28.0 for Windows 即可进行下载 但由于是使用 GitHub 的 release 进行下载所以速度较慢 国内用户可以使用:淘宝镜像源进行下载,最新版本需要翻到最底下进行下载 安装好后在桌面单击右键,如果右键菜单出现 Git Bash Here 的字眼则代表安装成功 安装 Hexo新建一个文件夹,在里面右键 选择 Git Bash Here 打开 Git 终端 输入 1npm install hexo-cli -g 安装 Hexo-cli 安装好后输入 1hexo init 来初始化 Hexo,此步骤会从 GitHub 下载 Hexo 的主题、依赖文件所以时间会比较久,请耐心等待哦 o( ̄ ▽  ̄)ブ如果你有条件就科学上网吧~ 当提示 INFO Start blogging with Hexo!时就安装完成了 查看安装的文件夹 发现有这些文件/文件夹: node_modules scaffolds source themes .gitignore _config.yml package.json package-lock.json 其中 node_modules 是你安装的插件存放位置,删掉了必须重新 npm i scaffolds 是你博客的模板存储位置,page.md 就是创建 page 时使用什么模板以此类推就行 source 是用来存放博客资源的,一般都是随手扔文件进去就行 .gitignore 目前用不到(除了使用 GitHub actions 等持续集成部署博客的) _config.yml 用来存放 Hexo 配置 package.json 顾名思义,就是你安装的插件名称和版本都会被存储在里面 其中我们要用到的是 themes、_config.yml 安装主题首先我们去Hexo 官方主题网站找一个好看的主题 这边用 Butterfly 为例 点击它的图片进去看看效果 个人觉得还行,目前我正在用,体验也非常好 这款主题的 GitHub 仓库为https://github.com/jerryc127/hexo-theme-butterfly 进入后在 README.md 中有 2 种安装方法 1.使用普通安装方法(git clone) 2.使用 NPM 安装(npm install hexo-theme-butterfly) 这边用 GIT 做演示 复制指令 在终端内部粘贴并回车 安装完成后根据 GitHub 仓库的 README.md 提示还需要安装 pug&stylus 渲染器 指令如下: 1npm install hexo-renderer-pug hexo-renderer-stylus 安装依赖完成后我们打开_config.yml 找到 theme: 把它改为 Butterfly 保存文件,然后在终端执行 1hexo s 打开 Hexo 的本地预览工具看看效果 默认的打开地址是:http://localhost4000 用户可通过 hexo s -p 来指定访问端口 比如 2000 1080 8081 等 更改名称Hexo 安装完成后默认的名称为 Hexo,那么如何更改呢 首先打开_config.yml 找到”# Site” 更改 title subtitle description keywords author title 更改为您的博客名字 subtitle 更改为你的介绍 keywords 更改为你想要的关键字 author 更改为你自己的名字 部署到服务器一切准备完成后就可以部署了 这边演示 Coding 部署 双部署也一样 首先打开Coding 官网 如果没有账号就点击免费注册 注册完成进入你的企业 选择创建项目 项目模板使用 DevOps 名称可以随意 例如:👴 的博客等 这边用 👴 的博客示范 启用 README.md 初始化可以随意 公开源代码可以自选 配置完后点击完成创建 接下来进入持续部署-静态网站 进行实名认证 认证完成后点击立即发布静态网站 网站名称依旧随便填写 其他配置不要动 点击完成创建 这时候出现这个页面 选择设置 下滑找到自定义域名 复制用以代替 xxxx.coding-pages.com 作为网站的访问地址的 xxxx.coding-pages.com 然后打开 DNS 解析商 这边使用 dns.la 新建一个解析 解析设置: 其中主机记录可以自行设置 比如 www test cna 等 如果要直接用域名访问主机记录留空 做好解析之后回到 Coding 页面 添加刚才的域名 这边使用 test.slqwq.cn 做示范 这时候会出现这样的样子 这是在生成证书 证书状态变为正常后推荐打开强制 HTTPS 这些做完后打开_config.yml 找到 deploy 配置 里面这样填写 1234deploy: type: git repo: https://e.coding.net/企业名/项目名/仓库名.git branch: master 填写完后在终端内输入 1npm install hexo-deployer-git --save 安装 Hexo-Deployer-Git 安装完后就可以使用 1hexo clean && hexo d -g 部署了 End结束了~ 感谢您的观看 更多进阶功能可前往Hexo 文档和Butterfly 主题文档查看","categories":[],"tags":[],"author":"Hajeekn"},{"title":"关于3.0.0RC2版本Valine魔改出博主、访客、小伙伴的教程","slug":"ulhohz","date":"2020-08-04T15:41:39.000Z","updated":"2023-02-01T11:29:35.177Z","comments":true,"path":"2020/posts/8f68d635/index.html","link":"","permalink":"https://blog.slqwq.cn/2020/posts/8f68d635/index.html","excerpt":"","text":"关于 Butterfly 最新的 3.0.0RC2 版本如何魔改出博主、访客、小伙伴的教程 首先我们进行对比 发现 3.0.0RC 的 Valine.pug 与其他版本的结构不相同 其它版: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950- let emojiMaps = '""'if site.data.valine - emojiMaps = JSON.stringify(site.data.valine)script. function loadvaline () { function requestSetting (from, set) { var from = from var setting = set.split(',').filter(function(item){ return from.indexOf(item) > -1 }); setting = setting.length == 0 ? from :setting; return setting } var guestInfo = requestSetting(['nick','mail','link'],'#{ theme.valine.guest_info }') var requiredFields = requestSetting(['nick','mail'],'#{ theme.valine.requiredFields }') function initValine () { window.valine = new Valine({ el:'#vcomment', appId: '#{theme.valine.appId}', appKey: '#{theme.valine.appKey}', path: window.location.pathname, placeholder: '#{theme.valine.placeholder}', avatar: '#{theme.valine.avatar}', meta: guestInfo, pageSize: '#{theme.valine.pageSize}', lang: '#{theme.valine.lang}', recordIP: #{theme.valine.recordIP}, serverURLs: '#{theme.valine.serverURLs}', emojiCDN: '#{theme.valine.emojiCDN}', emojiMaps: !{emojiMaps}, enableQQ: #{theme.valine.enableQQ}, requiredFields: requiredFields, }); } if (typeof window.valine ==='object') initValine() else $.getScript('!{url_for(theme.CDN.valine)}', initValine) } if ('!{defaultComment}' === 'Valine' || !{theme.comments.load_begin}) { loadvaline() } else { function loadOtherComment () { loadvaline() } } RC2 版: 1234567891011121314151617181920212223242526272829303132333435363738- let emojiMaps = '""'if site.data.valine - emojiMaps = JSON.stringify(site.data.valine)script. function loadValine () { function initValine () { window.valine = new Valine({ el: '#vcomment', appId: '#{theme.valine.appId}', appKey: '#{theme.valine.appKey}', placeholder: '#{theme.valine.placeholder}', avatar: '#{theme.valine.avatar}', meta: '#{theme.valine.guest_info }'.split(','), pageSize: '#{theme.valine.pageSize}', lang: '#{theme.valine.lang}', recordIP: #{theme.valine.recordIP}, serverURLs: '#{theme.valine.serverURLs}', emojiCDN: '#{theme.valine.emojiCDN}', emojiMaps: !{emojiMaps}, enableQQ: #{theme.valine.enableQQ}, path: window.location.pathname, }); if ('#{theme.valine.requiredFields}') { valine.config.requiredFields= '#{theme.valine.requiredFields}'.split(',') } } if (typeof Valine === 'function') initValine() else $.getScript('!{url_for(theme.CDN.valine)}', initValine) } if ('!{theme.comments.use[0]}' === 'Valine' || !!{theme.comments.lazyload}) { if (!{theme.comments.lazyload}) loadComment(document.querySelector('#vcomment'),loadValine) else setTimeout(() => loadValine(), 0) } else { function loadOtherComment () { loadValine() } } 可以看到 script.下面的内容不一样 这就是不同之处了 这样也就导致部分根据 HCLonely 博客魔改 Valine 的用户无法找到魔改的地方 解决其实很简单 在 function loadValine 的前面加上 1234567891011function requestSetting (from, set) { var from = from var setting = set.split(',').filter(function(item){ return from.indexOf(item) > -1 }); setting = setting.length == 0 ? from :setting; return setting}var guestInfo = requestSetting(['nick','mail','link'],'#{ theme.valine.guest_info }')var requiredFields = requestSetting(['nick','mail','link'],'#{ theme.valine.requiredFields }') 即可,然后就可以继续按照 HCLonely 的魔改教程魔改了。 完结,撒花","categories":[{"name":"魔改","slug":"魔改","permalink":"https://blog.slqwq.cn/categories/%E9%AD%94%E6%94%B9/"},{"name":"评论","slug":"魔改/评论","permalink":"https://blog.slqwq.cn/categories/%E9%AD%94%E6%94%B9/%E8%AF%84%E8%AE%BA/"}],"tags":[{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/tags/Hexo/"},{"name":"魔改","slug":"魔改","permalink":"https://blog.slqwq.cn/tags/%E9%AD%94%E6%94%B9/"}],"author":"Hajeekn"}],"categories":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/categories/cloudflare/"},{"name":"ios","slug":"ios","permalink":"https://blog.slqwq.cn/categories/ios/"},{"name":"ipa","slug":"ios/ipa","permalink":"https://blog.slqwq.cn/categories/ios/ipa/"},{"name":"ax9000","slug":"ax9000","permalink":"https://blog.slqwq.cn/categories/ax9000/"},{"name":"docker","slug":"ax9000/docker","permalink":"https://blog.slqwq.cn/categories/ax9000/docker/"},{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/categories/docker/"},{"name":"electron","slug":"electron","permalink":"https://blog.slqwq.cn/categories/electron/"},{"name":"Magisk","slug":"Magisk","permalink":"https://blog.slqwq.cn/categories/Magisk/"},{"name":"picgo","slug":"picgo","permalink":"https://blog.slqwq.cn/categories/picgo/"},{"name":"github","slug":"github","permalink":"https://blog.slqwq.cn/categories/github/"},{"name":"p2p","slug":"p2p","permalink":"https://blog.slqwq.cn/categories/p2p/"},{"name":"ipfs","slug":"p2p/ipfs","permalink":"https://blog.slqwq.cn/categories/p2p/ipfs/"},{"name":"cloudreve","slug":"cloudreve","permalink":"https://blog.slqwq.cn/categories/cloudreve/"},{"name":"link","slug":"link","permalink":"https://blog.slqwq.cn/categories/link/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/categories/Windows/"},{"name":"windows","slug":"windows","permalink":"https://blog.slqwq.cn/categories/windows/"},{"name":"Windows11","slug":"Windows/Windows11","permalink":"https://blog.slqwq.cn/categories/Windows/Windows11/"},{"name":"书签同步","slug":"书签同步","permalink":"https://blog.slqwq.cn/categories/%E4%B9%A6%E7%AD%BE%E5%90%8C%E6%AD%A5/"},{"name":"Butterfly","slug":"Butterfly","permalink":"https://blog.slqwq.cn/categories/Butterfly/"},{"name":"Custom","slug":"Butterfly/Custom","permalink":"https://blog.slqwq.cn/categories/Butterfly/Custom/"},{"name":"评论","slug":"评论","permalink":"https://blog.slqwq.cn/categories/%E8%AF%84%E8%AE%BA/"},{"name":"部署日志","slug":"评论/部署日志","permalink":"https://blog.slqwq.cn/categories/%E8%AF%84%E8%AE%BA/%E9%83%A8%E7%BD%B2%E6%97%A5%E5%BF%97/"},{"name":"云端写作","slug":"云端写作","permalink":"https://blog.slqwq.cn/categories/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"},{"name":"语雀","slug":"云端写作/语雀","permalink":"https://blog.slqwq.cn/categories/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/%E8%AF%AD%E9%9B%80/"},{"name":"Leancloud","slug":"Leancloud","permalink":"https://blog.slqwq.cn/categories/Leancloud/"},{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/categories/Hexo/"},{"name":"主题魔改","slug":"Hexo/主题魔改","permalink":"https://blog.slqwq.cn/categories/Hexo/%E4%B8%BB%E9%A2%98%E9%AD%94%E6%94%B9/"},{"name":"云端写作","slug":"Hexo/云端写作","permalink":"https://blog.slqwq.cn/categories/Hexo/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"},{"name":"Vercel","slug":"Vercel","permalink":"https://blog.slqwq.cn/categories/Vercel/"},{"name":"实用工具","slug":"实用工具","permalink":"https://blog.slqwq.cn/categories/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/"},{"name":"在线工具","slug":"实用工具/在线工具","permalink":"https://blog.slqwq.cn/categories/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7/"},{"name":"魔改","slug":"魔改","permalink":"https://blog.slqwq.cn/categories/%E9%AD%94%E6%94%B9/"},{"name":"评论","slug":"魔改/评论","permalink":"https://blog.slqwq.cn/categories/%E9%AD%94%E6%94%B9/%E8%AF%84%E8%AE%BA/"}],"tags":[{"name":"cloudflare","slug":"cloudflare","permalink":"https://blog.slqwq.cn/tags/cloudflare/"},{"name":"ios","slug":"ios","permalink":"https://blog.slqwq.cn/tags/ios/"},{"name":"ipa","slug":"ipa","permalink":"https://blog.slqwq.cn/tags/ipa/"},{"name":"docker","slug":"docker","permalink":"https://blog.slqwq.cn/tags/docker/"},{"name":"ax9000","slug":"ax9000","permalink":"https://blog.slqwq.cn/tags/ax9000/"},{"name":"electron","slug":"electron","permalink":"https://blog.slqwq.cn/tags/electron/"},{"name":"Windows11","slug":"Windows11","permalink":"https://blog.slqwq.cn/tags/Windows11/"},{"name":"Android","slug":"Android","permalink":"https://blog.slqwq.cn/tags/Android/"},{"name":"Magisk","slug":"Magisk","permalink":"https://blog.slqwq.cn/tags/Magisk/"},{"name":"picgo","slug":"picgo","permalink":"https://blog.slqwq.cn/tags/picgo/"},{"name":"github","slug":"github","permalink":"https://blog.slqwq.cn/tags/github/"},{"name":"gfw","slug":"gfw","permalink":"https://blog.slqwq.cn/tags/gfw/"},{"name":"p2p","slug":"p2p","permalink":"https://blog.slqwq.cn/tags/p2p/"},{"name":"peertopeer","slug":"peertopeer","permalink":"https://blog.slqwq.cn/tags/peertopeer/"},{"name":"cloudreve","slug":"cloudreve","permalink":"https://blog.slqwq.cn/tags/cloudreve/"},{"name":"link","slug":"link","permalink":"https://blog.slqwq.cn/tags/link/"},{"name":"Windows","slug":"Windows","permalink":"https://blog.slqwq.cn/tags/Windows/"},{"name":"windows","slug":"windows","permalink":"https://blog.slqwq.cn/tags/windows/"},{"name":"书签同步","slug":"书签同步","permalink":"https://blog.slqwq.cn/tags/%E4%B9%A6%E7%AD%BE%E5%90%8C%E6%AD%A5/"},{"name":"Butterfly","slug":"Butterfly","permalink":"https://blog.slqwq.cn/tags/Butterfly/"},{"name":"Custom","slug":"Custom","permalink":"https://blog.slqwq.cn/tags/Custom/"},{"name":"评论","slug":"评论","permalink":"https://blog.slqwq.cn/tags/%E8%AF%84%E8%AE%BA/"},{"name":"部署日志","slug":"部署日志","permalink":"https://blog.slqwq.cn/tags/%E9%83%A8%E7%BD%B2%E6%97%A5%E5%BF%97/"},{"name":"云端写作","slug":"云端写作","permalink":"https://blog.slqwq.cn/tags/%E4%BA%91%E7%AB%AF%E5%86%99%E4%BD%9C/"},{"name":"语雀","slug":"语雀","permalink":"https://blog.slqwq.cn/tags/%E8%AF%AD%E9%9B%80/"},{"name":"VPS","slug":"VPS","permalink":"https://blog.slqwq.cn/tags/VPS/"},{"name":"Leancloud","slug":"Leancloud","permalink":"https://blog.slqwq.cn/tags/Leancloud/"},{"name":"Hexo","slug":"Hexo","permalink":"https://blog.slqwq.cn/tags/Hexo/"},{"name":"主题魔改","slug":"主题魔改","permalink":"https://blog.slqwq.cn/tags/%E4%B8%BB%E9%A2%98%E9%AD%94%E6%94%B9/"},{"name":"云端","slug":"云端","permalink":"https://blog.slqwq.cn/tags/%E4%BA%91%E7%AB%AF/"},{"name":"高效写作","slug":"高效写作","permalink":"https://blog.slqwq.cn/tags/%E9%AB%98%E6%95%88%E5%86%99%E4%BD%9C/"},{"name":"网站","slug":"网站","permalink":"https://blog.slqwq.cn/tags/%E7%BD%91%E7%AB%99/"},{"name":"Free","slug":"Free","permalink":"https://blog.slqwq.cn/tags/Free/"},{"name":"实用工具","slug":"实用工具","permalink":"https://blog.slqwq.cn/tags/%E5%AE%9E%E7%94%A8%E5%B7%A5%E5%85%B7/"},{"name":"干货","slug":"干货","permalink":"https://blog.slqwq.cn/tags/%E5%B9%B2%E8%B4%A7/"},{"name":"魔改","slug":"魔改","permalink":"https://blog.slqwq.cn/tags/%E9%AD%94%E6%94%B9/"}]}