<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>脚本自动化 - 标签 - Hotine的小窝</title>
        <link>/tags/%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96/</link>
        <description>脚本自动化 - 标签 - 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>Tue, 24 Mar 2026 07:06:41 &#43;0000</lastBuildDate><atom:link href="/tags/%E8%84%9A%E6%9C%AC%E8%87%AA%E5%8A%A8%E5%8C%96/" rel="self" type="application/rss+xml" /><item>
    <title>PM2-NodeJS进程守护程序</title>
    <link>/pm2-nodejs%E8%BF%9B%E7%A8%8B%E5%AE%88%E6%8A%A4%E7%A8%8B%E5%BA%8F/</link>
    <pubDate>Tue, 24 Mar 2026 07:06:41 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/pm2-nodejs%E8%BF%9B%E7%A8%8B%E5%AE%88%E6%8A%A4%E7%A8%8B%E5%BA%8F/</guid>
    <description><![CDATA[<h2 id="1-pm2-是什么">1. PM2 是什么？</h2>
<p>PM2（Process Manager 2）是目前最主流的 Node.js 生产环境<strong>进程管理器</strong>。它自带负载均衡、日志管理、性能监控和热重载功能。</p>
<p>如果你只是用 <code>node app.js</code> 启动程序，一旦代码报错或者服务器重启，你的服务就直接挂了。PM2 的存在就是为了确保你的程序<strong>7x24 小时永不掉线</strong> 。</p>]]></description>
</item>
<item>
    <title>Docker部署kimi-free-api</title>
    <link>/docker%E9%83%A8%E7%BD%B2kimi-free-api/</link>
    <pubDate>Wed, 23 Apr 2025 03:28:58 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/docker%E9%83%A8%E7%BD%B2kimi-free-api/</guid>
    <description><![CDATA[<h3 id="简介">简介</h3>
<p>🚀 KIMI AI 长文本大模型逆向API【特长：长文本解读整理】，支持高速流式输出、智能体对话、联网搜索、探索版、K1思考模型、长文档解读、图像解析、多轮对话，零配置部署，多路token支持，自动清理会话痕迹，仅供测试，如需商用请前往官方开放平台。
<a href="https://github.com/LLM-Red-Team/kimi-free-api" target="_blank" rel="noopener noreffer ">GitHub项目页面</a></p>]]></description>
</item>
<item>
    <title>随身wifi的断网自动重启脚本</title>
    <link>/%E9%9A%8F%E8%BA%ABwifi%E7%9A%84%E6%96%AD%E7%BD%91%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF%E8%84%9A%E6%9C%AC/</link>
    <pubDate>Mon, 17 Mar 2025 10:20:32 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/%E9%9A%8F%E8%BA%ABwifi%E7%9A%84%E6%96%AD%E7%BD%91%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF%E8%84%9A%E6%9C%AC/</guid>
    <description><![CDATA[<h3 id="编写脚本">编写脚本</h3>
<p>脚本内容net_check.sh</p>
<div class="code-block code-line-numbers" 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"><span class="cp">#!/bin/bash
</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">check_network<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 使用 ping 命令检测网络连接</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># -c 1 表示发送 1 个 ICMP 数据包</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># -W 5 表示超时时间为 5 秒</span>
</span></span><span class="line"><span class="cl">    ping -c <span class="m">1</span> -W <span class="m">5</span> 8.8.8.8 <span class="p">&amp;</span>&gt; /dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 检查 ping 命令的返回值</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;网络正常，无需重启。&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;网络已断开，准备重启设备。&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</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">while</span> true<span class="p">;</span> <span class="k">do</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> ! check_network<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 如果网络断开，执行重启操作</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;正在重启设备...&#34;</span>
</span></span><span class="line"><span class="cl">        sudo reboot
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 每隔一定时间检查一次（例如每 30 秒检查一次）</span>
</span></span><span class="line"><span class="cl">    sleep <span class="m">30</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div></div>
<p>保存在根目录即可。</p>]]></description>
</item>
<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>天天基金网API</title>
    <link>/%E5%A4%A9%E5%A4%A9%E5%9F%BA%E9%87%91%E7%BD%91api/</link>
    <pubDate>Thu, 23 Jan 2025 14:41:54 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/%E5%A4%A9%E5%A4%A9%E5%9F%BA%E9%87%91%E7%BD%91api/</guid>
    <description><![CDATA[<p>天天基金网获取某基金净值的API接口主要有以下几个：</p>
<ol>
<li><strong>基金实时信息接口</strong>：用于获取基金的实时信息，包括单位净值等数据。</li>
</ol>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <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-text" data-lang="text"><span class="line"><span class="cl">http://fundgz.1234567.com.cn/js/{基金代码}.js</span></span></code></pre></div></div>
<p>其中 <code>{基金代码}</code> 是要查询的基金代码，例如 <code>001186</code>。</p>]]></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>Docker宝库：青龙面板&amp;NTFY消息推送</title>
    <link>/docker%E5%AE%9D%E5%BA%93%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BFntfy%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81/</link>
    <pubDate>Sun, 05 Jan 2025 15:28:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/docker%E5%AE%9D%E5%BA%93%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BFntfy%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%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/%e7%8e%a9NAS/Docker%e5%ae%9d%e5%ba%93%ef%bc%9a%e9%9d%92%e9%be%99%e9%9d%a2%e6%9d%bf&amp;NTFY%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%811.png" referrerpolicy="no-referrer">
            </div><p>青龙面板是一款基于Docker技术构建的支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。</p>
<p>简单来说就是可以定时跑脚本，实现一些自动化任务，例如签到打卡、定时爬虫等</p>]]></description>
</item>
<item>
    <title>NTFY消息推送</title>
    <link>/ntfy%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81/</link>
    <pubDate>Fri, 27 Dec 2024 07:51:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/ntfy%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%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/%e5%85%b6%e4%bb%96/NTFY%e6%b6%88%e6%81%af%e6%8e%a8%e9%80%81.jpg" referrerpolicy="no-referrer">
            </div><p>研究了好几天，作为消息推送、订阅服务，首先查到的就是基于MQTT协议的相关服务，包括出名的EMQX、Mosquitto等，但是研究了半天，这些东西主要用于物联网，安卓缺少易用的客户端APP，最终发现了基于HTTP的消息推送服务NTFY。
官网:https://ntfy.sh/</p>]]></description>
</item>
<item>
    <title>安卓手机自动化神器AutoX.JS</title>
    <link>/%E5%AE%89%E5%8D%93%E8%87%AA%E5%8A%A8%E5%8C%96%E4%B9%8Bautox.js/</link>
    <pubDate>Sun, 17 Sep 2023 13:36:00 &#43;0000</pubDate>
    <author>Hotine</author>
    <guid>/%E5%AE%89%E5%8D%93%E8%87%AA%E5%8A%A8%E5%8C%96%E4%B9%8Bautox.js/</guid>
    <description><![CDATA[<h2 id="安卓手机自动化神器autoxjs">安卓手机自动化神器AutoX.JS</h2>
<p>Auto.js 是一款基于 Android 平台的自动化测试和脚本编写工具。它允许用户编写脚本来模拟用户在 Android 设备上的操作，例如点击、滑动、输入文字等，以便自动执行各种任务或测试应用程序。
因为功能太过强大，被一些灰色产业所利用，最后导致Auto.js被强制关停下架。而Autox.js就是根据Auto.js的源码，被继承并二次开发的接替版APP。</p>]]></description>
</item>
</channel>
</rss>
