mycpen-blog 0.0.0-wzblduunvr → 0.0.0-wzbqbtbmdt

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/search.xml CHANGED
@@ -263,7 +263,7 @@
263
263
  <link href="/posts/cee83196.html"/>
264
264
  <url>/posts/cee83196.html</url>
265
265
 
266
- <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录一些小知识点、工具、文章收藏</p><h2 id="01-链接收藏">01. 链接收藏<a class="header-anchor" href="#01-链接收藏"></a></h2><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="https://tools.liumingye.cn/music/#/">MyFreeMP3</a></td><td><a href="https://www.cnblogs.com/hider/p/11614688.html">Typora入门</a></td><td><a href="https://zhuanlan.zhihu.com/p/193101244">Typora页面美化</a></td></tr><tr><td><a href="https://apps.microsoft.com/store/apps">Microsoft Store</a></td><td><a href="https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md">中文文案排版指北</a></td><td><a href="https://blog.csdn.net/m0_37624402/article/details/108960118">Git常见用法总结</a></td></tr><tr><td><a href="https://www.processon.com/">ProcessOn</a></td><td><a href="https://www.nowcoder.com/discuss/353154816606150656">牛客网-面经-运开资料</a></td><td><a href="https://www.cnblogs.com/blogkui/p/12900655.html">JavaScript日期格式化,不足两位数补0</a></td></tr><tr><td><a href="https://molunerfinn.com/my-2019-interview-of-summer-internship/">Molunerfinn 大佬面经</a></td><td><a href="https://akilar.top/posts/f752c86d/#%E9%85%8D%E7%BD%AEGithub-Action">Akilar:Github Action自动部署</a></td><td><a href="https://auto.oldwu.top/">AutoPlan.哔哩升级</a></td></tr><tr><td><a href="https://www.cnblogs.com/xxhxs-21/p/17151813.html">Jetbrains 激活方法</a></td><td><a href="https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&amp;action=index&amp;token=168808346&amp;lang=zh_CN">公众号二维码.下载</a></td><td><a href="https://github.com/RayWangQvQ/BiliBiliToolPro">GitHub: BiliBiliToolPro</a></td></tr><tr><td><a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">Snipaste JPG 截图格式</a></td><td><a href="https://www.yilantingfeng.site/%e5%ad%a6%e4%b8%9a%e7%9b%b8%e5%85%b3/1503/">倚栏听风.2023计算机保研经历总结</a></td><td><a href="https://blog.zwying.com/archives/93.html">Veen Zhao.南师大.考研</a></td></tr><tr><td><a href="https://github.com/dxhuii/delWeibo">批量删除微博博文</a></td><td><a href="https://xedu.me/">chatgpt账号-key购买</a></td><td><a href="https://blog.zwying.com/archives/121.html">Veen Zhao.南师大.复试</a></td></tr><tr><td><a href="https://not.mcy.cloudns.org/article/example-17">网易云.安卓.dolby_beta.教程</a>、<a href="https://cloud.06dn.com/s/EB2MSp">下载</a>、<a href="https://github.com/nining377/dolby_beta/issues/142">github</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>其他:</p><ol><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/583c5c34.html">03_Other-PC端环境记录</a></p></li></ol><p>非技术:</p><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="http://coolshell.cn/articles/20276.html">酷壳:别让自己“墙”了自己</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>云服务器:</p><ul class="lvl-0"><li class="lvl-2"><p>阿里云 ECS 99/年,活动期内(活动时间: <mark>2023年10月31日0点0分0秒至2026年3月31日23点59分59秒</mark>。)续费同价,新老用户同享:<a href="https://www.aliyun.com/lowcode/promotion/allinaliyun/99program">https://www.aliyun.com/lowcode/promotion/allinaliyun/99program</a></p></li><li class="lvl-2"><p>阿里云在校学生300无门券/合作高校3折券领取:<a href="https://university.aliyun.com/">https://university.aliyun.com/</a></p></li></ul><h2 id="02-sshpass-非交互登录">02. sshpass 非交互登录<a class="header-anchor" href="#02-sshpass-非交互登录"></a></h2><p>ssh 不能在命令行中指定密码</p><p>sshpass:</p><ol><li class="lvl-3"><p>用于非交互的 ssh 密码验证,允许用 -p 参数指定明文密码</p></li><li class="lvl-3"><p>支持密码从命令行,文件,环境变量中读取</p></li></ol><blockquote><p>Ubuntu 报错 <code>E: Unable to locate package sshpass</code></p><p><code>apt-get update</code> ; sudo apt-get install sshpass</p><p>参考文章:<a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></blockquote><p>登录脚本(第一次需 SSH 登录)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ali.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">sshpass -p 密码 ssh -o ServerAliveinterval=60 root@IP</span><br><span class="line"><span class="comment"># sshpass -p 密码 ssh root@IP</span></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">chmod</span> +x ali.sh</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>-o option =&gt; Can be used to give options in the format used in the configuration file.</p></li><li class="lvl-2"><p><code>ServerAliveinterval=60</code> client每隔60秒发送一次请求给server,然后server响应,从而保持连接(防止连接空闲超时)</p></li></ul><p>定义别名 alias</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ~/.bashrc</span><br><span class="line"><span class="comment"># User specific aliases and functions</span></span><br><span class="line"><span class="built_in">alias</span> ali=<span class="string">&#x27;bash /home/peng/sh_file/ali.sh&#x27;</span></span><br></pre></td></tr></table></figure><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/u013288190/article/details/116921994">Shell 脚本 ssh免密码 登录 远程服务器 sshpass用法示例</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/liao392781/article/details/79220395">Shell脚本免密码登录远程服务器(方法一)</a></p></li><li class="lvl-3"><p><a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/weixin_48693408/article/details/125961472">Linux – 将自己的shell脚本设置成命令</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/qq_44895681/article/details/124841145">配置SSH服务远程连接空闲超时退出时间(包括SSH无法登录、登录缓慢)</a></p></li></ol><h2 id="03-Xftp-显示隐藏文件">03. Xftp 显示隐藏文件<a class="header-anchor" href="#03-Xftp-显示隐藏文件"></a></h2><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304042240000.png" alt="image-20230404224047926" style="zoom: 33%;" /><p>参考文章:<a href="http://www.nndssk.com/xtjc/287647HVA4sC.html">Xftp显示隐藏文件的方法</a></p><h2 id="04-Github-多账户-SSH-配置">04. Github 多账户 SSH 配置<a class="header-anchor" href="#04-Github-多账户-SSH-配置"></a></h2><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -f ~/.ssh/id_rsa_gh -C user_gh@gmail.com</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2">-b:指定 key 的 bit 数,对于 RSA key 而言,默认是 3072 bits</li><li class="lvl-2">-f:指定 key 的文件名,若需要指定路径,则文件名需要和路径一直,如 ~/.ssh/id_rsa_gh</li><li class="lvl-2">-C:指定新的 comment,即公钥末尾的字符串,一般是邮箱地址,若不指定会是 “username@hostname” 的形式</li><li class="lvl-2">-t:指定私钥类型,一般有 “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk” 和 “rsa” 等几种,若指定为 rsa 还可以指定签名类型,默认为 “rsa-sha2-512”</li></ul></blockquote><blockquote><p>Github 不同账户,类似配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ~/.ssh/config</span><br><span class="line">Host github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> PreferredAuthentications publickey</span><br><span class="line"> IdentityFile ~/.ssh/user1_rsa</span><br><span class="line"> User user1</span><br><span class="line">Host github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> PreferredAuthentications publickey</span><br><span class="line"> IdentityFile ~/.ssh/user2_rsa</span><br><span class="line"> User user2</span><br><span class="line">------</span><br><span class="line">Host user_gh.github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> User user_gh</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_gh</span><br><span class="line">Host github-qileq.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> User qileq</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_qileq</span><br><span class="line">Host gitlab.com</span><br><span class="line"> HostName gitlab.com</span><br><span class="line"> User user_gl</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_gl</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>Host 类型昵称,可以简化登录的输入地址,比如<code>Host ccl</code>,则可以用<code>ssh ccl</code>直接连接</p></li><li class="lvl-2"><p>HostName 表示连接的远程主机地址</p></li><li class="lvl-2"><p>IdentityFile 表示指定私钥文件路径</p></li><li class="lvl-2"><p>Port 指定端口</p></li><li class="lvl-2"><p>User 指定用户名</p></li></ul><p>修改仓库的 git 信息,将仓库配置 url 的 <a href="https://link.zhihu.com/?target=http%3A//github.com">http://github.com</a> 替换为 ssh config 中设置的 Host 值。</p><p>笔者以 <a href="https://link.zhihu.com/?target=https%3A//github.com/qileq/java-roam-guide">java-roam-guide</a> 为例,使用如下两种方式来修改仓库地址:</p><ol><li class="lvl-3"><p>执行命令 git remote set-url origin <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guid.git</p></li><li class="lvl-3"><p>将该仓库 .git/config 中的 url = <a href="mailto:git@github.com">git@github.com</a>:qileq/java-roam-guide.git 修改为 url = <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guide.git</p></li></ol><p>修改完成后,执行 git remote -v 查看仓库地址是否正确。</p></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 当使用&lt;user1.github.com&gt;替换&lt;github.com&gt;进行访问时,ssh会自动识别为user1</span></span><br><span class="line"><span class="comment"># 配置用户1</span></span><br><span class="line">Host user1.github.com<span class="comment"># 别名,可以随便写一个url。</span></span><br><span class="line">Hostname github.com<span class="comment"># 网站真实的域名,如果是GitHub就不用改了</span></span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user1<span class="comment"># 指向user1的私钥路径,似乎只能在~/.ssh下,不要随便放</span></span><br><span class="line">User user1<span class="comment"># 填写user1的Github用户名,不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置用户2</span></span><br><span class="line">Host user1.github.com</span><br><span class="line">Hostname github.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user2<span class="comment"># 指向user2的私钥路径,似乎只能在~/.ssh下,不要随便放</span></span><br><span class="line">User user2<span class="comment"># 填写user2的GitHub用户名,不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果是直接使用 <code>git@github.com</code>,那么ssh将自动识别为config列表的第一个用户,可以认为是单用户模式</p><p>由于是多用户,所以在第一次clone一个GitHub地址的时候,需要简单的修改一下对应的域名,此时SSH将可以识别使用哪个用户进行操作,并建立配置记录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 原始要clone的仓库命令</span></span><br><span class="line">git <span class="built_in">clone</span> git@github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对应修改一下&lt;github.com&gt;,user1修改为上面配置的&lt;user1.github.com&gt;即可</span></span><br><span class="line">git <span class="built_in">clone</span> git@user1.github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>多用户共用情况下,如果提示设置用户名,一定要设置为<code>局部信息</code>,而不是<code>global</code>。命令应修改为</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git默认提示的命令</span></span><br><span class="line">git config --global user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 我们应该使用的命令</span></span><br><span class="line">git config user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/521768041">* SSH 多账号的配置</a></p></li><li class="lvl-3"><p><a href="https://cloud.tencent.com/developer/article/2121948">ssh config多账户/多域名配置</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/senlin1202/article/details/122081089">SSH Config 使用</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/443e.html">Mac上配置多个SSH</a></p></li><li class="lvl-3"><p><a href="https://oneflyingfish.gitee.io/articles/20c7aea41283/">* 配置SSH keys连接GitHub(支持多用户)</a></p></li><li class="lvl-3"><p><a href="https://happyleecode.gitee.io/2023/04/05/SSH/">解决 Git 同时部署到 GitHub 和 Gitee 时,密钥 SSH 冲突问题</a></p></li></ol><h2 id="05-APICloud-打包网页">05. APICloud 打包网页<a class="header-anchor" href="#05-APICloud-打包网页"></a></h2><p><mark>未成功</mark></p><p><a href="https://www.apicloud.com/portal-web/console">APICloud</a> =&gt; Web App 创建</p><p>图标<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png</a></p><p>启动页<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061613612.png" alt="image-20230406161352487" style="zoom:33%;" /><p>安装后的 APP 因无法开启存储空间权限,未能成功(个人原因,<a href="https://www.fomal.cc/">Fomalhaut🥝</a> 的 <a href="https://lskypro.acozycotage.net/Fomalhaut/Fomalhaut.apk">APP</a> 能设置)</p><p>参考教程:<a href="https://naokuoteng.cn/posts/2afd210.html">将网站 / 博客打包成桌面 APP</a>、<a href="https://www.fomal.cc/comments/#9392fccc60784238be439c910336af0b">Fomalhaut🥝.留言</a></p><h2 id="06-Hexo-渲染脚注">06. Hexo 渲染脚注<a class="header-anchor" href="#06-Hexo-渲染脚注"></a></h2><p>下文采用 hexo-renderer-markdown-it 渲染器(渲染脚注效果一般,不打算用脚注了)</p><blockquote><p>尽管标准 Markdown 不支持脚注,但很多 Markdown 变种都支持。一般来说,大多数 Markdown 方言和编辑器支持行内脚注和引用式脚注这两种方式,而后者使用更为普遍(原文:<a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a>)</p></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm uninstall --save hexo-renderer-marked</span><br><span class="line">npm install --save hexo-renderer-markdown-it</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">markdown:</span></span><br><span class="line"> <span class="attr">plugins:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">markdown-it-footnote</span></span><br></pre></td></tr></table></figure><p>原文:<a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">我的博客的诞生(二)</a></p></blockquote><blockquote><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Here is a footnote reference,[^1] and another.[^longnote]</span><br><span class="line"></span><br><span class="line">[<span class="symbol">^1</span>]: <span class="link">Here is the footnote.</span></span><br><span class="line"></span><br><span class="line">[<span class="symbol">^longnote</span>]: <span class="link">Here&#x27;s one with multiple blocks.</span></span><br><span class="line"></span><br><span class="line"><span class="code"> Subsequent paragraphs are indented to show that they</span></span><br><span class="line"><span class="code">belong to the previous footnote.</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Here is an inline note.^[Inlines notes are easier to write, since</span><br><span class="line">you don&#x27;t have to pick an identifier and move down to type the</span><br><span class="line">note.]</span><br></pre></td></tr></table></figure><p>来源:<a href="https://github.com/markdown-it/markdown-it-footnote">markdown-it/markdown-it-footnote</a></p></blockquote><p>个人配置:</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"># https://butterfly.js.org/posts/ceeb73f/#Math-%E6%95%B8%E5%AD%B8</span><br><span class="line"># https://www.nickxu.top/2022/04/17/Hexo-Butterfly-建站指南(八)使用-KaTeX-数学公式/</span><br><span class="line"># https://github.com/hexojs/hexo-renderer-markdown-it</span><br><span class="line"># https://ezgx.tk/posts/65320/</span><br><span class="line">markdown:</span><br><span class="line"> preset: &#x27;default&#x27;</span><br><span class="line"> render:</span><br><span class="line"> html: true</span><br><span class="line"> xhtmlOut: false</span><br><span class="line"> langPrefix: &#x27;language-&#x27;</span><br><span class="line"> breaks: true</span><br><span class="line"> linkify: true</span><br><span class="line"> typographer: true</span><br><span class="line"> quotes: &#x27;“”‘’&#x27;</span><br><span class="line"> enable_rules:</span><br><span class="line"> disable_rules:</span><br><span class="line"> plugins:</span><br><span class="line"> - markdown-it-abbr</span><br><span class="line"> # installed external plugins also can be enabled</span><br><span class="line"> - markdown-it-table-of-contents</span><br><span class="line"> - markdown-it-attrs</span><br><span class="line"> # - markdown-it-cjk-breaks</span><br><span class="line"> - markdown-it-container</span><br><span class="line"> - markdown-it-deflist</span><br><span class="line"> - markdown-it-emoji</span><br><span class="line"><span class="addition">+ - markdown-it-footnote</span></span><br><span class="line"> - markdown-it-ins</span><br><span class="line"> - markdown-it-mark</span><br><span class="line"> - markdown-it-sub</span><br><span class="line"> - markdown-it-sup</span><br><span class="line"> - markdown-it-checkbox</span><br><span class="line"> - markdown-it-imsize</span><br><span class="line"> - markdown-it-expandable</span><br><span class="line"> - markdown-it-merge-cells</span><br><span class="line"> - &#x27;@renbaoshuo/markdown-it-katex&#x27;</span><br><span class="line"> # - @iktakahiro/markdown-it-katex</span><br><span class="line"> # - name: &#x27;@neilsustc/markdown-it-katex&#x27;</span><br><span class="line"> # enable: true</span><br><span class="line"> # options:</span><br><span class="line"> # strict: false</span><br><span class="line"> # - markdown-it-toc-and-anchor</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: success</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: tips</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: warning</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: danger</span><br><span class="line"> anchors:</span><br><span class="line"> level: 1</span><br><span class="line"> collisionSuffix: &#x27;&#x27;</span><br><span class="line"> permalink: false</span><br><span class="line"> permalinkClass: &#x27;header-anchor&#x27;</span><br><span class="line"> permalinkSide: &#x27;left&#x27;</span><br><span class="line"> permalinkSymbol: &#x27;¶&#x27;</span><br><span class="line"> case: 0</span><br><span class="line"> separator: &#x27;-&#x27;</span><br><span class="line"> images:</span><br><span class="line"> lazyload: false</span><br><span class="line"> prepend_root: false</span><br><span class="line"> post_asset: false</span><br></pre></td></tr></table></figure><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a></p></li><li class="lvl-3"><p><a href="https://markdown.com.cn/extended-syntax/footnotes.html">Markdown 脚注</a></p></li><li class="lvl-3"><p><a href="https://blog.meta-code.top/2023/03/21/2023-53/">百里飞洋 Barry-Flynn(得知脚注)</a></p></li><li class="lvl-3"><p><a href="https://github.com/hexojs/hexo-renderer-markdown-it">hexojs/hexo-renderer-markdown-it</a></p></li><li class="lvl-3"><p><a href="https://github.com/markdown-it/markdown-it-footnote">* markdown-it/markdown-it-footnote</a></p></li><li class="lvl-3"><p><a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">* 我的博客的诞生(二)</a></p></li></ol><h2 id="07-Base64-加密邮箱-解密">07. Base64 加密邮箱 解密<a class="header-anchor" href="#07-Base64-加密邮箱-解密"></a></h2><p>加密的邮箱地址,使用 base64 加密。在线加密:<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>解密 <code>javascript:decryptEmail(...)</code>,代码示例:<a href="https://www.mycpen.cn/">https://www.mycpen.cn/</a></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;javascript:decryptEmail(&#x27;bXljcGVuQHFxLmNvbQ==&#x27;);&quot;</span> <span class="attr">title</span>=<span class="string">&quot;email&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="08-Word-转-MD(Pandoc)">08. Word 转 MD(Pandoc)<a class="header-anchor" href="#08-Word-转-MD(Pandoc)"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pandoc -xxx.docx -o xxx.md</span><br></pre></td></tr></table></figure><blockquote><p>一、下载pandoc<br>建议使用msi直接安装,而不是下载安装包直接使用,msi的下载方法:安装方法。</p><p>二、pandoc转换<br>1、cmd进入文件夹<br>打开cmd。<br>转换到文件所在的路径中。d:进入D盘的路径下,CD D:\Program Files\OneDrive\桌面\temp</p><p>2、代码实现</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pandoc -xxx.docx -o xxx.md <span class="comment"># docx 文件转换为 md 文件</span></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304162143719.png" alt="image-20230416214320662" style="zoom: 33%;" /></blockquote><p>参考文章:<a href="http://www.taodudu.cc/news/show-3860696.html">word文件转md文件</a></p><h2 id="09-GitHub-删除历史记录">09. GitHub 删除历史记录<a class="header-anchor" href="#09-GitHub-删除历史记录"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git reset &lt;上一步复制到的字符串&gt;</span><br><span class="line">git push -f</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://blog.csdn.net/sunzequan888/article/details/125738176">GITHUB删除历史记录</a></p><h2 id="10-ChatGPT-API-Key-个人站">10. ChatGPT API Key 个人站<a class="header-anchor" href="#10-ChatGPT-API-Key-个人站"></a></h2><p>项目地址:</p><ol><li class="lvl-3"><p><a href="https://github.com/Chanzhaoyu/chatgpt-web">https://github.com/Chanzhaoyu/chatgpt-web</a></p></li><li class="lvl-3"><p><a href="https://github.com/Yidadaa/ChatGPT-Next-Web">https://github.com/Yidadaa/ChatGPT-Next-Web</a></p></li></ol><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://www.fomal.cc/posts/74ac8dc8.html">无服务器部署自己的chatGPT</a></p></li></ol><h2 id="11-字符画-consolo-log">11. 字符画 consolo.log()<a class="header-anchor" href="#11-字符画-consolo-log"></a></h2><p><strong>推荐</strong>:<a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a></p><p>文字生成字符画:<br><a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a><br><a href="http://www.network-science.de/ascii/">http://www.network-science.de/ascii/</a></p><p>图片生成字符画:<br><a href="http://www.degraeve.com/img2txt.php">http://www.degraeve.com/img2txt.php</a><br><a href="http://life.chacuo.net/convertphoto2char">http://life.chacuo.net/convertphoto2char</a></p><p>流程图生成字符画:<br><a href="http://asciiflow.com/">http://asciiflow.com/</a></p><p>VSCode 插件:<br><a href="https://github.com/OBKoro1/koro1FileHeader">https://github.com/OBKoro1/koro1FileHeader</a></p><p>参考:<a href="https://blog.saop.cc/p/c9df/">https://blog.saop.cc/p/c9df/</a></p><h2 id="12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS">12. ERR_HTTP2_PROTOCOL_ERROR 关闭 HSTS<a class="header-anchor" href="#12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS"></a></h2><p>访问网站,偶然性报错:ERR_HTTP2_PROTOCOL_ERROR。试着关闭 HSTS</p><p>CDN HTTPS 配置 关闭 <code>HSTS</code>,<a href="https://console.dogecloud.com/cdn/domain/https?domainId=6667">多吉云个人链接</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191935126.png" alt="image-20230419193555012" style="zoom: 33%;" /><p>以下内容来自 ChatGPT:</p><blockquote><p>问:<code>ERR_HTTP2_PROTOCOL_ERROR 和 HSTS 有什么联系</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946818.png" alt="image-20230419194615758" style="zoom: 50%;" /><p>问:<code>HSTS 会导致 ERR_HTTP2_PROTOCOL_ERROR 报错吗</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946462.png" alt="image-20230419194650417" style="zoom: 50%;" /></blockquote><h2 id="13-Clash-Parsers">13. Clash Parsers<a class="header-anchor" href="#13-Clash-Parsers"></a></h2><p>设置 =&gt; 配置 =&gt; 配置文件预处理</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">parsers:</span> <span class="comment"># array</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">https://xxx.xxx/xxx</span></span><br><span class="line"> <span class="attr">yaml:</span></span><br><span class="line"> <span class="attr">prepend-rules:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,香港Az-优化3</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,GLOBAL</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,DIRECT</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>参考链接:</p><ol><li class="lvl-3"><p><a href="https://docs.cfw.lbyczf.com/contents/parser.html">* Clash for Windows:配置文件预处理</a></p></li><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/600564111">* Clash利用parsers进行规则预处理</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/u013559309/article/details/129437063">* Clash使用Parser添加自定义规则并防止更新覆盖</a></p></li><li class="lvl-3"><p><a href="https://www.wangpc.cc/software/clash-for-windows-paarsers-rules/">clash for windows自定义规则(不会被更新覆盖)</a></p></li><li class="lvl-3"><p><a href="https://www.zhihu.com/question/507810862">clash for windows如何设置指定IP或者网站才走xx?</a></p></li></ol><h2 id="14-Replit-部署-Typecho-TimePlus">14. Replit 部署 Typecho.TimePlus<a class="header-anchor" href="#14-Replit-部署-Typecho-TimePlus"></a></h2><blockquote><p>步骤:<a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p><p>Demo:<a href="https://plog.zhheo.com/">https://plog.zhheo.com/</a></p><p>在 Typecho 后台导航栏点击【撰写】,在自定义字段中填写图片地址。并填写文章标题和内容,即对应为图片的标题和简介。</p></blockquote><p>搭建步骤:</p><ol><li class="lvl-3"><p><a href="https://replit.com/">Replit</a> Create a Repl,环境选 SQLite;参照 <a href="https://github.com/valetzx/typechonreplit">@valetzx/typechonreplit</a> 执行 <code>git clone https://github.com/valetzx/typechonreplit &amp;&amp; mv -b typechonreplit/* ./ &amp;&amp; mv -b typechonreplit/.[^.]* ./ &amp;&amp; rm -rf *~ &amp;&amp; rm -rf typechonreplit</code>;注释 <code>main.sh</code> butterfly 相关行,<code>bash main.sh</code>;Run 运行;设置 Typecho 时选择 SQLite 数据库</p></li><li class="lvl-3"><p>按照 <a href="https://github.com/zhheo/TimePlus/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%B8%8A%E6%89%8B">TimePlus.Wiki</a> 设置,将 <a href="https://github.com/zhheo/TimePlus/releases">Source code</a> 解压上传 Replit Repl 对应路径,按步骤设置</p></li><li class="lvl-3"><p>图片仓库批量获取图片 URL <code>ls ./bj |awk '&#123;print &quot;https://mycpen.gitee.io/cdn2/image/bj/&quot;$1&quot;&quot;&#125;' &gt; C:/Users/Administrator/Desktop/TimePlus.txt</code></p></li><li class="lvl-3"><p>Replit Repl 绑自定义域名,需先 TXT 记录认证(因验证问题无法使用 https)</p></li></ol><p>相关链接:</p><ol><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p></li><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus">https://github.com/zhheo/TimePlus</a></p></li><li class="lvl-3"><p><a href="https://github.com/valetzx/typechonreplit">https://github.com/valetzx/typechonreplit</a></p></li><li class="lvl-3"><p><a href="https://blog.zhheo.com/p/bed74f41.html">https://blog.zhheo.com/p/bed74f41.html</a></p></li><li class="lvl-3"><p><a href="https://replit.com/">Replit</a></p></li><li class="lvl-3"><p><a href="https://dns.console.aliyun.com/">阿里云.DNS</a></p></li></ol><h2 id="15-Git-修改提交信息">15. Git 修改提交信息<a class="header-anchor" href="#15-Git-修改提交信息"></a></h2><p><strong>2023-12-13 更新</strong></p><p>使用 <code>git rebase -i HEAD~&lt;n&gt;</code> 修改最近某一次的提交信息,以下来自 chatgpt</p><blockquote><p>当您执行 <code>git rebase -i HEAD~&lt;n&gt;</code> 命令时,会打开一个交互式的编辑器界面,列出最近 <code>&lt;n&gt;</code> 个提交。下面是一个示例,假设您要修改最近的前三次提交的提交信息:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pick 1a2b3c4 Commit message 1</span><br><span class="line">pick 5d6e7f8 Commit message 2</span><br><span class="line">pick 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>要修改提交信息,将每个提交的行的开头的 <code>pick</code> 改为 <code>reword</code> 或 <code>r</code>,然后保存并关闭编辑器。修改后的示例如下:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">reword 1a2b3c4 Commit message 1</span><br><span class="line">reword 5d6e7f8 Commit message 2</span><br><span class="line">reword 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>保存并关闭编辑器后,Git 会逐个应用这些提交,并在每个提交之前暂停并等待您编辑提交信息。对于每个提交,Git 会打开一个新的编辑器窗口,允许您修改提交信息。完成修改后,保存并关闭编辑器。</p><p>请注意,如果在 rebase 过程中出现冲突,您需要解决冲突并使用 <code>git add</code> 命令将解决后的文件标记为已解决。然后,继续进行 rebase,直到所有提交都被处理完毕。</p><p>完成 rebase 后,您可以使用 <code>git log</code> 命令验证提交信息是否已成功修改。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git log</span><br></pre></td></tr></table></figure><p>如果要将修改的提交信息推送到远程仓库,您需要使用 <code>git push --force</code> 命令,因为您已经修改了历史提交。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push --force</span><br></pre></td></tr></table></figure><p>请确保在进行此操作之前备份您的代码,并与团队成员进行沟通,以免影响其他人的工作。</p></blockquote><hr><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git commit --amend</span><br><span class="line">git push --force &lt;remote-name&gt; &lt;branch-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131749192.png" alt="image-20230513174958143" style="zoom: 80%;" /></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline</span><br><span class="line">git commit --amend -m <span class="string">&quot;新的提交信息&quot;</span></span><br><span class="line">git push --force origin master</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131751216.png" alt="image-20230513175153157" style="zoom: 67%;" /></blockquote><h2 id="16-GitHub-BiliBiliToolPro">16. GitHub: BiliBiliToolPro<a class="header-anchor" href="#16-GitHub-BiliBiliToolPro"></a></h2><p><strong>2024-12-11</strong> 更新至最新版本 <code>V2.1.1</code></p><p>版本 2.1.1,上线时间 2024-05-13</p><p>地址:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">github</a></p><p>方式:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署-文档-linux</a></p><p>失效项:</p><ol><li class="lvl-3"><p>LiveLottery,天选时刻抽奖,<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/764">issue</a></p></li><li class="lvl-3"><p>LiveFansMedal,直播间挂机,<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/794">issue</a></p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧版文件</span></span><br><span class="line">$ <span class="built_in">rm</span> -rf *</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/2.1.1/bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 8 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">* */12 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 16 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 18 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 20 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><p>地址:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">https://github.com/RayWangQvQ/BiliBiliToolPro</a></p><p><a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署</a>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/1.0.3/bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint</span><br><span class="line">0 8 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily</span><br><span class="line">* */12 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery</span><br><span class="line">0 16 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched</span><br><span class="line">0 20 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="17-GitHub-Compare">17. GitHub Compare<a class="header-anchor" href="#17-GitHub-Compare"></a></h2><p>原文:<a href="https://akilar.top/posts/bbf68ad4/">https://akilar.top/posts/bbf68ad4/</a></p><p>示例:<a href="https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0">https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202309161502336.png" alt="image-20230916150258235" style="zoom:50%;" /><h2 id="18-new-Date-getFullYear">18. new Date().getFullYear();<a class="header-anchor" href="#18-new-Date-getFullYear"></a></h2><p>JavaScript 获取当前年份</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 要以自动方式获取明年的年份并将其用于创建日期对象,您可以按如下方式修改代码:</span></span><br><span class="line"><span class="keyword">const</span> currentYear = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getFullYear</span>();</span><br><span class="line"><span class="keyword">const</span> nextYear = currentYear + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">const</span> newYearTimestamp = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">`<span class="subst">$&#123;nextYear&#125;</span>-01-01 00:00:00`</span>).<span class="title function_">getTime</span>() / <span class="number">1000</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="19-JavaScript-解码-Base64">19. JavaScript 解码 Base64<a class="header-anchor" href="#19-JavaScript-解码-Base64"></a></h2><p>在线加密:<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>以下来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中解码 Base64 编码的数据,你可以使用 <code>atob()</code> 函数。该函数可以将 Base64 编码的字符串解码为原始的文本数据。示例代码如下:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> base64String = <span class="string">&quot;SGVsbG8gd29ybGQ=&quot;</span>; <span class="comment">// Base64 编码的字符串</span></span><br><span class="line"><span class="keyword">const</span> decodedString = <span class="title function_">atob</span>(base64String); <span class="comment">// 解码</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(decodedString); <span class="comment">// 输出解码后的字符串</span></span><br></pre></td></tr></table></figure><p>在这个例子中,<code>base64String</code> 你要解码Base64编码的字符串。使用<code>atob()</code>函数对它进行解码,然后你就可以处理解码后的原始字符串了。</p></blockquote><h2 id="20-JavaScript-取绝对值">20. JavaScript 取绝对值<a class="header-anchor" href="#20-JavaScript-取绝对值"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中,你可以使用 <code>Math.abs()</code> 函数来获取一个数的绝对值,从而去除负号。例如:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> num = -<span class="number">5</span>;</span><br><span class="line"><span class="keyword">let</span> absNum = <span class="title class_">Math</span>.<span class="title function_">abs</span>(num); <span class="comment">// absNum将是5</span></span><br></pre></td></tr></table></figure><p>这样,<code>absNum</code> 将会取得 <code>num</code> 的绝对值,而不考虑其正负。</p></blockquote><h2 id="21-JavaScript-三元运算">21. JavaScript 三元运算<a class="header-anchor" href="#21-JavaScript-三元运算"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>你可以使用条件运算符(三元运算符)来判断 <code>e - now1</code> 是否大于 0,然后决定是否执行 +1。下面是优化后的代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> daysDifference = <span class="title class_">Math</span>.<span class="title function_">floor</span>(((e - now1) / <span class="number">1e3</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>) + (e - now1 &gt; <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>));</span><br></pre></td></tr></table></figure><p>这行代码首先计算 <code>(e - now1) / 1e3 / 60 / 60 / 24</code> 得到天数差,然后根据 <code>(e - now1 &gt; 0)</code> 条件判断天数差是否大于 0,如果是则加 1,否则加 0。最后使用 <code>Math.floor</code> 向下取整。</p></blockquote><h2 id="22-Snipaste-截图格式改-JPG">22. Snipaste 截图格式改 JPG<a class="header-anchor" href="#22-Snipaste-截图格式改-JPG"></a></h2><p>参考:<a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html</a></p><p>右键 → 首选项 → 输出 → 文件名.后缀</p><p>实测大大减少图片体积,500 KB (PNG) → 70KB (JPG)</p><p>仅适用于保存为本地文件,从剪贴板中粘贴到 typora 里还是 PNG 格式的</p><p>本人格式:<code>image-$yyyyMMddHHmmsszzz$.jpg</code>,目的 与 typora 剪贴板 上场时的 alt 命名保持一致</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070313815.jpg" alt="image-20231007031301508" style="zoom: 25%;" /><h2 id="23-CSS-视口单位-dvh-svh-lvh">23. CSS 视口单位 dvh, svh, lvh<a class="header-anchor" href="#23-CSS-视口单位-dvh-svh-lvh"></a></h2><p>参考:</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/e644.html">https://blog.anheyu.com/posts/e644.html</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/LuckyWinty/article/details/128962918">https://blog.csdn.net/LuckyWinty/article/details/128962918</a></p></li></ol><h2 id="24-CSS-旋转-rotate-90deg">24. CSS 旋转 rotate(90deg)<a class="header-anchor" href="#24-CSS-旋转-rotate-90deg"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p><code>rotate(90deg)</code> 是CSS中的旋转变换指令,用于将元素顺时针旋转90度。这可以应用于任何HTML元素,使其在页面上以指定角度旋转。</p><p>逆时针旋转一个元素90度,<code>rotate(-90deg)</code></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.about-page-chicken-soup</span> <span class="selector-tag">details</span><span class="selector-attr">[open]</span>&gt;<span class="selector-tag">summary</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></blockquote><h2 id="25-Markdown-折叠语法">25. Markdown 折叠语法<a class="header-anchor" href="#25-Markdown-折叠语法"></a></h2><p>参考:<a href="https://blog.csdn.net/ybb_ymm/article/details/128508243">https://blog.csdn.net/ybb_ymm/article/details/128508243</a></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code"> &lt;summary&gt;指示标题&lt;/summary&gt;</span></span><br><span class="line"><span class="code"> 内容</span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code"> &lt;summary&gt;展开查看&lt;/summary&gt;</span></span><br><span class="line"><span class="code"> &lt;pre&gt;&lt;code&gt;</span></span><br><span class="line"><span class="code"> 此处为代码的块具体内容</span></span><br><span class="line"><span class="code"> &lt;/code&gt;&lt;/pre&gt; </span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><h2 id="26-PicGo-图片压缩插件">26. PicGo 图片压缩插件<a class="header-anchor" href="#26-PicGo-图片压缩插件"></a></h2><p>插件名:<a href="https://github.com/liujinpen/picgo-plugin-compress-tinypng">picgo-plugin-compress-tinypng</a></p><p>NPM 包:<a href="https://www.npmjs.com/package/picgo-plugin-tinypng">picgo-plugin-tinypng</a></p><p>TinyPNG</p><ul class="lvl-0"><li class="lvl-2"><p>官网:<a href="https://tinify.cn/">https://tinify.cn/</a></p></li><li class="lvl-2"><p>获取 Key 参考:<a href="https://bearcai.com/index.php/archives/44/">https://bearcai.com/index.php/archives/44/</a><br><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070421963.jpg" alt="image-20231007042117896" style="zoom:25%;" /></p></li><li class="lvl-2"><p>Key 限额 500 次/月:<a href="https://tinify.cn/dashboard/api">https://tinify.cn/dashboard/api</a></p></li></ul><p>起因:<a href="https://github.com/juzisang/picgo-plugin-compress">picgo-plugin-compress</a> 长久失修,picgo 2.3.1 报错 <code>TypeError: req.end is not a function</code>。 <a href="https://github.com/juzisang/picgo-plugin-compress/issues/64#issuecomment-1504939740">issue#64</a> 获知此插件</p><h2 id="27-JavaScript-copy-事件">27. JavaScript copy 事件<a class="header-anchor" href="#27-JavaScript-copy-事件"></a></h2><p>来自 ChatGPT</p><p>要检测用户是否复制内容,你可以使用JavaScript中的<code>copy</code>事件来捕获复制操作。你可以将事件监听器绑定到<code>copy</code>事件上,然后在该事件触发时执行相应的操作,以获知用户是否复制了内容。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line"> <span class="comment">// 在这里执行你想要的操作,例如记录复制操作或发送数据到服务器</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容&#x27;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line"> <span class="comment">// 获取复制的内容</span></span><br><span class="line"> <span class="keyword">var</span> copiedText = <span class="variable language_">window</span>.<span class="title function_">getSelection</span>().<span class="title function_">toString</span>().<span class="title function_">trim</span>();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 检查复制的内容是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (copiedText.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="comment">// 在这里执行你想要的操作,例如记录复制操作或发送数据到服务器</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容:&#x27;</span>, copiedText);</span><br><span class="line"> &#125; <span class="keyword">else</span> &#123;</span><br><span class="line"> <span class="comment">// 复制的内容为空,可以选择不执行任何操作或者执行相应处理</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户尝试复制空内容&#x27;</span>);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="28-JavaScript-window-onresize">28. JavaScript window.onresize<a class="header-anchor" href="#28-JavaScript-window-onresize"></a></h2><p>来自:ChatGPT</p><p><code>window.onresize</code> 是 JavaScript 中的一个事件处理属性,它用于指定在浏览器窗口大小改变时要执行的函数。当用户调整浏览器窗口的大小时,就会触发 <code>resize</code> 事件,如果你将一个函数分配给 <code>window.onresize</code>,那么这个函数将在窗口大小改变时被调用。</p><p>例如,你可以使用以下方式监听窗口大小改变事件并执行相应的操作:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">onresize</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line"> <span class="comment">// 在窗口大小改变时执行的代码</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;窗口大小已改变&quot;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>这对于创建响应式设计或根据窗口大小进行布局调整等任务非常有用。当窗口大小发生变化时,你可以根据需要更新页面内容、样式或执行其他自定义操作。</p><h2 id="29-Git-指定远端">29. Git 指定远端<a class="header-anchor" href="#29-Git-指定远端"></a></h2><p>参考:<a href="http://www.mobiletrain.org/about/BBS/161969.html">http://www.mobiletrain.org/about/BBS/161969.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin &lt;远程仓库URL&gt;</span><br><span class="line"></span><br><span class="line">git push &lt;远程仓库别名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;</span><br><span class="line"></span><br><span class="line">git push origin master:main</span><br></pre></td></tr></table></figure><h2 id="30-Git-删除文件历史提交记录">30. Git 删除文件历史提交记录<a class="header-anchor" href="#30-Git-删除文件历史提交记录"></a></h2><p>参考:ChatGPT</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git filter-branch --force --index-filter <span class="string">&#x27;git rm -r --cached --ignore-unmatch node_modules&#x27;</span> --prune-empty --tag-name-filter <span class="built_in">cat</span> -- --all</span><br><span class="line">git <span class="built_in">rm</span> --cached node_modules -r</span><br><span class="line"></span><br><span class="line">git reflog expire --expire=now --all &amp;&amp; git gc --prune=now --aggressive</span><br></pre></td></tr></table></figure><p>ChatGPT 还提供了 <code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code> 命令删除,运行时间过长,不采用,给出的解释:命令1 使用了 <code>--index-filter</code> 和 <code>--cached</code>,这些参数可以更快地处理 Git 的索引而不需要检查和修改实际的工作树文件</p><blockquote><ol><li class="lvl-3"><p><code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--tree-filter</code> 参数,它会在每个提交上执行指定的 shell 命令。在这种情况下,它会执行 <code>rm -rf node_modules</code> 命令来删除 <code>node_modules</code> 目录。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">只作用于当前分支 <code>HEAD</code>。</li></ul></li><li class="lvl-3"><p><code>git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch node_modules' --prune-empty --tag-name-filter cat -- --all</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--index-filter</code> 参数,它会在 Git 索引上执行指定的命令。在这种情况下,它会执行 <code>git rm -r --cached --ignore-unmatch node_modules</code> 命令,以将 <code>node_modules</code> 从索引中删除。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">使用 <code>--tag-name-filter cat</code> 选项,以保留提交的标签(tags)。</li><li class="lvl-5">使用 <code>--all</code> 来指定作用于所有分支。</li></ul></li></ol><hr><p>之前上传 github 时提交了无需提交的 node_modules,如何缩小 .git 的大小</p><p>ChatGPT:要缩小.git目录的大小,可以采取以下步骤:</p><ol><li class="lvl-3"><p>清理历史提交中的node_modules:首先,你需要清理历史提交中的不必要的node_modules目录。你可以使用<code>git filter-branch</code>命令或<code>git filter-repo</code>工具来重写历史提交以删除node_modules。确保在删除之前备份你的仓库,以防发生问题。</p></li><li class="lvl-3"><p>使用.gitignore:在项目根目录下创建一个名为<code>.gitignore</code>的文件,并将<code>node_modules/</code>添加到其中,以确保不再将该目录包括在提交中。</p></li><li class="lvl-3"><p>执行<code>git rm --cached node_modules -r</code>:这将删除当前暂存区中的node_modules目录,但不会删除物理文件。然后,提交这一变更。</p></li><li class="lvl-3"><p>执行<code>git reflog expire --expire=now --all</code>:这将清理Git的reflog,以确保不再保留对不必要历史提交的引用。</p></li><li class="lvl-3"><p>执行<code>git gc --prune=now</code>:这将触发垃圾收集,清理不必要的数据,从而缩小.git目录的大小。</p></li><li class="lvl-3"><p>推送到远程仓库:如果你使用远程仓库(如GitHub),确保将这些更改推送到远程仓库以同步它们。</p></li></ol><p>请注意,这些步骤会修改你的Git历史,因此在执行它们之前务必小心,确保已备份你的仓库数据。</p></blockquote><h2 id="31-洛雪音乐导入三方音源">31. 洛雪音乐导入三方音源<a class="header-anchor" href="#31-洛雪音乐导入三方音源"></a></h2><p>官方源因 TX 警告而报废,详见 issue:<a href="https://github.com/lyswhut/lx-music-desktop/issues/1643">https://github.com/lyswhut/lx-music-desktop/issues/1643</a></p><p>详见 issue:<a href="https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022">https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022</a></p><p>仓库:<a href="https://github.com/OneCodeMonkey/music-sources">https://github.com/OneCodeMonkey/music-sources</a></p><h2 id="32-Clash-GUI">32. Clash GUI<a class="header-anchor" href="#32-Clash-GUI"></a></h2><p>起因:<a href="https://github.com/Fndroid/clash_for_windows_pkg">Clash for Windows</a> 删库</p><p>Clash Verge:<a href="https://github.com/zzzgydi/clash-verge/">https://github.com/zzzgydi/clash-verge/</a></p><p>Clash for Android 存档:<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA">https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA</a></p><p>Clash for Windows 存档:<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese">https://github.com/Z-Siqi/Clash-for-Windows_Chinese</a></p><h2 id="33-GitHub-SSH-超时">33. GitHub SSH 超时<a class="header-anchor" href="#33-GitHub-SSH-超时"></a></h2><p><code>git pull</code> 报超时、<code>ping github.com</code> 报超时</p><p>解决方案</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git bash 终端</span></span><br><span class="line">vim ~/.ssh/config</span><br></pre></td></tr></table></figure><p>内容如下,第一次 <code>git pull</code> 时输入 <code>yes</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># GitHub Start</span></span><br><span class="line">Host github.com</span><br><span class="line"> Hostname ssh.github.com</span><br><span class="line"><span class="comment"># GitHub End</span></span><br></pre></td></tr></table></figure><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.ttiee.tech/posts/2024/71e1/">https://blog.ttiee.tech/posts/2024/71e1/</a></p></li><li class="lvl-3"><p><a href="https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/">https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port">Using SSH over the HTTPS port</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses">About GitHub’s IP addresses</a></p></li></ol><h2 id="34-Hexo-隐藏文章">34. Hexo 隐藏文章<a class="header-anchor" href="#34-Hexo-隐藏文章"></a></h2><p>参考:<a href="https://blog.jiejaitt.tech/posts/1c5dc392.html">JIeJaitt | Hexo隐藏文章</a></p><ol><li class="lvl-3"><p><code>Front-Matter</code> 配置 <code>published</code> 参数</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">Foo</span></span><br><span class="line"><span class="attr">published:</span> <span class="literal">false</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>存为草稿</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 路径 source/_drafts/</span></span><br><span class="line">hexo new draft &lt;title&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>插件,hexo-hide-posts 等</p></li></ol><p>官方参考</p><ol><li class="lvl-3"><p><a href="https://hexo.io/docs/front-matter#Settings-Their-Default-Values">https://hexo.io/docs/front-matter#Settings-Their-Default-Values</a></p></li><li class="lvl-3"><p><a href="https://hexo.io/zh-cn/docs/writing.html">https://hexo.io/zh-cn/docs/writing.html</a></p></li></ol><h2 id="35-GitHub-2FA">35. GitHub 2FA<a class="header-anchor" href="#35-GitHub-2FA"></a></h2><p>GitHub 2FA 双因素认证</p><p>地址:<a href="https://github.com/settings/security">https://github.com/settings/security</a></p><p>Chrome插件:<a href="https://chromewebstore.google.com/detail/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%99%A8/bhghoamapcdpbohphigoooaddinpkbai">Authenticator</a></p><p>安卓应用:<a href="https://play.google.com/store/apps/details?id=com.azure.authenticator">Microsoft Authenticator</a></p><p>参考:<a href="https://zhuanlan.zhihu.com/p/657035724">https://zhuanlan.zhihu.com/p/657035724</a></p><h2 id="36-GitHub-B-站粉丝牌助手">36. GitHub: B 站粉丝牌助手<a class="header-anchor" href="#36-GitHub-B-站粉丝牌助手"></a></h2><p>用途:b站粉丝牌升级</p><p>版本:fdc626f,<a href="https://github.com/XiaoMiku01/fansMedalHelper/commits/master/">commits</a>;Nov 11, 2024</p><p>地址:<a href="https://github.com/XiaoMiku01/fansMedalHelper">https://github.com/XiaoMiku01/fansMedalHelper</a></p><p>文档:<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/">https://xiaomiku01.github.io/fansMedalHelperVersion/</a></p><p>服务器部署:<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html">https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file</span><br><span class="line"></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XiaoMiku01/fansMedalHelper.git</span><br><span class="line">$ <span class="built_in">cd</span> fansMedalHelper</span><br><span class="line"><span class="comment"># $ pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span></span><br><span class="line">$ pip3.8 install -r requirements.txt</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> users.example.yaml users.yaml</span><br><span class="line">$ vim users.yaml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <a href="https://github.com/XiaoMiku01/fansMedalHelper/releases/tag/logintool">B站access_key获取工具</a> 管理员身份运行,获取 access_key</p><p>文件 <code>users.yaml</code> 修改项:<code>access_key</code>、<code>SIGNINGROUP: 2</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cat users.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">USERS:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">access_key:</span> <span class="string">xxx</span></span><br><span class="line"></span><br><span class="line"><span class="attr">SIGNINGROUP:</span> <span class="number">2</span> <span class="comment"># 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>删除不重要的粉丝牌,减少耗时,<a href="https://link.bilibili.com/p/center/index#/user-center/wearing-center/my-medal">b站链接</a>,参考自 <a href="https://github.com/XiaoMiku01/fansMedalHelper/issues/189#issuecomment-2268357426">issue</a></p><p>使用计划任务每日一点跑程序,参考自 <a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html#%E8%BF%90%E8%A1%8C%E4%B8%BB%E7%A8%8B%E5%BA%8F">文档</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3.8 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="37-音乐播放器">37. 音乐播放器<a class="header-anchor" href="#37-音乐播放器"></a></h2><p>吾爱破解:<a href="https://www.52pojie.cn/">https://www.52pojie.cn/</a></p><p>酷我音乐PC:<a href="https://wwc.lanzouy.com/iIepJ0b3wchg">蓝奏云</a></p><h2 id="38-b站-硬核会员">38. b站 硬核会员<a class="header-anchor" href="#38-b站-硬核会员"></a></h2><p>b站 硬核会员答题 油猴脚本</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa">https://github.com/HCLonely/bili-senior-newbie-qa</a></p></li><li class="lvl-3"><p><a href="https://blog.hclonely.com/posts/c1ef618c/">https://blog.hclonely.com/posts/c1ef618c/</a></p></li></ol><p><strong>安装</strong></p><ol><li class="lvl-3"><p>安装<a href="https://www.tampermonkey.net/index.php">Tampermonkey</a>(建议)或其他脚本管理器;</p></li><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa/blob/main/bili-senior-newbie-qa.user.js?raw=true">点此安装</a>搜题脚本。</p></li></ol><p><strong>使用</strong></p><ol><li class="lvl-3"><p>手机哔哩哔哩客户端进入答题;</p></li><li class="lvl-3"><p>浏览器登录哔哩哔哩(已登录可跳过此步骤);</p></li><li class="lvl-3"><p>浏览器打开调试工具(<code>F12</code>), 将浏览器切换为移动设备(<code>Ctrl+Shift+M</code>);</p></li><li class="lvl-3"><p>在地址栏输入<code>https://www.bilibili.com/h5/senior-newbie/</code>并回车,进入答题,等待网页加载完成;</p></li><li class="lvl-3"><p>启动脚本(<code>Alt+N</code>);</p><ul class="lvl-2"><li class="lvl-6">加载题库(需要题目完全匹配):可从本地加载题库(支持<code>txt</code>,<code>doc</code>,<code>docx</code>,<code>xls</code>,<code>xlsx</code>格式),题库中搜索不到则使用搜索引擎搜索</li><li class="lvl-6">直接运行:使用搜索引擎搜索(支持<code>百度</code>,<code>搜狗</code>,<code>必应</code>,<code>谷歌</code>)</li></ul></li><li class="lvl-3"><p>点击<strong>题目</strong>即可进行搜索。</p></li></ol><p><strong>注意事项</strong></p><ol><li class="lvl-3"><p>使用此脚本时建议关闭其他插件/脚本,避免冲突;</p></li><li class="lvl-3"><p>建议选择<code>文史</code>,<code>知识</code>,<code>音乐</code>等答案比较好搜索判断的类型。</p></li></ol><h2 id="39-npm-cdn">39. npm cdn<a class="header-anchor" href="#39-npm-cdn"></a></h2><ol><li class="lvl-3"><p><a href="https://cdn.jsdelivr.net/npm/">https://cdn.jsdelivr.net/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.cbd.int/">https://cdn.cbd.int/</a></p></li><li class="lvl-3"><p><a href="https://cdn.iocdn.cc/npm/">https://cdn.iocdn.cc/npm/</a></p></li><li class="lvl-3"><p><a href="https://open.lightxi.com/unpkg/">https://open.lightxi.com/unpkg/</a></p></li><li class="lvl-3"><p><a href="https://cdn.smartcis.cn/npm/">https://cdn.smartcis.cn/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.jsdmirror.com/npm/">https://cdn.jsdmirror.com/npm/</a></p></li><li class="lvl-3"><p><a href="https://s4.zstatic.net/npm/">https://s4.zstatic.net/npm/</a></p></li></ol><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/fe76.html">https://blog.anheyu.com/posts/fe76.html</a></p></li><li class="lvl-3"><p><a href="https://blog.liushen.fun/posts/260f4f9a/#JSCDN">https://blog.liushen.fun/posts/260f4f9a/#JSCDN</a></p></li></ol>]]></content>
266
+ <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录一些小知识点、工具、文章收藏</p><h2 id="01-链接收藏">01. 链接收藏<a class="header-anchor" href="#01-链接收藏"></a></h2><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="https://tools.liumingye.cn/music/#/">MyFreeMP3</a></td><td><a href="https://www.cnblogs.com/hider/p/11614688.html">Typora入门</a></td><td><a href="https://zhuanlan.zhihu.com/p/193101244">Typora页面美化</a></td></tr><tr><td><a href="https://apps.microsoft.com/store/apps">Microsoft Store</a></td><td><a href="https://github.com/sparanoid/chinese-copywriting-guidelines/blob/master/README.zh-Hans.md">中文文案排版指北</a></td><td><a href="https://blog.csdn.net/m0_37624402/article/details/108960118">Git常见用法总结</a></td></tr><tr><td><a href="https://www.processon.com/">ProcessOn</a></td><td><a href="https://www.nowcoder.com/discuss/353154816606150656">牛客网-面经-运开资料</a></td><td><a href="https://www.cnblogs.com/blogkui/p/12900655.html">JavaScript日期格式化,不足两位数补0</a></td></tr><tr><td><a href="https://molunerfinn.com/my-2019-interview-of-summer-internship/">Molunerfinn 大佬面经</a></td><td><a href="https://akilar.top/posts/f752c86d/#%E9%85%8D%E7%BD%AEGithub-Action">Akilar:Github Action自动部署</a></td><td><a href="https://auto.oldwu.top/">AutoPlan.哔哩升级</a></td></tr><tr><td><a href="https://www.cnblogs.com/xxhxs-21/p/17151813.html">Jetbrains 激活方法</a></td><td><a href="https://mp.weixin.qq.com/cgi-bin/settingpage?t=setting/index&amp;action=index&amp;token=168808346&amp;lang=zh_CN">公众号二维码.下载</a></td><td><a href="https://github.com/RayWangQvQ/BiliBiliToolPro">GitHub: BiliBiliToolPro</a></td></tr><tr><td><a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">Snipaste JPG 截图格式</a></td><td><a href="https://www.yilantingfeng.site/%e5%ad%a6%e4%b8%9a%e7%9b%b8%e5%85%b3/1503/">倚栏听风.2023计算机保研经历总结</a></td><td><a href="https://blog.zwying.com/archives/93.html">Veen Zhao.南师大.考研</a></td></tr><tr><td><a href="https://github.com/dxhuii/delWeibo">批量删除微博博文</a></td><td><a href="https://xedu.me/">chatgpt账号-key购买</a></td><td><a href="https://blog.zwying.com/archives/121.html">Veen Zhao.南师大.复试</a></td></tr><tr><td><a href="https://not.mcy.cloudns.org/article/example-17">网易云.安卓.dolby_beta.教程</a>、<a href="https://cloud.06dn.com/s/EB2MSp">下载</a>、<a href="https://github.com/nining377/dolby_beta/issues/142">github</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>其他:</p><ol><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/583c5c34.html">03_Other-PC端环境记录</a></p></li></ol><p>非技术:</p><table><thead><tr><th colspan="3">地址</th></tr></thead><tbody><tr><td><a href="http://coolshell.cn/articles/20276.html">酷壳:别让自己“墙”了自己</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><p>云服务器:</p><ul class="lvl-0"><li class="lvl-2"><p>阿里云 ECS 99/年,活动期内(活动时间: <mark>2023年10月31日0点0分0秒至2026年3月31日23点59分59秒</mark>。)续费同价,新老用户同享:<a href="https://www.aliyun.com/lowcode/promotion/allinaliyun/99program">https://www.aliyun.com/lowcode/promotion/allinaliyun/99program</a></p></li><li class="lvl-2"><p>阿里云在校学生300无门券/合作高校3折券领取:<a href="https://university.aliyun.com/">https://university.aliyun.com/</a></p></li></ul><h2 id="02-sshpass-非交互登录">02. sshpass 非交互登录<a class="header-anchor" href="#02-sshpass-非交互登录"></a></h2><p>ssh 不能在命令行中指定密码</p><p>sshpass:</p><ol><li class="lvl-3"><p>用于非交互的 ssh 密码验证,允许用 -p 参数指定明文密码</p></li><li class="lvl-3"><p>支持密码从命令行,文件,环境变量中读取</p></li></ol><blockquote><p>Ubuntu 报错 <code>E: Unable to locate package sshpass</code></p><p><code>apt-get update</code> ; sudo apt-get install sshpass</p><p>参考文章:<a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></blockquote><p>登录脚本(第一次需 SSH 登录)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ali.sh</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">sshpass -p 密码 ssh -o ServerAliveinterval=60 root@IP</span><br><span class="line"><span class="comment"># sshpass -p 密码 ssh root@IP</span></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">chmod</span> +x ali.sh</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>-o option =&gt; Can be used to give options in the format used in the configuration file.</p></li><li class="lvl-2"><p><code>ServerAliveinterval=60</code> client每隔60秒发送一次请求给server,然后server响应,从而保持连接(防止连接空闲超时)</p></li></ul><p>定义别名 alias</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ~/.bashrc</span><br><span class="line"><span class="comment"># User specific aliases and functions</span></span><br><span class="line"><span class="built_in">alias</span> ali=<span class="string">&#x27;bash /home/peng/sh_file/ali.sh&#x27;</span></span><br></pre></td></tr></table></figure><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://blog.csdn.net/u013288190/article/details/116921994">Shell 脚本 ssh免密码 登录 远程服务器 sshpass用法示例</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/liao392781/article/details/79220395">Shell脚本免密码登录远程服务器(方法一)</a></p></li><li class="lvl-3"><p><a href="https://www.cnblogs.com/itsfei/p/15014277.html">ssh快捷登录 sshpass+alias</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/weixin_48693408/article/details/125961472">Linux – 将自己的shell脚本设置成命令</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/qq_44895681/article/details/124841145">配置SSH服务远程连接空闲超时退出时间(包括SSH无法登录、登录缓慢)</a></p></li></ol><h2 id="03-Xftp-显示隐藏文件">03. Xftp 显示隐藏文件<a class="header-anchor" href="#03-Xftp-显示隐藏文件"></a></h2><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304042240000.png" alt="image-20230404224047926" style="zoom: 33%;" /><p>参考文章:<a href="http://www.nndssk.com/xtjc/287647HVA4sC.html">Xftp显示隐藏文件的方法</a></p><h2 id="04-Github-多账户-SSH-配置">04. Github 多账户 SSH 配置<a class="header-anchor" href="#04-Github-多账户-SSH-配置"></a></h2><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -f ~/.ssh/id_rsa_gh -C user_gh@gmail.com</span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2">-b:指定 key 的 bit 数,对于 RSA key 而言,默认是 3072 bits</li><li class="lvl-2">-f:指定 key 的文件名,若需要指定路径,则文件名需要和路径一直,如 ~/.ssh/id_rsa_gh</li><li class="lvl-2">-C:指定新的 comment,即公钥末尾的字符串,一般是邮箱地址,若不指定会是 “username@hostname” 的形式</li><li class="lvl-2">-t:指定私钥类型,一般有 “dsa”, “ecdsa”, “ecdsa-sk”, “ed25519”, “ed25519-sk” 和 “rsa” 等几种,若指定为 rsa 还可以指定签名类型,默认为 “rsa-sha2-512”</li></ul></blockquote><blockquote><p>Github 不同账户,类似配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> ~/.ssh/config</span><br><span class="line">Host github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> PreferredAuthentications publickey</span><br><span class="line"> IdentityFile ~/.ssh/user1_rsa</span><br><span class="line"> User user1</span><br><span class="line">Host github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> PreferredAuthentications publickey</span><br><span class="line"> IdentityFile ~/.ssh/user2_rsa</span><br><span class="line"> User user2</span><br><span class="line">------</span><br><span class="line">Host user_gh.github.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> User user_gh</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_gh</span><br><span class="line">Host github-qileq.com</span><br><span class="line"> HostName github.com</span><br><span class="line"> User qileq</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_qileq</span><br><span class="line">Host gitlab.com</span><br><span class="line"> HostName gitlab.com</span><br><span class="line"> User user_gl</span><br><span class="line"> IdentityFile ~/.ssh/id_rsa_gl</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul class="lvl-1"><li class="lvl-2"><p>Host 类型昵称,可以简化登录的输入地址,比如<code>Host ccl</code>,则可以用<code>ssh ccl</code>直接连接</p></li><li class="lvl-2"><p>HostName 表示连接的远程主机地址</p></li><li class="lvl-2"><p>IdentityFile 表示指定私钥文件路径</p></li><li class="lvl-2"><p>Port 指定端口</p></li><li class="lvl-2"><p>User 指定用户名</p></li></ul><p>修改仓库的 git 信息,将仓库配置 url 的 <a href="https://link.zhihu.com/?target=http%3A//github.com">http://github.com</a> 替换为 ssh config 中设置的 Host 值。</p><p>笔者以 <a href="https://link.zhihu.com/?target=https%3A//github.com/qileq/java-roam-guide">java-roam-guide</a> 为例,使用如下两种方式来修改仓库地址:</p><ol><li class="lvl-3"><p>执行命令 git remote set-url origin <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guid.git</p></li><li class="lvl-3"><p>将该仓库 .git/config 中的 url = <a href="mailto:git@github.com">git@github.com</a>:qileq/java-roam-guide.git 修改为 url = <a href="mailto:git@github-qileq.com">git@github-qileq.com</a>:qileq/java-roam-guide.git</p></li></ol><p>修改完成后,执行 git remote -v 查看仓库地址是否正确。</p></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 当使用&lt;user1.github.com&gt;替换&lt;github.com&gt;进行访问时,ssh会自动识别为user1</span></span><br><span class="line"><span class="comment"># 配置用户1</span></span><br><span class="line">Host user1.github.com<span class="comment"># 别名,可以随便写一个url。</span></span><br><span class="line">Hostname github.com<span class="comment"># 网站真实的域名,如果是GitHub就不用改了</span></span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user1<span class="comment"># 指向user1的私钥路径,似乎只能在~/.ssh下,不要随便放</span></span><br><span class="line">User user1<span class="comment"># 填写user1的Github用户名,不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置用户2</span></span><br><span class="line">Host user1.github.com</span><br><span class="line">Hostname github.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa_user2<span class="comment"># 指向user2的私钥路径,似乎只能在~/.ssh下,不要随便放</span></span><br><span class="line">User user2<span class="comment"># 填写user2的GitHub用户名,不过似乎最后获取的还是真实的Github用户名</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果是直接使用 <code>git@github.com</code>,那么ssh将自动识别为config列表的第一个用户,可以认为是单用户模式</p><p>由于是多用户,所以在第一次clone一个GitHub地址的时候,需要简单的修改一下对应的域名,此时SSH将可以识别使用哪个用户进行操作,并建立配置记录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 原始要clone的仓库命令</span></span><br><span class="line">git <span class="built_in">clone</span> git@github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 对应修改一下&lt;github.com&gt;,user1修改为上面配置的&lt;user1.github.com&gt;即可</span></span><br><span class="line">git <span class="built_in">clone</span> git@user1.github.com:oneflyingfish/WebServer_C.git</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>多用户共用情况下,如果提示设置用户名,一定要设置为<code>局部信息</code>,而不是<code>global</code>。命令应修改为</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git默认提示的命令</span></span><br><span class="line">git config --global user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 我们应该使用的命令</span></span><br><span class="line">git config user.name <span class="string">&quot;your_name&quot;</span></span><br><span class="line">git config user.email <span class="string">&quot;your_eamil&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/521768041">* SSH 多账号的配置</a></p></li><li class="lvl-3"><p><a href="https://cloud.tencent.com/developer/article/2121948">ssh config多账户/多域名配置</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/senlin1202/article/details/122081089">SSH Config 使用</a></p></li><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/443e.html">Mac上配置多个SSH</a></p></li><li class="lvl-3"><p><a href="https://oneflyingfish.gitee.io/articles/20c7aea41283/">* 配置SSH keys连接GitHub(支持多用户)</a></p></li><li class="lvl-3"><p><a href="https://happyleecode.gitee.io/2023/04/05/SSH/">解决 Git 同时部署到 GitHub 和 Gitee 时,密钥 SSH 冲突问题</a></p></li></ol><h2 id="05-APICloud-打包网页">05. APICloud 打包网页<a class="header-anchor" href="#05-APICloud-打包网页"></a></h2><p><mark>未成功</mark></p><p><a href="https://www.apicloud.com/portal-web/console">APICloud</a> =&gt; Web App 创建</p><p>图标<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700919.png</a></p><p>启动页<a href="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png">https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061700867.png</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304061613612.png" alt="image-20230406161352487" style="zoom:33%;" /><p>安装后的 APP 因无法开启存储空间权限,未能成功(个人原因,<a href="https://www.fomal.cc/">Fomalhaut🥝</a> 的 <a href="https://lskypro.acozycotage.net/Fomalhaut/Fomalhaut.apk">APP</a> 能设置)</p><p>参考教程:<a href="https://naokuoteng.cn/posts/2afd210.html">将网站 / 博客打包成桌面 APP</a>、<a href="https://www.fomal.cc/comments/#9392fccc60784238be439c910336af0b">Fomalhaut🥝.留言</a></p><h2 id="06-Hexo-渲染脚注">06. Hexo 渲染脚注<a class="header-anchor" href="#06-Hexo-渲染脚注"></a></h2><p>下文采用 hexo-renderer-markdown-it 渲染器(渲染脚注效果一般,不打算用脚注了)</p><blockquote><p>尽管标准 Markdown 不支持脚注,但很多 Markdown 变种都支持。一般来说,大多数 Markdown 方言和编辑器支持行内脚注和引用式脚注这两种方式,而后者使用更为普遍(原文:<a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a>)</p></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm uninstall --save hexo-renderer-marked</span><br><span class="line">npm install --save hexo-renderer-markdown-it</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">markdown:</span></span><br><span class="line"> <span class="attr">plugins:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">markdown-it-footnote</span></span><br></pre></td></tr></table></figure><p>原文:<a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">我的博客的诞生(二)</a></p></blockquote><blockquote><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Here is a footnote reference,[^1] and another.[^longnote]</span><br><span class="line"></span><br><span class="line">[<span class="symbol">^1</span>]: <span class="link">Here is the footnote.</span></span><br><span class="line"></span><br><span class="line">[<span class="symbol">^longnote</span>]: <span class="link">Here&#x27;s one with multiple blocks.</span></span><br><span class="line"></span><br><span class="line"><span class="code"> Subsequent paragraphs are indented to show that they</span></span><br><span class="line"><span class="code">belong to the previous footnote.</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Here is an inline note.^[Inlines notes are easier to write, since</span><br><span class="line">you don&#x27;t have to pick an identifier and move down to type the</span><br><span class="line">note.]</span><br></pre></td></tr></table></figure><p>来源:<a href="https://github.com/markdown-it/markdown-it-footnote">markdown-it/markdown-it-footnote</a></p></blockquote><p>个人配置:</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"># https://butterfly.js.org/posts/ceeb73f/#Math-%E6%95%B8%E5%AD%B8</span><br><span class="line"># https://www.nickxu.top/2022/04/17/Hexo-Butterfly-建站指南(八)使用-KaTeX-数学公式/</span><br><span class="line"># https://github.com/hexojs/hexo-renderer-markdown-it</span><br><span class="line"># https://ezgx.tk/posts/65320/</span><br><span class="line">markdown:</span><br><span class="line"> preset: &#x27;default&#x27;</span><br><span class="line"> render:</span><br><span class="line"> html: true</span><br><span class="line"> xhtmlOut: false</span><br><span class="line"> langPrefix: &#x27;language-&#x27;</span><br><span class="line"> breaks: true</span><br><span class="line"> linkify: true</span><br><span class="line"> typographer: true</span><br><span class="line"> quotes: &#x27;“”‘’&#x27;</span><br><span class="line"> enable_rules:</span><br><span class="line"> disable_rules:</span><br><span class="line"> plugins:</span><br><span class="line"> - markdown-it-abbr</span><br><span class="line"> # installed external plugins also can be enabled</span><br><span class="line"> - markdown-it-table-of-contents</span><br><span class="line"> - markdown-it-attrs</span><br><span class="line"> # - markdown-it-cjk-breaks</span><br><span class="line"> - markdown-it-container</span><br><span class="line"> - markdown-it-deflist</span><br><span class="line"> - markdown-it-emoji</span><br><span class="line"><span class="addition">+ - markdown-it-footnote</span></span><br><span class="line"> - markdown-it-ins</span><br><span class="line"> - markdown-it-mark</span><br><span class="line"> - markdown-it-sub</span><br><span class="line"> - markdown-it-sup</span><br><span class="line"> - markdown-it-checkbox</span><br><span class="line"> - markdown-it-imsize</span><br><span class="line"> - markdown-it-expandable</span><br><span class="line"> - markdown-it-merge-cells</span><br><span class="line"> - &#x27;@renbaoshuo/markdown-it-katex&#x27;</span><br><span class="line"> # - @iktakahiro/markdown-it-katex</span><br><span class="line"> # - name: &#x27;@neilsustc/markdown-it-katex&#x27;</span><br><span class="line"> # enable: true</span><br><span class="line"> # options:</span><br><span class="line"> # strict: false</span><br><span class="line"> # - markdown-it-toc-and-anchor</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: success</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: tips</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: warning</span><br><span class="line"> - name: markdown-it-container</span><br><span class="line"> options: danger</span><br><span class="line"> anchors:</span><br><span class="line"> level: 1</span><br><span class="line"> collisionSuffix: &#x27;&#x27;</span><br><span class="line"> permalink: false</span><br><span class="line"> permalinkClass: &#x27;header-anchor&#x27;</span><br><span class="line"> permalinkSide: &#x27;left&#x27;</span><br><span class="line"> permalinkSymbol: &#x27;¶&#x27;</span><br><span class="line"> case: 0</span><br><span class="line"> separator: &#x27;-&#x27;</span><br><span class="line"> images:</span><br><span class="line"> lazyload: false</span><br><span class="line"> prepend_root: false</span><br><span class="line"> post_asset: false</span><br></pre></td></tr></table></figure><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://sspai.com/post/77513">在 Markdown 中使用引用式链接和脚注</a></p></li><li class="lvl-3"><p><a href="https://markdown.com.cn/extended-syntax/footnotes.html">Markdown 脚注</a></p></li><li class="lvl-3"><p><a href="https://blog.meta-code.top/2023/03/21/2023-53/">百里飞洋 Barry-Flynn(得知脚注)</a></p></li><li class="lvl-3"><p><a href="https://github.com/hexojs/hexo-renderer-markdown-it">hexojs/hexo-renderer-markdown-it</a></p></li><li class="lvl-3"><p><a href="https://github.com/markdown-it/markdown-it-footnote">* markdown-it/markdown-it-footnote</a></p></li><li class="lvl-3"><p><a href="https://blog.imql.life/2020/01/24/My_HexoBlog_with_NexT(2)/#%E6%9B%B4%E6%8D%A2%E9%BB%98%E8%AE%A4%E7%9A%84-Markdown-%E6%B8%B2%E6%9F%93%E5%99%A8-1">* 我的博客的诞生(二)</a></p></li></ol><h2 id="07-Base64-加密邮箱-解密">07. Base64 加密邮箱 解密<a class="header-anchor" href="#07-Base64-加密邮箱-解密"></a></h2><p>加密的邮箱地址,使用 base64 加密。在线加密:<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>解密 <code>javascript:decryptEmail(...)</code>,代码示例:<a href="https://www.mycpen.cn/">https://www.mycpen.cn/</a></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;javascript:decryptEmail(&#x27;bXljcGVuQHFxLmNvbQ==&#x27;);&quot;</span> <span class="attr">title</span>=<span class="string">&quot;email&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="08-Word-转-MD(Pandoc)">08. Word 转 MD(Pandoc)<a class="header-anchor" href="#08-Word-转-MD(Pandoc)"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pandoc -xxx.docx -o xxx.md</span><br></pre></td></tr></table></figure><blockquote><p>一、下载pandoc<br>建议使用msi直接安装,而不是下载安装包直接使用,msi的下载方法:安装方法。</p><p>二、pandoc转换<br>1、cmd进入文件夹<br>打开cmd。<br>转换到文件所在的路径中。d:进入D盘的路径下,CD D:\Program Files\OneDrive\桌面\temp</p><p>2、代码实现</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pandoc -xxx.docx -o xxx.md <span class="comment"># docx 文件转换为 md 文件</span></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304162143719.png" alt="image-20230416214320662" style="zoom: 33%;" /></blockquote><p>参考文章:<a href="http://www.taodudu.cc/news/show-3860696.html">word文件转md文件</a></p><h2 id="09-GitHub-删除历史记录">09. GitHub 删除历史记录<a class="header-anchor" href="#09-GitHub-删除历史记录"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git reset &lt;上一步复制到的字符串&gt;</span><br><span class="line">git push -f</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://blog.csdn.net/sunzequan888/article/details/125738176">GITHUB删除历史记录</a></p><h2 id="10-ChatGPT-API-Key-个人站">10. ChatGPT API Key 个人站<a class="header-anchor" href="#10-ChatGPT-API-Key-个人站"></a></h2><p>项目地址:</p><ol><li class="lvl-3"><p><a href="https://github.com/Chanzhaoyu/chatgpt-web">https://github.com/Chanzhaoyu/chatgpt-web</a></p></li><li class="lvl-3"><p><a href="https://github.com/Yidadaa/ChatGPT-Next-Web">https://github.com/Yidadaa/ChatGPT-Next-Web</a></p></li></ol><p>参考文章:</p><ol><li class="lvl-3"><p><a href="https://www.fomal.cc/posts/74ac8dc8.html">无服务器部署自己的chatGPT</a></p></li></ol><h2 id="11-字符画-consolo-log">11. 字符画 consolo.log()<a class="header-anchor" href="#11-字符画-consolo-log"></a></h2><p><strong>推荐</strong>:<a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a></p><p>文字生成字符画:<br><a href="http://patorjk.com/software/taag">http://patorjk.com/software/taag</a><br><a href="http://www.network-science.de/ascii/">http://www.network-science.de/ascii/</a></p><p>图片生成字符画:<br><a href="http://www.degraeve.com/img2txt.php">http://www.degraeve.com/img2txt.php</a><br><a href="http://life.chacuo.net/convertphoto2char">http://life.chacuo.net/convertphoto2char</a></p><p>流程图生成字符画:<br><a href="http://asciiflow.com/">http://asciiflow.com/</a></p><p>VSCode 插件:<br><a href="https://github.com/OBKoro1/koro1FileHeader">https://github.com/OBKoro1/koro1FileHeader</a></p><p>参考:<a href="https://blog.saop.cc/p/c9df/">https://blog.saop.cc/p/c9df/</a></p><h2 id="12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS">12. ERR_HTTP2_PROTOCOL_ERROR 关闭 HSTS<a class="header-anchor" href="#12-ERR-HTTP2-PROTOCOL-ERROR-关闭-HSTS"></a></h2><p>访问网站,偶然性报错:ERR_HTTP2_PROTOCOL_ERROR。试着关闭 HSTS</p><p>CDN HTTPS 配置 关闭 <code>HSTS</code>,<a href="https://console.dogecloud.com/cdn/domain/https?domainId=6667">多吉云个人链接</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191935126.png" alt="image-20230419193555012" style="zoom: 33%;" /><p>以下内容来自 ChatGPT:</p><blockquote><p>问:<code>ERR_HTTP2_PROTOCOL_ERROR 和 HSTS 有什么联系</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946818.png" alt="image-20230419194615758" style="zoom: 50%;" /><p>问:<code>HSTS 会导致 ERR_HTTP2_PROTOCOL_ERROR 报错吗</code></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202304191946462.png" alt="image-20230419194650417" style="zoom: 50%;" /></blockquote><h2 id="13-Clash-Parsers">13. Clash Parsers<a class="header-anchor" href="#13-Clash-Parsers"></a></h2><p>设置 =&gt; 配置 =&gt; 配置文件预处理</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">parsers:</span> <span class="comment"># array</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">https://xxx.xxx/xxx</span></span><br><span class="line"> <span class="attr">yaml:</span></span><br><span class="line"> <span class="attr">prepend-rules:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,香港Az-优化3</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,GLOBAL</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DOMAIN-SUFFIX,xxx.com,DIRECT</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>参考链接:</p><ol><li class="lvl-3"><p><a href="https://docs.cfw.lbyczf.com/contents/parser.html">* Clash for Windows:配置文件预处理</a></p></li><li class="lvl-3"><p><a href="https://zhuanlan.zhihu.com/p/600564111">* Clash利用parsers进行规则预处理</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/u013559309/article/details/129437063">* Clash使用Parser添加自定义规则并防止更新覆盖</a></p></li><li class="lvl-3"><p><a href="https://www.wangpc.cc/software/clash-for-windows-paarsers-rules/">clash for windows自定义规则(不会被更新覆盖)</a></p></li><li class="lvl-3"><p><a href="https://www.zhihu.com/question/507810862">clash for windows如何设置指定IP或者网站才走xx?</a></p></li></ol><h2 id="14-Replit-部署-Typecho-TimePlus">14. Replit 部署 Typecho.TimePlus<a class="header-anchor" href="#14-Replit-部署-Typecho-TimePlus"></a></h2><blockquote><p>步骤:<a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p><p>Demo:<a href="https://plog.zhheo.com/">https://plog.zhheo.com/</a></p><p>在 Typecho 后台导航栏点击【撰写】,在自定义字段中填写图片地址。并填写文章标题和内容,即对应为图片的标题和简介。</p></blockquote><p>搭建步骤:</p><ol><li class="lvl-3"><p><a href="https://replit.com/">Replit</a> Create a Repl,环境选 SQLite;参照 <a href="https://github.com/valetzx/typechonreplit">@valetzx/typechonreplit</a> 执行 <code>git clone https://github.com/valetzx/typechonreplit &amp;&amp; mv -b typechonreplit/* ./ &amp;&amp; mv -b typechonreplit/.[^.]* ./ &amp;&amp; rm -rf *~ &amp;&amp; rm -rf typechonreplit</code>;注释 <code>main.sh</code> butterfly 相关行,<code>bash main.sh</code>;Run 运行;设置 Typecho 时选择 SQLite 数据库</p></li><li class="lvl-3"><p>按照 <a href="https://github.com/zhheo/TimePlus/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%B8%8A%E6%89%8B">TimePlus.Wiki</a> 设置,将 <a href="https://github.com/zhheo/TimePlus/releases">Source code</a> 解压上传 Replit Repl 对应路径,按步骤设置</p></li><li class="lvl-3"><p>图片仓库批量获取图片 URL <code>ls ./bj |awk '&#123;print &quot;https://mycpen.gitee.io/cdn2/image/bj/&quot;$1&quot;&quot;&#125;' &gt; C:/Users/Administrator/Desktop/TimePlus.txt</code></p></li><li class="lvl-3"><p>Replit Repl 绑自定义域名,需先 TXT 记录认证(因验证问题无法使用 https)</p></li></ol><p>相关链接:</p><ol><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus/wiki/">https://github.com/zhheo/TimePlus/wiki/</a></p></li><li class="lvl-3"><p><a href="https://github.com/zhheo/TimePlus">https://github.com/zhheo/TimePlus</a></p></li><li class="lvl-3"><p><a href="https://github.com/valetzx/typechonreplit">https://github.com/valetzx/typechonreplit</a></p></li><li class="lvl-3"><p><a href="https://blog.zhheo.com/p/bed74f41.html">https://blog.zhheo.com/p/bed74f41.html</a></p></li><li class="lvl-3"><p><a href="https://replit.com/">Replit</a></p></li><li class="lvl-3"><p><a href="https://dns.console.aliyun.com/">阿里云.DNS</a></p></li></ol><h2 id="15-Git-修改提交信息">15. Git 修改提交信息<a class="header-anchor" href="#15-Git-修改提交信息"></a></h2><p><strong>2023-12-13 更新</strong></p><p>使用 <code>git rebase -i HEAD~&lt;n&gt;</code> 修改最近某一次的提交信息,以下来自 chatgpt</p><blockquote><p>当您执行 <code>git rebase -i HEAD~&lt;n&gt;</code> 命令时,会打开一个交互式的编辑器界面,列出最近 <code>&lt;n&gt;</code> 个提交。下面是一个示例,假设您要修改最近的前三次提交的提交信息:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pick 1a2b3c4 Commit message 1</span><br><span class="line">pick 5d6e7f8 Commit message 2</span><br><span class="line">pick 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>要修改提交信息,将每个提交的行的开头的 <code>pick</code> 改为 <code>reword</code> 或 <code>r</code>,然后保存并关闭编辑器。修改后的示例如下:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">reword 1a2b3c4 Commit message 1</span><br><span class="line">reword 5d6e7f8 Commit message 2</span><br><span class="line">reword 9g0h1i2 Commit message 3</span><br></pre></td></tr></table></figure><p>保存并关闭编辑器后,Git 会逐个应用这些提交,并在每个提交之前暂停并等待您编辑提交信息。对于每个提交,Git 会打开一个新的编辑器窗口,允许您修改提交信息。完成修改后,保存并关闭编辑器。</p><p>请注意,如果在 rebase 过程中出现冲突,您需要解决冲突并使用 <code>git add</code> 命令将解决后的文件标记为已解决。然后,继续进行 rebase,直到所有提交都被处理完毕。</p><p>完成 rebase 后,您可以使用 <code>git log</code> 命令验证提交信息是否已成功修改。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git log</span><br></pre></td></tr></table></figure><p>如果要将修改的提交信息推送到远程仓库,您需要使用 <code>git push --force</code> 命令,因为您已经修改了历史提交。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ git push --force</span><br></pre></td></tr></table></figure><p>请确保在进行此操作之前备份您的代码,并与团队成员进行沟通,以免影响其他人的工作。</p></blockquote><hr><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git commit --amend</span><br><span class="line">git push --force &lt;remote-name&gt; &lt;branch-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131749192.png" alt="image-20230513174958143" style="zoom: 80%;" /></blockquote><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> --oneline</span><br><span class="line">git commit --amend -m <span class="string">&quot;新的提交信息&quot;</span></span><br><span class="line">git push --force origin master</span><br><span class="line"></span><br></pre></td></tr></table></figure><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202305131751216.png" alt="image-20230513175153157" style="zoom: 67%;" /></blockquote><h2 id="16-GitHub-BiliBiliToolPro">16. GitHub: BiliBiliToolPro<a class="header-anchor" href="#16-GitHub-BiliBiliToolPro"></a></h2><p><strong>2024-12-11</strong> 更新至最新版本 <code>V2.1.1</code></p><p>版本 2.1.1,上线时间 2024-05-13</p><p>地址:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">github</a></p><p>方式:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署-文档-linux</a></p><p>失效项:</p><ol><li class="lvl-3"><p>LiveLottery,天选时刻抽奖,<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/764">issue</a></p></li><li class="lvl-3"><p>LiveFansMedal,直播间挂机,<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/issues/794">issue</a></p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧版文件</span></span><br><span class="line">$ <span class="built_in">rm</span> -rf *</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/2.1.1/bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v2.1.1-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 8 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">* */12 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 16 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0,20,40 18 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line">0 20 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><p>地址:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro">https://github.com/RayWangQvQ/BiliBiliToolPro</a></p><p><a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">本地部署</a>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/1.0.3/bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v1.0.3-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint</span><br><span class="line">0 8 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily</span><br><span class="line">* */12 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery</span><br><span class="line">0 16 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched</span><br><span class="line">0 20 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="17-GitHub-Compare">17. GitHub Compare<a class="header-anchor" href="#17-GitHub-Compare"></a></h2><p>原文:<a href="https://akilar.top/posts/bbf68ad4/">https://akilar.top/posts/bbf68ad4/</a></p><p>示例:<a href="https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0">https://github.com/jerryc127/hexo-theme-butterfly/compare/4.8.5...4.9.0</a></p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202309161502336.png" alt="image-20230916150258235" style="zoom:50%;" /><h2 id="18-new-Date-getFullYear">18. new Date().getFullYear();<a class="header-anchor" href="#18-new-Date-getFullYear"></a></h2><p>JavaScript 获取当前年份</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 要以自动方式获取明年的年份并将其用于创建日期对象,您可以按如下方式修改代码:</span></span><br><span class="line"><span class="keyword">const</span> currentYear = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getFullYear</span>();</span><br><span class="line"><span class="keyword">const</span> nextYear = currentYear + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">const</span> newYearTimestamp = <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">`<span class="subst">$&#123;nextYear&#125;</span>-01-01 00:00:00`</span>).<span class="title function_">getTime</span>() / <span class="number">1000</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="19-JavaScript-解码-Base64">19. JavaScript 解码 Base64<a class="header-anchor" href="#19-JavaScript-解码-Base64"></a></h2><p>在线加密:<a href="https://encode.chahuo.com/">https://encode.chahuo.com/</a></p><p>以下来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中解码 Base64 编码的数据,你可以使用 <code>atob()</code> 函数。该函数可以将 Base64 编码的字符串解码为原始的文本数据。示例代码如下:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> base64String = <span class="string">&quot;SGVsbG8gd29ybGQ=&quot;</span>; <span class="comment">// Base64 编码的字符串</span></span><br><span class="line"><span class="keyword">const</span> decodedString = <span class="title function_">atob</span>(base64String); <span class="comment">// 解码</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(decodedString); <span class="comment">// 输出解码后的字符串</span></span><br></pre></td></tr></table></figure><p>在这个例子中,<code>base64String</code> 你要解码Base64编码的字符串。使用<code>atob()</code>函数对它进行解码,然后你就可以处理解码后的原始字符串了。</p></blockquote><h2 id="20-JavaScript-取绝对值">20. JavaScript 取绝对值<a class="header-anchor" href="#20-JavaScript-取绝对值"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>在 JavaScript 中,你可以使用 <code>Math.abs()</code> 函数来获取一个数的绝对值,从而去除负号。例如:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> num = -<span class="number">5</span>;</span><br><span class="line"><span class="keyword">let</span> absNum = <span class="title class_">Math</span>.<span class="title function_">abs</span>(num); <span class="comment">// absNum将是5</span></span><br></pre></td></tr></table></figure><p>这样,<code>absNum</code> 将会取得 <code>num</code> 的绝对值,而不考虑其正负。</p></blockquote><h2 id="21-JavaScript-三元运算">21. JavaScript 三元运算<a class="header-anchor" href="#21-JavaScript-三元运算"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p>你可以使用条件运算符(三元运算符)来判断 <code>e - now1</code> 是否大于 0,然后决定是否执行 +1。下面是优化后的代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> daysDifference = <span class="title class_">Math</span>.<span class="title function_">floor</span>(((e - now1) / <span class="number">1e3</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>) + (e - now1 &gt; <span class="number">0</span> ? <span class="number">1</span> : <span class="number">0</span>));</span><br></pre></td></tr></table></figure><p>这行代码首先计算 <code>(e - now1) / 1e3 / 60 / 60 / 24</code> 得到天数差,然后根据 <code>(e - now1 &gt; 0)</code> 条件判断天数差是否大于 0,如果是则加 1,否则加 0。最后使用 <code>Math.floor</code> 向下取整。</p></blockquote><h2 id="22-Snipaste-截图格式改-JPG">22. Snipaste 截图格式改 JPG<a class="header-anchor" href="#22-Snipaste-截图格式改-JPG"></a></h2><p>参考:<a href="https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html">https://jingyan.baidu.com/article/25648fc14b3276d091fd00c3.html</a></p><p>右键 → 首选项 → 输出 → 文件名.后缀</p><p>实测大大减少图片体积,500 KB (PNG) → 70KB (JPG)</p><p>仅适用于保存为本地文件,从剪贴板中粘贴到 typora 里还是 PNG 格式的</p><p>本人格式:<code>image-$yyyyMMddHHmmsszzz$.jpg</code>,目的 与 typora 剪贴板 上场时的 alt 命名保持一致</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070313815.jpg" alt="image-20231007031301508" style="zoom: 25%;" /><h2 id="23-CSS-视口单位-dvh-svh-lvh">23. CSS 视口单位 dvh, svh, lvh<a class="header-anchor" href="#23-CSS-视口单位-dvh-svh-lvh"></a></h2><p>参考:</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/e644.html">https://blog.anheyu.com/posts/e644.html</a></p></li><li class="lvl-3"><p><a href="https://blog.csdn.net/LuckyWinty/article/details/128962918">https://blog.csdn.net/LuckyWinty/article/details/128962918</a></p></li></ol><h2 id="24-CSS-旋转-rotate-90deg">24. CSS 旋转 rotate(90deg)<a class="header-anchor" href="#24-CSS-旋转-rotate-90deg"></a></h2><p>来自 <a href="https://chat-shared2.zhile.io/">ChatGPT</a></p><blockquote><p><code>rotate(90deg)</code> 是CSS中的旋转变换指令,用于将元素顺时针旋转90度。这可以应用于任何HTML元素,使其在页面上以指定角度旋转。</p><p>逆时针旋转一个元素90度,<code>rotate(-90deg)</code></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.about-page-chicken-soup</span> <span class="selector-tag">details</span><span class="selector-attr">[open]</span>&gt;<span class="selector-tag">summary</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></blockquote><h2 id="25-Markdown-折叠语法">25. Markdown 折叠语法<a class="header-anchor" href="#25-Markdown-折叠语法"></a></h2><p>参考:<a href="https://blog.csdn.net/ybb_ymm/article/details/128508243">https://blog.csdn.net/ybb_ymm/article/details/128508243</a></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code"> &lt;summary&gt;指示标题&lt;/summary&gt;</span></span><br><span class="line"><span class="code"> 内容</span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">details</span>&gt;</span></span> </span><br><span class="line"><span class="code"> &lt;summary&gt;展开查看&lt;/summary&gt;</span></span><br><span class="line"><span class="code"> &lt;pre&gt;&lt;code&gt;</span></span><br><span class="line"><span class="code"> 此处为代码的块具体内容</span></span><br><span class="line"><span class="code"> &lt;/code&gt;&lt;/pre&gt; </span></span><br><span class="line"><span class="code">&lt;/details&gt;</span></span><br></pre></td></tr></table></figure><h2 id="26-PicGo-图片压缩插件">26. PicGo 图片压缩插件<a class="header-anchor" href="#26-PicGo-图片压缩插件"></a></h2><p>插件名:<a href="https://github.com/liujinpen/picgo-plugin-compress-tinypng">picgo-plugin-compress-tinypng</a></p><p>NPM 包:<a href="https://www.npmjs.com/package/picgo-plugin-tinypng">picgo-plugin-tinypng</a></p><p>TinyPNG</p><ul class="lvl-0"><li class="lvl-2"><p>官网:<a href="https://tinify.cn/">https://tinify.cn/</a></p></li><li class="lvl-2"><p>获取 Key 参考:<a href="https://bearcai.com/index.php/archives/44/">https://bearcai.com/index.php/archives/44/</a><br><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202310070421963.jpg" alt="image-20231007042117896" style="zoom:25%;" /></p></li><li class="lvl-2"><p>Key 限额 500 次/月:<a href="https://tinify.cn/dashboard/api">https://tinify.cn/dashboard/api</a></p></li></ul><p>起因:<a href="https://github.com/juzisang/picgo-plugin-compress">picgo-plugin-compress</a> 长久失修,picgo 2.3.1 报错 <code>TypeError: req.end is not a function</code>。 <a href="https://github.com/juzisang/picgo-plugin-compress/issues/64#issuecomment-1504939740">issue#64</a> 获知此插件</p><h2 id="27-JavaScript-copy-事件">27. JavaScript copy 事件<a class="header-anchor" href="#27-JavaScript-copy-事件"></a></h2><p>来自 ChatGPT</p><p>要检测用户是否复制内容,你可以使用JavaScript中的<code>copy</code>事件来捕获复制操作。你可以将事件监听器绑定到<code>copy</code>事件上,然后在该事件触发时执行相应的操作,以获知用户是否复制了内容。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line"> <span class="comment">// 在这里执行你想要的操作,例如记录复制操作或发送数据到服务器</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容&#x27;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;copy&#x27;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line"> <span class="comment">// 获取复制的内容</span></span><br><span class="line"> <span class="keyword">var</span> copiedText = <span class="variable language_">window</span>.<span class="title function_">getSelection</span>().<span class="title function_">toString</span>().<span class="title function_">trim</span>();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 检查复制的内容是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (copiedText.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="comment">// 在这里执行你想要的操作,例如记录复制操作或发送数据到服务器</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户复制了内容:&#x27;</span>, copiedText);</span><br><span class="line"> &#125; <span class="keyword">else</span> &#123;</span><br><span class="line"> <span class="comment">// 复制的内容为空,可以选择不执行任何操作或者执行相应处理</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;用户尝试复制空内容&#x27;</span>);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="28-JavaScript-window-onresize">28. JavaScript window.onresize<a class="header-anchor" href="#28-JavaScript-window-onresize"></a></h2><p>来自:ChatGPT</p><p><code>window.onresize</code> 是 JavaScript 中的一个事件处理属性,它用于指定在浏览器窗口大小改变时要执行的函数。当用户调整浏览器窗口的大小时,就会触发 <code>resize</code> 事件,如果你将一个函数分配给 <code>window.onresize</code>,那么这个函数将在窗口大小改变时被调用。</p><p>例如,你可以使用以下方式监听窗口大小改变事件并执行相应的操作:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">onresize</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line"> <span class="comment">// 在窗口大小改变时执行的代码</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;窗口大小已改变&quot;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>这对于创建响应式设计或根据窗口大小进行布局调整等任务非常有用。当窗口大小发生变化时,你可以根据需要更新页面内容、样式或执行其他自定义操作。</p><h2 id="29-Git-指定远端">29. Git 指定远端<a class="header-anchor" href="#29-Git-指定远端"></a></h2><p>参考:<a href="http://www.mobiletrain.org/about/BBS/161969.html">http://www.mobiletrain.org/about/BBS/161969.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin &lt;远程仓库URL&gt;</span><br><span class="line"></span><br><span class="line">git push &lt;远程仓库别名&gt; &lt;本地分支名&gt;:&lt;远程分支名&gt;</span><br><span class="line"></span><br><span class="line">git push origin master:main</span><br></pre></td></tr></table></figure><h2 id="30-Git-删除文件历史提交记录">30. Git 删除文件历史提交记录<a class="header-anchor" href="#30-Git-删除文件历史提交记录"></a></h2><p>参考:ChatGPT</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git filter-branch --force --index-filter <span class="string">&#x27;git rm -r --cached --ignore-unmatch node_modules&#x27;</span> --prune-empty --tag-name-filter <span class="built_in">cat</span> -- --all</span><br><span class="line">git <span class="built_in">rm</span> --cached node_modules -r</span><br><span class="line"></span><br><span class="line">git reflog expire --expire=now --all &amp;&amp; git gc --prune=now --aggressive</span><br></pre></td></tr></table></figure><p>ChatGPT 还提供了 <code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code> 命令删除,运行时间过长,不采用,给出的解释:命令1 使用了 <code>--index-filter</code> 和 <code>--cached</code>,这些参数可以更快地处理 Git 的索引而不需要检查和修改实际的工作树文件</p><blockquote><ol><li class="lvl-3"><p><code>git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--tree-filter</code> 参数,它会在每个提交上执行指定的 shell 命令。在这种情况下,它会执行 <code>rm -rf node_modules</code> 命令来删除 <code>node_modules</code> 目录。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">只作用于当前分支 <code>HEAD</code>。</li></ul></li><li class="lvl-3"><p><code>git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch node_modules' --prune-empty --tag-name-filter cat -- --all</code>:</p><ul class="lvl-3"><li class="lvl-5">使用 <code>--index-filter</code> 参数,它会在 Git 索引上执行指定的命令。在这种情况下,它会执行 <code>git rm -r --cached --ignore-unmatch node_modules</code> 命令,以将 <code>node_modules</code> 从索引中删除。</li><li class="lvl-5">使用 <code>--prune-empty</code> 选项以删除空提交。</li><li class="lvl-5">使用 <code>--tag-name-filter cat</code> 选项,以保留提交的标签(tags)。</li><li class="lvl-5">使用 <code>--all</code> 来指定作用于所有分支。</li></ul></li></ol><hr><p>之前上传 github 时提交了无需提交的 node_modules,如何缩小 .git 的大小</p><p>ChatGPT:要缩小.git目录的大小,可以采取以下步骤:</p><ol><li class="lvl-3"><p>清理历史提交中的node_modules:首先,你需要清理历史提交中的不必要的node_modules目录。你可以使用<code>git filter-branch</code>命令或<code>git filter-repo</code>工具来重写历史提交以删除node_modules。确保在删除之前备份你的仓库,以防发生问题。</p></li><li class="lvl-3"><p>使用.gitignore:在项目根目录下创建一个名为<code>.gitignore</code>的文件,并将<code>node_modules/</code>添加到其中,以确保不再将该目录包括在提交中。</p></li><li class="lvl-3"><p>执行<code>git rm --cached node_modules -r</code>:这将删除当前暂存区中的node_modules目录,但不会删除物理文件。然后,提交这一变更。</p></li><li class="lvl-3"><p>执行<code>git reflog expire --expire=now --all</code>:这将清理Git的reflog,以确保不再保留对不必要历史提交的引用。</p></li><li class="lvl-3"><p>执行<code>git gc --prune=now</code>:这将触发垃圾收集,清理不必要的数据,从而缩小.git目录的大小。</p></li><li class="lvl-3"><p>推送到远程仓库:如果你使用远程仓库(如GitHub),确保将这些更改推送到远程仓库以同步它们。</p></li></ol><p>请注意,这些步骤会修改你的Git历史,因此在执行它们之前务必小心,确保已备份你的仓库数据。</p></blockquote><h2 id="31-洛雪音乐导入三方音源">31. 洛雪音乐导入三方音源<a class="header-anchor" href="#31-洛雪音乐导入三方音源"></a></h2><p>官方源因 TX 警告而报废,详见 issue:<a href="https://github.com/lyswhut/lx-music-desktop/issues/1643">https://github.com/lyswhut/lx-music-desktop/issues/1643</a></p><p>详见 issue:<a href="https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022">https://github.com/lyswhut/lx-music-desktop/issues/1649#issuecomment-1774536022</a></p><p>仓库:<a href="https://github.com/OneCodeMonkey/music-sources">https://github.com/OneCodeMonkey/music-sources</a></p><h2 id="32-Clash-GUI">32. Clash GUI<a class="header-anchor" href="#32-Clash-GUI"></a></h2><p>起因:<a href="https://github.com/Fndroid/clash_for_windows_pkg">Clash for Windows</a> 删库</p><p>Clash Verge:<a href="https://github.com/zzzgydi/clash-verge/">https://github.com/zzzgydi/clash-verge/</a></p><p>Clash for Android 存档:<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA">https://github.com/Z-Siqi/Clash-for-Windows_Chinese/releases/tag/CFA</a></p><p>Clash for Windows 存档:<a href="https://github.com/Z-Siqi/Clash-for-Windows_Chinese">https://github.com/Z-Siqi/Clash-for-Windows_Chinese</a></p><h2 id="33-GitHub-SSH-超时">33. GitHub SSH 超时<a class="header-anchor" href="#33-GitHub-SSH-超时"></a></h2><p><code>git pull</code> 报超时、<code>ping github.com</code> 报超时</p><p>解决方案</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git bash 终端</span></span><br><span class="line">vim ~/.ssh/config</span><br></pre></td></tr></table></figure><p>内容如下,第一次 <code>git pull</code> 时输入 <code>yes</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># GitHub Start</span></span><br><span class="line">Host github.com</span><br><span class="line"> Hostname ssh.github.com</span><br><span class="line"><span class="comment"># GitHub End</span></span><br></pre></td></tr></table></figure><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.ttiee.tech/posts/2024/71e1/">https://blog.ttiee.tech/posts/2024/71e1/</a></p></li><li class="lvl-3"><p><a href="https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/">https://ww-rm.github.io/posts/2024/01/17/githubssh-timeout/</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port">Using SSH over the HTTPS port</a></p></li><li class="lvl-3"><p>github <a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses">About GitHub’s IP addresses</a></p></li></ol><h2 id="34-Hexo-隐藏文章">34. Hexo 隐藏文章<a class="header-anchor" href="#34-Hexo-隐藏文章"></a></h2><p>参考:<a href="https://blog.jiejaitt.tech/posts/1c5dc392.html">JIeJaitt | Hexo隐藏文章</a></p><ol><li class="lvl-3"><p><code>Front-Matter</code> 配置 <code>published</code> 参数</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">Foo</span></span><br><span class="line"><span class="attr">published:</span> <span class="literal">false</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>存为草稿</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 路径 source/_drafts/</span></span><br><span class="line">hexo new draft &lt;title&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>插件,hexo-hide-posts 等</p></li></ol><p>官方参考</p><ol><li class="lvl-3"><p><a href="https://hexo.io/docs/front-matter#Settings-Their-Default-Values">https://hexo.io/docs/front-matter#Settings-Their-Default-Values</a></p></li><li class="lvl-3"><p><a href="https://hexo.io/zh-cn/docs/writing.html">https://hexo.io/zh-cn/docs/writing.html</a></p></li></ol><h2 id="35-GitHub-2FA">35. GitHub 2FA<a class="header-anchor" href="#35-GitHub-2FA"></a></h2><p>GitHub 2FA 双因素认证</p><p>地址:<a href="https://github.com/settings/security">https://github.com/settings/security</a></p><p>Chrome插件:<a href="https://chromewebstore.google.com/detail/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E5%99%A8/bhghoamapcdpbohphigoooaddinpkbai">Authenticator</a></p><p>安卓应用:<a href="https://play.google.com/store/apps/details?id=com.azure.authenticator">Microsoft Authenticator</a></p><p>参考:<a href="https://zhuanlan.zhihu.com/p/657035724">https://zhuanlan.zhihu.com/p/657035724</a></p><h2 id="36-GitHub-B-站粉丝牌助手">36. GitHub: B 站粉丝牌助手<a class="header-anchor" href="#36-GitHub-B-站粉丝牌助手"></a></h2><p>用途:b站粉丝牌升级</p><p>版本:fdc626f,<a href="https://github.com/XiaoMiku01/fansMedalHelper/commits/master/">commits</a>;Nov 11, 2024</p><p>地址:<a href="https://github.com/XiaoMiku01/fansMedalHelper">https://github.com/XiaoMiku01/fansMedalHelper</a></p><p>文档:<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/">https://xiaomiku01.github.io/fansMedalHelperVersion/</a></p><p>服务器部署:<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html">https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file</span><br><span class="line"></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XiaoMiku01/fansMedalHelper.git</span><br><span class="line">$ <span class="built_in">cd</span> fansMedalHelper</span><br><span class="line"><span class="comment"># $ pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span></span><br><span class="line">$ pip3.8 install -r requirements.txt</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> users.example.yaml users.yaml</span><br><span class="line">$ vim users.yaml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <a href="https://github.com/XiaoMiku01/fansMedalHelper/releases/tag/logintool">B站access_key获取工具</a> 管理员身份运行,获取 access_key</p><p>文件 <code>users.yaml</code> 修改项:<code>access_key</code>、<code>SIGNINGROUP: 2</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cat users.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">USERS:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">access_key:</span> <span class="string">xxx</span></span><br><span class="line"></span><br><span class="line"><span class="attr">SIGNINGROUP:</span> <span class="number">2</span> <span class="comment"># 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>删除不重要的粉丝牌,减少耗时,<a href="https://link.bilibili.com/p/center/index#/user-center/wearing-center/my-medal">b站链接</a>,参考自 <a href="https://github.com/XiaoMiku01/fansMedalHelper/issues/189#issuecomment-2268357426">issue</a></p><p>使用计划任务每日一点跑程序,参考自 <a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html#%E8%BF%90%E8%A1%8C%E4%B8%BB%E7%A8%8B%E5%BA%8F">文档</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3.8 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="37-音乐播放器">37. 音乐播放器<a class="header-anchor" href="#37-音乐播放器"></a></h2><p>吾爱破解:<a href="https://www.52pojie.cn/">https://www.52pojie.cn/</a></p><p>酷我音乐PC:<a href="https://wwc.lanzouy.com/iIepJ0b3wchg">蓝奏云</a></p><h2 id="38-b站-硬核会员">38. b站 硬核会员<a class="header-anchor" href="#38-b站-硬核会员"></a></h2><p>b站 硬核会员答题 油猴脚本</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa">https://github.com/HCLonely/bili-senior-newbie-qa</a></p></li><li class="lvl-3"><p><a href="https://blog.hclonely.com/posts/c1ef618c/">https://blog.hclonely.com/posts/c1ef618c/</a></p></li></ol><p><strong>安装</strong></p><ol><li class="lvl-3"><p>安装<a href="https://www.tampermonkey.net/index.php">Tampermonkey</a>(建议)或其他脚本管理器;</p></li><li class="lvl-3"><p><a href="https://github.com/HCLonely/bili-senior-newbie-qa/blob/main/bili-senior-newbie-qa.user.js?raw=true">点此安装</a>搜题脚本。</p></li></ol><p><strong>使用</strong></p><ol><li class="lvl-3"><p>手机哔哩哔哩客户端进入答题;</p></li><li class="lvl-3"><p>浏览器登录哔哩哔哩(已登录可跳过此步骤);</p></li><li class="lvl-3"><p>浏览器打开调试工具(<code>F12</code>), 将浏览器切换为移动设备(<code>Ctrl+Shift+M</code>);</p></li><li class="lvl-3"><p>在地址栏输入<code>https://www.bilibili.com/h5/senior-newbie/</code>并回车,进入答题,等待网页加载完成;</p></li><li class="lvl-3"><p>启动脚本(<code>Alt+N</code>);</p><ul class="lvl-2"><li class="lvl-6">加载题库(需要题目完全匹配):可从本地加载题库(支持<code>txt</code>,<code>doc</code>,<code>docx</code>,<code>xls</code>,<code>xlsx</code>格式),题库中搜索不到则使用搜索引擎搜索</li><li class="lvl-6">直接运行:使用搜索引擎搜索(支持<code>百度</code>,<code>搜狗</code>,<code>必应</code>,<code>谷歌</code>)</li></ul></li><li class="lvl-3"><p>点击<strong>题目</strong>即可进行搜索。</p></li></ol><p><strong>注意事项</strong></p><ol><li class="lvl-3"><p>使用此脚本时建议关闭其他插件/脚本,避免冲突;</p></li><li class="lvl-3"><p>建议选择<code>文史</code>,<code>知识</code>,<code>音乐</code>等答案比较好搜索判断的类型。</p></li></ol><h2 id="39-npm-cdn">39. npm cdn<a class="header-anchor" href="#39-npm-cdn"></a></h2><ol><li class="lvl-3"><p><a href="https://cdn.jsdelivr.net/npm/">https://cdn.jsdelivr.net/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.cbd.int/">https://cdn.cbd.int/</a></p></li><li class="lvl-3"><p><a href="https://cdn.iocdn.cc/npm/">https://cdn.iocdn.cc/npm/</a></p></li><li class="lvl-3"><p><a href="https://open.lightxi.com/unpkg/">https://open.lightxi.com/unpkg/</a></p></li><li class="lvl-3"><p><a href="https://cdn.smartcis.cn/npm/">https://cdn.smartcis.cn/npm/</a></p></li><li class="lvl-3"><p><a href="https://cdn.jsdmirror.com/npm/">https://cdn.jsdmirror.com/npm/</a></p></li><li class="lvl-3"><p><a href="https://s4.zstatic.net/npm/">https://s4.zstatic.net/npm/</a></p></li></ol><p>参考</p><ol><li class="lvl-3"><p><a href="https://blog.anheyu.com/posts/fe76.html">https://blog.anheyu.com/posts/fe76.html</a></p></li><li class="lvl-3"><p><a href="https://blog.liushen.fun/posts/260f4f9a/#JSCDN">https://blog.liushen.fun/posts/260f4f9a/#JSCDN</a></p></li></ol><h2 id="40-CentOS-配置-zsh">40. CentOS 配置 zsh<a class="header-anchor" href="#40-CentOS-配置-zsh"></a></h2><p>背景:2025/5/11 更换新云主机 CentOS Stream 9,迁移旧主机配置</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://www.cnblogs.com/jie-fang/p/13437335.html">https://www.cnblogs.com/jie-fang/p/13437335.html</a></p></li></ol><p>别名免密登录:<a href="https://blog.cpen.top/posts/cee83196.html#02-sshpass-%E9%9D%9E%E4%BA%A4%E4%BA%92%E7%99%BB%E5%BD%95">mycpen</a></p><p>修改主机名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cat</span> /etc/hostname</span><br><span class="line">CentOS</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启</span></span><br><span class="line">$ reboot</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>安装 zsh 和 oh-my-zsh,参考 <a href="https://www.cnblogs.com/jie-fang/p/13437335.html">博客园</a></p><ol><li class="lvl-3"><p>查看当前 shell <code>echo $SHELL</code></p></li><li class="lvl-3"><p>安装 zsh <code>yum install -y zsh</code></p></li><li class="lvl-3"><p>查看系统中已经安装的 shell <code>cat /etc/shells</code></p></li><li class="lvl-3"><p>切换 shell <code>chsh -s /bin/zsh</code></p></li><li class="lvl-3"><p>安装 git <code>yum install -y git</code></p></li><li class="lvl-3"><p>安装 oh-my-zsh</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sh -c <span class="string">&quot;<span class="subst">$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="7"><li class="lvl-3"><p>修改 oh-my-zsh 主题</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ vim ~/.zshrc</span><br><span class="line">ZSH_THEME=<span class="string">&quot;ys&quot;</span></span><br><span class="line"></span><br><span class="line">$ <span class="built_in">source</span> ~/.zshrc</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其他配置</p><p>迁移计划任务 crontab 定时脚本 <code>crontab -e</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站签到投币</span></span><br><span class="line"><span class="comment"># https://github.com/RayWangQvQ/BiliBiliToolPro</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=VipBigPoint &amp;&gt; /dev/null</span><br><span class="line">0 8 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=Daily &amp;&gt; /dev/null</span><br><span class="line"><span class="comment"># * */12 * * * cd /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveLottery &amp;&gt; /dev/null</span></span><br><span class="line">0,20,40 16 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line">0,20,40 18 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=UnfollowBatched &amp;&gt; /dev/null</span><br><span class="line">0 20 * * * <span class="built_in">cd</span> /root/sh_file/BiliBiliToolPro/linux-x64; ./Ray.BiliBiliTool.Console --runTasks=LiveFansMedal &amp;&gt; /dev/null</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>BiliBiliToolPro</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/RayWangQvQ/BiliBiliToolPro">https://github.com/RayWangQvQ/BiliBiliToolPro</a></p></li><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/cee83196.html#16-GitHub-BiliBiliToolPro">mycpen</a></p></li></ol><p>本地部署:<s>2025/5/11,V2.2.1</s> 2025/5/23,V3.1.0,参考:<a href="https://github.com/RayWangQvQ/BiliBiliToolPro/blob/main/docs/runInLocal.md#3-linux">github-linux</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file/BiliBiliToolPro</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除旧版文件</span></span><br><span class="line">$ <span class="built_in">rm</span> -rf *</span><br><span class="line"></span><br><span class="line">$ wget https://github.com/RayWangQvQ/BiliBiliToolPro/releases/download/3.1.0/bilibili-tool-pro-v3.1.0-linux-x64.zip</span><br><span class="line">$ unzip bilibili-tool-pro-v3.1.0-linux-x64.zip</span><br><span class="line">$ <span class="built_in">cd</span> ./linux-x64/</span><br><span class="line">$ ./Ray.BiliBiliTool.Console --runTasks=Login</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>fansMedalHelper</p><p>参考</p><ol><li class="lvl-3"><p><a href="https://github.com/XiaoMiku01/fansMedalHelper">https://github.com/XiaoMiku01/fansMedalHelper</a></p></li><li class="lvl-3"><p><a href="https://blog.cpen.top/posts/cee83196.html#36-GitHub-B-%E7%AB%99%E7%B2%89%E4%B8%9D%E7%89%8C%E5%8A%A9%E6%89%8B">mycpen</a></p></li></ol><p>本地部署:2025/5/11,<a href="https://github.com/XiaoMiku01/fansMedalHelper/commits/master/">fdc626f</a> Nov 11, 2024,参考:<a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html">文档</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">pwd</span></span><br><span class="line">/root/sh_file</span><br><span class="line"></span><br><span class="line">$ git <span class="built_in">clone</span> https://github.com/XiaoMiku01/fansMedalHelper.git</span><br><span class="line">$ <span class="built_in">cd</span> fansMedalHelper</span><br><span class="line"><span class="comment"># $ pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple</span></span><br><span class="line">$ pip3 install -r requirements.txt</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cp</span> users.example.yaml users.yaml</span><br><span class="line">$ vim users.yaml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用 <a href="https://github.com/XiaoMiku01/fansMedalHelper/releases/tag/logintool">B站access_key获取工具</a> 管理员身份运行,获取 access_key</p><p>文件 <code>users.yaml</code> 修改项:<code>access_key</code>、<code>SIGNINGROUP: 2</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># cat users.yaml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">USERS:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">access_key:</span> <span class="string">xxx</span></span><br><span class="line"></span><br><span class="line"><span class="attr">SIGNINGROUP:</span> <span class="number">2</span> <span class="comment"># 应援团签到CD时间,单位秒,默认2秒,设置为0则不签到</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用计划任务每日一点跑程序,参考自 <a href="https://xiaomiku01.github.io/fansMedalHelperVersion/guide/location.html#%E8%BF%90%E8%A1%8C%E4%B8%BB%E7%A8%8B%E5%BA%8F">文档</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"><span class="comment"># B站粉丝牌助手</span></span><br><span class="line"><span class="comment"># https://github.com/XiaoMiku01/fansMedalHelper</span></span><br><span class="line">0 1 * * * <span class="built_in">cd</span> /root/sh_file/fansMedalHelper; python3 main.py &amp;&gt; /dev/null</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
267
267
 
