<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>VPS与建站 - 分类 - Hotine的小窝</title>
        <link>/categories/vps%E4%B8%8E%E5%BB%BA%E7%AB%99/</link>
        <description>VPS与建站 - 分类 - Hotine的小窝</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Sun, 26 Jan 2025 13:06:56 &#43;0000</lastBuildDate><atom:link href="/categories/vps%E4%B8%8E%E5%BB%BA%E7%AB%99/" rel="self" type="application/rss+xml" /><item>
    <title>Obsidian转Hugo的小脚本</title>
    <link>/obsidian%E8%BD%AChugo%E7%9A%84%E5%B0%8F%E8%84%9A%E6%9C%AC/</link>
    <pubDate>Sun, 26 Jan 2025 13:06:56 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/obsidian%E8%BD%AChugo%E7%9A%84%E5%B0%8F%E8%84%9A%E6%9C%AC/</guid>
    <description><![CDATA[<p>费劲巴拉，写了个Obsidian转换Hugo的小脚本。因为Obsidian上的那两个转Hugo的插件都不好用。C！</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-js">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 功能，把Obsidain的MD文件，批量转换成Hugo博客格式的MD文件
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 图片，全部更换链接
</span></span></span><span class="line"><span class="cl"><span class="cm"> * md引用，全部替换成html的url
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 封面图（如有）全部更新链接
</span></span></span><span class="line"><span class="cl"><span class="cm"> * categories如果缺失，则根据md文件所在的文件夹命名categories
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 
</span></span></span><span class="line"><span class="cl"><span class="cm"> * npm install gray-matter
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 常量定义
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">OBSIDIAN_PATH</span> <span class="o">=</span> <span class="s1">&#39;Y:\\documents\\notes&#39;</span><span class="p">;</span> <span class="c1">// Obsidian的根目录
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">HUGO_PATH</span> <span class="o">=</span> <span class="s1">&#39;D:\\Github\\hotineblog\\构建blog&#39;</span><span class="p">;</span> <span class="c1">// Hugo的根目录
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">HUGO_STATIC_PATH</span> <span class="o">=</span> <span class="s1">&#39;\\static\\blog&#39;</span><span class="p">;</span><span class="c1">//static文件夹下附件目录
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">HUGO_POSTS_PATH</span> <span class="o">=</span> <span class="s1">&#39;\\content\\posts&#39;</span><span class="p">;</span><span class="c1">//博客文件夹
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">HUGO_TAG</span> <span class="o">=</span> <span class="s1">&#39;blog&#39;</span><span class="p">;</span> <span class="c1">// 标记需要转换的文章的标签
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 引入必要的模块
</span></span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">matter</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;gray-matter&#39;</span><span class="p">);</span> <span class="c1">// 用于解析Markdown文件的元数据
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 记录文件列表数据
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span> <span class="nx">fileListData</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 扫描Obsidian目录中的全部文件和文件夹，生成一个文件记录列表
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {*} dirPath 
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">traverseDirectory</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">files</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readdirSync</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">files</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">file</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 检查文件名是否以点开头
</span></span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">file</span><span class="p">.</span><span class="nx">startsWith</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span><span class="p">;</span> <span class="c1">// 如果是隐藏文件或文件夹，跳过
</span></span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">filePath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">dirPath</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">fileStat</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">statSync</span><span class="p">(</span><span class="nx">filePath</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">fileStat</span><span class="p">.</span><span class="nx">isDirectory</span><span class="p">())</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">traverseDirectory</span><span class="p">(</span><span class="nx">filePath</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">fileListData</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span></span><span class="line"><span class="cl">                <span class="nx">name</span><span class="o">:</span> <span class="nx">file</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">ext</span><span class="o">:</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">file</span><span class="p">).</span><span class="nx">toLowerCase</span><span class="p">(),</span>
</span></span><span class="line"><span class="cl">                <span class="nx">obs_path</span><span class="o">:</span> <span class="nx">filePath</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="nx">hugo_path</span><span class="o">:</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">            <span class="p">});</span>
</span></span><span class="line"><span class="cl">            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&#34;遍历-&#34;</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 复制文件到目标路径
</span></span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">copyFile</span><span class="p">(</span><span class="nx">oldPath</span><span class="p">,</span> <span class="nx">newPath</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 检查源文件是否存在
</span></span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fs</span><span class="p">.</span><span class="nx">existsSync</span><span class="p">(</span><span class="nx">oldPath</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="sb">`【E】拷贝文件时，源文件不存在: </span><span class="si">${</span><span class="nx">oldPath</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// 获取目标文件的目录路径
</span></span></span><span class="line"><span class="cl">    <span class="kr">const</span> <span class="nx">newDir</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span><span class="p">(</span><span class="nx">newPath</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// 检查目标目录是否存在，如果不存在则创建
</span></span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fs</span><span class="p">.</span><span class="nx">existsSync</span><span class="p">(</span><span class="nx">newDir</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">fs</span><span class="p">.</span><span class="nx">mkdirSync</span><span class="p">(</span><span class="nx">newDir</span><span class="p">,</span> <span class="p">{</span> <span class="nx">recursive</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">        <span class="c1">//console.log(`目标目录不存在，已创建: ${newDir}`);
</span></span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// 拷贝文件
</span></span></span><span class="line"><span class="cl">    <span class="nx">fs</span><span class="p">.</span><span class="nx">copyFile</span><span class="p">(</span><span class="nx">oldPath</span><span class="p">,</span> <span class="nx">newPath</span><span class="p">,</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="sb">`【E】拷贝文件时出错: </span><span class="si">${</span><span class="nx">err</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">//console.log(`【i】文件已成功拷贝到: ${newPath}`);
</span></span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 把路径中的\都换成/
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {*} filePath 
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns 
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">path2url</span><span class="p">(</span><span class="nx">filePath</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">filePath</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\\/g</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 修改文章附件连接为HUGO标准链接：![备注]{链接}
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 同时把连接中的md文件修改为对应的html文件
</span></span></span><span class="line"><span class="cl"><span class="cm"> * ==================================================有未完善的BUG=============================================
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 目前除了md文件输出[xx]{url}，默认都作为图片文件输出成了![xx]{url}的格式。
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {*} match 原始链接内容
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {*} altText 连接中的提示词
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {*} url 连接中的url
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns 新的链接内容
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">fixMDContent</span><span class="p">(</span><span class="nx">match</span><span class="p">,</span> <span class="nx">altText</span><span class="p">,</span> <span class="nx">url</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 如果是本地链接（不是http开头的）
</span></span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="sr">/^http/</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">url</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">//如果没有文件后缀名，则认定为md文件
</span></span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">url</span><span class="p">).</span><span class="nx">toLowerCase</span><span class="p">()</span> <span class="o">===</span> <span class="s2">&#34;&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">url</span> <span class="o">+=</span> <span class="s1">&#39;.md&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="c1">//获取文件名和格式
</span></span></span><span class="line"><span class="cl">        <span class="kr">const</span> <span class="nx">filename</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">basename</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="kd">let</span> <span class="nx">obj</span> <span class="o">=</span> <span class="nx">fileListData</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">item</span> <span class="p">=&gt;</span> <span class="nx">item</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="nx">filename</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1">//如果找到了对应文件
</span></span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">//如果附件在文件遍历数组中未登记hugo_path（说明文件未复制到hugo目录）
</span></span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span> <span class="o">===</span> <span class="s2">&#34;&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">url</span><span class="p">)</span> <span class="o">===</span> <span class="s2">&#34;.md&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">OBSIDIAN_PATH</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span> <span class="o">+</span> <span class="nx">HUGO_POSTS_PATH</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//文件名全部转换成小写并且移除标点符号
</span></span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">n</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">n</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">n</span> <span class="o">=</span> <span class="nx">n</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/\.md$/</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">n</span> <span class="o">=</span> <span class="nx">n</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/[.,!?;:&#39;&#34;(){}[\]&lt;&gt;/?！，。？；：“”‘’（）【】《》、|]/g</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">,</span> <span class="nx">n</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//返回对应的html url
</span></span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="sb">`[</span><span class="si">${</span><span class="nx">altText</span><span class="si">}</span><span class="sb">](</span><span class="si">${</span><span class="nx">path2url</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">),</span> <span class="s2">&#34;&#34;</span><span class="p">)).</span><span class="nx">toLowerCase</span><span class="p">()</span><span class="si">}</span><span class="sb">)`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span> <span class="o">=</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">OBSIDIAN_PATH</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span> <span class="o">+</span> <span class="nx">HUGO_STATIC_PATH</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//console.log(&#34;新路径&#34;,obj.hugo_path)
</span></span></span><span class="line"><span class="cl">                    <span class="nx">copyFile</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">,</span> <span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//返回修改后的MD链接
</span></span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="sb">`![</span><span class="si">${</span><span class="nx">altText</span><span class="si">}</span><span class="sb">](</span><span class="si">${</span><span class="nx">path2url</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span><span class="p">,</span> <span class="s2">&#34;static&#34;</span><span class="p">),</span> <span class="s2">&#34;&#34;</span><span class="p">))</span><span class="si">}</span><span class="sb">)`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">url</span><span class="p">)</span> <span class="o">===</span> <span class="s2">&#34;.md&#34;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="sb">`[</span><span class="si">${</span><span class="nx">altText</span><span class="si">}</span><span class="sb">](</span><span class="si">${</span><span class="nx">path2url</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">),</span> <span class="s2">&#34;&#34;</span><span class="p">)).</span><span class="nx">toLowerCase</span><span class="p">()</span><span class="si">}</span><span class="sb">)`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="sb">`![</span><span class="si">${</span><span class="nx">altText</span><span class="si">}</span><span class="sb">](</span><span class="si">${</span><span class="nx">path2url</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">hugo_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span><span class="p">,</span> <span class="s2">&#34;static&#34;</span><span class="p">),</span> <span class="s2">&#34;&#34;</span><span class="p">))</span><span class="si">}</span><span class="sb">)`</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">//如果附件中指定的文件不存在，则返回原始链接（一定要返回原始链接，防止误识别附件）
</span></span></span><span class="line"><span class="cl">            <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`【E】附件不存在：</span><span class="si">${</span><span class="nx">url</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">return</span> <span class="nx">match</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">match</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 遍历全部的md文件，并转换成HUGO格式
</span></span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">convertMarkdownFiles</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fileListData</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">fileInfo</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">ext</span> <span class="o">===</span> <span class="s1">&#39;.md&#39;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">//读取MD文件
</span></span></span><span class="line"><span class="cl">            <span class="kr">const</span> <span class="nx">fileContent</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">,</span> <span class="s1">&#39;utf8&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="kr">const</span> <span class="p">{</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">content</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">matter</span><span class="p">(</span><span class="nx">fileContent</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c1">// 检查是否包含HUGO_TAG
</span></span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">tags</span> <span class="o">&amp;&amp;</span> <span class="nx">data</span><span class="p">.</span><span class="nx">tags</span><span class="p">.</span><span class="nx">includes</span><span class="p">(</span><span class="nx">HUGO_TAG</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`【i】处理MD文件：</span><span class="si">${</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">name</span><span class="si">}</span><span class="sb">@</span><span class="si">${</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">obs_path</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="c1">// 删除HUGO_TAG
</span></span></span><span class="line"><span class="cl">                <span class="nx">data</span><span class="p">.</span><span class="nx">tags</span> <span class="o">=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">tags</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">tag</span> <span class="p">=&gt;</span> <span class="nx">tag</span> <span class="o">!==</span> <span class="nx">HUGO_TAG</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 把不标准的附件链接转换成标准附件链接：
</span></span></span><span class="line"><span class="cl">                <span class="c1">// ![xx](./da/bb.jpg)或 [xx](./da/bb.jpg)格式，解析并处理文件中的图片、文件、URL链接：
</span></span></span><span class="line"><span class="cl">                <span class="kd">let</span> <span class="nx">newContent</span> <span class="o">=</span> <span class="nx">content</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/!\[(.*?)\]\((.*?)\)|\[(.*?)\]\((.*?)\)/g</span><span class="p">,</span> <span class="p">(</span><span class="nx">match</span><span class="p">,</span> <span class="nx">altText1</span><span class="p">,</span> <span class="nx">url1</span><span class="p">,</span> <span class="nx">altText2</span><span class="p">,</span> <span class="nx">url2</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">altText</span> <span class="o">=</span> <span class="nx">altText1</span> <span class="o">||</span> <span class="nx">altText2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">url1</span> <span class="o">||</span> <span class="nx">url2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//console.log(match,altText,url);
</span></span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="nx">fixMDContent</span><span class="p">(</span><span class="nx">match</span><span class="p">,</span> <span class="nx">altText</span><span class="p">,</span> <span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">//![[xxx/cover.jpg]]或[[xxx/cover.jpg]]格式，解析并处理文件中的图片、文件、URL链接：
</span></span></span><span class="line"><span class="cl">                <span class="nx">newContent</span> <span class="o">=</span> <span class="nx">newContent</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/!\[\[(.*?)\]\]|\[\[(.*?)\]\]/g</span><span class="p">,</span> <span class="p">(</span><span class="nx">match</span><span class="p">,</span> <span class="nx">url1</span><span class="p">,</span> <span class="nx">url2</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">url1</span> <span class="o">||</span> <span class="nx">url2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">altText</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">basename</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="k">return</span> <span class="nx">fixMDContent</span><span class="p">(</span><span class="nx">match</span><span class="p">,</span> <span class="nx">altText</span><span class="p">,</span> <span class="nx">url</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 处理文章封面图（null=有featuredImage属性但是为空，undefined=未设置featuredImage属性）
</span></span></span><span class="line"><span class="cl">                <span class="c1">// 如果指定了封面
</span></span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span><span class="o">===</span><span class="s1">&#39;undefined&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span> <span class="o">===</span> <span class="kc">null</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">f</span> <span class="o">=</span> <span class="nx">fixMDContent</span><span class="p">(</span><span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">,</span> <span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">f</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/\!\[.*?\]\((.*?)\)/</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="p">(</span><span class="nx">url</span> <span class="o">&amp;&amp;</span> <span class="nx">url</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span> <span class="o">=</span> <span class="nx">url</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span> <span class="o">===</span> <span class="kc">null</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="c1">//如果无封面设置，则自动生成一个封面图
</span></span></span><span class="line"><span class="cl">                    <span class="kr">const</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">newContent</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/\!\[.*?\]\((.*?)\)/</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="c1">// 如果匹配成功，返回第一个图片的 URL
</span></span></span><span class="line"><span class="cl">                    <span class="k">if</span> <span class="p">(</span><span class="nx">match</span> <span class="o">&amp;&amp;</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                        <span class="nx">data</span><span class="p">.</span><span class="nx">featuredImage</span><span class="o">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">//为文章生成categories
</span></span></span><span class="line"><span class="cl">                <span class="c1">//如果文章没有指定categories
</span></span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">data</span><span class="p">.</span><span class="nx">categories</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">categories</span> <span class="o">===</span> <span class="s2">&#34;&#34;</span> <span class="o">||</span> <span class="nx">data</span><span class="p">.</span><span class="nx">categories</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">c</span> <span class="o">=</span> <span class="nx">path2url</span><span class="p">(</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">OBSIDIAN_PATH</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                    <span class="kd">let</span> <span class="nx">cat</span> <span class="o">=</span> <span class="nx">c</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/[^/]+(?=\/[^/]+$)/</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">data</span><span class="p">.</span><span class="nx">categories</span> <span class="o">=</span> <span class="p">[</span><span class="nx">cat</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 生成新的Markdown文件内容
</span></span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">newFileContent</span> <span class="o">=</span> <span class="nx">matter</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">newContent</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 创建Hugo内容目录
</span></span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">newDirPath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">HUGO_PATH</span> <span class="o">+</span> <span class="nx">HUGO_POSTS_PATH</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">dirname</span><span class="p">(</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">obs_path</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="nx">OBSIDIAN_PATH</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">)));</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fs</span><span class="p">.</span><span class="nx">existsSync</span><span class="p">(</span><span class="nx">newDirPath</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">fs</span><span class="p">.</span><span class="nx">mkdirSync</span><span class="p">(</span><span class="nx">newDirPath</span><span class="p">,</span> <span class="p">{</span> <span class="nx">recursive</span><span class="o">:</span> <span class="kc">true</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="c1">// 写入新的Markdown文件
</span></span></span><span class="line"><span class="cl">                <span class="kr">const</span> <span class="nx">newFilePath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">newDirPath</span><span class="p">,</span> <span class="nx">fileInfo</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="nx">fs</span><span class="p">.</span><span class="nx">writeFileSync</span><span class="p">(</span><span class="nx">newFilePath</span><span class="p">,</span> <span class="nx">newFileContent</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="sb">`【i】跳过MD文件：</span><span class="si">${</span><span class="nx">fileInfo</span><span class="p">.</span><span class="nx">obs_path</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 主函数
</span></span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">traverseDirectory</span><span class="p">(</span><span class="nx">OBSIDIAN_PATH</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">convertMarkdownFiles</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 执行主函数
</span></span></span><span class="line"><span class="cl"><span class="nx">main</span><span class="p">();</span></span></span></code></pre></div></div>]]></description>
</item>
<item>
    <title>Linux上做个流量统计器</title>
    <link>/linux%E4%B8%8A%E5%81%9A%E4%B8%AA%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1%E5%99%A8/</link>
    <pubDate>Tue, 14 Jan 2025 14:17:47 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/linux%E4%B8%8A%E5%81%9A%E4%B8%AA%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1%E5%99%A8/</guid>
    <description><![CDATA[<p>VPS流量竟然用超了，于是打算做个流量统计与监控的脚本来自动统计每月和每天的流量使用情况。</p>
<p>查了下资料，Linux系统中，有一个虚拟文件，它提供了系统中所有网络接口的详细统计信息。这个文件就是<code>/proc/net/dev</code>。
打开这个文件，内容大致像：</p>]]></description>
</item>
<item>
    <title>Linux修改SSH端口号和登录方式</title>
    <link>/linux%E4%BF%AE%E6%94%B9ssh%E7%AB%AF%E5%8F%A3%E5%8F%B7%E5%92%8C%E7%99%BB%E5%BD%95%E6%96%B9%E5%BC%8F/</link>
    <pubDate>Tue, 14 Jan 2025 07:03:58 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/linux%E4%BF%AE%E6%94%B9ssh%E7%AB%AF%E5%8F%A3%E5%8F%B7%E5%92%8C%E7%99%BB%E5%BD%95%E6%96%B9%E5%BC%8F/</guid>
    <description><![CDATA[<p>在Debian系统中，修改SSH端口号到2077的步骤如下：</p>
<h3 id="一备份配置文件">一、备份配置文件</h3>
<p>首先，备份<code>sshd_config</code>文件，以防止修改过程中出现错误导致无法通过SSH连接到服务器。</p>]]></description>
</item>
<item>
    <title>Hugo修改发布位置</title>
    <link>/hugo%E4%BF%AE%E6%94%B9%E5%8F%91%E5%B8%83%E4%BD%8D%E7%BD%AE/</link>
    <pubDate>Wed, 07 Feb 2024 12:58:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/hugo%E4%BF%AE%E6%94%B9%E5%8F%91%E5%B8%83%E4%BD%8D%E7%BD%AE/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/blog/%e7%94%b5%e8%84%91%e6%8a%98%e8%85%be/%e9%99%84%e4%bb%b6/VPS%e4%b8%8e%e5%bb%ba%e7%ab%99/Hugo%e4%b8%aa%e4%ba%ba%e5%8d%9a%e5%ae%a2%e6%90%ad%e5%bb%ba.jpg" referrerpolicy="no-referrer">
            </div><p>
Hugo默认发布文件是保存在Hugo文件夹下的public文件夹中，如果需要修改发布的位置，例如直接发布在github的项目文件中，可以通过修改配置文件来实现。</p>]]></description>
</item>
<item>
    <title>Caddy网站设置访问密码</title>
    <link>/caddy%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE%E8%AE%BF%E9%97%AE%E5%AF%86%E7%A0%81/</link>
    <pubDate>Wed, 23 Aug 2023 14:49:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/caddy%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE%E8%AE%BF%E9%97%AE%E5%AF%86%E7%A0%81/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/blog/%e7%94%b5%e8%84%91%e6%8a%98%e8%85%be/%e9%99%84%e4%bb%b6/VPS%e4%b8%8e%e5%bb%ba%e7%ab%99/Caddy%e5%bb%ba%e7%ab%99%e6%8c%87%e5%8d%97.svg" referrerpolicy="no-referrer">
            </div><p>
<strong>有时候，明明搭建了一个网站，但还不想让无关的人看，咋办？当然是设置访问密码！</strong></p>
<p>当然有很多这样的应用场景，比方说：</p>
<ul>
<li>把家里NAS上的某个功能穿透到外网了，但是只想自己能看到。</li>
<li>把宝宝相册放到VPS上了，不想让无关人员看到。</li>
<li>等等</li>
</ul>
<p>如何设置呢？总不能自己写一个身份验证吧（那也太麻烦了），幸运的是，Caddy自带身份验证的功能。</p>]]></description>
</item>
<item>
    <title>Hugo个人博客搭建</title>
    <link>/hugo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</link>
    <pubDate>Thu, 17 Aug 2023 08:11:23 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/hugo%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/blog/%e7%94%b5%e8%84%91%e6%8a%98%e8%85%be/%e9%99%84%e4%bb%b6/VPS%e4%b8%8e%e5%bb%ba%e7%ab%99/Hugo%e4%b8%aa%e4%ba%ba%e5%8d%9a%e5%ae%a2%e6%90%ad%e5%bb%ba.jpg" referrerpolicy="no-referrer">
            </div><p></p>
<h2 id="前言">前言</h2>
<p>一直想弄一个轻量级的博客，操作简单，便于迁移。试过wordpress和自建静态博客，最后发现还有hugo这类好东西。整体对比起来就是：</p>]]></description>
</item>
<item>
    <title>V2Ray服务端V途锐部署笔记</title>
    <link>/v2ray%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%83%A8%E7%BD%B2%E7%AC%94%E8%AE%B0/</link>
    <pubDate>Mon, 14 Aug 2023 14:54:59 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/v2ray%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%83%A8%E7%BD%B2%E7%AC%94%E8%AE%B0/</guid>
    <description><![CDATA[<h2 id="前言">前言</h2>
<p>VPS的IP被墙了，在此之前，V途锐在搬瓦工已经安稳运行了8个月了。不知道是因为在VPS部署了Chanzhaoyu/chatgpt-web的项目的缘故(因为大约在被墙的前两周发现该项目使用的3002端口被封了)，还是因为升级的V途锐的版本的问题(升级后稀里糊涂重新配置了VM3SS链接，可能伪装比较差)。总之之前那个VPS的IP报废了。之后又慌忙花了60块钱换了个新IP(心疼)，花了一天的时间恢复了网站，并且把V途锐使用了VM3SS+WS+TLS伪装。结果第二天发现又有被墙的迹象，主要表现为域名解析出现问题，通过域名访问不了VPS了，但是通过<a href="https://ping.pe" target="_blank" rel="noopener noreffer ">ping.pe</a>检测，国内均能ping通。于是抓紧想办法补救。结果还真有办法，而且之前换IP的那60元，也成了冤枉钱。</p>]]></description>
</item>
<item>
    <title>Caddy建站指南</title>
    <link>/caddy%E5%BB%BA%E7%AB%99%E6%8C%87%E5%8D%97/</link>
    <pubDate>Thu, 10 Aug 2023 16:00:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/caddy%E5%BB%BA%E7%AB%99%E6%8C%87%E5%8D%97/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/blog/%e7%94%b5%e8%84%91%e6%8a%98%e8%85%be/%e9%99%84%e4%bb%b6/VPS%e4%b8%8e%e5%bb%ba%e7%ab%99/Caddy%e5%bb%ba%e7%ab%99%e6%8c%87%e5%8d%97.svg" referrerpolicy="no-referrer">
            </div><p></p>
<p>对于在VPS或者家里的小服务器上搭建网站，最轻量级的可以使用基于NodeJS的Express,也可以使用功能强大且出名的Nginx，本文主要讲解Caddy快速在VPS上搭建HTTPS的个人网站。因为Caddy可以自动申请SSL证书，搭建完成直接就是HTTPS网站。</p>]]></description>
</item>
<item>
    <title>Linux系统中V途锐客户端安装</title>
    <link>/linux%E7%B3%BB%E7%BB%9F%E4%B8%ADv%E9%80%94%E9%94%90%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%AE%89%E8%A3%85/</link>
    <pubDate>Sat, 24 Jun 2023 16:00:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/linux%E7%B3%BB%E7%BB%9F%E4%B8%ADv%E9%80%94%E9%94%90%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%AE%89%E8%A3%85/</guid>
    <description><![CDATA[<h1 id="linux系统中直接安装">Linux系统中直接安装：</h1>
<p>Linux系统中V途锐客户端的名称叫<code>V2RAYA</code>。
官网：<a href="https://v2raya.org/" target="_blank" rel="noopener noreffer ">V2RAYA.ORG</a>
GitHub：<a href="https://github.com/v2rayA/v2rayA" target="_blank" rel="noopener noreffer ">v2rayA/v2rayA</a>
官方文档<a href="https://v2raya.org/docs/prologue/installation/debian/" target="_blank" rel="noopener noreffer ">Debian：Debian/Ubuntu安装</a></p>]]></description>
</item>
<item>
    <title>Linux中安装NodeJS并用Express搭建静态网站</title>
    <link>/linux%E4%B8%AD%E5%AE%89%E8%A3%85nodejs%E5%B9%B6%E7%94%A8express%E6%90%AD%E5%BB%BA%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/</link>
    <pubDate>Wed, 10 May 2023 08:00:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/linux%E4%B8%AD%E5%AE%89%E8%A3%85nodejs%E5%B9%B6%E7%94%A8express%E6%90%AD%E5%BB%BA%E9%9D%99%E6%80%81%E7%BD%91%E7%AB%99/</guid>
    <description><![CDATA[<h2 id="nodejs部署">NODEJS部署</h2>
<h3 id="最简单的部署方式">最简单的部署方式</h3>
<p>分别输入以下命令</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt install nodejs
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">sudo apt install npm</span></span></code></pre></div></div>
<p>之后在控制台输入</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">node
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">npm</span></span></code></pre></div></div>
<p>如果能正常显示版本号，那就说明装好了。可以跳过本文后边的安装过程了。</p>]]></description>
</item>
</channel>
</rss>
