<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Ydecl/忧</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.yc2019.cn/</id>
  <link href="https://blog.yc2019.cn/" rel="alternate"/>
  <link href="https://blog.yc2019.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Ydecl/忧</rights>
  <subtitle>博客</subtitle>
  <title>匿迹-无垠</title>
  <updated>2026-06-17T05:21:31.504Z</updated>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="忧@官网" scheme="https://blog.yc2019.cn/categories/%E5%BF%A7-%E5%AE%98%E7%BD%91/"/>
    <category term="api" scheme="https://blog.yc2019.cn/categories/%E5%BF%A7-%E5%AE%98%E7%BD%91/api/"/>
    <content>
      <![CDATA[<h3 id="一行代码把-XML-变成-JSON：免费-API-工具上线"><a href="#一行代码把-XML-变成-JSON：免费-API-工具上线" class="headerlink" title="一行代码把 XML 变成 JSON：免费 API 工具上线"></a>一行代码把 XML 变成 JSON：免费 API 工具上线</h3><p>示例地址（将 xxxxxx.cn 的 Atom 转为 JSON）：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xmlorjson.api.yc2019.cn/?xml=https://xxxxxx.cn/atom.xml</span><br></pre></td></tr></table></figure></div><p>访问后立刻得到格式化 JSON，包含文章标题、链接、更新时间、摘要等，可直接在前端 fetch，或粘贴到调试工具中分析。</p><p>格式：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xmlorjson.api.yc2019.cn/?xml=目标XML地址</span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/mxlorjson-api.html</id>
    <link href="https://blog.yc2019.cn/posts/mxlorjson-api.html"/>
    <published>2026-06-17T05:17:29.357Z</published>
    <summary>
      <![CDATA[<h3 id="一行代码把-XML-变成-JSON：免费-API-工具上线"><a href="#一行代码把-XML-变成-JSON：免费-API-工具上线" class="headerlink" title="一行代码把 XML 变成 JSON：免费 API 工具上线"></a]]>
    </summary>
    <title>一行代码把 XML 变成 JSON：免费 API 工具上线</title>
    <updated>2026-06-17T05:21:31.504Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="python" scheme="https://blog.yc2019.cn/categories/python/"/>
    <category term="微信开发者工具" scheme="https://blog.yc2019.cn/categories/python/%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7/"/>
    <category term="Casdoor" scheme="https://blog.yc2019.cn/categories/python/%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7/Casdoor/"/>
    <content>
      <![CDATA[<h2 id="个人也能拥有“微信扫码登录”——基于-Casdoor-的轻量级-OAuth-方案"><a href="#个人也能拥有“微信扫码登录”——基于-Casdoor-的轻量级-OAuth-方案" class="headerlink" title="个人也能拥有“微信扫码登录”——基于 Casdoor 的轻量级 OAuth 方案"></a>个人也能拥有“微信扫码登录”——基于 Casdoor 的轻量级 OAuth 方案</h2><p>通过这套方案，即使使用的是普通账户（非企业认证）的小程序，也能实现和主流网站一样的“扫一扫，自动登录”体验。（注：微信官方扫码登录能力本身要求企业认证，本方案是一种轻量化的替代实现。）</p><p>github:<a class="link"   href="https://github.com/ydecl/personal-wechat-auth-gateway" >https://github.com/ydecl/personal-wechat-auth-gateway<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>简单的视频演示：<a class="link"   href="https://www.bilibili.com/video/BV1mjJV6qEU5/" >https://www.bilibili.com/video/BV1mjJV6qEU5/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><pre class="mermaid">sequenceDiagram    participant Browser as 浏览器    participant AuthSvr as OAuth授权服务器<br/>(FastAPI)    participant WxMP as 微信小程序    participant WxBackend as 微信服务器    participant Casdoor as Casdoor (IdP)    Browser->>Casdoor: 访问应用，触发登录    Casdoor->>AuthSvr: 302重定向到 /oauth/authorize?client_id=...    AuthSvr->>AuthSvr: 生成 session_id (pending)    AuthSvr-->>Browser: 返回HTML页面，包含：<br/>1. 展示小程序码（自动请求 /oauth/qrcode_img/{session_id}）<br/>2. 前端轮询脚本（每2秒请求 /oauth/session_status/{session_id}）        Browser->>AuthSvr: GET /oauth/qrcode_img/{session_id}    AuthSvr->>AuthSvr: 检查缓存，若无则调用微信接口生成    AuthSvr-->>Browser: 返回小程序码图片（PNG）    Note over Browser,WxMP: 用户用微信扫描二维码    WxMP->>WxBackend: 扫码唤起，获取 scene 参数（内含 session_id）    WxMP->>WxBackend: wx.login() 获取 code    WxMP->>AuthSvr: POST /api/bind_session {code, session_id}    AuthSvr->>WxBackend: 用 code 换取 openid    WxBackend-->>AuthSvr: 返回 openid    AuthSvr->>AuthSvr: 将 session_id 状态改为 bound，关联 openid    AuthSvr-->>WxMP: 返回 access_token (JWT)    Note over WxMP: 小程序可继续调用业务接口    Browser->>AuthSvr: 轮询检测到 status=bound    Browser->>AuthSvr: POST /oauth/authorize/submit (session_id, client_id, redirect_uri, state)    AuthSvr->>AuthSvr: 生成一次性授权码 (authorization_code)    AuthSvr-->>Browser: 302重定向到 Casdoor 回调地址?code=...    Casdoor->>AuthSvr: POST /oauth/token (code, client_secret)    AuthSvr-->>Casdoor: 返回 access_token (JWT)    Casdoor->>AuthSvr: GET /oauth/userinfo (Bearer Token)    AuthSvr-->>Casdoor: 返回用户信息 (openid, 昵称等)    Casdoor-->>Browser: 登录成功，返回应用页面</pre><h3 id="小程序-Python-Casdoor，三步搭建扫码登录"><a href="#小程序-Python-Casdoor，三步搭建扫码登录" class="headerlink" title="小程序 + Python + Casdoor，三步搭建扫码登录"></a>小程序 + Python + Casdoor，三步搭建扫码登录</h3><blockquote><p>代码已开源在 GitHub 上，部署几乎没有门槛。小程序部分仅包含 CSS、HTML 和 JS 代码，注意：小程序正式上线仍然需要备案。</p></blockquote><h3 id="第一步：注册并配置小程序"><a href="#第一步：注册并配置小程序" class="headerlink" title="第一步：注册并配置小程序"></a>第一步：注册并配置小程序</h3><p>首先在:<a class="link"   href="https://mp.weixin.qq.com/" >微信公众平台<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>注册一个小程序。</p><p>进入微信小程序开发平台，随便选择一个模板即可（这里以 JS 模板为例），然后定位到 pages&#x2F;index 目录。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-13_210641.png"                                     ></p><p>从 GitHub 仓库获取最新的 index.js、index.wxml 和 index.wxss 代码，直接复制粘贴到对应的文件中。</p><p><em>index.wxml代码可以改,改成你自己喜欢的界面。这里只是个示例,也是方便输入会话ID调试。</em><br>比如,扫描登录失败&#x2F;成功会有提示框：</p><blockquote><p>实例代码位于github仓库&#x2F;微信美化实例&#x2F;index.wxml</p></blockquote><div style="text-align: left;">  <img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-15_172750.png"                      width="100"                 ></div><p>在 index.js 中，<strong>务必修改代码中两处域名，确保与你在微信官方后台配置的服务器域名一致</strong>：</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-13_222954.png"                                     ></p><div class="code-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Page</span>(&#123;</span><br><span class="line">  <span class="attr">data</span>: &#123;</span><br><span class="line">    <span class="attr">sessionId</span>: <span class="string">&#x27;&#x27;</span>,        <span class="comment">// 用户输入的会话ID</span></span><br><span class="line">    <span class="attr">hasToken</span>: <span class="literal">false</span>,      <span class="comment">// 是否已有 token</span></span><br><span class="line">    <span class="attr">result</span>: <span class="string">&#x27;&#x27;</span>,           <span class="comment">// 显示接口返回结果</span></span><br><span class="line">    <span class="attr">loginStatus</span>: <span class="string">&#x27;&#x27;</span>       <span class="comment">// 登录状态提示</span></span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="title function_">onLoad</span>(<span class="params">options</span>) &#123;</span><br><span class="line">    <span class="comment">// 1. 首先处理从二维码（小程序码）传入的参数</span></span><br><span class="line">    <span class="keyword">let</span> qrSessionId = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 判断是否通过小程序码进入（参数在 options.scene 中）</span></span><br><span class="line">    <span class="keyword">if</span> (options.<span class="property">scene</span>) &#123;</span><br><span class="line">      <span class="comment">// scene 是经过 encodeURIComponent 编码的，需要解码一次</span></span><br><span class="line">      qrSessionId = <span class="built_in">decodeURIComponent</span>(options.<span class="property">scene</span>);</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;从小程序码获取到会话ID:&#x27;</span>, qrSessionId);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 判断是否通过普通链接二维码进入（参数在 options.q 中）</span></span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (options.<span class="property">q</span>) &#123;</span><br><span class="line">      <span class="keyword">const</span> qrUrl = <span class="built_in">decodeURIComponent</span>(options.<span class="property">q</span>);</span><br><span class="line">      qrSessionId = <span class="variable language_">this</span>.<span class="title function_">getQueryParam</span>(qrUrl, <span class="string">&#x27;session_id&#x27;</span>);</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;从普通二维码获取到会话ID:&#x27;</span>, qrSessionId);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 2. 如果从二维码中成功获取到会话ID，则自动填充并登录</span></span><br><span class="line">    <span class="keyword">if</span> (qrSessionId) &#123;</span><br><span class="line">      <span class="comment">// 自动填充到输入框</span></span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; </span><br><span class="line">        <span class="attr">sessionId</span>: qrSessionId,</span><br><span class="line">        <span class="attr">loginStatus</span>: <span class="string">`✅ 已自动获取会话ID: <span class="subst">$&#123;qrSessionId&#125;</span>`</span></span><br><span class="line">      &#125;);</span><br><span class="line">      <span class="comment">// 自动执行登录（无需用户点击）</span></span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">onLogin</span>();</span><br><span class="line">    &#125; </span><br><span class="line">    <span class="comment">// 3. 非扫码进入时，检查本地是否有 token</span></span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> token = wx.<span class="title function_">getStorageSync</span>(<span class="string">&#x27;access_token&#x27;</span>);</span><br><span class="line">      <span class="keyword">if</span> (token) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">hasToken</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">showResult</span>(<span class="string">&#x27;已有登录凭证，可直接调用业务接口&#x27;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 辅助函数：从 URL 字符串中提取指定参数的值</span></span><br><span class="line">  <span class="title function_">getQueryParam</span>(<span class="params">url, paramName</span>) &#123;</span><br><span class="line">    <span class="comment">// 分离出 &quot;?&quot; 后面的查询字符串</span></span><br><span class="line">    <span class="keyword">const</span> queryString = url.<span class="title function_">split</span>(<span class="string">&#x27;?&#x27;</span>)[<span class="number">1</span>];</span><br><span class="line">    <span class="keyword">if</span> (!queryString) <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="comment">// 按 &quot;&amp;&quot; 拆分每个参数</span></span><br><span class="line">    <span class="keyword">const</span> params = queryString.<span class="title function_">split</span>(<span class="string">&#x27;&amp;&#x27;</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; params.<span class="property">length</span>; i++) &#123;</span><br><span class="line">      <span class="keyword">const</span> [key, value] = params[i].<span class="title function_">split</span>(<span class="string">&#x27;=&#x27;</span>);</span><br><span class="line">      <span class="keyword">if</span> (key === paramName) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">decodeURIComponent</span>(value);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 用户手动输入会话ID时触发</span></span><br><span class="line">  <span class="title function_">onSessionIdInput</span>(<span class="params">e</span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">sessionId</span>: e.<span class="property">detail</span>.<span class="property">value</span> &#125;);</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 登录逻辑（保持不变，会自动使用 data.sessionId）</span></span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">onLogin</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> sessionId = <span class="variable language_">this</span>.<span class="property">data</span>.<span class="property">sessionId</span>.<span class="title function_">trim</span>();</span><br><span class="line">    <span class="keyword">if</span> (!sessionId) &#123;</span><br><span class="line">      wx.<span class="title function_">showToast</span>(&#123; <span class="attr">title</span>: <span class="string">&#x27;请输入会话ID&#x27;</span>, <span class="attr">icon</span>: <span class="string">&#x27;none&#x27;</span> &#125;);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">loginStatus</span>: <span class="string">&#x27;❌ 请输入会话ID&#x27;</span> &#125;);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    wx.<span class="title function_">showLoading</span>(&#123; <span class="attr">title</span>: <span class="string">&#x27;登录中...&#x27;</span> &#125;);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">loginStatus</span>: <span class="string">&#x27;⏳ 正在登录...&#x27;</span> &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> loginRes = <span class="keyword">await</span> wx.<span class="title function_">login</span>();</span><br><span class="line">      <span class="keyword">const</span> code = loginRes.<span class="property">code</span>;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">const</span> res = <span class="keyword">await</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">        wx.<span class="title function_">request</span>(&#123;</span><br><span class="line">          <span class="attr">url</span>: <span class="string">&#x27;https://你的域名/api/bind_session&#x27;</span>,   <span class="comment">// 修改域名// 修改域名// 修改域名</span></span><br><span class="line">          <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span><br><span class="line">          <span class="attr">data</span>: &#123; code, <span class="attr">session_id</span>: sessionId &#125;,</span><br><span class="line">          <span class="attr">header</span>: &#123; <span class="string">&#x27;content-type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span> &#125;,</span><br><span class="line">          <span class="attr">success</span>: resolve,</span><br><span class="line">          <span class="attr">fail</span>: reject</span><br><span class="line">        &#125;);</span><br><span class="line">      &#125;);</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (res.<span class="property">statusCode</span> === <span class="number">200</span> &amp;&amp; res.<span class="property">data</span>.<span class="property">access_token</span>) &#123;</span><br><span class="line">        wx.<span class="title function_">setStorageSync</span>(<span class="string">&#x27;access_token&#x27;</span>, res.<span class="property">data</span>.<span class="property">access_token</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">hasToken</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">        wx.<span class="title function_">showToast</span>(&#123; <span class="attr">title</span>: <span class="string">&#x27;登录成功&#x27;</span>, <span class="attr">icon</span>: <span class="string">&#x27;success&#x27;</span> &#125;);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">showResult</span>(<span class="string">&#x27;✅ 登录成功！access_token 已保存&#x27;</span>);</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(res.<span class="property">data</span>.<span class="property">detail</span> || <span class="string">&#x27;登录失败&#x27;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(err);</span><br><span class="line">      wx.<span class="title function_">showToast</span>(&#123; <span class="attr">title</span>: err.<span class="property">message</span> || <span class="string">&#x27;登录失败&#x27;</span>, <span class="attr">icon</span>: <span class="string">&#x27;none&#x27;</span> &#125;);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">showResult</span>(<span class="string">`❌ 登录失败：<span class="subst">$&#123;err.message || <span class="string">&#x27;未知错误&#x27;</span>&#125;</span>`</span>);</span><br><span class="line">    &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">      wx.<span class="title function_">hideLoading</span>();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">callBusinessApi</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> token = wx.<span class="title function_">getStorageSync</span>(<span class="string">&#x27;access_token&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!token) &#123;</span><br><span class="line">      wx.<span class="title function_">showToast</span>(&#123; <span class="attr">title</span>: <span class="string">&#x27;请先登录&#x27;</span>, <span class="attr">icon</span>: <span class="string">&#x27;none&#x27;</span> &#125;);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">loginStatus</span>: <span class="string">&#x27;⚠️ 请先登录&#x27;</span> &#125;);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    wx.<span class="title function_">showLoading</span>(&#123; <span class="attr">title</span>: <span class="string">&#x27;请求中...&#x27;</span> &#125;);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">loginStatus</span>: <span class="string">&#x27;⏳ 请求业务接口...&#x27;</span> &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> res = <span class="keyword">await</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">        wx.<span class="title function_">request</span>(&#123;</span><br><span class="line">          <span class="attr">url</span>: <span class="string">&#x27;https://你的域名/api/userinfo&#x27;</span>,   <span class="comment">// 修改域名// 修改域名// 修改域名</span></span><br><span class="line">          <span class="attr">method</span>: <span class="string">&#x27;GET&#x27;</span>,</span><br><span class="line">          <span class="attr">header</span>: &#123;</span><br><span class="line">            <span class="string">&#x27;Authorization&#x27;</span>: <span class="string">`Bearer <span class="subst">$&#123;token&#125;</span>`</span>,</span><br><span class="line">            <span class="string">&#x27;content-type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span></span><br><span class="line">          &#125;,</span><br><span class="line">          <span class="attr">success</span>: resolve,</span><br><span class="line">          <span class="attr">fail</span>: reject</span><br><span class="line">        &#125;);</span><br><span class="line">      &#125;);</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (res.<span class="property">statusCode</span> === <span class="number">200</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="title function_">showResult</span>(<span class="string">`✅ 业务接口返回：<span class="subst">$&#123;<span class="built_in">JSON</span>.stringify(res.data, <span class="literal">null</span>, <span class="number">2</span>)&#125;</span>`</span>);</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(res.<span class="property">data</span>.<span class="property">detail</span> || <span class="string">&#x27;请求失败&#x27;</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(err);</span><br><span class="line">      wx.<span class="title function_">showToast</span>(&#123; <span class="attr">title</span>: err.<span class="property">message</span>, <span class="attr">icon</span>: <span class="string">&#x27;none&#x27;</span> &#125;);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">showResult</span>(<span class="string">`❌ 业务接口错误：<span class="subst">$&#123;err.message&#125;</span>`</span>);</span><br><span class="line">    &#125; <span class="keyword">finally</span> &#123;</span><br><span class="line">      wx.<span class="title function_">hideLoading</span>();</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="title function_">showResult</span>(<span class="params">msg</span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">setData</span>(&#123; <span class="attr">result</span>: msg, <span class="attr">loginStatus</span>: msg &#125;);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></div><h3 id="第二步：部署-Python-后端（伪-OAuth-2-0-协议）"><a href="#第二步：部署-Python-后端（伪-OAuth-2-0-协议）" class="headerlink" title="第二步：部署 Python 后端（伪 OAuth 2.0 协议）"></a>第二步：部署 Python 后端（伪 OAuth 2.0 协议）</h3><blockquote><p>注意： 默认情况下需要使用 HTTPS 链接。在调试过程中，如果使用 HTTP，浏览器可能无法自动跳转，并会出现安全风险确认提示。</p></blockquote><p>你需要准备一台服务器来运行 Python 后端。你可以选择通过反向代理将服务绑定到域名，也可以直接修改 Python 代码。</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/ydecl/personal-wechat-auth-gateway/server-oauth.py</span><br><span class="line">#需要安装的库</span><br><span class="line">pip install requests PyJWT fastapi uvicorn</span><br><span class="line">python server-oauth.py</span><br></pre></td></tr></table></figure></div><p>运行前，务必修改 Python 代码中的以下配置项：WX_APPID、WX_SECRET、JWT_SECRET、client_secret 以及 Casdoor 客户端相关信息。</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"># ========== 硬编码配置 ==========</span><br><span class="line">WX_APPID = &quot;你的小程序&quot; #&lt;-需要修改 1</span><br><span class="line">WX_SECRET = &quot;你的小程序密钥&quot;#&lt;-------------------------------需要修改 2 </span><br><span class="line">JWT_SECRET = &quot; 自己顺便设置个字符串别太短&quot; #需要修改https://yc2019.cn/pages/tools/GenStr.html</span><br><span class="line">JWT_EXPIRE_MINUTES = 60 * 24 * 7</span><br><span class="line"></span><br><span class="line"># OAuth 2.0 客户端配置（与 Casdoor 中填写的 client_id/secret 一致）</span><br><span class="line">OAUTH_CLIENTS = &#123;</span><br><span class="line">    &quot;Casdoor客户端名称&quot;: &#123;#&lt;-------------------------------需要修改 3 </span><br><span class="line">        &quot;client_secret&quot;: &quot;Casdoor客户端密钥&quot;,# 4 &lt;------------需要修改</span><br><span class="line">        &quot;redirect_uris&quot;: [&quot;https://你的Casdoor地址/callback&quot;] #5 &lt;-----------需要修改 </span><br><span class="line">    &#125;</span><br><span class="line">&#125;&quot;</span><br></pre></td></tr></table></figure></div><p>小程序 ID &#x2F; 小程序密钥 查询位置：</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/20260615.png"                                     ></p><h3 id="第三步：配置-Casdoor"><a href="#第三步：配置-Casdoor" class="headerlink" title="第三步：配置 Casdoor"></a>第三步：配置 Casdoor</h3><blockquote><p>以下是 Casdoor 中客户端名称、密钥等信息的配置界面截图：</p></blockquote><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-13_223513.png"                                     ><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-13_223528.png"                                     ><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/2026-06-13_223544.png"                                     ></p><h3 id="🔧-技术原理（极简版）"><a href="#🔧-技术原理（极简版）" class="headerlink" title="🔧 技术原理（极简版）"></a>🔧 技术原理（极简版）</h3><ol><li>网页生成一个<strong>一次性会话ID</strong>，同时展示包含该 ID 的小程序码。</li><li>用户扫码后，小程序自动获取微信的 <code>code</code>，并连同会话 ID 一同发回你的服务器。</li><li>服务器用 <code>code</code> 换取用户的 <code>openid</code>，并将其绑定到对应的会话 ID。</li><li>网页通过轮询得知绑定成功，接着完成 OAuth 2.0 授权流程，用户顺利登录。</li></ol><p>所有组件都可以运行在<strong>一台低配 VPS</strong> 上，甚至可以部署在本地树莓派上。</p><p>👉 如果觉得项目有帮助，欢迎 Star 支持～</p><p>现在AI这么猛，得学会抱大腿。我编程水平嘛……属于“能跑就别动”那一档，代码里肯定有不少让人扶额的地方；对微信小程序更是基本处于“它认识我、我不认识它”的状态。这个项目说白了就是个抛砖引玉的思路，欢迎哪位大神看不过眼，顺手把它进化成一个真正能打的产品。顺带一提，这玩意儿部署起来，大概率是运维小伙伴看了会沉默、想打人那种，但只要能跑起来，就说明——至少在此时此刻，这世上还是多了一个属于我自己的“乞丐版单点登录”。</p><p>赞助</p><div style="text-align: left;">  <img                       lazyload                     src="/images/loading.svg"                     data-src="/access/weixin/20260613224712_94_21.png"                      width="100"                 ></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/weixinxcxpy.html</id>
    <link href="https://blog.yc2019.cn/posts/weixinxcxpy.html"/>
    <published>2026-06-15T07:24:45.595Z</published>
    <summary>
      <![CDATA[<h2 id="个人也能拥有“微信扫码登录”——基于-Casdoor-的轻量级-OAuth-方案"><a href="#个人也能拥有“微信扫码登录”——基于-Casdoor-的轻量级-OAuth-方案" class="headerlink" title="个人也能拥有“微信扫码登]]>
    </summary>
    <title>微信小程序对接单点系统</title>
    <updated>2026-06-16T09:54:51.257Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="linux" scheme="https://blog.yc2019.cn/categories/linux/"/>
    <category term="git" scheme="https://blog.yc2019.cn/categories/linux/git/"/>
    <content>
      <![CDATA[<h4 id="使用-Gitea-Act-Runner-搭建本地工作流（无-Docker）"><a href="#使用-Gitea-Act-Runner-搭建本地工作流（无-Docker）" class="headerlink" title="使用 Gitea + Act Runner 搭建本地工作流（无 Docker）"></a>使用 Gitea + Act Runner 搭建本地工作流（无 Docker）</h4><p>目标：在本地服务器上以二进制文件方式搭建 Gitea，并运行 Act Runner（不使用 Docker，直接在宿主机上执行命令）。</p><p>操作系统：Debian</p><p>一、搭建 Gitea<br>按照官方文档创建 git 用户：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">#这里按照官网创建git user</span><br><span class="line"></span><br><span class="line">adduser \</span><br><span class="line">   --system \</span><br><span class="line">   --shell /bin/bash \</span><br><span class="line">   --gecos &#x27;Git Version Control&#x27; \</span><br><span class="line">   --group \</span><br><span class="line">   --disabled-password \</span><br><span class="line">   --home /home/git \</span><br><span class="line">   git</span><br><span class="line">#我喜欢把所有数据放在一个目录下，这里就是 /home/git</span><br><span class="line">cd /home/git</span><br><span class="line"></span><br><span class="line">#教程有时效性，请自行使用 wget 下载最新版本。</span><br><span class="line">#官方下载地址：https://dl.gitea.com/gitea/</span><br><span class="line"></span><br><span class="line">#假设下载的二进制文件名为 gitea-xxx，执行以下操作：</span><br><span class="line">cp gitea-xxx gitea    </span><br><span class="line">chown -R git:git gitea </span><br><span class="line"></span><br><span class="line"># 这里我本身是root终端，指定git user运行./gitea</span><br><span class="line"> sudo -u git ./gitea web</span><br></pre></td></tr></table></figure></div><p>二、Nginx 反向代理（宝塔）</p><p>如果使用 HTTPS，必须在 Nginx 配置中添加 X-Forwarded-Proto 头，否则 Gitea 会报错：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The detected web site URL is &quot;[http://xxxxxx.xxx/](http://git.yc2019.cn/)&quot;, it&#x27;s unlikely matching the site config. Mismatched app.ini ROOT_URL or reverse proxy &quot;Host/X-Forwarded-Proto&quot; config might cause wrong URL links for web UI/mail content/webhook notification/OAuth2 sign-in.</span><br></pre></td></tr></table></figure></div><p>需要在配置中加入：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">proxy_set_header X-Forwarded-Proto $scheme;</span><br></pre></td></tr></table></figure></div><p>下面是我的完整 Nginx 配置，供参考：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">proxy_pass http://127.0.0.1:3000;</span><br><span class="line">proxy_set_header Host xxxxx.xx;#</span><br><span class="line">proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">proxy_set_header REMOTE-HOST $remote_addr;</span><br><span class="line">proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">proxy_set_header Connection $connection_upgrade;</span><br></pre></td></tr></table></figure></div><p>三、安装与配置 Act Runner<br>下载地址：<a class="link"   href="https://dl.gitea.com/act_runner/" >https://dl.gitea.com/act_runner/<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><ol><li>注册 Runner<div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">./act_runner register</span><br><span class="line"></span><br><span class="line"><span class="comment">#Instance URL: https://xxxxx.xx 你的域名</span></span><br><span class="line"><span class="comment">#Runner token:  后台获取 </span></span><br><span class="line"><span class="comment">#Runner name: 可以留空（默认主机名）</span></span><br><span class="line"><span class="comment">#Runner labels: 这里必须手动输入，输入以下内容：self-hosted,ubuntu-latest</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#创建配置文件并启动</span></span><br><span class="line"><span class="built_in">cat</span> &gt; config.yaml &lt;&lt; <span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">runner:</span><br><span class="line">  mode: <span class="string">&quot;host&quot;</span></span><br><span class="line">EOF</span><br><span class="line">./act_runner daemon --config config.yaml</span><br></pre></td></tr></table></figure></div><blockquote><p>为什么要使用宿主机模式（mode: “host”）？因为 Gitea 不支持类似 GitHub&#x2F;GitLab Pages 的功能，我需要将构建生成的静态文件直接复制到宿主机的网站目录（如 &#x2F;www&#x2F;wwwroot&#x2F;hexo）中，而 Docker 模式下不便操作宿主机文件系统。</p></blockquote></li></ol><p>四、工作流示例：部署 public 文件夹到宿主机<br>下面是一个 .gitea&#x2F;workflows&#x2F;deploy.yml 示例，当 push 到 main 分支时，自动将仓库中的 public&#x2F; 目录复制到宿主机的 &#x2F;www&#x2F;wwwroot&#x2F;hexo&#x2F; 下。</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">name: Deploy public folder to host</span><br><span class="line"></span><br><span class="line">on:</span><br><span class="line">  push:</span><br><span class="line">    branches:</span><br><span class="line">      - main</span><br><span class="line">  workflow_dispatch:</span><br><span class="line"></span><br><span class="line">jobs:</span><br><span class="line">  deploy:</span><br><span class="line">    runs-on: self-hosted</span><br><span class="line">    steps:</span><br><span class="line">      - name: Checkout repository</span><br><span class="line">        run: |</span><br><span class="line">          # 构造带认证的仓库 URL</span><br><span class="line">          REPO_URL=&quot;https://oauth2:$&#123;&#123; secrets.GITEA_TOKEN &#125;&#125;@gitea域名/$&#123;&#123; gitea.repository &#125;&#125;.git&quot;</span><br><span class="line">          echo &quot;Cloning from $REPO_URL&quot;</span><br><span class="line">          git clone --depth 1 &quot;$REPO_URL&quot; .</span><br><span class="line">          # 切换到当前触发的 commit（可选）</span><br><span class="line">          git checkout $&#123;&#123; gitea.sha &#125;&#125;</span><br><span class="line"></span><br><span class="line">      # 2. 查看工作区内容（调试用，可删除）</span><br><span class="line">      - name: List workspace</span><br><span class="line">        run: ls -la</span><br><span class="line"></span><br><span class="line">      # 3. 部署 public 文件夹到目标目录</span><br><span class="line">      - name: Deploy public to /www/wwwroot/hexo</span><br><span class="line">        run: |</span><br><span class="line">          sudo mkdir -p /www/wwwroot/hexo</span><br><span class="line">          sudo cp -r public/. /www/wwwroot/hexo/</span><br><span class="line"></span><br><span class="line">      # 4. 确认部署结果</span><br><span class="line">      - name: Show deployed files</span><br><span class="line">        run: ls -la /www/wwwroot/hexo/</span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/gitea-server.html</id>
    <link href="https://blog.yc2019.cn/posts/gitea-server.html"/>
    <published>2026-06-09T14:05:00.032Z</published>
    <summary>
      <![CDATA[<h4 id="使用-Gitea-Act-Runner-搭建本地工作流（无-Docker）"><a href="#使用-Gitea-Act-Runner-搭建本地工作流（无-Docker）" class="headerlink" title="使用 Gitea + Act Run]]>
    </summary>
    <title>使用 Gitea + Act Runner 搭建本地工作流（无 Docker）, Nginx 反向代理报错问题</title>
    <updated>2026-06-09T14:12:16.083Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="官网首页产品介绍" scheme="https://blog.yc2019.cn/categories/%E5%AE%98%E7%BD%91%E9%A6%96%E9%A1%B5%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D/"/>
    <content>
      <![CDATA[<h2 id="🚀-你的网站，我来守护！24小时不间断监控，仅需5元-月！"><a href="#🚀-你的网站，我来守护！24小时不间断监控，仅需5元-月！" class="headerlink" title="🚀 你的网站，我来守护！24小时不间断监控，仅需5元&#x2F;月！"></a>🚀 你的网站，我来守护！24小时不间断监控，仅需5元&#x2F;月！</h2><blockquote><p>网站突然打不开？SSL证书过期没人管？客户投诉才发现？<br>别慌！云监控小助手 24小时在线值守，异常秒级邮件告警，让你安心睡大觉！</p></blockquote><h4 id="🔍-我们能监控什么？"><a href="#🔍-我们能监控什么？" class="headerlink" title="🔍 我们能监控什么？"></a>🔍 我们能监控什么？</h4><ul><li><p>✅ 网站连通性 – 实时检测网站是否能正常访问，状态码异常（如404、500）立即通知</p></li><li><p>✅ SSL证书到期提醒 – 提前50天邮件提醒，避免证书过期导致网站不安全警告</p></li><li><p>✅ 响应时间监控 – 首字节时间超过5秒自动报警，提前发现性能瓶颈</p></li><li><p>✅ 泛域名支持 – <strong>一个主域名</strong>，旗下所有子域名（泛域名）全部覆盖，不加价！</p></li></ul><h4 id="💰-价格透明，按需付费"><a href="#💰-价格透明，按需付费" class="headerlink" title="💰 价格透明，按需付费"></a>💰 价格透明，按需付费</h4><blockquote><p>免费试用1月,关注微信公众号:yc2019</p></blockquote><table><thead><tr><th>监控域名数量</th><th>月费</th></tr></thead><tbody><tr><td>第1个域名（含泛域名）</td><td>5元</td></tr><tr><td>从第2个域名起，每个</td><td>3元</td></tr></tbody></table><blockquote><p>示例：监控3个域名（如 example.com、test.com、shop.com），月费 &#x3D; 5 + 3 + 3 &#x3D; 11元<br>比一杯奶茶还便宜，买不了吃亏买不了上当！</p></blockquote><h4 id="⚙️-技术可靠，简单易用"><a href="#⚙️-技术可靠，简单易用" class="headerlink" title="⚙️ 技术可靠，简单易用"></a>⚙️ 技术可靠，简单易用</h4><ul><li><p>（可选）提供api查看监控日志</p></li><li><p>配置灵活：只需提供邮箱和域名，后台自动监控</p></li><li><p>每日SSL证书仅提醒一次，避免轰炸</p></li><li><p>邮件告警直达收件箱，不错过任何异常</p></li></ul><h4 id="📧-立即开通，守护你的网站"><a href="#📧-立即开通，守护你的网站" class="headerlink" title="📧 立即开通，守护你的网站"></a>📧 立即开通，守护你的网站</h4><p><strong>联系方式：</strong>关注微信公众号‘yc2019’,点击监控服务或人工客服</p><p>如果你需要定制化监控（如短信告警、更多高级指标），也可以私信详谈，我们提供二次开发服务。</p><p><strong>注：本服务为自动化脚本监控，个人项目，就是个咸鱼运维。官网还有很多公益项目，个人开发，没有企业限制。个人运维肯定比企业稳定差，但是便宜呀。回点血😊</strong></p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/yc2019-www-pro-alarm.html</id>
    <link href="https://blog.yc2019.cn/posts/yc2019-www-pro-alarm.html"/>
    <published>2026-04-13T13:44:03.877Z</published>
    <summary>
      <![CDATA[<h2 id="🚀-你的网站，我来守护！24小时不间断监控，仅需5元-月！"><a href="#🚀-你的网站，我来守护！24小时不间断监控，仅需5元-月！" class="headerlink" title="🚀 你的网站，我来守护！24小时不间断监控，仅需5元&#x2F]]>
    </summary>
    <title>云托管24小时不间断监控，仅需5元/月！yc2019.cn官网产品介绍</title>
    <updated>2026-04-13T13:44:03.877Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="忧@官网" scheme="https://blog.yc2019.cn/categories/%E5%BF%A7-%E5%AE%98%E7%BD%91/"/>
    <content>
      <![CDATA[<h4 id="🚀-YC：你的随身开发环境与个人应用商店"><a href="#🚀-YC：你的随身开发环境与个人应用商店" class="headerlink" title="🚀 YC：你的随身开发环境与个人应用商店"></a>🚀 YC：你的随身开发环境与个人应用商店</h4><p>告别在新电脑上手忙脚乱搜索官网、提防捆绑软件的日子。YC25 是一个专属于你的命令行效率工具，它将 Install（安装）与 Run（运行）解耦，让你在任何一台电脑上，只需一句话，就能还原你最熟悉的工作环境。</p><blockquote><p>核心理念：你的软件库，你做主。无需重复搜索，无需忍受第三方下载站的广告。</p></blockquote><hr><h4 id="💡-核心功能速览"><a href="#💡-核心功能速览" class="headerlink" title="💡 核心功能速览"></a>💡 核心功能速览</h4><table><thead><tr><th>模块</th><th>功能定位</th><th>一句话解释</th></tr></thead><tbody><tr><td>install</td><td>私人应用商店</td><td>代理官方镜像&#x2F;个人收藏，一键静默安装常用软件。</td></tr><tr><td>run</td><td>自动化脚本库</td><td>一键搭建复杂开发环境，省去逐行敲配置的麻烦。</td></tr><tr><td>ssh(无用产品)</td><td>连接管家</td><td>快速管理、连接你的远程服务器，告别记 IP。</td></tr></tbody></table><hr><h4 id="📥-安装与配置"><a href="#📥-安装与配置" class="headerlink" title="📥 安装与配置"></a>📥 安装与配置</h4><p>你可以通过以下任意方式使用 YC：</p><p>直接调用：将程序放置在任意目录，使用绝对路径执行命令。</p><p>全局变量（推荐）：将 YC 所在目录添加至系统环境变量 Path 中，即可在任意终端窗口直接输入 yc 命令。</p><h4 id="📦-命令详解与使用示例"><a href="#📦-命令详解与使用示例" class="headerlink" title="📦 命令详解与使用示例"></a>📦 命令详解与使用示例</h4><p>以下命令格式遵循：yc &lt;模块&gt; &lt;参数&gt;</p><h5 id="install-——-软件包安装代理"><a href="#install-——-软件包安装代理" class="headerlink" title="install —— 软件包安装代理"></a>install —— 软件包<del>安装</del>代理</h5><p>负责接管软件的下载与<del>安装</del>流程。默认提供官方常用软件的纯净安装源，同时支持加载你自己的私有包列表。</p><p>核心机制：支持读取 本地 JSON 配置文件 或 云端 URL 配置文件，实现软件列表的跨设备同步。</p><p>常用命令：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看可用的安装库列表</span></span><br><span class="line">yc install -ls</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看所有库（包含详细版本信息）</span></span><br><span class="line">yc install -ls -a</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装指定名称的软件（例如安装 Git）</span></span><br><span class="line">yc install -n git</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">指定自定义输出目录</span></span><br><span class="line">yc install -n &lt;name&gt; -o /path/to/dir</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">(旧版命令，改为交互式) 启用 github 代理模式下载（针对特殊网络环境，默认关闭）</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">yc install -n &lt;name&gt; -vpn Y</span></span><br></pre></td></tr></table></figure></div><h5 id="run-——-环境一键搭建脚本"><a href="#run-——-环境一键搭建脚本" class="headerlink" title="run —— 环境一键搭建脚本"></a>run —— 环境一键搭建脚本</h5><p>这是 YC25 的灵魂扩展模块。它让你把复杂的开发环境配置过程（比如安装 Node.js 特定版本 + 配置 NVM + 安装全局包）封装成一个脚本，一键执行。</p><p>当前状态：官方提供基础维护脚本，对外开放的开发接口文档正在整理中，未来你将可以编写并分享属于自己的插件。</p><p>常用命令：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看可用的插件库</span></span><br><span class="line">yc run -ls</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">执行/安装某个环境插件（例如安装 Docker 环境）</span></span><br><span class="line">yc run -n docker_env</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">静默执行插件（不显示详细过程日志）</span></span><br><span class="line">yc run -n &lt;name&gt; -q</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">带参数执行插件（格式为 JSON 字符串）</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例：假设插件(插件/扩展)需要参数</span></span><br><span class="line">yc run -q &quot;&#123;&#x27;-n&#x27;,&#x27;123&#x27;,&#x27;-p&#x27;,&#x27;3306&#x27;&#125;&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除本地插件</span></span><br><span class="line">yc run -del &lt;name&gt;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">更新本地插件库</span></span><br><span class="line">yc run -update</span><br></pre></td></tr></table></figure></div><h5 id="ssh-——-服务器连接管理器"><a href="#ssh-——-服务器连接管理器" class="headerlink" title="ssh —— 服务器连接管理器"></a>ssh —— 服务器连接管理器</h5><blockquote><p>无用产品，本应该作为插件提供</p></blockquote><h4 id="⚙️-程序配置详解：打造你的私人应用商店货架"><a href="#⚙️-程序配置详解：打造你的私人应用商店货架" class="headerlink" title="⚙️ 程序配置详解：打造你的私人应用商店货架"></a>⚙️ 程序配置详解：打造你的私人应用商店货架</h4><p>配置文件路径为 config&#x2F;conf.json，与 YC25 主程序位于同一目录。<strong>首次运行时程序会自动生成带有详细备注的默认模板</strong>，你只需按需修改即可。</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">示例:</span></span><br><span class="line">&#123;</span><br><span class="line">    // ============================================================</span><br><span class="line">    // 1. 官方公共仓库（App_Config）</span><br><span class="line">    //    这是 YC25 内置的软件源开关。保持开启即可使用官方维护的</span><br><span class="line">    //    常用软件镜像（如 Chrome、7-Zip、Python 等）。</span><br><span class="line">    // ============================================================</span><br><span class="line">    &quot;App_Config&quot;: [</span><br><span class="line">        &#123;&quot;id&quot;: &quot;1&quot;, &quot;YN&quot;: &quot;Y&quot;&#125;   // Y=开启，N=关闭</span><br><span class="line">    ],</span><br><span class="line"></span><br><span class="line">    // ============================================================</span><br><span class="line">    // 2. 你的私有收藏夹（Local_Install）</span><br><span class="line">    //    把你个人偏好的软件添加在这里。支持两种方式：</span><br><span class="line">    //    - 直链下载（url）</span><br><span class="line">    //    - 读取 GitHub Releases（github）</span><br><span class="line">    // ============================================================</span><br><span class="line">    &quot;Local_Install&quot;: [</span><br><span class="line">        // 方式一：直链 URL 下载（适用于存放在网盘、官网的 .exe/.msi 文件）</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;name&quot;: &quot;示例-直链安装包&quot;,</span><br><span class="line">            &quot;source&quot;: &quot;url&quot;,</span><br><span class="line">            &quot;url&quot;: &quot;http://demo.com/obs.exe&quot;  // 支持 301/302 重定向</span><br><span class="line">        &#125;,</span><br><span class="line">        // 方式二：GitHub 项目托管</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;name&quot;: &quot;OBS Studio&quot;,</span><br><span class="line">            &quot;source&quot;: &quot;github&quot;,</span><br><span class="line">            &quot;github_name&quot;: &quot;obsproject&quot;,    // GitHub 用户名或组织名</span><br><span class="line">            &quot;github_repo&quot;: &quot;obs-studio&quot;      // 仓库名</span><br><span class="line">        &#125;</span><br><span class="line">        // 添加 GitHub 源后，程序会交互式列出所有历史发布版本供你选择下载</span><br><span class="line">    ],</span><br><span class="line"></span><br><span class="line">    // ============================================================</span><br><span class="line">    // 3. 云端同步仓库（Cloud_Install）</span><br><span class="line">    //    将你的软件列表托管在自建 API 或 Gist 上，实现多设备同步。</span><br><span class="line">    //    API 返回的 JSON 格式需与 Local_Install 数组结构一致。</span><br><span class="line">    // ============================================================</span><br><span class="line">    &quot;Cloud_Install&quot;: [</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;id&quot;: &quot;1&quot;,</span><br><span class="line">            &quot;url&quot;: &quot;https://your-server.com/api/yc-packages.json&quot;,</span><br><span class="line">            &quot;YN&quot;: &quot;N&quot;   // 改为 &quot;Y&quot; 即启用云端同步</span><br><span class="line">        &#125;,</span><br><span class="line"></span><br><span class="line">    // ============================================================</span><br><span class="line">    // 4. 云端同步仓库（Cloud_Run）</span><br><span class="line">    //    将你的插件扩展托管在自建 API 或 Gist 上，实现多设备同步。</span><br><span class="line">    //    API 返回的 JSON 格式 请看下方介绍</span><br><span class="line">    // ============================================================</span><br><span class="line">    &quot;Cloud_Install&quot;: [</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;id&quot;: &quot;1&quot;,</span><br><span class="line">            &quot;url&quot;: &quot;https://your-server.com/api/yc-packages2.json&quot;,</span><br><span class="line">            &quot;YN&quot;: &quot;N&quot;   // 改为 &quot;Y&quot; 即启用云端同步</span><br><span class="line">        &#125;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><blockquote><p>Cloud_Install —— 云端同步库 ⚠️ 格式约束必读<br>⚠️ 重要：API 返回的 JSON 格式必须严格遵循以下规范，items 键名不可更改！<br>比如 <a class="link"   href="https://your-server.com/api/yc-packages.json" >https://your-server.com/api/yc-packages.json<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 返回格式需要遵循。</p></blockquote><p>正确的 API 响应格式：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;items&quot;: [</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;name&quot;: &quot;示例-直链安装包&quot;,</span><br><span class="line">            &quot;source&quot;: &quot;url&quot;,</span><br><span class="line">            &quot;url&quot;: &quot;http://demo.com/obs.exe&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;name&quot;: &quot;示例-GitHub下载&quot;,</span><br><span class="line">            &quot;source&quot;: &quot;github&quot;,</span><br><span class="line">            &quot;github_name&quot;: &quot;obsproject&quot;,</span><br><span class="line">            &quot;github_repo&quot;: &quot;obs-studio&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><blockquote><p>Cloud_Run —— 云端run插件同步库 ⚠️ 格式约束必读<br>⚠️ 重要：API 返回的 JSON 格式必须严格遵循以下规范，items 键名不可更改！<br>比如 <a class="link"   href="https://your-server.com/api/yc-packages2.json" >https://your-server.com/api/yc-packages2.json<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> 返回格式需要遵循。</p></blockquote><p>正确的 API 响应格式：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;items&quot;: [</span><br><span class="line">        &#123;</span><br><span class="line">            &quot;name&quot;: &quot;示例-docker部署&quot;,</span><br><span class="line">            &quot;source&quot;: &quot;&quot;,</span><br><span class="line">            &quot;url&quot;: &quot;http://demo.com/docker_install.7z&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><h4 id="🚩下载"><a href="#🚩下载" class="headerlink" title="🚩下载"></a>🚩下载</h4><table><thead><tr><th>线路</th><th>平台</th><th>链接</th></tr></thead><tbody><tr><td>GL</td><td>windows</td><td><a class="link"   href="https://gl-yc.yc2019.top/download/yc.exe" >https://gl-yc.yc2019.top/download/yc.exe<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></td></tr><tr><td>CN</td><td>windows</td><td><a class="link"   href="https://cn-yc.yc2019.cn/download/yc.exe" >https://cn-yc.yc2019.cn/download/yc.exe<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></td></tr><tr><td>GL</td><td>Linux amd</td><td><a class="link"   href="https://gl-yc.yc2019.top/download/yc" >https://gl-yc.yc2019.top/download/yc<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></td></tr><tr><td>CN</td><td>Linux amd</td><td><a class="link"   href="https://cn-yc.yc2019.cn/download/yc" >https://cn-yc.yc2019.cn/download/yc<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></td></tr><tr><td>Github</td><td>windows &#x2F;Linux</td><td><a class="link"   href="https://github.com/ydecl/yc_repo/releases" >https://github.com/ydecl/yc_repo/releases<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></td></tr></tbody></table><blockquote><p>官网:<a class="link"   href="https://yc25.yc2019.cn/" >https://yc25.yc2019.cn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote><h4 id="🗺️-未来规划与开发者寄语"><a href="#🗺️-未来规划与开发者寄语" class="headerlink" title="🗺️ 未来规划与开发者寄语"></a>🗺️ 未来规划与开发者寄语</h4><p>持续优化 Run 扩展生态</p><p>程序2026.4.11完成上线 ,install &#x2F; run源 默认东西较少， 后续持续上传，丰富内容</p><p><strong>[wx:yc2019]</strong> <strong>[blog.yc2019.cn]</strong> <strong>[yc2019.cn]</strong></p><p>版本状态： 个人开发者维护项目，欢迎通过 微信公众号:yc2019 反馈使用建议。</p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/yc25_yclist.html</id>
    <link href="https://blog.yc2019.cn/posts/yc25_yclist.html"/>
    <published>2026-04-09T12:44:20.315Z</published>
    <summary>
      <![CDATA[<h4 id="🚀-YC：你的随身开发环境与个人应用商店"><a href="#🚀-YC：你的随身开发环境与个人应用商店" class="headerlink" title="🚀 YC：你的随身开发环境与个人应用商店"></a>🚀 YC：你的随身开发环境与个人应用商店</]]>
    </summary>
    <title>YC命令工具介绍,YC25/yclist</title>
    <updated>2026-04-11T08:46:48.735Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="忧@官网,API" scheme="https://blog.yc2019.cn/categories/%E5%BF%A7-%E5%AE%98%E7%BD%91-API/"/>
    <content>
      <![CDATA[<h4 id="在线API信息"><a href="#在线API信息" class="headerlink" title="在线API信息"></a>在线API信息</h4><p>本系统提供了两种格式的站点地图（Sitemap）获取接口，方便爬虫程序抓取网站信息。您可以根据需要选择以下格式：</p><p>API加载速度取决于地图数量,35条大约10s</p><p>XML格式api：</p><p><code>https://admin.api.yc2019.cn/api/web/sitemap?url=网址&amp;start=.xml</code></p><p>TXT格式api:</p><p><code>https://admin.api.yc2019.cn/api/web/sitemap?url=网址&amp;start=.txt</code></p><p>调用时，请将 网址 替换为您的实际网站域名。为确保爬虫能够正常访问，您的网站需允许爬虫抓取，并将 API 域名 admin.api.yc2019.cn 加入白名单</p><p><strong>调用实例:</strong></p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">https://admin.api.yc2019.cn/api/web/sitemap?url=https://yc2019.cn&amp;start=.txt</span><br><span class="line"></span><br><span class="line">https://admin.api.yc2019.cn/api/web/sitemap?url=https://yc2019.cn&amp;start=.xml</span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/yc2019-api-sitemap.html</id>
    <link href="https://blog.yc2019.cn/posts/yc2019-api-sitemap.html"/>
    <published>2026-04-09T10:15:55.828Z</published>
    <summary>
      <![CDATA[<h4 id="在线API信息"><a href="#在线API信息" class="headerlink" title="在线API信息"></a>在线API信息</h4><p>本系统提供了两种格式的站点地图（Sitemap）获取接口，方便爬虫程序抓取网站信息。您可以根据需要选]]>
    </summary>
    <title>官网首页产品介绍,免费API在线生成地图</title>
    <updated>2026-04-09T10:15:55.828Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="windows" scheme="https://blog.yc2019.cn/categories/windows/"/>
    <content>
      <![CDATA[<p><span style="color: #ff0000">（小白中的小白篇） </span></p><ol><li><p>键盘按住’WIN +R’键，打开运行窗.输入 <code>dxdiag</code> 然后点击确定（<span style="color: #cc99ff">这是在你有键盘的情况下</span>）</p></li><li><p>右键win图标，可以看到”运行”点击进入。（<span style="color: #ff99cc">这是在你没有键盘的情况下</span>）</p></li><li><p>把电脑砸开，看硬件型号（<span style="color: #3366ff">这是在你没有键盘、鼠标、显示器的情况下</span>）</p></li><li><p>看个毛（<span style="color: #00c200">这是在没有电脑的情况下</span>）</p></li></ol><blockquote><p>软件左上角，系统是电脑信息，点击显示就可以查看显卡信息</p></blockquote>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/windwos-1.html</id>
    <link href="https://blog.yc2019.cn/posts/windwos-1.html"/>
    <published>2026-01-12T02:12:34.009Z</published>
    <summary>
      <![CDATA[<p><span style="color: #ff0000">（小白中的小白篇） </span></p>

<ol>
<li><p>键盘按住’WIN +R’键，打开运行窗.输入 <code>dxdiag</code> 然后点击确定（<span style="color: #cc]]>
    </summary>
    <title>简单查看电脑配置，不使用第三方工具</title>
    <updated>2026-01-12T02:12:34.009Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="官网首页产品介绍" scheme="https://blog.yc2019.cn/categories/%E5%AE%98%E7%BD%91%E9%A6%96%E9%A1%B5%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D/"/>
    <content>
      <![CDATA[<h4 id="免费的网站流量监测页面托管服务"><a href="#免费的网站流量监测页面托管服务" class="headerlink" title="免费的网站流量监测页面托管服务"></a>免费的网站流量监测页面托管服务</h4><p>免费的网站流量监测页面托管服务 首次上线！</p><p>个人制作难免有问题，<span style="color: #cc99ff">运行中陆续发现并修复优化。</p><p>发布于2025年12月</p><blockquote><p>由于用户中心功能正在开发中，当前版本采用轻量级方案：</p><p>为您的每个域名生成专属监控链接，直接访问即可查看该域名的所有监控数据。</p></blockquote><h5 id="需要注意的功能说明："><a href="#需要注意的功能说明：" class="headerlink" title="需要注意的功能说明："></a><span style="color: #ff0000ff">需要注意的功能说明：</h5><p>默认情况下，监控页面显示的数据以访问次数为依据。即页面每被刷新或访问一次，即累计一次访问量。</p><p>若在页面头部切换为筛选模式，则统计方式改为以天为单位、以IP 为依据进行去重。即同一天内，同一客户端&#x2F;IP 的多次访问仅计为一次访问量，其余相关参数（如来源、访问路径等）均以该 IP 当天首次访问的记录为准。</p><p><img src="/access/www.yc2019.cn/hello2026-0-www.yc2019.cn.png" alt="http://yc2019.cn"></p><p>【开始使用】<br>只需三步，快速开启监控：</p><ol><li><p>访问生成页面：<br><a class="link"   href="http://yc2019.cn/pages/pro/stetdet_user.html" >http://yc2019.cn/pages/pro/stetdet_user.html<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></li><li><p>输入您的域名，系统将生成追踪代码</p></li><li><p>将生成的JavaScript代码添加到您网站中</p></li></ol><p>完成部署后，您就可以通过专属链接访问监控面板，查看实时数据。<br><img src="/access/www.yc2019.cn/hello2026-1-www.yc2019.cn.png" alt="http://yc2019.cn"></p><p>【重要提示】</p><ul><li>确保正确添加追踪代码到您的网站</li><li>监控数据可能需要几分钟才会开始显示</li><li>如有问题，请检查代码是否部署正确,系统问题请联系微信公众号’yc2019’</li></ul><p>立即开始监控您的网站流量！</p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/yc2019-www-pro-stetdet.html</id>
    <link href="https://blog.yc2019.cn/posts/yc2019-www-pro-stetdet.html"/>
    <published>2025-12-28T14:50:12.929Z</published>
    <summary>
      <![CDATA[<h4 id="免费的网站流量监测页面托管服务"><a href="#免费的网站流量监测页面托管服务" class="headerlink" title="免费的网站流量监测页面托管服务"></a>免费的网站流量监测页面托管服务</h4><p>免费的网站流量监测页面托管服务 首次]]>
    </summary>
    <title>官网首页产品介绍,免费托管网站流量监测页面</title>
    <updated>2025-12-30T14:02:05.764Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="php" scheme="https://blog.yc2019.cn/categories/php/"/>
    <category term="wp" scheme="https://blog.yc2019.cn/categories/php/wp/"/>
    <content>
      <![CDATA[<h3 id="WordPress-html模块中js代码-符号-不生效解决办法"><a href="#WordPress-html模块中js代码-符号-不生效解决办法" class="headerlink" title="WordPress html模块中js代码 &amp;&amp; 符号 不生效解决办法"></a>WordPress html模块中js代码 &amp;&amp; 符号 不生效解决办法</h3><p>在 wp中的html模块写入script标签的js代码可能出现此问题</p><p>我发现的问题在于使用了 &amp;&amp; 符合,所导致的 “&amp;&amp;” 被转义成了 <code>&amp;#038;&amp;#038;</code> ,查阅相关资料后 修改 functions.php无用，或许是我的问题吧，但是发现这种方法可行</p><h4 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h4><p>这<strong>应该</strong>就是官方的写法,<br>改成以下格式 要保留 <code>&lt;!--  //--&gt;</code>！</p><div class="code-container" data-rel="Html"><figure class="iseeu highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><span class="language-handlebars"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-xml"><span class="language-handlebars"><span class="comment">&lt;!--</span></span></span></span><br><span class="line"><span class="comment"><span class="language-xml"><span class="language-handlebars"></span></span></span></span><br><span class="line"><span class="comment"><span class="language-xml"><span class="language-handlebars">你的js代码</span></span></span></span><br><span class="line"><span class="comment"><span class="language-xml"><span class="language-handlebars"></span></span></span></span><br><span class="line"><span class="comment"><span class="language-xml"><span class="language-handlebars">//--&gt;</span></span></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/wpCMSErro1.html</id>
    <link href="https://blog.yc2019.cn/posts/wpCMSErro1.html"/>
    <published>2025-12-15T03:25:19.778Z</published>
    <summary>
      <![CDATA[<h3 id="WordPress-html模块中js代码-符号-不生效解决办法"><a href="#WordPress-html模块中js代码-符号-不生效解决办法" class="headerlink" title="WordPress html模块中js代码 &amp;&]]>
    </summary>
    <title>WordPress html模块中js代码不生效解决办法</title>
    <updated>2025-12-15T03:52:37.279Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="it" scheme="https://blog.yc2019.cn/categories/it/"/>
    <category term="ydecl" scheme="https://blog.yc2019.cn/categories/it/ydecl/"/>
    <content>
      <![CDATA[<h3 id="当“自信”溢出时，对话即终止"><a href="#当“自信”溢出时，对话即终止" class="headerlink" title="当“自信”溢出时，对话即终止"></a>当“自信”溢出时，对话即终止</h3><blockquote><p>在计算机的世界里，我信奉逻辑与真理。代码面前，人人平等。然而，比技术更先需要建立的，是交流的共识。因此，我认为有必要在此阐明我的技术交流原则。</p></blockquote><h3 id="1-知识的疆域与谦逊的坐标"><a href="#1-知识的疆域与谦逊的坐标" class="headerlink" title="1.知识的疆域与谦逊的坐标"></a>1.知识的疆域与谦逊的坐标</h3><blockquote><p>知识无涯，谦逊为舟。若你笃信自己无所不知，那我的存在对你而言纯属多余——毕竟，井蛙不可语海，夏虫不可语冰。</p></blockquote><p>我始终坚信：知识无涯，谦逊为舟。</p><p>这片技术的海洋浩瀚无垠，我尊重的是每一个经过验证的知识点，而非建立在空中楼阁上的傲慢。若你笃信自己无所不知，那我的存在对你而言纯属多余——毕竟，井蛙不可语海，夏虫不可语冰。我们看到的，本就不是同一个世界。</p><h3 id="2-当“自信”成为一种递归故障"><a href="#2-当“自信”成为一种递归故障" class="headerlink" title="2.当“自信”成为一种递归故障"></a>2.当“自信”成为一种递归故障</h3><blockquote><p>在计算机领域，我尊重的是知识，而非傲慢。如果你的自信已经陷入了“天下第一”的递归且没有Base Case，那么我们的对话必然栈溢出。</p></blockquote><p>我遇到过一些对话者，<strong>他们的自信已经陷入了一种“天下第一”的递归循环，并且缺乏终止条件的判断。这是一种危险的逻辑陷阱，最终只会导致一个结果：我们的对话必然栈溢出，系统崩溃，无疾而终。</strong></p><p>这通常表现为：<strong>在你认知的OOM错误里，向我炫耀你虚构的全局最优解</strong></p><h3 id="3-我的协议：只对谦逊开放连接"><a href="#3-我的协议：只对谦逊开放连接" class="headerlink" title="3.我的协议：只对谦逊开放连接"></a>3.我的协议：只对谦逊开放连接</h3><blockquote><p>我的交流协议只对谦逊开放连接。对于那些自信内核已无需更新的“专家”，你的权限已被重置：只读，且无法执行。</p></blockquote><p>因此，我在此明确我的交流协议：</p><ul><li>我的交流协议，只对谦逊开放连接。</li><li>我的专业能力，运行在“相互尊重”的核心协议之上。</li></ul><p><strong>对于那些自信内核已无需更新、在自己的认知系统里永远是 root 的“专家”，很遗憾，我们之间持续的 权限冲突 无法调和。如果你的 自信进程 拒绝关闭，那么，你的访问权限已被我重置为：只读，且 无法执行 。换言之，我们无法建立有效会话。</strong></p><h3 id="4-最后的边界：我的技术，是我的尊严"><a href="#4-最后的边界：我的技术，是我的尊严" class="headerlink" title="4.最后的边界：我的技术，是我的尊严"></a>4.最后的边界：我的技术，是我的尊严</h3><blockquote><p>在你的认知系统里，你永远是 root。但在我这里，持续的“权限冲突”将直接触发连接终止。</p></blockquote><p>请理解，这一切并非源于固执或高傲。</p><p>我的技术，不服务于你的“正确”。</p><p>这是我投入无数时间、热情与思考所淬炼出的专业能力，它构成了我在这个领域里的尊严。既然你永远是对的，又何必在出错后来找我？请别浪费彼此宝贵的时间。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>简单来说：</p><ul><li>带着问题与开放的心态来，我愿与你一同探索。</li><li>带着傲慢与封闭的结论来，我请你保持距离。</li></ul><p>希望我们能在一个对等的、尊重知识的层面上相遇。否则，连接将提前终止。</p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/ydecl-introduced.html</id>
    <link href="https://blog.yc2019.cn/posts/ydecl-introduced.html"/>
    <published>2025-10-23T02:49:02.838Z</published>
    <summary>
      <![CDATA[<h3 id="当“自信”溢出时，对话即终止"><a href="#当“自信”溢出时，对话即终止" class="headerlink" title="当“自信”溢出时，对话即终止"></a>当“自信”溢出时，对话即终止</h3><blockquote>
<p>在计算机的世界里，]]>
    </summary>
    <title>我的技术交流原则：当“自信”溢出时，对话即终止</title>
    <updated>2025-10-23T03:34:34.756Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="linux" scheme="https://blog.yc2019.cn/categories/linux/"/>
    <category term="git" scheme="https://blog.yc2019.cn/categories/linux/git/"/>
    <content>
      <![CDATA[<h4 id="在服务器上搭建仓库"><a href="#在服务器上搭建仓库" class="headerlink" title="在服务器上搭建仓库"></a>在服务器上搭建仓库</h4><p>服务器:</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">mkdir hexo</span><br><span class="line">cd hexo </span><br><span class="line">git init --bare # 初始仓库</span><br><span class="line"></span><br><span class="line">mkdir -p /root/html # 文件路径自定义</span><br><span class="line"></span><br><span class="line">echo &#x27;#!/bin/bash&#x27; &gt; hooks/post-receive</span><br><span class="line">echo &#x27;git --work-tree=/root/html --git-dir=/root/hexo checkout -f main&#x27; &gt;&gt; hooks/post-receive</span><br><span class="line">    #也可以直接写入：</span><br><span class="line">    #!/bin/bash</span><br><span class="line">    git --work-tree=/root/html --git-dir=/root/hexo checkout -f</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">以上的路径自定义</span></span><br><span class="line">chmod +x hooks/post-receive</span><br></pre></td></tr></table></figure></div><p>保证自己的SSH 可以连接，必要时可以不用root。但是要保证仓库所属用户与git提交用户一致。</p><p>客户端：</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入本地 public 文件夹，不想在public搭建仓库,记得改当前路径 和 git add .命令:</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在hexo项目根目录的使用 git add public</span></span><br><span class="line">git init</span><br><span class="line">git remote add origin root@你的服务器IP:/root/hexo #添加远程仓库地址</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">windows 报错fatal: detected dubious ownership <span class="keyword">in</span> repository at ...看下面常见问题解决方法</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m &quot;hexo&quot;</span><br><span class="line">git push -u origin master # 这里如果你改分支了master ，hooks/post-receive文件也需要更改 如 .....-f main</span><br></pre></td></tr></table></figure></div><h4 id="常见问题："><a href="#常见问题：" class="headerlink" title="常见问题："></a>常见问题：</h4><h5 id="windows-powershell添加远程仓库地址出现权限问题："><a href="#windows-powershell添加远程仓库地址出现权限问题：" class="headerlink" title="windows powershell添加远程仓库地址出现权限问题："></a>windows powershell添加远程仓库地址出现权限问题：</h5><p>运行 <code>git config --global --add safe.directory C:/hexo/public</code><br>这里写你的Hexo 下的 public 文件夹绝对路径</p><h5 id="服务器没有文件-hint-The-‘hooks-post-receive’-hook-was-ignored-because-it’s-not-set-as-executable"><a href="#服务器没有文件-hint-The-‘hooks-post-receive’-hook-was-ignored-because-it’s-not-set-as-executable" class="headerlink" title="服务器没有文件&#x2F; hint: The ‘hooks&#x2F;post-receive’ hook was ignored because it’s not set as executable."></a>服务器没有文件&#x2F; hint: The ‘hooks&#x2F;post-receive’ hook was ignored because it’s not set as executable.</h5><p>权限问题： <code>chmod +x hooks/post-receive</code></p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/hexo-git.html</id>
    <link href="https://blog.yc2019.cn/posts/hexo-git.html"/>
    <published>2025-09-28T13:50:58.442Z</published>
    <summary>
      <![CDATA[<h4 id="在服务器上搭建仓库"><a href="#在服务器上搭建仓库" class="headerlink" title="在服务器上搭建仓库"></a>在服务器上搭建仓库</h4><p>服务器:</p>
<div class="code-container" data-]]>
    </summary>
    <title>Hexo静态文件Git提交到自己的云服务器 搭建教程</title>
    <updated>2025-09-29T12:20:47.345Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="linux" scheme="https://blog.yc2019.cn/categories/linux/"/>
    <content>
      <![CDATA[<h4 id="nps内网穿透-踩坑记录，web无法访问"><a href="#nps内网穿透-踩坑记录，web无法访问" class="headerlink" title="nps内网穿透 踩坑记录，web无法访问"></a>nps内网穿透 踩坑记录，web无法访问</h4><p>nps server安装后，配置文件在&#x2F;etc&#x2F;nps&#x2F;conf&#x2F;nps.conf此路径修改配置。</p><p>使用版本∶0.26.10</p><p>在nps.conf下</p><pre><code>web_port = 127.0.0.1 #这里官方默认是a.o.comweb_base_url = 127.0.0.1</code></pre><p>如同时配置为一样的公网IP值，就有概率无法访问IP:8080的页面</p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/nps-1.html</id>
    <link href="https://blog.yc2019.cn/posts/nps-1.html"/>
    <published>2025-09-27T11:30:38.887Z</published>
    <summary>
      <![CDATA[<h4 id="nps内网穿透-踩坑记录，web无法访问"><a href="#nps内网穿透-踩坑记录，web无法访问" class="headerlink" title="nps内网穿透 踩坑记录，web无法访问"></a>nps内网穿透 踩坑记录，web无法访问</h4><]]>
    </summary>
    <title>nps内网穿透 踩坑记录，web无法访问</title>
    <updated>2025-09-27T12:10:28.654Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="linux" scheme="https://blog.yc2019.cn/categories/linux/"/>
    <category term="dokcer" scheme="https://blog.yc2019.cn/categories/linux/dokcer/"/>
    <category term="宝塔" scheme="https://blog.yc2019.cn/categories/linux/dokcer/%E5%AE%9D%E5%A1%94/"/>
    <content>
      <![CDATA[<p>安装过程没有记录了,记录几个比较常见的问题。<br>安装用的是 docker debian13 (2025-9)</p><h5 id="报ps-command-not-found-cannot-execute-required-file-not-found"><a href="#报ps-command-not-found-cannot-execute-required-file-not-found" class="headerlink" title="报ps: command not found &#x2F;cannot execute: required file not found"></a>报ps: command not found &#x2F;cannot execute: required file not found</h5><p>在容器中安装宝塔后尽管是报错，也可尝试以下重启bt。按理也是有报错的:</p><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">bt restart #重启宝塔命令</span><br><span class="line">/usr/bin/bt: line 393: btpython: command not found</span><br><span class="line">Stopping Bt-Tasks.../usr/bin/bt: line 65: ps: command not found</span><br><span class="line">        done</span><br><span class="line">Stopping Bt-Panel.../usr/bin/bt: line 59: ps: command not found</span><br><span class="line">        done</span><br><span class="line">/usr/bin/bt: line 72: ps: command not found</span><br><span class="line">/usr/bin/bt: line 59: ps: command not found</span><br><span class="line">/usr/bin/bt: line 79: /usr/bin/python: No such file or directory</span><br><span class="line">/usr/bin/bt: line 80: /usr/bin/python: No such file or directory</span><br><span class="line">Starting Bt-Panel..../usr/bin/bt: line 59: ps: command not found</span><br><span class="line">./usr/bin/bt: line 59: ps: command not found</span><br><span class="line">......省略</span><br><span class="line"></span><br><span class="line">\n</span><br><span class="line">/www/server/panel/init.sh: line 124: /www/server/panel/BT-Task: cannot execute: required file not found</span><br><span class="line">......省略</span><br><span class="line">\n</span><br><span class="line">/usr/bin/bt: line 124: /www/server/panel/BT-Task: cannot execute: required file not found</span><br><span class="line">------------------------------------------------------</span><br><span class="line">Error: BT-Task service startup failed.</span><br></pre></td></tr></table></figure></div><p>1.先安装 <code>apt update &amp;&amp; apt install -y procps</code><br>2.在检测python ,<code> which python || which python3</code> 如果没有请使用 apt 或其他方式安装 python3 如<code>apt install python3</code><br>3.在使用宝塔修复工具 <code> curl http://download.bt.cn/install/update_panel.sh|bash</code></p><h5 id="在记忆中安装时最后会出现-openssl安装不上的-相关报错"><a href="#在记忆中安装时最后会出现-openssl安装不上的-相关报错" class="headerlink" title="在记忆中安装时最后会出现 openssl安装不上的 相关报错"></a>在记忆中安装时最后会出现 openssl安装不上的 相关报错</h5><p>1.应该是换了一个容器内的linux版本 ，或者重启bt 。应该如此吧~<br>2.或者使用 宝塔修复工具 在尝试以下，对于宝塔修复工具是否能解决大概率是玄学。<br>3.在就是字面意思自己手动安装 openssl</p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/docker-bt.html</id>
    <link href="https://blog.yc2019.cn/posts/docker-bt.html"/>
    <published>2025-09-19T11:36:34.855Z</published>
    <summary>
      <![CDATA[<p>安装过程没有记录了,记录几个比较常见的问题。<br>安装用的是 docker debian13 (2025-9)</p>
<h5 id="报ps-command-not-found-cannot-execute-required-file-not-found"><a hre]]>
    </summary>
    <title>在docker容器中安装宝塔面板问题/报错</title>
    <updated>2025-09-15T03:18:01.588Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="game" scheme="https://blog.yc2019.cn/categories/game/"/>
    <category term="minecraft" scheme="https://blog.yc2019.cn/categories/game/minecraft/"/>
    <content>
      <![CDATA[<h3 id="MC皮肤站使用教程"><a href="#MC皮肤站使用教程" class="headerlink" title="MC皮肤站使用教程"></a>MC皮肤站使用教程</h3><blockquote><p>已经尽量写的简单,白话了。没有提及github方式下载和系统基础的文件路径。<br>如果你都懂,可以直接登录皮肤站，按照引导走就行,不必浪费时间阅读</p></blockquote><p>本人<strong>MC皮肤站</strong>为：<span style="color: #4e004eff">(欢迎使用)</span> <a class="link"   href="http://mc.wuyouheike.top/" >http://mc.wuyouheike.top<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h4 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h4><p>1.<span style="color: #3366ff"><span style="color: #ff6600"><span style="color: #ff0000">首先访问 <strong>MC皮肤站</strong> 注册</span></span></span><br><del>进入后台记得认证邮箱！（认证邮箱只是为了防止恶意注册）</del></p><p>2.在后台点击角色管理—&gt;创建角色<br>皮肤可以在 “我的衣柜” 里看到，上传自己的皮肤可以点击 皮肤库-&gt;上传新的皮肤！</p><h4 id="启动器"><a href="#启动器" class="headerlink" title="启动器"></a>启动器</h4><p>先打开MC皮肤站的仪表盘,<span style="color: #cc99ff"> 在打开MC启动器，这里演示用的<a class="link"   href="https://hmcl.huangyuhui.net/download" >HMCL启动器。<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> <span style="color: #8000ff">按照后台提示加按钮拖动到服务器页面，然后点击弹窗中的完成，再点击启动里的加号创建账号</span></span>。<br>各类启动器都是类似操作，也可以自己手动输入添加第三方登录地址。</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Blog-mc-images/1630057708115.png"                      alt="仪表盘示例"                ></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Blog-mc-images/1630057708109.png"                      alt="启动器示例"                ></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Blog-mc-images/1630057708098.png"                      alt="创建账号示例"                ></p><p><span style="color: #ff0000"><strong>账号就是注册时的填的角色名，如果找不知道用户名，可以填注册时候的邮箱。</strong></span><br>查看用户名：访问:<a class="link"   href="https://mc.wuyouheike.top/user/player" >https://mc.wuyouheike.top/user/player<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a><br>菜单-&gt;角色管理-&gt;角色名</p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Blog-mc-images/1630057708105.png"                      alt="账号输入示例"                ></p><p>皮肤站程序，仅仅是提供了上传、存储、检索、分享玩家皮肤的功能。想要在 Minecraft 游戏中显示您之前在皮肤站中上传的皮肤的话，您还需要「自定义皮肤 Mod」的帮助。</p><h4 id="下载并安装mod"><a href="#下载并安装mod" class="headerlink" title="下载并安装mod"></a>下载并安装mod</h4><p>下载地址：<br>访问:<a class="link"   href="https://mc.wuyouheike.top/user/player" >https://mc.wuyouheike.top/user/player<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a><br>菜单-&gt;配置生成-&gt;Mod</p><h4 id="配置MOD文件"><a href="#配置MOD文件" class="headerlink" title="配置MOD文件"></a>配置MOD文件</h4><p>菜单-&gt;配置生成-&gt;CustomSkinLoader ExtraList;下载json文件,如图片<br><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Blog-mc-images/ExtraList.png"                      alt="下载ExtraList"                ><br><span style="color: #0000ff">将下载的文件夹拖动到</span> <code>.minecraft/CustomSkinLoader/ExtraList</code> 下<br>第一种方式查看自己的<code>.minecraft</code>文件夹创建<code>CustomSkinLoader/ExtraList/</code>文件夹<br>第二种HMCL启动器-&gt;版本管理-&gt;浏览-&gt;游戏文件夹,创建<code>CustomSkinLoader/ExtraList/</code>文件夹</p><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h2 id="为什么服务器里的玩家看不到我的皮肤"><a href="#为什么服务器里的玩家看不到我的皮肤" class="headerlink" title="为什么服务器里的玩家看不到我的皮肤"></a><span style="color: #ff6600">为什么服务器里的玩家看不到我的皮肤</span></h2><p>如果你想让服务器里的伙伴看到你的皮肤，就得需要服务器里的每一个玩家都使用皮肤站登录安装mod。且下载<span style="color: #fc00f0"> json文件，<span style="color: #8000ff">并</span><span style="color: #0000ff">拖动到</span> <code>.minecraft/CustomSkinLoader/ExtraList</code> </span></p>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/mc-server-web.html</id>
    <link href="https://blog.yc2019.cn/posts/mc-server-web.html"/>
    <published>2025-09-19T11:36:34.853Z</published>
    <summary>
      <![CDATA[<h3 id="MC皮肤站使用教程"><a href="#MC皮肤站使用教程" class="headerlink" title="MC皮肤站使用教程"></a>MC皮肤站使用教程</h3><blockquote>
<p>已经尽量写的简单,白话了。没有提及github方式下载和系]]>
    </summary>
    <title>MC皮肤站使用教程</title>
    <updated>2025-09-21T13:50:53.084Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="linux" scheme="https://blog.yc2019.cn/categories/linux/"/>
    <content>
      <![CDATA[<h3 id="nginx-安装教程记录-debian12"><a href="#nginx-安装教程记录-debian12" class="headerlink" title="nginx 安装教程记录 debian12"></a>nginx 安装教程记录 debian12</h3><blockquote><p>过程记录</p></blockquote><h3 id="nginx-install"><a href="#nginx-install" class="headerlink" title="nginx install"></a>nginx install</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev git build-essential -y #基础</span><br><span class="line"></span><br><span class="line">mkdir /home/ydecl/tmp # 下载编译目录后续可删除</span><br><span class="line">cd /home/ydecl/tmp</span><br><span class="line"></span><br><span class="line">wget https://nginx.org/download/nginx-1.28.0.tar.gz</span><br><span class="line"></span><br><span class="line">tar -zxvf nginx-1.28.0.tar.gz</span><br><span class="line">cd nginx-1.28.0</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">## /home/user/nginx 安装目录，根据自己需求改！</span></span></span><br><span class="line">./configure --prefix=/home/user/nginx \</span><br><span class="line">--with-http_ssl_module \</span><br><span class="line">--with-http_v2_module \</span><br><span class="line">--with-http_realip_module \</span><br><span class="line">--with-http_stub_status_module \</span><br><span class="line">--with-threads \</span><br><span class="line">--with-file-aio</span><br><span class="line"></span><br><span class="line">make -j$(nproc)</span><br><span class="line">make install</span><br></pre></td></tr></table></figure></div><h3 id="host"><a href="#host" class="headerlink" title="host"></a>host</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo nano /etc/hosts #127.0.0.1 site1.com www.site1.com</span><br></pre></td></tr></table></figure></div><h3 id="html-conf"><a href="#html-conf" class="headerlink" title="html-conf"></a>html-conf</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name site1.com www.site1.com;</span><br><span class="line">    </span><br><span class="line">    # 站点根目录</span><br><span class="line">    root /home/user/nginx/html/site1.com;</span><br><span class="line">    index index.html index.htm;</span><br><span class="line">    </span><br><span class="line">    # 访问日志</span><br><span class="line">    access_log /home/user/nginx/logs/site1.com/access.log;</span><br><span class="line">    error_log /home/user/nginx/logs/site1.com/error.log;</span><br><span class="line">    </span><br><span class="line">    location / &#123;</span><br><span class="line">        try_files $uri $uri/ =404;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    # 禁止访问隐藏文件</span><br><span class="line">    location ~ /\. &#123;</span><br><span class="line">        deny all;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="php-conf"><a href="#php-conf" class="headerlink" title="php-conf"></a>php-conf</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name site2.com www.site2.com;</span><br><span class="line">    </span><br><span class="line">    # 站点根目录</span><br><span class="line">    root /home/user/nginx/html/site2.com;</span><br><span class="line">    index index.php index.html index.htm;</span><br><span class="line">    </span><br><span class="line">    # 访问日志</span><br><span class="line">    access_log /home/user/nginx/logs/site2.com/access.log;</span><br><span class="line">    error_log /home/user/nginx/logs/site2.com/error.log;</span><br><span class="line">    </span><br><span class="line">    location / &#123;</span><br><span class="line">        try_files $uri $uri/ /index.php?$query_string;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    # PHP 处理配置</span><br><span class="line">    location ~ \.php$ &#123;</span><br><span class="line">        # 根据您的 PHP-FPM 配置调整这里</span><br><span class="line">        # 如果是 Unix socket 方式</span><br><span class="line">        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; #先运行php</span><br><span class="line">        </span><br><span class="line">        # 如果是 TCP 方式</span><br><span class="line">        # fastcgi_pass 127.0.0.1:9000;</span><br><span class="line">        </span><br><span class="line">        fastcgi_index index.php;</span><br><span class="line">        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</span><br><span class="line">        include fastcgi_params;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    # 禁止访问隐藏文件</span><br><span class="line">    location ~ /\. &#123;</span><br><span class="line">        deny all;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="conf-nginx-conf"><a href="#conf-nginx-conf" class="headerlink" title="conf&#x2F;nginx.conf"></a>conf&#x2F;nginx.conf</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">http &#123;</span><br><span class="line">    </span><br><span class="line">    ... ...</span><br><span class="line">    include sites/enabled/*.conf;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><div class="code-container" data-rel="Shell"><figure class="iseeu highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">检测配置文件</span></span><br><span class="line">nginx -t</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启</span></span><br><span class="line">nginx -s reload</span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/nginx-25.html</id>
    <link href="https://blog.yc2019.cn/posts/nginx-25.html"/>
    <published>2025-09-19T11:36:34.843Z</published>
    <summary>
      <![CDATA[<h3 id="nginx-安装教程记录-debian12"><a href="#nginx-安装教程记录-debian12" class="headerlink" title="nginx 安装教程记录 debian12"></a>nginx 安装教程记录 debian12</]]>
    </summary>
    <title>nginx 安装教程记录 debian12</title>
    <updated>2025-09-17T11:55:26.699Z</updated>
  </entry>
  <entry>
    <author>
      <name>Ydecl/忧</name>
    </author>
    <category term="BadUSB" scheme="https://blog.yc2019.cn/categories/BadUSB/"/>
    <category term="开发板" scheme="https://blog.yc2019.cn/categories/BadUSB/%E5%BC%80%E5%8F%91%E6%9D%BF/"/>
    <content>
      <![CDATA[<h1 id="Arduino-Leonardo开发板"><a href="#Arduino-Leonardo开发板" class="headerlink" title="Arduino Leonardo开发板"></a>Arduino Leonardo开发板</h1><blockquote><p>淘宝就有，一般在90-110RMB左右<br><em>如果觉得贵的话，可以看这篇文章 低价制作BadUSB：https&#x2F;&#x2F;yc2019.cn&#x2F;archives&#x2F;423.html</em><br>开发软件：<a class="link"   href="https://www.arduino.cc/en/software/" >Arduino IDE 1.8.19<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p></blockquote><h2 id="设置Arduino"><a href="#设置Arduino" class="headerlink" title="#设置Arduino"></a>#设置Arduino</h2><p><strong>一、工具</strong> -&gt; <strong>开发板</strong> -&gt; <strong>开发板管理</strong><br><strong>下载 Arduino AVR Boards</strong></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Arduino-Leonardo-images/1.png"                      alt="image"                ></p><p><strong>二、工具</strong> -&gt; <strong>开发板</strong> -&gt; <strong>选择Arduino Leonardo</strong></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Arduino-Leonardo-images/2.png"                      alt="image"                ></p><p><strong>三、打开工具</strong> -&gt; <strong>端口</strong>，<strong>插入 Leonardo开发板后</strong>，<strong>选中新出来的端口</strong></p><p><img                       lazyload                     src="/images/loading.svg"                     data-src="/access/Arduino-Leonardo-images/3.png"                      alt="image"                ></p><p>编写代码，左上角箭头上传代码就OK了。</p><p>给段实例代码：</p><div class="code-container" data-rel="Cpp"><figure class="iseeu highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;Keyboard.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">setup</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    Keyboard.<span class="built_in">begin</span>();</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">    Keyboard.<span class="built_in">press</span>(KEY_LEFT_GUI);</span><br><span class="line">    Keyboard.<span class="built_in">press</span>(<span class="string">&#x27;r&#x27;</span>);</span><br><span class="line">    Keyboard.<span class="built_in">release</span>(<span class="string">&#x27;r&#x27;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">    Keyboard.<span class="built_in">release</span>(KEY_LEFT_GUI);</span><br><span class="line">    Keyboard.<span class="built_in">press</span>(KEY_CAPS_LOCK);</span><br><span class="line">    Keyboard.<span class="built_in">release</span>(KEY_CAPS_LOCK);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">    Keyboard.<span class="built_in">println</span>(<span class="string">&quot;CMD&quot;</span>);</span><br><span class="line">    <span class="built_in">delay</span>(<span class="number">1000</span>);</span><br><span class="line">    Keyboard.<span class="built_in">press</span>(KEY_RETURN);</span><br><span class="line">    Keyboard.<span class="built_in">release</span>(KEY_RETURN);</span><br><span class="line">    Keyboard.<span class="built_in">println</span>(<span class="string">&quot;ipconfig&quot;</span>);</span><br><span class="line">    Keyboard.<span class="built_in">end</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">loop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div>]]>
    </content>
    <id>https://blog.yc2019.cn/posts/Badusb-1.html</id>
    <link href="https://blog.yc2019.cn/posts/Badusb-1.html"/>
    <published>2025-09-19T11:36:34.840Z</published>
    <summary>
      <![CDATA[<h1 id="Arduino-Leonardo开发板"><a href="#Arduino-Leonardo开发板" class="headerlink" title="Arduino Leonardo开发板"></a>Arduino Leonardo开发板</h1><bloc]]>
    </summary>
    <title>Arduino Leonardo开发板制作BadUSB</title>
    <updated>2025-09-15T03:53:53.358Z</updated>
  </entry>
</feed>