268
268
 
269
269
  <categories>
@@ -485,7 +485,7 @@
485
485
  <link href="/posts/3ffec809.html"/>
486
486
  <url>/posts/3ffec809.html</url>
487
487
 
488
- <content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkbkvbadgx/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkbkvbadgx/image/&#x27;</span></span><br><span class="line"></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p>]]></content>
488
+ <content type="html"><![CDATA[<h2 id="2023-02-06-更新">2023/02/06 更新<a class="header-anchor" href="#2023-02-06-更新"></a></h2><p>VSCode 集成了 <code>某路径下的文件批量替换指定内容</code> 的功能,更方便</p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2023/image/202302061839251.png" alt="image-20230206183933193" style="zoom:50%;" /><h2 id="1-前言">1. 前言<a class="header-anchor" href="#1-前言"></a></h2><p>在 <a href="https://www.jsdelivr.com/">jsd</a> 失效之后,博主使用了新的图床方案,需将文章的原 jsd 图片链接替换为新的图片地址</p><p>这类脚本在网上有很多,都很推荐,如</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p></li><li class="lvl-2"><p><a href="https://blog.zhheo.com/p/369dbf41.html">张洪Heo:用 Python 批量替换 md 文件内容</a></p></li><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/7a5857a0.html">Justlovesmile:如何自动下载、压缩并批量替换文章中的外链图片</a></p></li></ul><h2 id="2-脚本内容">2. 脚本内容<a class="header-anchor" href="#2-脚本内容"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p><p>脚本采用递归的方式,遍历 43~46 行 目录下的所有文件,进行批量替换</p><p>说明:</p><ol><li class="lvl-3"><p>根据自身情况修改 43~46 行 需遍历的目录;修改 47、48 行 需要替换的内容</p></li><li class="lvl-3"><p>脚本第 24 行 限制了只筛选出 Markdown 类型的文本文件进行修改,如需修改其他类型的文本文件 需自行更改后缀进行匹配</p></li><li class="lvl-3"><p>执行前请先备份源文件,以防出错后无法还原</p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-ezurusudxw/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-ezurusudxw/image/&#x27;</span></span><br><span class="line"></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-参考文章">3. 参考文章<a class="header-anchor" href="#3-参考文章"></a></h2><p>源码来自:<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">批量修改文件内容(Python版)</a></p>]]></content>
489
489
 
490
490
 
491
491
  <categories>
@@ -543,7 +543,7 @@
543
543
  <link href="/posts/583c5c34.html"/>
544
544
  <url>/posts/583c5c34.html</url>
545
545
 
546
- <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录个人电脑环境</p><p>更新时间:2023.03.10</p><h2 id="Windows">Windows<a class="header-anchor" href="#Windows"></a></h2><h3 id="202303">202303<a class="header-anchor" href="#202303"></a></h3><p>系统重置记录</p><table><thead><tr><th colspan="3">软件</th></tr></thead><tbody><tr><td>联想电脑管家</td><td>联想应用商店</td><td>QQ</td></tr><tr><td>Clash for Windows</td><td>Typora</td><td>WeGame</td></tr><tr><td>Google Chrome</td><td>Microsoft Edge</td><td>Firefox</td></tr><tr><td>Logitech G HUB</td><td>搜狗输入法</td><td>网易邮箱大师</td></tr><tr><td>网易有道词典</td><td><a href="https://www.ghxi.com/ddqdpc.html">滴答清单</a></td><td>微信</td></tr><tr><td>腾讯会议</td><td>百度网盘</td><td>阿里云盘</td></tr><tr><td>哔哩哔哩</td><td>PotPlayer</td><td><a href="https://www.sublimetext.com/"><s>Sublime Text</s></a></td></tr><tr><td><a href="https://www.w3cschool.cn/sublimetext/sublimetext-mdc13bbj.html"><s>Sublime Text 汉化教程</s></a></td><td><a href="https://www.ghxi.com/sublimetext4.html">Sublime Text</a></td><td>WPS Office</td></tr><tr><td>腾讯文档</td><td>XMind ZEN(本地安装包)</td><td><a href="https://www.zjh336.cn/?id=280">XMind 8</a></td></tr><tr><td>WinRAR</td><td>Git</td><td>Windows Terminal</td></tr><tr><td><a href="https://www.bilibili.com/video/BV1n14y1x7Y7">WSL 2</a></td><td><a href="https://www.ghxi.com/vmware17.html">VMware Workstation Pro</a></td><td><a href="https://zhuanlan.zhihu.com/p/104118123">CentOS</a>、<a href="https://blog.cpen.top/posts/48860.html">安装教程</a></td></tr><tr><td>Xshell、Xftp</td><td>Visual Studio Code</td><td>SwitchHosts</td></tr><tr><td>PicGo、<a href="https://blog.csdn.net/jiangjianzhong00/article/details/128256073">教程</a>、<a href="https://github.com/mycpen/tools/tree/main/python-ftp">密钥</a></td><td>uTools</td><td>Snipaste</td></tr><tr><td>Python</td><td>PyCharm</td><td><a href="https://www.ghxi.com/navicat16.html">Navicat</a></td></tr><tr><td><a href="https://www.runoob.com/nodejs/nodejs-install-setup.html">Node.js</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_178562.html">联想软件:关闭Win10系统自动更新</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_184411_1.html"><s>联想软件:网络图标叹号修复工具</s></a></td></tr><tr><td><a href="https://github.com/listen1/listen1_desktop">Listen 1</a></td><td><a href="https://github.com/lyswhut/lx-music-desktop">LX Music</a></td><td><a href="https://desktop.telegram.org/">Telegram</a>、<a href="https://t.me/setlanguage/classic-zh-cn">汉化</a></td></tr><tr><td><a href="https://seer.61.com/">赛尔号</a></td><td><a href="https://github.com/Planshit/Tai">Tai</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">GitHub</th></tr></thead><tbody><tr><td><a href="https://github.com/mycpen/image_bed">image_bed</a></td><td><a href="https://github.com/mycpen/ultra-tinypng">ultra-tinypng</a></td><td><a href="https://github.com/mycpen/tools">tools</a></td></tr><tr><td><a href="https://github.com/mycpen/hexo-source-butterfly">hexo-source-butterfly</a></td><td><a href="https://github.com/mycpen/hexo-source">hexo-source</a></td><td><a href="https://github.com/mycpen/hexo-source-diary">hexo-source-diary</a></td></tr><tr><td><a href="https://github.com/mycpen/nav">nav</a></td><td><a href="https://github.com/mycpen/dino">dino</a></td><td rowspan="3"></td></tr><tr><td rowspan="2" colspan="2"></td></tr><tr></tr></tbody></table><table><thead><tr><th colspan="3">VSCode</th></tr></thead><tbody><tr><td>简中插件</td><td>GitLens</td><td><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a></td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><table><thead><tr><th colspan="3">参考教程</th></tr></thead><tbody><tr><td><a href="https://blog.cpen.top/posts/583c5c34.html">本文</a></td><td><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&amp;mid=2649092080&amp;idx=3&amp;sn=124abf24a463486deaf380e710a31822&amp;chksm=be5bc85d892c414b2f52e7d7d58a3a6dc987324ded0ed749295a480ce0cb86df1eaefd7fb3c7&amp;scene=27">GIT SSH 密钥认证教程</a></td><td><a href="https://baijiahao.baidu.com/s?id=1742306839397588676">PyCharm 汉化</a></td></tr><tr><td><a href="https://www.ghxi.com/">果壳剥壳</a></td><td><a href="https://blog.csdn.net/qq_44498977/article/details/124204347">vscode 配置 gitbash 终端</a></td><td><a href="https://hexo.io/zh-cn/">Hexo 官网</a></td></tr><tr><td><a href="https://blog.anheyu.com/posts/sdxhu.html#npm-%E9%95%9C%E5%83%8F">npm 淘宝源</a></td><td><a href="https://juejin.cn/post/7078155627305893925">Typora 页面美化</a></td><td><a href="https://bearcai.com/index.php/archives/44/"><s>PicGo安装插件compress</s></a></td></tr><tr><td><a href="https://zhuanlan.zhihu.com/p/618663612">安装 Node.js</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><h3 id="202211">202211<a class="header-anchor" href="#202211"></a></h3><p>第三方分享网站:<a href="https://www.ghxi.com/">果壳剥壳</a></p><table><thead><tr><th>name</th><th>description</th></tr></thead><tbody><tr><td>联想电脑管家、联想应用商店、Legion Zone、Logitech G HUB、小米云服务、金山打字通、搜狗输入法、网易邮箱大师、网易有道词典、滴答清单</td><td rowspan="3"></td></tr><tr><td>腾讯QQ、微信、腾讯会议、向日葵</td></tr><tr><td>网易云音乐、酷我音乐、QQ音乐</td></tr><tr><td>百度网盘、阿里云盘、迅雷</td><td>网盘</td></tr><tr><td>哔哩、哔哩哔哩 UWP</td><td>哔哩哔哩uwp</td></tr><tr><td><a href="http://draw.io">draw.io</a></td><td>流程拓扑图</td></tr><tr><td>PotPlayer 64 bit</td><td>视频播放</td></tr><tr><td>Typora、Sublime Text、WPS Office、XMind 8、XMind 2021、腾讯文档、MarkdownPad 2</td><td>文本编辑</td></tr><tr><td>WSA Toolbox</td><td>WSA</td></tr><tr><td>Chrome、Firefox、Edge</td><td>浏览器</td></tr><tr><td>Windows Terminal、PowerShell 7、Git bash</td><td>终端</td></tr><tr><td>WSL2、Ubuntu 20.04 LTS、WSA</td><td rowspan="2">虚拟机</td></tr><tr><td>VMware Workstation Pro、Xshell 7、Xftp 7</td></tr><tr><td>Clash for Windows、Steam++</td><td>代理客户端</td></tr><tr><td>PyCharm、Visual Studio Code、HBuilder X、CodeBlocks、Visual C++ 6.0</td><td>开发工具</td></tr><tr><td>Postman</td><td>接口调试</td></tr><tr><td>SwitchHosts</td><td>本地解析</td></tr><tr><td>Navicat Premium 15、SQLyog、QuickRedis、Another Redis Desktop Manager</td><td>数据库客户端</td></tr><tr><td>PicGo</td><td>图片上传</td></tr><tr><td>uTools、Everything</td><td>剪贴板,取色</td></tr><tr><td>Snipaste</td><td>截图</td></tr><tr><td><a href="https://github.com/mycpen/ultra-tinypng">mycpen/ultra-tinypng</a></td><td>图片压缩。原地址:<a href="https://github.com/libudu/ultra-tinypng">libudu/ultra-tinypng</a></td></tr><tr><td><a href="https://github.com/mycpen/tools">mycpen/tools</a></td><td>私有仓库。ftp图床同步、内容替换</td></tr><tr></tr></tbody></table><h2 id="软件备份">软件备份<a class="header-anchor" href="#软件备份"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>bilibili下载助手 (谷歌插件)</p><p>引导页:<a href="https://csser.top/">csser.top</a>、<a href="https://docs.qq.com/doc/DQ2lhaWRpS0tubVVF">docs.qq.com</a></p><p>crx文件备份 (v3.0.0):<a href="https://gitee.com/mycpen/cdn3/blob/master/download/bilibili-helper-3.0.0.crx">gitee.com/mycpen/cdn3</a></p></li></ul>]]></content>
546
+ <content type="html"><![CDATA[<h2 id="前言">前言<a class="header-anchor" href="#前言"></a></h2><p>记录个人电脑环境</p><p>更新时间:2023.03.10</p><h2 id="Windows">Windows<a class="header-anchor" href="#Windows"></a></h2><h3 id="202303">202303<a class="header-anchor" href="#202303"></a></h3><p>系统重置记录</p><table><thead><tr><th colspan="3">软件</th></tr></thead><tbody><tr><td>联想电脑管家</td><td>联想应用商店</td><td>QQ</td></tr><tr><td>Clash for Windows</td><td>Typora</td><td>WeGame</td></tr><tr><td>Google Chrome</td><td>Microsoft Edge</td><td>Firefox</td></tr><tr><td>Logitech G HUB</td><td>搜狗输入法</td><td>网易邮箱大师</td></tr><tr><td>网易有道词典</td><td><a href="https://www.ghxi.com/ddqdpc.html">滴答清单</a></td><td>微信</td></tr><tr><td>腾讯会议</td><td>百度网盘</td><td>阿里云盘</td></tr><tr><td>哔哩哔哩</td><td>PotPlayer</td><td><a href="https://www.sublimetext.com/"><s>Sublime Text</s></a></td></tr><tr><td><a href="https://www.w3cschool.cn/sublimetext/sublimetext-mdc13bbj.html"><s>Sublime Text 汉化教程</s></a></td><td><a href="https://www.ghxi.com/sublimetext4.html">Sublime Text</a></td><td>WPS Office</td></tr><tr><td>腾讯文档</td><td>XMind ZEN(本地安装包)</td><td><a href="https://www.zjh336.cn/?id=280">XMind 8</a></td></tr><tr><td>WinRAR</td><td>Git</td><td>Windows Terminal</td></tr><tr><td><a href="https://www.bilibili.com/video/BV1n14y1x7Y7">WSL 2</a></td><td><a href="https://www.ghxi.com/vmware17.html">VMware Workstation Pro</a></td><td><a href="https://zhuanlan.zhihu.com/p/104118123">CentOS</a>、<a href="https://blog.cpen.top/posts/48860.html">安装教程</a></td></tr><tr><td>Xshell、Xftp</td><td>Visual Studio Code</td><td>SwitchHosts</td></tr><tr><td>PicGo、<a href="https://blog.csdn.net/jiangjianzhong00/article/details/128256073">教程</a>、<a href="https://github.com/mycpen/tools/tree/main/python-ftp">密钥</a></td><td>uTools</td><td>Snipaste</td></tr><tr><td>Python</td><td>PyCharm</td><td><a href="https://www.ghxi.com/navicat16.html">Navicat</a></td></tr><tr><td><a href="https://www.runoob.com/nodejs/nodejs-install-setup.html">Node.js</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_178562.html">联想软件:关闭Win10系统自动更新</a></td><td><a href="https://iknow.lenovo.com.cn/detail/dc_184411_1.html"><s>联想软件:网络图标叹号修复工具</s></a></td></tr><tr><td><a href="https://github.com/listen1/listen1_desktop">Listen 1</a></td><td><a href="https://github.com/lyswhut/lx-music-desktop">LX Music</a></td><td><a href="https://desktop.telegram.org/">Telegram</a>、<a href="https://t.me/setlanguage/classic-zh-cn">汉化</a></td></tr><tr><td><a href="https://seer.61.com/">赛尔号</a></td><td><a href="https://github.com/Planshit/Tai">Tai</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">GitHub</th></tr></thead><tbody><tr><td><a href="https://github.com/mycpen/image_bed">image_bed</a></td><td><a href="https://github.com/mycpen/ultra-tinypng">ultra-tinypng</a></td><td><a href="https://github.com/mycpen/tools">tools</a></td></tr><tr><td><a href="https://github.com/mycpen/hexo-source-butterfly">hexo-source-butterfly</a></td><td><a href="https://github.com/mycpen/hexo-source">hexo-source</a></td><td><a href="https://github.com/mycpen/hexo-source-diary">hexo-source-diary</a></td></tr><tr><td><a href="https://github.com/mycpen/nav">nav</a></td><td><a href="https://github.com/mycpen/dino">dino</a></td><td rowspan="3"></td></tr><tr><td rowspan="2" colspan="2"></td></tr><tr></tr></tbody></table><table><thead><tr><th colspan="3">VSCode</th></tr></thead><tbody><tr><td>简中插件</td><td>GitLens</td><td><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">Material Icon Theme</a></td></tr><tr><td><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory">Git History</a></td><td><a href="https://wakatime.com/vs-code">WakaTime</a></td><td rowspan="2"></td></tr><tr><td colspan="2"></td></tr></tbody></table><table><thead><tr><th colspan="3">参考教程</th></tr></thead><tbody><tr><td><a href="https://blog.cpen.top/posts/583c5c34.html">本文</a></td><td><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDA2MTI1MA==&amp;mid=2649092080&amp;idx=3&amp;sn=124abf24a463486deaf380e710a31822&amp;chksm=be5bc85d892c414b2f52e7d7d58a3a6dc987324ded0ed749295a480ce0cb86df1eaefd7fb3c7&amp;scene=27">GIT SSH 密钥认证教程</a></td><td><a href="https://baijiahao.baidu.com/s?id=1742306839397588676">PyCharm 汉化</a></td></tr><tr><td><a href="https://www.ghxi.com/">果壳剥壳</a></td><td><a href="https://blog.csdn.net/qq_44498977/article/details/124204347">vscode 配置 gitbash 终端</a></td><td><a href="https://hexo.io/zh-cn/">Hexo 官网</a></td></tr><tr><td><a href="https://blog.anheyu.com/posts/sdxhu.html#npm-%E9%95%9C%E5%83%8F">npm 淘宝源</a></td><td><a href="https://juejin.cn/post/7078155627305893925">Typora 页面美化</a></td><td><a href="https://bearcai.com/index.php/archives/44/"><s>PicGo安装插件compress</s></a></td></tr><tr><td><a href="https://zhuanlan.zhihu.com/p/618663612">安装 Node.js</a></td><td rowspan="2" colspan="2"></td></tr><tr><td></td></tr></tbody></table><h3 id="202211">202211<a class="header-anchor" href="#202211"></a></h3><p>第三方分享网站:<a href="https://www.ghxi.com/">果壳剥壳</a></p><table><thead><tr><th>name</th><th>description</th></tr></thead><tbody><tr><td>联想电脑管家、联想应用商店、Legion Zone、Logitech G HUB、小米云服务、金山打字通、搜狗输入法、网易邮箱大师、网易有道词典、滴答清单</td><td rowspan="3"></td></tr><tr><td>腾讯QQ、微信、腾讯会议、向日葵</td></tr><tr><td>网易云音乐、酷我音乐、QQ音乐</td></tr><tr><td>百度网盘、阿里云盘、迅雷</td><td>网盘</td></tr><tr><td>哔哩、哔哩哔哩 UWP</td><td>哔哩哔哩uwp</td></tr><tr><td><a href="http://draw.io">draw.io</a></td><td>流程拓扑图</td></tr><tr><td>PotPlayer 64 bit</td><td>视频播放</td></tr><tr><td>Typora、Sublime Text、WPS Office、XMind 8、XMind 2021、腾讯文档、MarkdownPad 2</td><td>文本编辑</td></tr><tr><td>WSA Toolbox</td><td>WSA</td></tr><tr><td>Chrome、Firefox、Edge</td><td>浏览器</td></tr><tr><td>Windows Terminal、PowerShell 7、Git bash</td><td>终端</td></tr><tr><td>WSL2、Ubuntu 20.04 LTS、WSA</td><td rowspan="2">虚拟机</td></tr><tr><td>VMware Workstation Pro、Xshell 7、Xftp 7</td></tr><tr><td>Clash for Windows、Steam++</td><td>代理客户端</td></tr><tr><td>PyCharm、Visual Studio Code、HBuilder X、CodeBlocks、Visual C++ 6.0</td><td>开发工具</td></tr><tr><td>Postman</td><td>接口调试</td></tr><tr><td>SwitchHosts</td><td>本地解析</td></tr><tr><td>Navicat Premium 15、SQLyog、QuickRedis、Another Redis Desktop Manager</td><td>数据库客户端</td></tr><tr><td>PicGo</td><td>图片上传</td></tr><tr><td>uTools、Everything</td><td>剪贴板,取色</td></tr><tr><td>Snipaste</td><td>截图</td></tr><tr><td><a href="https://github.com/mycpen/ultra-tinypng">mycpen/ultra-tinypng</a></td><td>图片压缩。原地址:<a href="https://github.com/libudu/ultra-tinypng">libudu/ultra-tinypng</a></td></tr><tr><td><a href="https://github.com/mycpen/tools">mycpen/tools</a></td><td>私有仓库。ftp图床同步、内容替换</td></tr><tr></tr></tbody></table><h2 id="软件备份">软件备份<a class="header-anchor" href="#软件备份"></a></h2><ul class="lvl-0"><li class="lvl-2"><p>bilibili下载助手 (谷歌插件)</p><p>引导页:<a href="https://csser.top/">csser.top</a>、<a href="https://docs.qq.com/doc/DQ2lhaWRpS0tubVVF">docs.qq.com</a></p><p>crx文件备份 (v3.0.0):<a href="https://gitee.com/mycpen/cdn3/blob/master/download/bilibili-helper-3.0.0.crx">gitee.com/mycpen/cdn3</a></p></li></ul>]]></content>
547
547
 
548
548
 
549
549
  <categories>
@@ -1041,7 +1041,7 @@
1041
1041
  <link href="/posts/63259.html"/>
1042
1042
  <url>/posts/63259.html</url>
1043
1043
 
1044
- <content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP &gt;= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="comment"># print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = &#x27;gbk&#x27;</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">&#x27;utf8&#x27;</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">&quot;/log.txt&quot;</span>, <span class="string">&quot;a&quot;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">&quot;FTP 连接或登录失败 ,错误描述为:%s&quot;</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为:%s&quot; % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为:%s&quot; % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;local_file_size:%d , remote_file_size:%d&#x27;</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 文件大小相同,无需下载&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;下载文件 %s ... ...&#x27;</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">&#x27;RETR %s&#x27;</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;下载文件出错,出现异常:%s &#x27;</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录%s不存在,继续...&#x27;</span> % remote_path + <span class="string">&quot; ,具体错误描述为:%s&quot;</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录%s不存在,先创建本地目录&#x27;</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录 列表: %s&#x27;</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">&#x27;d&#x27;</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; 下载目录: %s&quot;</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file()---&gt; 下载文件: %s&quot;</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;返回上层目录 %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 不存在&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;跳过相等的文件: %s&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">&#x27;STOR %s&#x27;</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;上传: %s&#x27;</span> % local_file + <span class="string">&quot;成功!&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录 %s 不存在&#x27;</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至远程目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;目录已存在 %s ,具体错误描述为:%s&quot;</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传目录: %s&quot;</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传文件: %s&quot;</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 退出ftp</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;close()---&gt; FTP退出&quot;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 打印日志</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> log_str = <span class="string">&#x27;发生错误: %s&#x27;</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">&#x27;%Y-%m-%d&#x27;</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">&quot;%s ---&gt; %s \n &quot;</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;..&#x27;</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> pos = line.rfind(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">&#x27; &#x27;</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">&#x27; &#x27;</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">&#x27;/log.txt&#x27;</span>):</span><br><span class="line"> log_file = path + <span class="string">&#x27;/log.txt &#x27;</span><span class="keyword">if</span> os.sep == <span class="string">&quot;/&quot;</span> <span class="keyword">else</span> path + <span class="string">&#x27;\\&#x27;</span> + <span class="string">&#x27;log.txt&#x27;</span></span><br><span class="line"> subprocess.Popen(<span class="string">f&#x27;rm -rf <span class="subst">&#123;log_file&#125;</span>&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">&quot;xxx.ftp.upyun.com&quot;</span>)</span><br><span class="line"> my_ftp.login(<span class="string">&quot;xxx/xxx&quot;</span>, <span class="string">&quot;xxx&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file(&quot;E:/code_zone/image_bed/image/wallpaper/1.jpg&quot;, &quot;/image/wallpaper/1.jpg&quot;)</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file(&quot;G:/ftp_test/Release/XTCLauncher.apk&quot;, &quot;/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk&quot;)</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login(&quot;用户名xxx/xxx&quot;, &quot;密码xxx&quot;)</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-diary/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkbkvbadgx/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkbkvbadgx/image/&#x27;</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
1044
+ <content type="html"><![CDATA[<h2 id="一-前言">一. 前言<a class="header-anchor" href="#一-前言"></a></h2><p>因 <a href="https://www.jsdelivr.com/">https://www.jsdelivr.com/</a> 失效,博主打算将 GitHub 托管的图床备份到其他平台。</p><p>网上看到 <a href="https://github.com/lsky-org/lsky-pro">兰空图床</a> 萌生了自建图床的念头,搭建环境要求 PHP &gt;= 8.0.2,于是打算编译安装 PHP。</p><p>最终因服务器配置太低(1核2G)编译失败而放弃。转而投身之前已经搭建好环境的又拍云平台。</p><p>博文内容:<code>PHP-CentOS8.2 编译安装 PHP8.1.10</code> + <code>编写GitHub图床迁移至又拍云的脚本(ftp)</code> + <code>编写批量修改文章内容的脚本</code></p><h2 id="二-正文">二. 正文<a class="header-anchor" href="#二-正文"></a></h2><h3 id="2-1❤-CentOS8-2-编译安装-PHP8-1-10">2.1❤ CentOS8.2 编译安装 PHP8.1.10<a class="header-anchor" href="#2-1❤-CentOS8-2-编译安装-PHP8-1-10"></a></h3><p><strong>2.1.1</strong> PHP8 和 oniguruma 源码下载并上传至服务器 /mnt 目录</p><p><a href="https://www.php.net/distributions/php-8.1.10.tar.gz">https://www.php.net/distributions/php-8.1.10.tar.gz</a></p><p><a href="https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4">https://codeload.github.com/kkos/oniguruma/tar.gz/refs/tags/v6.9.4</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar xzf oniguruma-6.9.4.tar.gz</span><br><span class="line">tar xzf php-8.1.10.tar.gz</span><br></pre></td></tr></table></figure><p><strong>2.1.2</strong> 安装 PHP8 依赖包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 2 安装 PHP8 依赖包</span></span><br><span class="line">yum -y install autoconf freetype gd libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-clients freetype-devel gmp-devel libzip libzip-devel sqlite-devel automake libtool</span><br></pre></td></tr></table></figure><p><strong>2.1.3</strong> 编译 PHP8 依赖包 oniguruma</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 3.1 生成 configure</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/oniguruma-6.9.4</span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.2 生成编译配置文件</span></span><br><span class="line">./configure --prefix=/usr</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.3 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p><strong>2.1.4</strong> 编译 PHP8 主包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4.1 生成编译配置文件</span></span><br><span class="line"><span class="built_in">cd</span> /mnt/php-8.1.10</span><br><span class="line">./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-opcache --with-pcre-jit --enable-gd --with-jpeg --with-freetype --with-gettext --with-curl --with-openssl --enable-sockets --enable-mbstring --enable-xml --with-zip --with-zlib --with-snmp --with-mhash --enable-ftp --enable-bcmath --enable-soap --enable-shmop --enable-sysvsem --enable-pcntl --with-gmp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.2 编译并安装</span></span><br><span class="line">make &amp;&amp; make install</span><br></pre></td></tr></table></figure><p>因为配置过低,编译失败。</p><p><strong>2.1.5</strong> 编译安装后目录</p><p>/usr/local/php</p><p><strong>参考</strong></p><p><a href="https://www.bilibili.com/read/cv9248283/">https://www.bilibili.com/read/cv9248283/</a></p><p><a href="https://www.bilibili.com/video/BV13U4y1T7VS">https://www.bilibili.com/video/BV13U4y1T7VS</a></p><h3 id="2-2-基于-FTP-将GitHub图床迁移至又拍云">2.2 基于 FTP 将GitHub图床迁移至又拍云<a class="header-anchor" href="#2-2-基于-FTP-将GitHub图床迁移至又拍云"></a></h3><p><strong>参考</strong></p><p><a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">官方视频教程 - 创建存储服务和使用 FTP 上传</a>可以得到用户名和密码</p><p>默认已经完成了又拍云云存储服务的申请 + 绑定自定义域名 <a href="https://help.upyun.com/knowledge-base/quick_start/">https://help.upyun.com/knowledge-base/quick_start/</a></p><p><strong>2.2.1</strong> 编写 Python 脚本 实现批量</p><p>源码来自<a href="http://blog.csdn.net/ouyang_peng/article/details/79271113">http://blog.csdn.net/ouyang_peng/article/details/79271113</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cmath <span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> ftplib <span class="keyword">import</span> FTP</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">MyFTP</span>:</span><br><span class="line"> <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string"> ftp自动下载、自动上传脚本,可以递归目录操作</span></span><br><span class="line"><span class="string"> 作者:欧阳鹏</span></span><br><span class="line"><span class="string"> 博客地址:http://blog.csdn.net/ouyang_peng/article/details/79271113</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, host, port=<span class="number">21</span></span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> host:ip地址</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> port:端口号</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="comment"># print(&quot;__init__()---&gt; host = %s ,port = %s&quot; % (host, port))</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.host = host</span><br><span class="line"> <span class="variable language_">self</span>.port = port</span><br><span class="line"> <span class="variable language_">self</span>.ftp = FTP()</span><br><span class="line"> <span class="comment"># 重新设置下编码方式</span></span><br><span class="line"> <span class="comment">#self.ftp.encoding = &#x27;gbk&#x27;</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.encoding = <span class="string">&#x27;utf8&#x27;</span></span><br><span class="line"> <span class="comment"># 获取脚本路径</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__))</span><br><span class="line"> <span class="variable language_">self</span>.log_file = <span class="built_in">open</span>(path + <span class="string">&quot;/log.txt&quot;</span>, <span class="string">&quot;a&quot;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 初始化 FTP 客户端</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> username: 用户名</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> password: 密码</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> timeout = <span class="number">60</span></span><br><span class="line"> socket.setdefaulttimeout(timeout)</span><br><span class="line"> <span class="comment"># 0主动模式 1 #被动模式</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.set_pasv(<span class="literal">True</span>)</span><br><span class="line"> <span class="comment"># 打开调试级别2,显示详细信息</span></span><br><span class="line"> <span class="comment"># self.ftp.set_debuglevel(2)</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.connect(<span class="variable language_">self</span>.host, <span class="variable language_">self</span>.port)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功连接到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;开始尝试登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.login(username, password)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;成功登录到 %s&#x27;</span> % <span class="variable language_">self</span>.host)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="variable language_">self</span>.ftp.welcome)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.deal_error(<span class="string">&quot;FTP 连接或登录失败 ,错误描述为:%s&quot;</span> % err)</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">is_same_size</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;判断远程文件和本地文件大小是否一致</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> remote_file_size = <span class="variable language_">self</span>.ftp.size(remote_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为:%s&quot; % err)</span></span><br><span class="line"> remote_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> local_file_size = os.path.getsize(local_file)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="comment"># self.debug_print(&quot;is_same_size() 错误描述为:%s&quot; % err)</span></span><br><span class="line"> local_file_size = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;local_file_size:%d , remote_file_size:%d&#x27;</span> % (local_file_size, remote_file_size))</span><br><span class="line"> <span class="keyword">if</span> remote_file_size == local_file_size:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从ftp下载文件</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_file: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_file: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;download_file()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_file, remote_file))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 文件大小相同,无需下载&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;下载文件 %s ... ...&#x27;</span> % local_file)</span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;wb&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.retrbinary(<span class="string">&#x27;RETR %s&#x27;</span> % remote_file, file_handler.write, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;下载文件出错,出现异常:%s &#x27;</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">download_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从远程目录下载多个文件到本地目录</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; local_path = %s ,remote_path = %s&quot;</span> % (local_path, remote_path))</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录%s不存在,继续...&#x27;</span> % remote_path + <span class="string">&quot; ,具体错误描述为:%s&quot;</span> % err)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录%s不存在,先创建本地目录&#x27;</span> % local_path)</span><br><span class="line"> os.makedirs(local_path)</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.file_list = []</span><br><span class="line"> <span class="comment"># 方法回调</span></span><br><span class="line"> <span class="variable language_">self</span>.ftp.<span class="built_in">dir</span>(<span class="variable language_">self</span>.get_file_list)</span><br><span class="line"></span><br><span class="line"> remote_names = <span class="variable language_">self</span>.file_list</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;远程目录 列表: %s&#x27;</span> % remote_names)</span><br><span class="line"> <span class="keyword">for</span> item <span class="keyword">in</span> remote_names:</span><br><span class="line"> file_type = item[<span class="number">0</span>]</span><br><span class="line"> file_name = item[<span class="number">1</span>]</span><br><span class="line"> local = os.path.join(local_path, file_name)</span><br><span class="line"> <span class="keyword">if</span> file_type == <span class="string">&#x27;d&#x27;</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file_tree()---&gt; 下载目录: %s&quot;</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file_tree(local, file_name)</span><br><span class="line"> <span class="keyword">elif</span> file_type == <span class="string">&#x27;-&#x27;</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;download_file()---&gt; 下载文件: %s&quot;</span> % file_name)</span><br><span class="line"> <span class="variable language_">self</span>.download_file(local, file_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;返回上层目录 %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file</span>(<span class="params">self, local_file, remote_file</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从本地上传文件到ftp</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> local_path: 本地文件</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程文件</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(local_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;%s 不存在&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="variable language_">self</span>.is_same_size(local_file, remote_file):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;跳过相等的文件: %s&#x27;</span> % local_file)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> buf_size = <span class="number">1024</span></span><br><span class="line"> file_handler = <span class="built_in">open</span>(local_file, <span class="string">&#x27;rb&#x27;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.storbinary(<span class="string">&#x27;STOR %s&#x27;</span> % remote_file, file_handler, buf_size)</span><br><span class="line"> file_handler.close()</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;上传: %s&#x27;</span> % local_file + <span class="string">&quot;成功!&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">upload_file_tree</span>(<span class="params">self, local_path, remote_path</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot;从本地上传目录下多个文件到ftp</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> local_path: 本地路径</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> remote_path: 远程路径</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> os.path.isdir(local_path):</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;本地目录 %s 不存在&#x27;</span> % local_path)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(remote_path)</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&#x27;切换至远程目录: %s&#x27;</span> % <span class="variable language_">self</span>.ftp.pwd())</span><br><span class="line"></span><br><span class="line"> local_name_list = os.listdir(local_path)</span><br><span class="line"> <span class="keyword">for</span> local_name <span class="keyword">in</span> local_name_list:</span><br><span class="line"> src = os.path.join(local_path, local_name)</span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(src):</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="variable language_">self</span>.ftp.mkd(local_name)</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;目录已存在 %s ,具体错误描述为:%s&quot;</span> % (local_name, err))</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传目录: %s&quot;</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file_tree(src, local_name)</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;upload_file_tree()---&gt; 上传文件: %s&quot;</span> % local_name)</span><br><span class="line"> <span class="variable language_">self</span>.upload_file(src, local_name)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.cwd(<span class="string">&quot;..&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">close</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 退出ftp</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.debug_print(<span class="string">&quot;close()---&gt; FTP退出&quot;</span>)</span><br><span class="line"> <span class="variable language_">self</span>.ftp.quit()</span><br><span class="line"> <span class="variable language_">self</span>.log_file.close()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">debug_print</span>(<span class="params">self, s</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 打印日志</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> <span class="variable language_">self</span>.write_log(s)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">deal_error</span>(<span class="params">self, e</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 处理错误异常</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> e:异常</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> log_str = <span class="string">&#x27;发生错误: %s&#x27;</span> % e</span><br><span class="line"> <span class="variable language_">self</span>.write_log(log_str)</span><br><span class="line"> sys.exit()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">write_log</span>(<span class="params">self, log_str</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 记录日志</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> log_str:日志</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> time_now = time.localtime()</span><br><span class="line"> date_now = time.strftime(<span class="string">&#x27;%Y-%m-%d&#x27;</span>, time_now)</span><br><span class="line"> format_log_str = <span class="string">&quot;%s ---&gt; %s \n &quot;</span> % (date_now, log_str)</span><br><span class="line"> <span class="built_in">print</span>(format_log_str)</span><br><span class="line"> <span class="variable language_">self</span>.log_file.write(format_log_str)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_list</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 获取文件列表</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> file_arr = <span class="variable language_">self</span>.get_file_name(line)</span><br><span class="line"> <span class="comment"># 去除 . 和 ..</span></span><br><span class="line"> <span class="keyword">if</span> file_arr[<span class="number">1</span>] <span class="keyword">not</span> <span class="keyword">in</span> [<span class="string">&#x27;.&#x27;</span>, <span class="string">&#x27;..&#x27;</span>]:</span><br><span class="line"> <span class="variable language_">self</span>.file_list.append(file_arr)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">get_file_name</span>(<span class="params">self, line</span>):</span><br><span class="line"> <span class="string">&quot;&quot;&quot; 获取文件名</span></span><br><span class="line"><span class="string"> 参数:</span></span><br><span class="line"><span class="string"> line:</span></span><br><span class="line"><span class="string"> &quot;&quot;&quot;</span></span><br><span class="line"> pos = line.rfind(<span class="string">&#x27;:&#x27;</span>)</span><br><span class="line"> <span class="keyword">while</span> (line[pos] != <span class="string">&#x27; &#x27;</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (line[pos] == <span class="string">&#x27; &#x27;</span>):</span><br><span class="line"> pos += <span class="number">1</span></span><br><span class="line"> file_arr = [line[<span class="number">0</span>], line[pos:]]</span><br><span class="line"> <span class="keyword">return</span> file_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line"> <span class="comment"># 清除日志</span></span><br><span class="line"> path = os.path.dirname(os.path.realpath(__file__)) <span class="comment"># 脚本路径</span></span><br><span class="line"> <span class="keyword">if</span> os.path.exists(path + <span class="string">&#x27;/log.txt&#x27;</span>):</span><br><span class="line"> log_file = path + <span class="string">&#x27;/log.txt &#x27;</span><span class="keyword">if</span> os.sep == <span class="string">&quot;/&quot;</span> <span class="keyword">else</span> path + <span class="string">&#x27;\\&#x27;</span> + <span class="string">&#x27;log.txt&#x27;</span></span><br><span class="line"> subprocess.Popen(<span class="string">f&#x27;rm -rf <span class="subst">&#123;log_file&#125;</span>&#x27;</span>, shell=<span class="literal">True</span>)</span><br><span class="line"> time.sleep(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> my_ftp = MyFTP(<span class="string">&quot;xxx.ftp.upyun.com&quot;</span>)</span><br><span class="line"> my_ftp.login(<span class="string">&quot;xxx/xxx&quot;</span>, <span class="string">&quot;xxx&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.download_file(&quot;E:/code_zone/image_bed/image/wallpaper/1.jpg&quot;, &quot;/image/wallpaper/1.jpg&quot;)</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传单个文件</span></span><br><span class="line"> <span class="comment"># my_ftp.upload_file(&quot;G:/ftp_test/Release/XTCLauncher.apk&quot;, &quot;/App/AutoUpload/ouyangpeng/I12/Release/XTCLauncher.apk&quot;)</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 下载目录</span></span><br><span class="line"> <span class="comment"># image.cpen.top/image/ → 本地 E:/code_zone/image_bed/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>:</span><br><span class="line"> my_ftp.download_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.download_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 上传目录</span></span><br><span class="line"> <span class="comment"># 本地 E:/code_zone/image_bed/image/ → image.cpen.top/image/ (本地图床目录, 又拍云路径)</span></span><br><span class="line"> <span class="keyword">if</span> os.sep == <span class="string">&quot;\\&quot;</span>: <span class="comment"># Windows</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">&quot;E:/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"> <span class="keyword">elif</span> os.sep == <span class="string">&quot;/&quot;</span>: <span class="comment"># aliyun</span></span><br><span class="line"> my_ftp.upload_file_tree(<span class="string">&quot;/root/code_zone/image_bed/image/&quot;</span>, <span class="string">&quot;/image/&quot;</span>) </span><br><span class="line"> my_ftp.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"><span class="comment"># python3 /root/code_zone/tools/python-ftp/ftp.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.2.2</strong> 说明</p><p><code>my_ftp.login(&quot;用户名xxx/xxx&quot;, &quot;密码xxx&quot;)</code> 参考 <a href="https://techs.upyun.com/videos/cdnpage/creating_storage.html">https://techs.upyun.com/videos/cdnpage/creating_storage.html</a></p><p>后期又将脚本传到云服务器上,通过计划任务,每15分钟同步,保持 GitHub 与又拍云图床一致</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># root @ CentOS in ~ [18:05:59]</span></span><br><span class="line">$ crontab -l</span><br><span class="line">*/15 * * * * <span class="built_in">cd</span> /root/code_zone/image_bed/; git pull; python3 /root/code_zone/tools/python-ftp/ftp.py; bash git.sh</span><br></pre></td></tr></table></figure><p>迁移好图床后,博客中调用图片资源时 浏览器自动 http 跳 https,因为没有证书导致图片失效,于是又申请了 ssl 证书,上传至又拍云。</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220910180219146.png" alt=""></p></blockquote><h3 id="2-3-编写批量修改文章内容的脚本">2.3 编写批量修改文章内容的脚本<a class="header-anchor" href="#2-3-编写批量修改文章内容的脚本"></a></h3><p>源码参考<a href="https://blog.csdn.net/qq_38150250/article/details/118026219">https://blog.csdn.net/qq_38150250/article/details/118026219</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br><span class="line"><span class="comment"># -*- coding: UTF-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 源码参考 https://blog.csdn.net/qq_38150250/article/details/118026219</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找 find . -name file_name -type f</span></span><br><span class="line"><span class="comment"># 查找函数:search_path 查找根路径 </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取文章路径</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">search</span>(<span class="params">search_path, search_result</span>):</span><br><span class="line"> <span class="comment"># 获取当前路径下地所有文件</span></span><br><span class="line"> all_file = os.listdir(search_path)</span><br><span class="line"> <span class="comment"># 对于每一个文件</span></span><br><span class="line"> <span class="keyword">for</span> each_file <span class="keyword">in</span> all_file:</span><br><span class="line"> <span class="comment"># 若文件为一个文件夹</span></span><br><span class="line"> <span class="keyword">if</span> os.path.isdir(search_path + each_file):</span><br><span class="line"> <span class="comment"># 递归查找</span></span><br><span class="line"> search(search_path + each_file + <span class="string">&#x27;/&#x27;</span>, search_result)</span><br><span class="line"> <span class="comment"># 如果是需要被查找的文件</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">if</span> re.findall(<span class="string">&#x27;.*\.md$&#x27;</span>, each_file) == [each_file]:</span><br><span class="line"> <span class="comment"># 输出路径</span></span><br><span class="line"> search_result.append(search_path + each_file)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 替换 sed -i &#x27;s/old_str/new_str/&#x27;</span></span><br><span class="line"><span class="comment"># 文本替换 replace_file_name 需要替换的文件路径,replace_old_str 要替换的字符,replace_new_str 替换的字符</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">replace</span>(<span class="params">replace_file_name, replace_old_str, replace_new_str</span>):</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;r&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f1: </span><br><span class="line"> content = f1.read()</span><br><span class="line"> f1.close()</span><br><span class="line"> t = content.replace(replace_old_str, replace_new_str)</span><br><span class="line"> <span class="keyword">with</span> <span class="built_in">open</span>(replace_file_name, <span class="string">&quot;w&quot;</span>, encoding = <span class="string">&quot;UTF-8&quot;</span>) <span class="keyword">as</span> f2:</span><br><span class="line"> f2.write(t)</span><br><span class="line"> f2.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 需要改的地方</span></span><br><span class="line"><span class="comment">#path = &#x27;E:/code_zone/.history/20220831_blog/source/_posts/&#x27;</span></span><br><span class="line">path_list = [</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-butterfly/source/_posts/&#x27;</span>,</span><br><span class="line"> <span class="string">&#x27;E:/code_zone/hexo-source-diary/source/_posts/&#x27;</span>,</span><br><span class="line">]</span><br><span class="line">old_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-ezurusudxw/image/&#x27;</span></span><br><span class="line">new_str = <span class="string">&#x27;https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-ezurusudxw/image/&#x27;</span></span><br><span class="line">search_result = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line"> result = [] <span class="comment"># 存放文件路径</span></span><br><span class="line"> <span class="comment"># 默认当前目录</span></span><br><span class="line"> <span class="comment"># path = os.getcwd()</span></span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> path_list:</span><br><span class="line"> search(path, result) <span class="comment"># 获取文章路径</span></span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> file_name <span class="keyword">in</span> result:</span><br><span class="line"> replace(file_name, old_str, new_str)</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">&quot;&#123;&#125; done &#123;&#125;&quot;</span>.<span class="built_in">format</span>(file_name, count))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令</span></span><br><span class="line"><span class="comment"># python E:/code_zone/tools/python-replace/replace.py</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>2.3.1</strong> 说明</p><p><code>search</code>函数指定文件类型为 .md,可获得文章的完整路径;</p><p><code>path_list</code>列表存放需要修改的文章父目录路径,可以递归查询子目录;</p><p><code>old_str</code>需要替换的内容</p><p><code>new_str</code>新内容</p>]]></content>
1045
1045
 
1046
1046
 
1047
1047
  <categories>
@@ -1543,7 +1543,7 @@
1543
1543
  <link href="/posts/8236.html"/>
1544
1544
  <url>/posts/8236.html</url>
1545
1545
 
1546
- <content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 &amp; 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 &amp; 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml&quot;关于、个人介绍、公告&quot;</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs&quot;时间、版权&quot;</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js&quot;160行&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-fkbkvbadgx/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述&lt;!-- more --&gt;</span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">&#125;</span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement &#123;</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover &#123;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment &#123;</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover &#123;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code>&lt;/script&gt;</code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch(&#x27;https://v1.hitokoto.cn/?c=j&#x27;)</span><br><span class="line">.then(response =&gt; response.json())</span><br><span class="line">.then(data =&gt; &#123;</span><br><span class="line"> document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line">&#125;)</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;script type=&quot;text/javascript&quot;&gt;</span><br><span class="line"> fetch(&#x27;https://v1.hitokoto.cn&#x27;)</span><br><span class="line"> .then(response =&gt; response.json())</span><br><span class="line"> .then(data =&gt; &#123;</span><br><span class="line"> document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line"> &#125;)</span><br><span class="line"> .catch(console.error)</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&amp;c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&amp;encode=text">https://v1.hitokoto.cn/?c=f&amp;encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
1546
+ <content type="html"><![CDATA[<h1 id="Hexo-搭建私人博客">Hexo 搭建私人博客<a class="header-anchor" href="#Hexo-搭建私人博客"></a></h1><h2 id="一-介绍">一. 介绍<a class="header-anchor" href="#一-介绍"></a></h2><h3 id="1-1-Hexo">1.1 Hexo<a class="header-anchor" href="#1-1-Hexo"></a></h3><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 <a href="http://daringfireball.net/projects/markdown/">Markdown</a>(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。<a href="https://hexo.io">Hexo 官网</a></p></blockquote><h3 id="1-2-Pure-主题">1.2 Pure 主题<a class="header-anchor" href="#1-2-Pure-主题"></a></h3><p><a href="https://github.com/cofess/hexo-theme-pure">https://github.com/cofess/hexo-theme-pure</a></p><p><a href="https://blog.cofess.com/">https://blog.cofess.com/</a></p><hr><h2 id="二-参考">二. 参考<a class="header-anchor" href="#二-参考"></a></h2><p>Hexo 官网<a href="https://hexo.io/zh-cn/docs/index.html">https://hexo.io/zh-cn/docs/index.html</a></p><p>Pure 项目地址<a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md</a></p><h3 id="搭建-魔改">搭建 &amp; 魔改<a class="header-anchor" href="#搭建-魔改"></a></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md">Pure 项目中文文档</a></p></li><li class="lvl-2"><p><a href="https://hwame.top/20200520/hello-hexo-setup-deploy.html">https://hwame.top</a></p></li><li class="lvl-2"><p><a href="https://blog.cofess.com/2017/11/01/hexo-blog-theme-pure-usage-description.html">作者: Hexo博客主题pure使用说明</a></p></li><li class="lvl-2"><p><a href="https://www.cnblogs.com/zzk31/p/14062887.html">https://www.cnblogs.com/zzk31/p/14062887.html</a></p></li><li class="lvl-2"><p><a href="https://blog.csdn.net/qq_42983502/article/details/106745567">https://blog.csdn.net/qq_42983502/article/details/106745567</a></p></li><li class="lvl-2"><p>gitalk</p><ul class="lvl-2"><li class="lvl-4"><a href="https://www.jianshu.com/p/b1161eb3f848">https://www.jianshu.com/p/b1161eb3f848</a></li><li class="lvl-4"><a href="https://cors-anywhere.herokuapp.com/corsdemo">https://cors-anywhere.herokuapp.com/corsdemo</a></li><li class="lvl-4"><a href="https://www.cnblogs.com/qisi007/p/13731562.html">https://www.cnblogs.com/qisi007/p/13731562.html</a></li><li class="lvl-4"><a href="https://www.jianshu.com/p/02fc71f3633f">https://www.jianshu.com/p/02fc71f3633f</a></li></ul></li></ul><hr><h2 id="三-命令">三. 命令<a class="header-anchor" href="#三-命令"></a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean ; hexo g ; hexo d ; hexo s</span><br></pre></td></tr></table></figure><hr><h2 id="四-评论-收录">四. 评论 &amp; 收录<a class="header-anchor" href="#四-评论-收录"></a></h2><p>Valine 评论<a href="https://www.leancloud.cn/">https://www.leancloud.cn/</a></p><p>Valine 评论<a href="https://www.leancloud.app/">https://www.leancloud.app/</a>国外站点,国内账号受限,域名没白嫖成功,可能是这个原因 → <a href="https://forum.leancloud.cn/t/2022-8/25408">https://forum.leancloud.cn/t/2022-8/25408</a></p><p>谷歌收录<a href="">https://search.google.com/search-console</a></p><p>百度收录<a href="https://ziyuan.baidu.com">https://ziyuan.baidu.com</a></p><p>MD5 在线加密<a href="https://md5jiami.bmcx.com/">https://md5jiami.bmcx.com/</a>评论区通过密文,识别博主身份</p><hr><h2 id="五-相关路径">五. 相关路径<a class="header-anchor" href="#五-相关路径"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">文章路径</span>]: </span><br><span class="line"><span class="link">\source\_posts</span></span><br><span class="line">[<span class="symbol">站点配置文件</span>]: </span><br><span class="line"><span class="link">\_config.yml</span></span><br><span class="line">[<span class="symbol">主题配置文件</span>]: </span><br><span class="line"><span class="link">\themes\pure\_config.yml&quot;关于、个人介绍、公告&quot;</span></span><br><span class="line">[<span class="symbol">友链文件</span>]: </span><br><span class="line"><span class="link">\source\_data\links.yml</span></span><br><span class="line">[<span class="symbol">语言</span>]: </span><br><span class="line"><span class="link">\themes\pure\languages</span></span><br><span class="line">[<span class="symbol">左下角运行时间</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_common\footer.ejs&quot;时间、版权&quot;</span></span><br><span class="line">[<span class="symbol">评论角色配置</span>]: </span><br><span class="line"><span class="link">\themes\pure\layout\_script\_comment\valine.ejs</span></span><br><span class="line">[<span class="symbol">css样式</span>]:</span><br><span class="line"><span class="link">\themes\pure\source\css\style.css</span></span><br><span class="line">[<span class="symbol">搜索栏限制</span>]: </span><br><span class="line"><span class="link">\themes\pure\source\js\insight.js&quot;160行&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="六-内容样例">六. 内容样例<a class="header-anchor" href="#六-内容样例"></a></h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: Test</span><br><span class="line">date: 2022-08-28 00:09:00</span><br><span class="line">updated: 2022-08-28 00:09:01</span><br><span class="line">thumbnail: https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-ezurusudxw/image/test.png</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">category:</span><br><span class="line"><span class="bullet"> -</span> Test</span><br><span class="line">toc: true</span><br><span class="line"><span class="section">top: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">描述&lt;!-- more --&gt;</span><br></pre></td></tr></table></figure><h3 id="文章指定多个-category">文章指定多个 category<a class="header-anchor" href="#文章指定多个-category"></a></h3><blockquote><p>多个分类</p><p>如果我们的要求是将文章同时分到两个或者多个不同的类目下呢?官方给出的方法是:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">categories:</span><br><span class="line"> - [Sports]</span><br><span class="line"> - [Baseball]</span><br></pre></td></tr></table></figure><p>参考文章:<a href="https://www.jianshu.com/p/4438c417611e">Hexo 一篇文章多个 categories https://www.jianshu.com/p/4438c417611e</a></p></blockquote><hr><h2 id="七-自定义">七. 自定义<a class="header-anchor" href="#七-自定义"></a></h2><h3 id="7-1-搜索框索引突破-5">7.1 搜索框索引突破 5<a class="header-anchor" href="#7-1-搜索框索引突破-5"></a></h3><ol><li class="lvl-3"><p><code>F12</code> 定位到搜索框的 类选择器 为 ins-section-header</p></li><li class="lvl-3"><p>grep,定位到配置文件为 <code>\themes\pure\source\js\insight.js</code></p></li><li class="lvl-3"><p>Ctrl + F,搜索 5,定位到第 160 行,修改限制</p></li></ol><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075511578.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075224471.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830075722865.png" alt=""></p></blockquote><h3 id="7-2-左侧头像链接,target-修改为-self">7.2 左侧头像链接,target 修改为 _self<a class="header-anchor" href="#7-2-左侧头像链接,target-修改为-self"></a></h3><p>a 标签,修改 target: ‘_blank’ → ‘_self’</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080811356.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080916410.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220830080945424.png" alt=""></p></blockquote><hr><h3 id="7-3-文章目录,一级标题不跳转">7.3 文章目录,一级标题不跳转<a class="header-anchor" href="#7-3-文章目录,一级标题不跳转"></a></h3><p>有时发现一级标题不会跳转</p><p><s>配置文件<code>\node_modules\hexo\lib\plugins\helper\toc.js</code></s></p><p><s>更新下 <code>\node_modules\hexo\lib\plugins\helper\toc.js</code> 文件,又正常了。时灵时不灵的。。。</s></p><p><s>参考<a href="https://hwame.top/20200520/hello-hexo-troubleshooting.html#3-%E5%A6%82%E4%BD%95%E5%8F%96%E6%B6%88%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E7%9A%84%E8%87%AA%E5%8A%A8%E7%BC%96%E5%8F%B7">https://hwame.top/如何取消文章目录的自动编号</a></s></p><p>修改 “.\node_modules\hexo-renderer-markdown-it\index.js” level 为 1</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906033013691.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>参考文章:</p><p><a href="https://blog.csdn.net/Fosu_Chenai/article/details/111192850">https://blog.csdn.net/Fosu_Chenai/article/details/111192850 评论</a></p></li></ul><hr><h3 id="7-4-滚动条加粗-加小箭头">7.4 滚动条加粗 + 加小箭头<a class="header-anchor" href="#7-4-滚动条加粗-加小箭头"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>修改 css 样式,路径 <code>.\hexo-source\themes\pure\source\css\style.css</code></p><ol><li class="lvl-5"><code>Ctlrl + F</code> 定位 <code>scrollbar</code>;</li><li class="lvl-5">调高 <code>height</code>,使代码框 右拉滚动条加粗;</li><li class="lvl-5">右侧下拉条变粗;</li></ol><blockquote><p><strong>7.4.1 代码框加粗</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * scrollbar</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">14px</span>;# 调高</span><br><span class="line"> <span class="attribute">background</span>: transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164700329.png" alt=""></p><p><strong>7.4.2 右侧下拉条变粗 + 添加小箭头</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 滚动条箭头</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">::-webkit-scrollbar-button &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">0px</span>;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">4px</span>;</span><br><span class="line"> <span class="attribute">display</span>: block; </span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#c3c3c3</span>;</span><br><span class="line">&#125;</span><br><span class="line">::-webkit-scrollbar &#123;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">5px</span> solid white;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-thumb &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#b0b0b0</span>;</span><br><span class="line"> <span class="attribute">background-clip</span>: padding-box;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">0.05em</span> solid <span class="number">#eeeeee</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-track &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Buttons */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button &#123;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#bbbbbb</span>;</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">border-style</span>: solid;</span><br><span class="line"> <span class="attribute">height</span>: <span class="number">13px</span>;</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Up */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement &#123;</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">0px</span> <span class="number">8px</span> <span class="number">8px</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#555555</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:decrement:hover &#123;</span><br><span class="line"> <span class="attribute">border-color</span>: transparent transparent <span class="number">#777777</span> transparent;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Down */</span></span><br><span class="line">::-webkit-scrollbar-button:single-button:vertical:increment &#123;</span><br><span class="line"> <span class="attribute">border-width</span>: <span class="number">8px</span> <span class="number">8px</span> <span class="number">0</span> <span class="number">8px</span>;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#555555</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">::-webkit-scrollbar-button:vertical:single-button:increment:hover &#123;</span><br><span class="line"> <span class="attribute">border-color</span>: <span class="number">#777777</span> transparent transparent transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901164914382.png" alt=""></p></blockquote></li></ul><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="http://www.qianduanheidong.com/blog/article/27901/a1c9346c7830d6ffa3f2/">右侧下拉条新增箭头</a></p></li><li class="lvl-2"><p><a href="https://www.php.cn/css-tutorial-475268.html">:-webkit-scrollbar 滚动条整体部分 https://www.php.cn/css-tutorial-475268.html</a></p></li></ul><h3 id="7-5-Valine-评论框添加一言">7.5 Valine 评论框添加一言<a class="header-anchor" href="#7-5-Valine-评论框添加一言"></a></h3><p><strong>参考文章</strong></p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a></p></li></ul><p>偶然看到的文章,然后自己就加了这个功能。</p><ul class="lvl-0"><li class="lvl-2"><p>路径:<code>.\themes\pure\layout\_script\_comment\valine.ejs</code>;</p></li><li class="lvl-2"><p>加到最后 <code>&lt;/script&gt;</code> 标签之前;c=j 请求获得网易云的句子,开始网抑云吧;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fetch(&#x27;https://v1.hitokoto.cn/?c=j&#x27;)</span><br><span class="line">.then(response =&gt; response.json())</span><br><span class="line">.then(data =&gt; &#123;</span><br><span class="line"> document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line">&#125;)</span><br><span class="line">.catch(console.error)</span><br></pre></td></tr></table></figure></li></ul><blockquote><p>修改方法:</p><ol><li class="lvl-3"><p>找到博客对应添加valine的位置,例如Ayer主题的位于hexo\themes\ayer\layout_partial\post\valine.ejs</p></li><li class="lvl-3"><p>在内部添加一段代码:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;script type=&quot;text/javascript&quot;&gt;</span><br><span class="line"> fetch(&#x27;https://v1.hitokoto.cn&#x27;)</span><br><span class="line"> .then(response =&gt; response.json())</span><br><span class="line"> .then(data =&gt; &#123;</span><br><span class="line"> document.getElementById(&quot;veditor&quot;).setAttribute(&quot;placeholder&quot;,data.hitokoto+&quot;__&quot;+data.from);</span><br><span class="line"> &#125;)</span><br><span class="line"> .catch(console.error)</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure></li><li class="lvl-3"><p>Api接口说明:<br>(1)<a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn/</a> (从7种分类中随机抽取)<br>(2)<a href="https://v1.hitokoto.cn/?c=b">https://v1.hitokoto.cn/?c=b</a> (请求获得一个分类是漫画的句子)<br>参数说明<br>a动画<br>b漫画<br>c游戏<br>d文学<br>e原创<br>f来自网络<br>g其他<br>h影视<br>i诗词<br>j网易云<br>k哲学<br>l抖机灵<br>其他作为动画类型处理<br>可选择多个分类,例如: ?c=a&amp;c=c</p></li></ol><p>(3)<a href="https://v1.hitokoto.cn/?c=f&amp;encode=text">https://v1.hitokoto.cn/?c=f&amp;encode=text</a> (请求获得一个来自网络的句子,并以纯文本格式输出)</p><ol start="4"><li class="lvl-3"><p>返回的格式说明<br>返回参数名称描述<br>id一言标识<br>hitokoto一言正文。编码方式 unicode。使用 utf-8。<br>type类型<br>from一言的出处<br>from_who一言的作者<br>creator添加者<br>creator_uid添加者用户标识<br>reviewer审核员标识<br>uuid一言唯一标识;可以链接到 <a href="https://hitokoto.cn?uuid=%5Buuid%5D">https://hitokoto.cn?uuid=[uuid]</a> 查看这个一言的完整信息<br>commit_from提交方式<br>created_at添加时间<br>length句子长度<br>例如:返回的data,通过data.hitokoto获取句子正文</p></li></ol><p>作者: Justlovesmile<br>链接: <a href="https://blog.justlovesmile.top/posts/27831.html">https://blog.justlovesmile.top/posts/27831.html</a><br>来源: Justlovesmile’s BLOG<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p></blockquote><p>PS:这位大佬的博客真好看~~</p><h3 id="7-6-左侧-归档、分类-改为默认收起">7.6 左侧 归档、分类 改为默认收起<a class="header-anchor" href="#7-6-左侧-归档、分类-改为默认收起"></a></h3><ul class="lvl-0"><li class="lvl-2"><p>默认是展开的</p></li></ul><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203849607.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203907981.png" alt=""></p></blockquote><ul class="lvl-0"><li class="lvl-2"><p>修改以下文件,改为收起状态。如图</p><ul class="lvl-2"><li class="lvl-4">style=“height: 0px” 应该可以不用写,收起状态默认就是 0 ~~</li></ul></li></ul><blockquote><p><code>.\themes\pure\layout\categories.ejs</code></p><p><code>.\themes\pure\layout\_partial\archive.ejs</code></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203746673.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901203807739.png" alt=""></p></blockquote><hr><h2 id="八-未解决的小需求">八. 未解决的小需求<a class="header-anchor" href="#八-未解决的小需求"></a></h2><ol><li class="lvl-3"><p>(已解决,#7.3)一级目录,右侧导航栏 有时跳转失败;</p></li><li class="lvl-3"><p>Valine 评论系统,下面的评论 被@后,未显示 @信息,而别人的是成功的;</p><blockquote><p>我的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171817579.png" alt=""></p><p>其他大佬的</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901171912131.png" alt=""></p></blockquote></li><li class="lvl-3"><p>引用时 使用 #,会被导航目录误认为 一级标题;</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172133945.png" alt=""></p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901172316157.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)生成在 /public 目录的静态文件都被压缩了,<s>我看别人的没被压缩,不清楚啥原因。</s> 因为配置了这个 <a href="https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md#%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96">https://github.com/cofess/hexo-theme-pure/blob/master/README.cn.md 博客优化</a> 压缩了文件</p><blockquote><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220901175404486.png" alt=""></p></blockquote></li><li class="lvl-3"><p>(已解决)文章内部一级、二级…标题左侧无锚点</p><blockquote><p>理想效果图</p><p><img src="https://cdn.iocdn.cc/npm/mycpen-image-bed@0.0.0-2022/image/20220906034109271.png" alt=""></p><p><s>似乎是环境配置问题,我用虚拟机推送静态文件,就有显示;用真实 win机 推送 就没有锚点,重装 git 也没显示(可能不是 git 的问题)。。。</s></p><p>因为压缩了静态文件,全部注释 <code>hexo-neat</code> 配置。<br>参考<br><a href="https://github.com/cofess/hexo-theme-pure#hexo-neat">https://github.com/cofess/hexo-theme-pure#hexo-neat</a><br><a href="https://github.com/rozbo/hexo-neat#options">https://github.com/rozbo/hexo-neat#options</a></p></blockquote></li></ol><p>无伤大雅,<s>我一般一级标题写的是文章标题</s>;评论区也就是个摆设;<s>静态文件被压缩,可能别人还觉得我是故意,嘿</s>~~</p><p>最后总结:魔改要适量,太费时 还得不到提升,不如多看几个前端视频 多写几篇文章。。。</p><hr>]]></content>
1547
1547
 
1548
1548
 
1549
1549
  <categories>