<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>空想的杂谈</title>
  <icon>https://cdn.cnzw.top/blog/assets/logo.png</icon>
  
  <link href="https://www.cnzw.top/atom.xml" rel="self"/>
  
  <link href="https://www.cnzw.top/"/>
  <updated>2025-06-27T03:24:50.000Z</updated>
  <id>https://www.cnzw.top/</id>
  
  <author>
    <name>Cnzw</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>我的头像图片来源</title>
    <link href="https://www.cnzw.top/p/4561/"/>
    <id>https://www.cnzw.top/p/4561/</id>
    <published>2025-06-27T03:09:19.000Z</published>
    <updated>2025-06-27T03:24:50.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.cnzw.top/blog/TNJMbhrs0ovjJ3xH0QecAShVnoc.png" alt="image"><br><a href="https://fox-info.net/fox-photo/archives/13462">まるまりキツネ | スタンダード | キツネ写真館-圆滚滚狐狸 | 标准 | 狐狸照片馆</a> </p><p>（我们 fox-info 团队是为了将拍摄到的狐狸集中到一个网站，并向全世界传播而成立的团队。）</p><p>目前来看虽然互联网上有传播，但是作为头像的人很少，具有辨识度</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://cdn.cnzw.top/blog/TNJMbhrs0ovjJ3xH0QecAShVnoc.png&quot; alt=&quot;image&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://fox-info.net/fox-photo/archives/134</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>VSCode Remote + Windows OpenSSH</title>
    <link href="https://www.cnzw.top/p/50514/"/>
    <id>https://www.cnzw.top/p/50514/</id>
    <published>2024-08-24T12:51:29.000Z</published>
    <updated>2024-12-27T08:47:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>在调试 mc 服务器时，想使用 Git 来管理各个插件的配置文件。于是逛了一圈 Windows 上的版本管理软件，发现操作的时候窗口很多（文件夹窗口 + 编辑器 + Git），从而转向 VSCode 这类继承了项目文件管理和 Git 的编码工具。</p><p>随后发现 VSCode Remote 是支持 Windows OpenSSH 的，VSCode Remote 体验基本和本地开发无异，甚至不需要开远程桌面，于是写此文章记录。</p><h1 id="安装-SSH"><a href="#安装-SSH" class="headerlink" title="安装 SSH"></a>安装 SSH</h1><p>一般来说，在 控制面板&#x2F;设置 里的 应用&gt;可选功能里。具体步骤见链接。</p><ul><li><p><a href="https://blog.csdn.net/engchina/article/details/134445460">Windows 11 配置 ssh server 服务_windows11 gitea ssh server-CSDN博客</a></p></li><li><p><a href="https://blog.csdn.net/frighting_ing/article/details/122705781">windows 安装 OpenSSH-CSDN博客</a></p></li><li><p>Server 2016 不自带 OpenSSH，需要自己<a href="https://github.com/PowerShell/Win32-OpenSSH">下载</a></p></li></ul><p>需要注意，可能安装系统的时候 OpenSSH 是默认安装的，但是版本可能有问题无法启动。此时卸载再重新安装就可以了。</p><h1 id="启动-SSH"><a href="#启动-SSH" class="headerlink" title="启动 SSH"></a>启动 SSH</h1><p>首次安装 OpenSSH 需要手动到 services.msc（Windows+R键） 里启动来生成配置文件。重启 OpenSSH 也是在这里。</p><h1 id="配置-SSH"><a href="#配置-SSH" class="headerlink" title="配置 SSH"></a>配置 SSH</h1><p>配置文件在：<code>C:\ProgramData\ssh\sshd_config</code></p><p>记得去掉<code>#</code>来启用配置项</p><h2 id="修改端口"><a href="#修改端口" class="headerlink" title="修改端口"></a>修改端口</h2><p><code>Port 22</code></p><h2 id="禁用密码登录和允许密钥登录"><a href="#禁用密码登录和允许密钥登录" class="headerlink" title="禁用密码登录和允许密钥登录"></a>禁用密码登录和允许密钥登录</h2><p>启用并修改以下内容</p><p><code>PasswordAuthentication no</code></p><p><code>PubkeyAuthentication yes</code></p><p><code>AuthorizedKeysFile .ssh/authorized_keys</code></p><p>注释掉以下内容</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Match Group administrators                                                    </span></span><br><span class="line"><span class="comment">#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys  </span></span><br></pre></td></tr></table></figure><h2 id="配置密钥"><a href="#配置密钥" class="headerlink" title="配置密钥"></a>配置密钥</h2><p>将公钥内容放在<code>C:\Users\Administrator\.ssh\authorized_keys</code>中，重启后就可以了。</p><p>如果<code>.ssh</code>文件夹不存在，在 cmd 中输入<code>mkdir .ssh</code>即可。（直接创建文件夹会失败）</p><p>生成密钥对命令：<code>ssh-keygen</code>（注意路径，别找不到文件了）</p><h1 id="配置-VSCode-Remote"><a href="#配置-VSCode-Remote" class="headerlink" title="配置 VSCode Remote"></a>配置 VSCode Remote</h1><ol><li>点击 VSCode 左下角的</li></ol><p><img src="https://cdn.cnzw.top/blog/GKyRbqR6XogmQFxK0v3cmCcYnUc.png" alt="image"></p><ol><li><p>在弹出窗口选择“连接到主机…”</p></li><li><p>在弹出窗口选择“配置 SSH 主机…”</p></li><li><p>选择第一个配置文件（C:\Users\用户名.ssh\config）</p></li><li><p>编辑配置文件：</p></li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">Host</span> <span class="string">显示的名称</span></span><br><span class="line">    <span class="string">HostName</span> <span class="string">www.baidu.com</span></span><br><span class="line">    <span class="string">Port</span> <span class="number">22</span></span><br><span class="line">    <span class="string">User</span> <span class="string">用户名（administrator）</span></span><br><span class="line">    <span class="string">IdentityFile</span> <span class="string">C:\Users\用户名\.ssh\生成的私钥文件</span></span><br><span class="line"><span class="string">Host</span> <span class="string">显示的名称2</span></span><br><span class="line">    <span class="string">HostName</span> <span class="string">www.baidu.com</span></span><br><span class="line">    <span class="string">Port</span> <span class="number">22</span></span><br><span class="line">    <span class="string">User</span> <span class="string">用户名（administrator）</span></span><br><span class="line">    <span class="string">IdentityFile</span> <span class="string">C:\Users\用户名\.ssh\生成的私钥文件</span></span><br></pre></td></tr></table></figure><ol><li><p>再次 VSCode 左下角的“&gt;&lt;”</p></li><li><p>在弹出窗口选择“连接到主机…”</p></li><li><p>在弹出窗口选择配置好的主机</p></li><li><p>在确认了密钥签名后选择对应的系统（Linux，Windows，MacOS）</p></li><li><p>等待远程主机下载 VSCode</p></li><li><p>完事</p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在调试 mc 服务器时，想使用 Git 来管理各个插件的配置文件。于是逛了一圈 Windows 上的版本管理软件，发现操作的时候窗口很多（文件夹窗口 + 编辑器 + Git），从而转向 VSCode 这类继承了项目文件管理和 Git 的编码工具。&lt;/p&gt;
&lt;p&gt;随后发现 V</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
  </entry>
  
  <entry>
    <title>Hexo+Elog+Github+Cloudflare 博客全流程搭建 - 开源免费免维护多平台同步博客搭建</title>
    <link href="https://www.cnzw.top/p/11485/"/>
    <id>https://www.cnzw.top/p/11485/</id>
    <published>2024-06-05T10:47:38.000Z</published>
    <updated>2024-09-08T10:07:33.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>👷 文章内容还在施工</p></blockquote><h1 id="快捷链接"><a href="#快捷链接" class="headerlink" title="快捷链接"></a>快捷链接</h1><ul><li><p><a href="https://hexo.io/zh-cn/docs/index.html">Hexo 官方文档</a></p></li><li><p><a href="https://butterfly.js.org/posts/21cfbf15/">Butterfly 主题文档</a></p></li><li><p><a href="https://elog.1874.cool/notion/start">Elog 文档</a></p></li></ul><h1 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h1><h1 id="双分支仓库"><a href="#双分支仓库" class="headerlink" title="双分支仓库"></a>双分支仓库</h1><h1 id="安装-Elog"><a href="#安装-Elog" class="headerlink" title="安装 Elog"></a>安装 Elog</h1><h1 id="配置-Action"><a href="#配置-Action" class="headerlink" title="配置 Action"></a>配置 Action</h1><h1 id="配置和美化"><a href="#配置和美化" class="headerlink" title="配置和美化"></a>配置和美化</h1><ol><li><p>github克隆hexo模板仓库</p></li><li><p>GitHub workspace</p></li><li><p>hexo基础配置和调试查看</p></li><li><p>elog安装</p></li><li><p>elog调试</p></li><li><p>各种插件和美化</p></li></ol>]]></content>
    
    
    <summary type="html">开源免费免维护多平台同步博客搭建</summary>
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="博客" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>Tailscale 部署中继 DERP</title>
    <link href="https://www.cnzw.top/p/29369/"/>
    <id>https://www.cnzw.top/p/29369/</id>
    <published>2024-03-21T07:42:02.000Z</published>
    <updated>2024-03-28T05:18:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="什么是-DERP"><a href="#什么是-DERP" class="headerlink" title="什么是 DERP"></a>什么是 DERP</h1><p>DERP 即 Detoured Encrypted Routing Protocol，这是 Tailscale 自研的一个协议：</p><ul><li><p>它是一个通用目的包中继协议，运行在 HTTP 之上，而大部分网络都是允许 HTTP 通信的。</p></li><li><p>它根据目的公钥（destination’s public key）来中继加密的流量（encrypted payloads）。</p></li></ul><p>Tailscale 会自动选择离目标节点最近的 DERP server 来中继流量</p><p>Tailscale 使用的算法很有趣: 所有客户端之间的连接都是先选择 DERP 模式（中继模式），这意味着连接立即就能建立（优先级最低但 100% 能成功的模式），用户不用任何等待。然后开始并行地进行路径发现，通常几秒钟之后，我们就能发现一条更优路径，然后将现有连接透明升级（upgrade）过去，变成点对点连接（直连）。</p><p>因此， DERP 既是 Tailscale 在 NAT 穿透失败时的保底通信方式（此时的角色与 TURN 类似），也是在其他一些场景下帮助我们完成 NAT 穿透的旁路信道。换句话说，它既是我们的保底方式，也是有更好的穿透链路时，帮助我们进行连接升级（upgrade to a peer-to-peer connection）的基础设施。</p><p>Tailscale 官方内置了很多 DERP 服务器，分布在全球各地，惟独不包含中国大陆，原因你懂得。这就导致了一旦流量通过 DERP 服务器进行中继，延时就会非常高。</p><h1 id="部署-DERP"><a href="#部署-DERP" class="headerlink" title="部署 DERP"></a>部署 DERP</h1><p><a href="https://github.com/fredliang44/derper-docker">https://github.com/fredliang44/derper-docker</a></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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="attr">version:</span> <span class="string">&quot;3&quot;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">derper:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ghcr.io/fredliang44/derper:latest</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">/www/docker/derper/certs:/app/certs</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">/var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock</span> <span class="comment"># sock映射出来给客户端验证</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="number">3443</span><span class="string">:443</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="number">3478</span><span class="string">:3478/udp</span> <span class="comment"># 默认情况下也会开启 STUN 服务，UDP 端口是 3478</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">DERP_DOMAIN=derper.5112.xyz</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">DERP_CERT_MODE=manual</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">DERP_VERIFY_CLIENTS=true</span></span><br></pre></td></tr></table></figure><p>关于证书部分需要重点说明：假设你的域名是 xxx.com，那么证书的名称必须是 xxx.com.crt，一个字符都不能错！同理，私钥名称必须是 xxx.com.key，一个字符都不能错！</p><h1 id="防止-DERP-被白嫖"><a href="#防止-DERP-被白嫖" class="headerlink" title="防止 DERP 被白嫖"></a>防止 DERP 被白嫖</h1><p>默认情况下 DERP 服务器是可以被白嫖的，只要别人知道了你的 DERP 服务器的地址和端口，就可以为他所用。如果你的服务器是个小水管，用的人多了可能会把你撑爆，因此我们需要修改配置来防止被白嫖。</p><ol><li><p>在 docker 环境变量中设置<code>DERP_VERIFY_CLIENTS=true</code>，开启客户端验证，</p></li><li><p>把<code>/var/run/tailscale/tailscaled.sock</code>映射出来</p></li><li><p>在 DERP 服务所在的主机上安装 Tailscale 客户端，启动 tailscaled 进程。</p></li></ol><p>这样就大功告成了，别人即使知道了你的 DERP 服务器地址也无法使用，但还是要说明一点，即便如此，你也应该尽量不让别人知道你的服务器地址，防止别人有可趁之机。</p><h1 id="使用-DERP"><a href="#使用-DERP" class="headerlink" title="使用 DERP"></a>使用 DERP</h1><p>部署好 derper 之后，就可以修改 tailscale.com 上的 Access Controls 规则来使用自定义的 DERP 服务器了。</p><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">        <span class="comment">// ......</span></span><br><span class="line">        <span class="attr">&quot;derpMap&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;OmitDefaultRegions&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">                <span class="comment">// OmitDefaultRegions 用来忽略官方的中继节点，一般自建后就看不上官方小水管了</span></span><br><span class="line">                <span class="attr">&quot;Regions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                        <span class="comment">// 这里的 901 从 900 开始随便取数字</span></span><br><span class="line">                        <span class="attr">&quot;901&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                                <span class="comment">// RegionID 和上面的相等</span></span><br><span class="line">                                <span class="attr">&quot;RegionID&quot;</span><span class="punctuation">:</span> <span class="number">901</span><span class="punctuation">,</span></span><br><span class="line">                                <span class="comment">// RegionCode 自己取个易于自己名字</span></span><br><span class="line">                                <span class="attr">&quot;RegionCode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;阿里云-深圳&quot;</span><span class="punctuation">,</span></span><br><span class="line">                                <span class="attr">&quot;Nodes&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                                        <span class="punctuation">&#123;</span></span><br><span class="line">                                                <span class="comment">// Name 保持 1不动</span></span><br><span class="line">                                                <span class="attr">&quot;Name&quot;</span><span class="punctuation">:</span>     <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line">                                                <span class="comment">// 这个也和 RegionID 一样</span></span><br><span class="line">                                                <span class="attr">&quot;RegionID&quot;</span><span class="punctuation">:</span> <span class="number">901</span><span class="punctuation">,</span></span><br><span class="line">                                                <span class="comment">// 域名</span></span><br><span class="line">                                                <span class="attr">&quot;HostName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;你的域名&gt;&quot;</span><span class="punctuation">,</span></span><br><span class="line">                                                <span class="comment">// 端口号</span></span><br><span class="line">                                                <span class="attr">&quot;DERPPort&quot;</span><span class="punctuation">:</span> <span class="number">56473</span><span class="punctuation">,</span></span><br><span class="line">                                        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">                                <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">                        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br></pre></td></tr></table></figure><p><img src="https://cdn.cnzw.top/blog/FAQ3bvGqaoiG19x20ZBcqdZAnMh.png" alt="image"></p><p>在 Tailscale 客户端上使用以下命令查看目前可以使用的 DERP 服务器：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ tailscale netcheck</span><br><span class="line">Report:</span><br><span class="line">        * UDP: true</span><br><span class="line">        * IPv4: yes, xx.154.29.252:50713</span><br><span class="line">        * IPv6: yes, [::ffff:xx.154.29.252]:50713</span><br><span class="line">        * MappingVariesByDestIP: false</span><br><span class="line">        * HairPinning: false</span><br><span class="line">        * PortMapping: UPnP, NAT-PMP, PCP</span><br><span class="line">        * Nearest DERP: Tencent Guangzhou</span><br><span class="line">        * DERP latency:</span><br><span class="line">                -  1: 8.5ms   (阿里云-深圳)   -----&gt; 这就是我们刚建的derp服务器</span><br></pre></td></tr></table></figure><p>tailscale netcheck 实际上只检测 3478&#x2F;udp 的端口， 就算 netcheck 显示能连，也不一定代表 23479 端口可以转发流量。最简单的办法是直接打开 DERP 服务器的 URL：<a href="https://derp.XXXX.cn:443，如果看到如下页面，且地址栏的">https://derp.XXXX.cn:443，如果看到如下页面，且地址栏的</a> SSL 证书标签显示正常可用，那才是真没问题了。<br><img src="https://cdn.cnzw.top/blog/HWQxb2q9lo4BZmxpJRDc9mXcnWd.png" alt="image"></p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://icloudnative.io/posts/custom-derp-servers/">Tailscale 基础教程：部署私有 DERP 中继服务器</a></p><p><a href="https://junyao.tech/posts/18297f50.html">headscale保底设施之DERP中继服务器自建</a></p><p><a href="https://zhuanlan.zhihu.com/p/638910565">大内网战略(6)：自建 Tailscale DERP 中继服务器 保姆级教程</a></p><p><a href="https://linshen.netlify.app/tailscale-derper-docker/">我的服务器系列：tailscale使用自定义derper服务器（docker部署）</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;什么是-DERP&quot;&gt;&lt;a href=&quot;#什么是-DERP&quot; class=&quot;headerlink&quot; title=&quot;什么是 DERP&quot;&gt;&lt;/a&gt;什么是 DERP&lt;/h1&gt;&lt;p&gt;DERP 即 Detoured Encrypted Routing Protocol，这是 </summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="家庭网络" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>2024 新春快乐！</title>
    <link href="https://www.cnzw.top/p/22550/"/>
    <id>https://www.cnzw.top/p/22550/</id>
    <published>2024-02-09T08:26:55.000Z</published>
    <updated>2024-03-09T05:39:36.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.cnzw.top/blog/LvYQb3YlIoZ5vTxD5QHcZEFGngf.png" alt="image"><br><a href="https://www.bilibili.com/video/BV16v42117Ko">Chubbyemu祝大家2024年新春快乐！_哔哩哔哩_bilibili</a></p><p>附：<a href="https://tv.cctv.com/2024/01/01/VIDExWl1StPlxt0lE4yI99r7240101.shtml">[新闻直播间]国家主席习近平发表二〇二四年新年贺词</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://cdn.cnzw.top/blog/LvYQb3YlIoZ5vTxD5QHcZEFGngf.png&quot; alt=&quot;image&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV16v42117Ko</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>Elog 文章模板</title>
    <link href="https://www.cnzw.top/p/52606/"/>
    <id>https://www.cnzw.top/p/52606/</id>
    <published>2024-01-23T17:03:54.000Z</published>
    <updated>2024-02-09T15:00:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>写法        解释</p><p>title        【必需】页面标题</p><p>date        【必需】页面创建日期</p><p>type        【必需】标签、分类和友情链接三个页面需要配置</p><p>updated        【可选】页面更新日期</p><p>description        【可选】页面描述</p><p>keywords        【可选】页面关键字</p><p>comments        【可选】显示页面评论模块 (默认 true)</p><p>top_img        【可选】页面顶部图片</p><p>mathjax        【可选】显示mathjax (当设置mathjax的per_page: false时，才需要配置，默认 false)</p><p>katex        【可选】显示katex (当设置katex的per_page: false时，才需要配置，默认 false)</p><p>aside        【可选】显示侧边栏 (默认 true)</p><p>aplayer        【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</p><p>highlight_shrink        【可选】配置代码框是否展开 (true&#x2F;false) (默认为设置中highlight_shrink的配置)</p><p>random        【可选】配置友情链接是否随机排序（默认为 false)</p><p>作者: Jerry</p><p>連結: <a href="https://butterfly.js.org/posts/dc584b87/#Page-Front-matter">https://butterfly.js.org/posts/dc584b87/#Page-Front-matter</a></p><p>來源: Butterfly</p><h2 id="著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。"><a href="#著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。" class="headerlink" title="著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。"></a>著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。</h2><p>写法        解释</p><p>title        【必需】文章标题</p><p>date        【必需】文章创建日期</p><p>updated        【可选】文章更新日期</p><p>tags        【可选】文章标签</p><p>categories        【可选】文章分类</p><p>keywords        【可选】文章关键字</p><p>description        【可选】文章描述</p><p>top_img        【可选】文章顶部图片</p><p>cover        【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图，可设为false&#x2F;图片地址&#x2F;留空)</p><p>comments        【可选】显示文章评论模块(默认 true)</p><p>toc        【可选】显示文章TOC(默认为设置中toc的enable配置)</p><p>toc_number        【可选】显示toc_number(默认为设置中toc的number配置)</p><p>toc_style_simple        【可选】显示 toc 简洁模式</p><p>copyright        【可选】显示文章版权模块(默认为设置中post_copyright的enable配置)</p><p>copyright_author        【可选】文章版权模块的文章作者</p><p>copyright_author_href        【可选】文章版权模块的文章作者链接</p><p>copyright_url        【可选】文章版权模块的文章连结链接</p><p>copyright_info        【可选】文章版权模块的版权声明文字</p><p>mathjax        【可选】显示mathjax(当设置 mathjax 的 per_page: false 时，才需要配置，默认 false )</p><p>katex        【可选】显示 katex (当设置 katex 的 per_page: false 时，才需要配置，默认 false )</p><p>aplayer        【可选】在需要的页面加载 aplayer 的 js 和 css,请参考文章下面的音乐 配置</p><p>highlight_shrink        【可选】配置代码框是否展开(true&#x2F;false)(默认为设置中 highlight_shrink 的配置)</p><p>aside        【可选】显示侧边栏 (默认 true)</p><p>abcjs        【可选】加载 abcjs (当设置 abcjs 的 per_page: false 时，才需要配置，默认 false )</p><p>作者: Jerry</p><p>連結: <a href="https://butterfly.js.org/posts/dc584b87/#Post-Front-matter">https://butterfly.js.org/posts/dc584b87/#Post-Front-matter</a></p><p>來源: Butterfly</p><p>著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;写法        解释&lt;/p&gt;
&lt;p&gt;title        【必需】页面标题&lt;/p&gt;
&lt;p&gt;date        【必需】页面创建日期&lt;/p&gt;
&lt;p&gt;type        【必需】标签、分类和友情链接三个页面需要配置&lt;/p&gt;
&lt;p&gt;updated        【</summary>
      
    
    
    
    <category term="Default" scheme="https://www.cnzw.top/categories/Default/"/>
    
    
    <category term="Default" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/Default/"/>
    
  </entry>
  
  <entry>
    <title>飞书示例文档</title>
    <link href="https://www.cnzw.top/p/37618/"/>
    <id>https://www.cnzw.top/p/37618/</id>
    <published>2024-01-23T10:26:13.000Z</published>
    <updated>2024-03-14T15:30:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文章飞书文档地址：</p><h1 id="飞书示例文档"><a href="#飞书示例文档" class="headerlink" title="飞书示例文档"></a>飞书示例文档</h1><h2 id="二级标题"><a href="#二级标题" class="headerlink" title="二级标题"></a>二级标题</h2><h3 id="三级标题"><a href="#三级标题" class="headerlink" title="三级标题"></a>三级标题</h3><h4 id="四级标题"><a href="#四级标题" class="headerlink" title="四级标题"></a>四级标题</h4><h5 id="五级标题"><a href="#五级标题" class="headerlink" title="五级标题"></a>五级<a href="https://github.com/halo-sigs/vscode-extension-halo/">标题</a></h5><h6 id="六级标题"><a href="#六级标题" class="headerlink" title="六级标题"></a>六级标题</h6><p>####### 七级标题<br>######## 八级标题<br>######### 九级标题</p><ol><li><p>有序列表1</p></li><li><p>有序列表2</p><ol><li>有序列表2-1<ol><li>有序列表2-2</li><li>有序列表2-2-1<ol><li>有序列表2-2-2</li></ol></li></ol></li></ol></li></ol><ul><li><p>无序列表1</p><ul><li>无序列表1-1<ul><li>无序列表1-1-1<ul><li>无序列表1-1-2</li><li>无序列表1-2</li></ul></li></ul></li></ul></li><li><p>无序列表2</p></li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// javascritp代码块</span></span><br><span class="line"><span class="keyword">const</span> a = <span class="number">123</span></span><br></pre></td></tr></table></figure><blockquote><p>引用文字打<a href="https://github.com/halo-sigs/vscode-extension-halo/">完打我打完打打完打完打文档</a><br>第二行<br>第三行</p></blockquote><hr><p><a href="https://elog.1874.cool/">链接</a></p><h1 id="常用"><a href="#常用" class="headerlink" title="常用"></a>常用</h1><ul><li><input disabled="" type="checkbox"> 任务<a href="https://github.com/halo-sigs/vscode-extension-halo/">列表1</a></li><li><input checked="" disabled="" type="checkbox"> 任务列表已完成</li></ul><h2 id="媒体"><a href="#媒体" class="headerlink" title="媒体"></a>媒体</h2><p>图片<br><img src="https://cdn.cnzw.top/blog/NWYUbwTfWoUkWpxtuYGcgVtnnuN.jpeg" alt="image"><br>视频不支持</p><h2 id="表格"><a href="#表格" class="headerlink" title="表格"></a>表格</h2><blockquote><p>🦄 高亮块<br>高亮块文字第二行<br>高亮块文字第三行</p></blockquote><h2 id="公式"><a href="#公式" class="headerlink" title="公式"></a>公式</h2><p>$$<br>\prod\limits_a^b\frac{ab}{cd}\frac{\text{d}x}{\text{d}y}\lim\limits_{a \rightarrow b}</p><p>$$<br>123123123123123</p><h1 id="行内样式"><a href="#行内样式" class="headerlink" title="行内样式"></a>行内样式</h1><p><code>行内代码 const a = 1</code></p><p><strong>加粗</strong></p><p><em>斜体</em></p><p><del>中划线</del></p><p><u>下划线</u></p><p><a href="https://elog.1874.cool/">链接</a></p><p>&#x2F;</p><p><a href="https://elog.1874.cool/">复合</a><del><em><u><strong>样式万达万达文档啊万达万</strong></u></em></del><strong>达万达万达玩打</strong><del><em><u><strong>我大文档啊万达啊万达啊万达啊万达啊万达啊万达</strong></u></em></del></p><blockquote><p>对我的文档带娃大王啊</p></blockquote><p>大雾大雾大大万达万达为</p><table><thead><tr><th><code>第一行第1列</code></th><th><strong>第一行第2列</strong></th><th><del><em><strong>第一行第3列</strong></em></del></th></tr></thead><tbody><tr><td>第二<a href="https://elog.1874.cool/">行</a>第1列</td><td>第二行第2列</td><td>第二行第3列</td></tr></tbody></table>]]></content>
    
    
    <summary type="html">描述描述描述</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://www.cnzw.top/p/16107/"/>
    <id>https://www.cnzw.top/p/16107/</id>
    <published>2024-01-22T06:55:07.000Z</published>
    <updated>2024-02-15T18:43:44.000Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a><strong>Quick Start</strong></h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a><strong>Create a new post</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a><strong>Run server</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a><strong>Generate static files</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a><strong>Deploy to remote sites</strong></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>Huginn 搭建数据采集监控网页平台</title>
    <link href="https://www.cnzw.top/p/32785/"/>
    <id>https://www.cnzw.top/p/32785/</id>
    <published>2023-02-27T08:15:00.000Z</published>
    <updated>2024-03-14T14:55:03.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://cdn.cnzw.top/blog/Je4pbXhc1oc7vUxrriwcXsd2noc.png" alt="image"><br><a href="https://github.com/huginn/huginn">GitHub - huginn&#x2F;huginn: Create agents that monitor and act on your behalf.  Your agents are standing</a></p><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>在北欧神话中，奥丁的肩膀上坐着两只乌鸦，一只名叫 Huginn，一只名叫 Muninn。这两只乌鸦告诉奥丁他们的所见所闻，毫无遗漏。奥丁在黎明时派出它们，它们飞遍全世界然后在晚餐之前回来汇报，因此，奥丁能知晓很多事情。在Huginn的项目主页上，作者对它有详细的介绍。我们同样可以通过Huginn创建不同的代理，通过这些代理发送HTTP请求获得相关数据，然后将获取到的数据进行处理，就可以在互联网上面收集到各类我们需要的信息了。通过Huginn我们可以比较方便的实现如下功能:</p><ul><li><p>监控你关心的事项例如知乎、微博、贴吧等平台指定的信息，一旦监控到信息，邮件通知你。</p></li><li><p>监控各大购物平台商品信息，一旦发现折扣信息，邮件通知你。 支持各种形式的发送和接收 WebHooks。</p></li><li><p>抓取网页内容并且在它们发生变化时发送邮件给你。 将获得的数据进行相应的格式处理并输出，例如RSS。</p></li><li><p>跟踪天气的变化，如果监测到明天要下雨或下雪，就会发邮件提醒你。</p></li></ul><p>总得来说，Huginn可以帮助我们做好两件事情，一是定制化推送或提醒，二是聚合数据。</p><p>目前我的用途：</p><ul><li><p>监控 Github Release 和 Commits，推送消息</p></li><li><p>监控地震台网，推送消息</p></li><li><p>监控Dz论坛帖子，推送消息</p></li></ul><p>中间踩坑还是不少的</p><h1 id="安装-Huginn"><a href="#安装-Huginn" class="headerlink" title="安装 Huginn"></a>安装 Huginn</h1><p>使用 Docker 安装：</p><ol><li><p>拉取镜像 <a href="https://hub.docker.com/r/huginn/huginn">hub.docker.com</a></p></li><li><p>启动镜像 <code>docker run -it -p 3000:3000 -v /home/huginn/mysql-data:/var/lib/mysql huginn/huginn</code></p></li></ol><blockquote><p>支持外部 MySQL 数据库，但是作为个人使用的话只需要导出内部数据库文件做持久化就好了。<br>我在群晖里遇到目录权限问题，最后手动把对应目录权限设置为everyone解决的</p></blockquote><ol><li>初始用户名：<code>admin</code> 密码：<code>password</code></li></ol><h1 id="概念讲解"><a href="#概念讲解" class="headerlink" title="概念讲解"></a>概念讲解</h1><h2 id="Agent"><a href="#Agent" class="headerlink" title="Agent"></a>Agent</h2><p>Agent 就是代理，是执行具体操作的角色。如采集网页、运行js代码、发送 webhook 等具体操作。</p><h2 id="Scenario"><a href="#Scenario" class="headerlink" title="Scenario"></a>Scenario</h2><p>Scenario 就是集合，等于是文件夹，用来整理归类 Agent 方便识别。所以不用 Scenario 归类也可以。</p><h2 id="Event"><a href="#Event" class="headerlink" title="Event"></a>Event</h2><p>Event 就是事件，Agent 之前依靠 Event 传递消息和数据。有些 Agent 可以自己产生数据（如爬取网页或解析RSS），有些 Agent 拿到传递的 Event 解析后再发出下一个 Event。</p><h1 id="实践"><a href="#实践" class="headerlink" title="实践"></a>实践</h1><h2 id="RSS订阅源"><a href="#RSS订阅源" class="headerlink" title="RSS订阅源"></a>RSS订阅源</h2><p>首先当然是去找现成的 RSS ，这样就不用自己写网页采集了。</p><p><a href="https://uneasy.win/rsshubserver/">RSSHub订阅服务 - 胜之不易</a></p><p>有现成的我捡来用了</p><h2 id="Shopify-Liquid"><a href="#Shopify-Liquid" class="headerlink" title="Shopify Liquid"></a>Shopify Liquid</h2><p>Liquid 是一种字符串模版，用于提取 Agent 传递的 Event 中的数据。</p><p>简单点来说 如果上一个 Agent 传递的 Event 是这样的</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;abc&quot;: &#123;</span><br><span class="line">    &quot;123&quot;: &quot;true&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>那么 <code>&#123;&#123;abc.123&#125;&#125;</code> 的结果就是 <code>true</code></p><p>更多的姿势可以看 Liquid 文档和 Huginn Wiki</p><p><a href="https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid">使用 Liquid · 设置事件格式huginn&#x2F;huginn Wiki (github.com)</a></p><p><a href="https://liquid.bootcss.com/basics/introduction/">简介 – Liquid 模板语言中文文档 | Liquid 中文网 (bootcss.com)</a></p><h2 id="消息推送相关"><a href="#消息推送相关" class="headerlink" title="消息推送相关"></a>消息推送相关</h2><h3 id="钉钉机器人"><a href="#钉钉机器人" class="headerlink" title="钉钉机器人"></a>钉钉机器人</h3><p><a href="https://open.dingtalk.com/document/orgapp/message-link-description">消息链接说明 - 钉钉开放平台 (dingtalk.com)</a></p><p>以下是 <u>POST Agent</u> 的内容</p><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;post_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://oapi.dingtalk.com/robot/send?access_token=10086&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;expected_receive_period_in_days&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;content_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;json&quot;</span><span class="punctuation">,</span> <span class="comment">// json xml 和正常的 HTTP Header 头</span></span><br><span class="line">  <span class="attr">&quot;method&quot;</span><span class="punctuation">:</span> <span class="string">&quot;post&quot;</span><span class="punctuation">,</span> <span class="comment">// get, post, put, patch, and delete</span></span><br><span class="line">  <span class="attr">&quot;payload&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="comment">// 可以是 json，也可以是字符串（字符串看 Bark 例子）。</span></span><br><span class="line">    <span class="attr">&quot;msgtype&quot;</span><span class="punctuation">:</span> <span class="string">&quot;actionCard&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;actionCard&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;title&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;content&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;btnOrientation&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;btns&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;有好康的&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;actionURL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dingtalk://dingtalkclient/page/link?url=&#123;&#123;encodeUrl&#125;&#125;&amp;pc_slide=false&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;headers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;emit_events&quot;</span><span class="punctuation">:</span> <span class="string">&quot;false&quot;</span><span class="punctuation">,</span> <span class="comment">// 设置成 true 可以看到输出，用来调试 webhook</span></span><br><span class="line">  <span class="attr">&quot;no_merge&quot;</span><span class="punctuation">:</span> <span class="string">&quot;false&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;output_mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;clean&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="飞书机器人"><a href="#飞书机器人" class="headerlink" title="飞书机器人"></a>飞书机器人</h3><p><a href="https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot">自定义机器人使用指南 - 开发指南 - 开发文档 - 飞书开放平台</a></p><p>以下是 <u>POST Agent</u> 的内容</p><figure class="highlight json"><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"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;post_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://open.feishu.cn/open-apis/bot/v2/hook/xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;expected_receive_period_in_days&quot;</span><span class="punctuation">:</span> <span class="string">&quot;0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;content_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;json&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;method&quot;</span><span class="punctuation">:</span> <span class="string">&quot;post&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;payload&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;msg_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;post&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;post&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;zh_cn&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;title&#125;&#125;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">            <span class="punctuation">[</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;text&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;content&#125;&#125;&quot;</span></span><br><span class="line">              <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">              <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;tag&quot;</span><span class="punctuation">:</span> <span class="string">&quot;a&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;text&quot;</span><span class="punctuation">:</span> <span class="string">&quot;\n\n&gt; 查看详情&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;href&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&#123;&#123;url&#125;&#125;&quot;</span></span><br><span class="line">              <span class="punctuation">&#125;</span></span><br><span class="line">            <span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">]</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;headers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;emit_events&quot;</span><span class="punctuation">:</span> <span class="string">&quot;false&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;no_merge&quot;</span><span class="punctuation">:</span> <span class="string">&quot;true&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;output_mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;clean&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="iOS-Bark"><a href="#iOS-Bark" class="headerlink" title="iOS Bark"></a>iOS Bark</h3><p><a href="https://bark.day.app/#/tutorial">使用教程</a></p><p>以下是 <u>POST Agent</u> 的内容</p><p>建议使用正常的 POST，Json POST 好像有问题</p><figure class="highlight json"><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"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;post_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://api.day.app/ping&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;expected_receive_period_in_days&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;content_type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;application/x-www-form-urlencoded&quot;</span><span class="punctuation">,</span> <span class="comment">// json xml 和正常的 HTTP Header 头</span></span><br><span class="line">  <span class="attr">&quot;method&quot;</span><span class="punctuation">:</span> <span class="string">&quot;post&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;payload&quot;</span><span class="punctuation">:</span> <span class="string">&quot;title=&#123;&#123;title&#125;&#125;&amp;body=&#123;&#123;body&#125;&#125;&amp;group=&#123;&#123;group&#125;&#125;&amp;icon=&#123;&#123;icon&#125;&#125;&amp;isArchive=&#123;&#123;isArchive&#125;&#125;&amp;url=&#123;&#123;url&#125;&#125;&amp;sound=&#123;&#123;sound&#125;&#125;&quot;</span><span class="punctuation">,</span> <span class="comment">// 可以是 json，也可以是字符串</span></span><br><span class="line">  <span class="attr">&quot;emit_events&quot;</span><span class="punctuation">:</span> <span class="string">&quot;false&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;no_merge&quot;</span><span class="punctuation">:</span> <span class="string">&quot;true&quot;</span><span class="punctuation">,</span> <span class="comment">// 如果 payload 是字符串，必须为 true</span></span><br><span class="line">  <span class="attr">&quot;output_mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;clean&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Github-RSS-订阅、处理和传递"><a href="#Github-RSS-订阅、处理和传递" class="headerlink" title="Github RSS 订阅、处理和传递"></a>Github RSS 订阅、处理和传递</h2><h3 id="RSS-订阅"><a href="#RSS-订阅" class="headerlink" title="RSS 订阅"></a>RSS 订阅</h3><blockquote><p>GitHub 官方也提供了一些 RSS:  </p><p>仓库 releases: <a href="https://github.com/:owner/:repo/releases.atom">https://github.com/:owner/:repo/releases.atom</a><br>仓库 commits: <a href="https://github.com/:owner/:repo/commits.atom">https://github.com/:owner/:repo/commits.atom</a><br>用户动态: <a href="https://github.com/:user.atom">https://github.com/:user.atom</a><br>专属动态: <a href="https://github.com/:user.private.atom?token=:secret">https://github.com/:user.private.atom?token=:secret</a> (登录后在仪表盘页面 (opens new window)找到 Subscribe to your news feed 字样即可)<br>Wiki 历史: <a href="https://github.com/:owner/:repo/wiki.atom">https://github.com/:owner/:repo/wiki.atom</a></p></blockquote><p>使用 <u>Rss Agent</u>，名为 <code>Github Repo Release Atom</code>。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;expected_update_period_in_days&quot;</span><span class="punctuation">:</span> <span class="string">&quot;5&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;clean&quot;</span><span class="punctuation">:</span> <span class="string">&quot;false&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://github.com/huginn/huginn/commits/master.atom&quot;</span> # url 支持数组，可以填入多个 RSS 源。</span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>检查频率（Schedule）是 5 个小时（Every 5h），Event 传递给 <code>Github Repo Release Atom Parser</code>。</p><h3 id="数据处理"><a href="#数据处理" class="headerlink" title="数据处理"></a>数据处理</h3><p>如果想从 RSS 中解析内容到 飞书机器人，还需要自行处理数据。</p><p>因为涉及到时间转换和正则匹配，所以我使用了 <u>JavaScript Agent</u>，名为<code>Github Repo Release Atom Parser</code>。</p><p>JS 也提供了 Huginn Event 相关的 API，在初始化的时候会有示范代码，右侧也有相应说明。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">formatDate</span>(<span class="params">time, format</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (time == <span class="literal">null</span> || time == <span class="literal">undefined</span> || time == <span class="string">&quot;&quot;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> t = <span class="keyword">new</span> <span class="title class_">Date</span>(time); <span class="comment">// 容器内时区为-8</span></span><br><span class="line">  <span class="keyword">var</span> len = t.<span class="title function_">getTime</span>(); <span class="comment">// 到现在的秒数</span></span><br><span class="line">  <span class="keyword">var</span> offset = t.<span class="title function_">getTimezoneOffset</span>() * <span class="number">60000</span>; <span class="comment">// 和utc差多少秒</span></span><br><span class="line">  <span class="keyword">var</span> utc = len + offset; <span class="comment">// utc时间</span></span><br><span class="line">  <span class="keyword">var</span> t1 = <span class="keyword">new</span> <span class="title class_">Date</span>(utc + <span class="number">3600000</span> * <span class="number">8</span>); <span class="comment">// +8</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> tf = <span class="keyword">function</span> (<span class="params">i</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> (i &lt; <span class="number">10</span> ? <span class="string">&#x27;0&#x27;</span> : <span class="string">&#x27;&#x27;</span>) + i</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">return</span> format.<span class="title function_">replace</span>(<span class="regexp">/yyyy|MM|dd|HH|mm|ss/g</span>, <span class="keyword">function</span> (<span class="params">a</span>) &#123;</span><br><span class="line">    <span class="keyword">switch</span> (a) &#123;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;yyyy&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getFullYear</span>());</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;MM&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getMonth</span>() + <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;mm&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getMinutes</span>());</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;dd&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getDate</span>());</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;HH&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getHours</span>());</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">&#x27;ss&#x27;</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">tf</span>(t1.<span class="title function_">getSeconds</span>());</span><br><span class="line">        <span class="keyword">break</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="title class_">Agent</span>.<span class="property">receive</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> events = <span class="variable language_">this</span>.<span class="title function_">incomingEvents</span>();</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; events.<span class="property">length</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">var</span> url = events[i].<span class="property">payload</span>.<span class="property">url</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">var</span> regex = <span class="regexp">/^https:\/\/github\.com\/([a-zA-z]+\/[a-zA-z-_\.]+)\/.+$/</span>;</span><br><span class="line">    <span class="keyword">var</span> res = regex.<span class="title function_">exec</span>(url);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">var</span> dateTime = <span class="title function_">formatDate</span>(<span class="keyword">new</span> <span class="title class_">Date</span>(events[i].<span class="property">payload</span>.<span class="property">last_updated</span>), <span class="string">&#x27;yyyy-MM-dd HH:mm:ss&#x27;</span>);</span><br><span class="line">    <span class="keyword">var</span> content = events[i].<span class="property">payload</span>.<span class="property">content</span>.<span class="title function_">replace</span>(<span class="regexp">/&lt;.*?&gt;/ig</span>, <span class="string">&quot;&quot;</span>).<span class="title function_">replace</span>(<span class="regexp">/\n\n/ig</span>, <span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">createEvent</span>(&#123;</span><br><span class="line">      <span class="string">&#x27;title&#x27;</span>: <span class="string">&#x27;Github &#x27;</span> + res[<span class="number">1</span>] + <span class="string">&#x27; Release&#x27;</span>,</span><br><span class="line">      <span class="string">&#x27;content&#x27;</span>: content,</span><br><span class="line">      <span class="string">&#x27;url&#x27;</span>: events[i].<span class="property">payload</span>.<span class="property">url</span></span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p> 通过 <code>this.createEvent</code> 创建 Json，传递给飞书机器人 Agent，最后通过 Liquid 提取对应字段就完成了。</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><p><a href="https://blog.csdn.net/unreliable_narrator/article/details/124309672">使用Huginn打造自动化信息处理中心-CSDN博客</a></p></li><li><p><a href="https://guozh.net/2021-docker-install-huginn/">Docker 安装 Huginn，2021 最新教程（100%解决） | 老郭种树 (</a><a href="https://guozh.net/2021-docker-install-huginn/">guozh.net</a><a href="https://guozh.net/2021-docker-install-huginn/">)</a></p></li><li><p><a href="https://blog.wangjiegulu.com/2018/11/24/huginn_deployment_with_docker_and_data_migration/">Huginn 的 Docker 部署及数据迁移 (</a><a href="https://blog.wangjiegulu.com/2018/11/24/huginn_deployment_with_docker_and_data_migration/">wangjiegulu.com</a><a href="https://blog.wangjiegulu.com/2018/11/24/huginn_deployment_with_docker_and_data_migration/">)</a></p></li><li><p><a href="https://www.jianshu.com/p/d272a09ba686">Huginn Docker 安装笔记 - 简书 (</a><a href="https://www.jianshu.com/p/d272a09ba686">jianshu.com</a><a href="https://www.jianshu.com/p/d272a09ba686">)</a></p></li><li><p><a href="https://blog.csdn.net/unreliable_narrator/article/details/124309672">使用Huginn打造自动化信息处理中心_PalmerYang的博客-CSDN博客</a></p></li><li><p><a href="https://www.jianshu.com/p/d3407cc3df5c">Huginn中文指南：搭建自己的iFTTT - 简书 (</a><a href="https://www.jianshu.com/p/d3407cc3df5c">jianshu.com</a><a href="https://www.jianshu.com/p/d3407cc3df5c">)</a></p></li><li><p><a href="https://huginn.cn/huginn">huginn – huginn</a></p></li><li><p><a href="https://www.cnblogs.com/liujiangblog/articles/12115804.html">超详细!如何利用Huginn制作专属RSS - 谁是小菜鸡 - 博客园 (</a><a href="https://www.cnblogs.com/liujiangblog/articles/12115804.html">cnblogs.com</a><a href="https://www.cnblogs.com/liujiangblog/articles/12115804.html">)</a></p></li><li><p><a href="https://www.bilibili.com/read/cv14280731/">【高级篇】RSS的世界：Huginn篇（中） - 哔哩哔哩 (</a><a href="https://www.bilibili.com/read/cv14280731/">bilibili.com</a><a href="https://www.bilibili.com/read/cv14280731/">)</a></p></li><li><p><a href="https://app.gitter.im/#/room/#huginn_huginn:gitter.im">https://app.gitter.im/#/room/#huginn_huginn:gitter.im</a></p></li><li><p><a href="https://zhuanlan.zhihu.com/p/75730603">上手huginn的第一篇教程：一个定时监控黄金价格的rss - 知乎 (</a><a href="https://zhuanlan.zhihu.com/p/75730603">zhihu.com</a><a href="https://zhuanlan.zhihu.com/p/75730603">)</a></p></li></ul><h1 id="TODO"><a href="#TODO" class="headerlink" title="TODO"></a>TODO</h1><p>Agent介绍</p><p><a href="https://www.jianshu.com/p/39d8c47050d3">discuz论坛的通用RSS订阅办法</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://cdn.cnzw.top/blog/Je4pbXhc1oc7vUxrriwcXsd2noc.png&quot; alt=&quot;image&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://github.com/huginn/huginn&quot;&gt;GitHub - </summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
    <category term="Huginn" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/Huginn/"/>
    
  </entry>
  
  <entry>
    <title>可道云 Kodexplorer 软链接访问问题</title>
    <link href="https://www.cnzw.top/p/43262/"/>
    <id>https://www.cnzw.top/p/43262/</id>
    <published>2023-01-24T13:17:00.000Z</published>
    <updated>2024-03-14T15:22:10.000Z</updated>
    
    <content type="html"><![CDATA[<p>众所周知，MCSM的文件管理挺难用的。（虽然也在努力改进）在最开始的想法是使用 <a href="https://kodcloud.com/download/">Kodexplorer</a> 的，但是它的多用户并没有指定目录的功能，只能憨憨的把服务器扔到web目录下，既不安全也做不到多用户同时编辑一个服务器。所以那时候退了一步使用了基于 docker 的 filebrowser。(<a href="/p/24110/">Filebrowser Docker Volume 文件权限问题</a>)</p><p>然后在最近突然开窍，Linux 不是有软链接功能嘛，再加上 kodexplorer 配置里的定义用户目录功能，可以实现服务器文件不在web目录下，而且多用户同时编辑的目标。</p><p>首先是软链接：</p><p><a href="https://www.jianshu.com/p/9f0c8e113d95">软连接 - Linux软连接创建及一个“坑”</a></p><p>2023.02.28：直接在宝塔面板的文件管理新建软链接就行了，原谅我没看到 :(</p><p>创建完之后再到网页访问就发愁了，它提示没有权限“该文件或目录没有读权限”。</p><p>于是我先后尝试搜索关键词“php 软链接”和“nginx 软链接”，可以搜索到 nginx 是有相关配置需要开启的：</p><p><a href="https://blog.csdn.net/chuozhun5567/article/details/100824630">Nginx 配置软链，报403无法访问。-CSDN博客</a></p><p>于是我配置了<code>disable_symlinks</code>，然后也配置了所有文件夹的权限，还是无法访问。</p><p>在最后想要放弃的时候，在 kod 的论坛乱逛查看是否有相关解决办法，结果真找到了前人 <a href="https://bbs.kodcloud.com/d/602-docker-kodexplorer">docker部署的kodexplorer，往用户目录下添加软连接，没有读写权限 - 可道云社区</a>，也找到了触发我灵感的 <a href="https://bbs.kodcloud.com/d/2027-kodexplore">KodExplore 怎么挂载本地盘?或者挂载各种云? - 可道云社区</a>，然后到<code>config/config.php</code>里边一瞅就明白了少了什么了：<code>open_basedir</code>！</p><p>因为我用的是宝塔面板，防跨站一键就可以关闭了，所以就不在此写如何操作了（反正我贴的连接也是百度出来的嘿嘿）。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;众所周知，MCSM的文件管理挺难用的。（虽然也在努力改进）在最开始的想法是使用 &lt;a href=&quot;https://kodcloud.com/download/&quot;&gt;Kodexplorer&lt;/a&gt; 的，但是它的多用户并没有指定目录的功能，只能憨憨的把服务器扔到web目录下，既不</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>Filebrowser Docker Volume 文件权限问题</title>
    <link href="https://www.cnzw.top/p/24110/"/>
    <id>https://www.cnzw.top/p/24110/</id>
    <published>2023-01-03T14:27:00.000Z</published>
    <updated>2024-03-13T11:59:29.000Z</updated>
    
    <content type="html"><![CDATA[<p>近段时间折腾服务器，接触了 filebrowser。发现通过 filebrowser 上传的文件所属用户都默认为 root，由此导致了低级别用户（如 www）可以读取但无法写入数据，遂发本文。</p><p>在经过简单百度 <a href="https://www.cnblogs.com/woshimrf/p/understand-docker-uid.html">docker挂载volume的用户权限问题,理解docker容器的uid - Ryan.Miao - 博客园</a> 后，可知需要设置运行 docker 容器的 uid 和 gid 为相对应的用户。</p><p>在系统内查询后可知 www 用户的 uid 和 gid 均为 1000，遂在 docker-compose 中设置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">&#x27;3&#x27;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">filbrowser:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">filebrowser/filebrowser</span></span><br><span class="line">    <span class="attr">user:</span> <span class="string">&quot;1000:1000&quot;</span></span><br></pre></td></tr></table></figure><p>设置完成后启动容器，发现容器报错退出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">listen tcp :80: bind: permission denied</span><br></pre></td></tr></table></figure><p>此处是因为 uid 为 1000 的用户不是容器的的 root 权限用户（甚至没有被记录在 passwd 文件中），所以无法打开 1024 以下的低端口。所以需要调整 filebrowser 的默认端口。</p><p>首先将配置文件<code>.filebrowser.json</code>映射进容器，在配置文件中填写好 <a href="https://github.com/filebrowser/filebrowser/blob/master/docker/root/defaults/settings.json">默认的配置</a> 后按需自行修改端口和数据库地址即可。（映射空文件是会报错的，必须填入完整配置）</p><p>数据库地址<code>database</code>按需更改，这是因为默认配置文件内的路径与官方 docker 教程内的映射的数据库路径不相符。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;近段时间折腾服务器，接触了 filebrowser。发现通过 filebrowser 上传的文件所属用户都默认为 root，由此导致了低级别用户（如 www）可以读取但无法写入数据，遂发本文。&lt;/p&gt;
&lt;p&gt;在经过简单百度 &lt;a href=&quot;https://www.cnbl</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>Docker 启动报错 status=205/LIMITS</title>
    <link href="https://www.cnzw.top/p/5823/"/>
    <id>https://www.cnzw.top/p/5823/</id>
    <published>2022-07-09T08:28:00.000Z</published>
    <updated>2024-03-14T15:22:46.000Z</updated>
    
    <content type="html"><![CDATA[<p>相关文章: <a href="https://blog.csdn.net/rockstics/article/details/108670563">centos 7.8.2003版本docker安装失败问题记录</a></p><p>出现的原因是因为我在上一篇文章（<a href="/p/17417/">Linux 的 open file 限制</a>）修改了<code>/etc/systemd/system.conf</code>, 随后在重启后发现 Docker 无法启动, 查看对应日志:</p><figure class="highlight prolog"><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">[root@jh-java ~]# systemctl start docker</span><br><span class="line"><span class="symbol">Job</span> for docker.service failed because the control process exited with error code. <span class="symbol">See</span> “systemctl status docker.service” and “journalctl -xe” for details.</span><br><span class="line">[root@jh-java ~]# systemctl status docker</span><br><span class="line">● docker.service - <span class="symbol">Docker</span> <span class="symbol">Application</span> <span class="symbol">Container</span> <span class="symbol">Engine</span></span><br><span class="line"><span class="symbol">Loaded</span>: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)</span><br><span class="line"><span class="symbol">Active</span>: failed (<span class="symbol">Result</span>: exit-code) since <span class="symbol">Fri</span> <span class="number">2020</span><span class="number">-09</span><span class="number">-18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> <span class="symbol">CST</span>; <span class="number">6</span>min ago</span><br><span class="line"><span class="symbol">Docs</span>: https://docs.docker.com</span><br><span class="line"><span class="symbol">Process</span>: <span class="number">10174</span> <span class="symbol">ExecStart</span>=/usr/bin/dockerd (code=exited, status=<span class="number">205</span>/<span class="symbol">LIMITS</span>)</span><br><span class="line"><span class="symbol">Main</span> <span class="symbol">PID</span>: <span class="number">10174</span> (code=exited, status=<span class="number">205</span>/<span class="symbol">LIMITS</span>)</span><br><span class="line"></span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">1</span>]: <span class="symbol">Starting</span> <span class="symbol">Docker</span> <span class="symbol">Application</span> <span class="symbol">Container</span> <span class="symbol">Engine</span>…</span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">10174</span>]: <span class="symbol">Failed</span> at step <span class="symbol">LIMITS</span> spawning /usr/bin/dockerd: <span class="symbol">Operation</span> not permitted</span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">1</span>]: docker.service: main process exited, code=exited, status=<span class="number">205</span>/<span class="symbol">LIMITS</span></span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">1</span>]: <span class="symbol">Failed</span> to start <span class="symbol">Docker</span> <span class="symbol">Application</span> <span class="symbol">Container</span> <span class="symbol">Engine</span>.</span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">1</span>]: <span class="symbol">Unit</span> docker.service entered failed state.</span><br><span class="line"><span class="symbol">Sep</span> <span class="number">18</span> <span class="number">17</span>:<span class="number">25</span>:<span class="number">33</span> jh-java systemd[<span class="number">1</span>]: docker.service failed.</span><br></pre></td></tr></table></figure><p>在经过查询后得知是因为 open file 限制的问题, 需要修改<code>/lib/systemd/system/&lt;服务名&gt;.service</code>的<code>LimitNOFILE=unlimited</code>为<code>LimitNOFILE=&lt;对应上限&gt;</code><strong>即可解决</strong></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;相关文章: &lt;a href=&quot;https://blog.csdn.net/rockstics/article/details/108670563&quot;&gt;centos 7.8.2003版本docker安装失败问题记录&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;出现的原因是因为我在上一篇文章（&lt;a h</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>Linux 的 open file 限制</title>
    <link href="https://www.cnzw.top/p/17417/"/>
    <id>https://www.cnzw.top/p/17417/</id>
    <published>2022-07-09T08:19:00.000Z</published>
    <updated>2024-03-14T15:21:38.000Z</updated>
    
    <content type="html"><![CDATA[<p>我在一台高配 Linux 开了 Minecraft 群组服, 在地图和玩家达到一定数量时, 会触发 open file 限制, 具体表现为服务端日志<code>error: too many open files</code>. 随之而来的就是大量地图文件无法读取, <code>session.lock</code>文件失效, 在游戏内的表现就是大量区块变成空置域, 玩家背包物品丢失.</p><p>具体的服务器启动关系是: 宝塔 -&gt; Nodejs -&gt; MCSM -&gt; Java.</p><h1 id="在发现问题的时候尝试了各种百度-CSDN-的姿势-均无果"><a href="#在发现问题的时候尝试了各种百度-CSDN-的姿势-均无果" class="headerlink" title="在发现问题的时候尝试了各种百度 &#x2F; CSDN 的姿势, 均无果:"></a>在发现问题的时候尝试了各种百度 &#x2F; CSDN 的姿势, 均无果:</h1><p><a href="https://www.cnblogs.com/greyzeng/p/14297258.html">Linux 下 Too many open files 问题排查与解决</a></p><p><a href="https://blog.csdn.net/weixin_42466518/article/details/117513063">linux open file 最大,怎样增大 Linux 系统的 open file(s) 上限</a></p><p><a href="https://www.cnblogs.com/shoufeng/p/10620480.html">Linux - 修改系统的max open files、max user processes (附ulimit的使用方法)</a></p><p><a href="https://cloud.tencent.com/developer/article/1796671">刨根问底，看我如何处理 Too many open files 错误</a></p><p>在尝试上述姿势后<code>cat /proc/’程序pid’/limits</code>显示仍然为<code>2048</code>.</p><h1 id="经过两天的深入"><a href="#经过两天的深入" class="headerlink" title="经过两天的深入:"></a>经过两天的深入:</h1><p><a href="http://cncc.bingj.com/cache.aspx?q=%E4%BF%AE%E6%94%B9+daemon+open+files&d=4874487565780956&mkt=zh-CN&setlang=zh-CN&w=3ob5lpfUXuioqW6PpArjNuP0Xg9CZf36">实战：linux修改open files-2022.1.15</a></p><p><a href="https://www.cnblogs.com/chinasoft/p/15341071.html">Linux 系统修改 open files 无效</a></p><p>这两篇文章中的修改<code>/etc/systemd/system.conf</code><strong>解决了我的问题</strong>.</p><p>具体原因是 Nodejs 服务是由 systemctl 启动的, 受到<code>/etc/systemd/system.conf</code>限制的, 修改<code>/etc/security/limits.conf</code>对于服务是无效的.</p><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p><a href="/p/5823/">Docker 启动报错 status&#x3D;205!LIMITS</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;我在一台高配 Linux 开了 Minecraft 群组服, 在地图和玩家达到一定数量时, 会触发 open file 限制, 具体表现为服务端日志&lt;code&gt;error: too many open files&lt;/code&gt;. 随之而来的就是大量地图文件无法读取, &lt;co</summary>
      
    
    
    
    <category term="Minecraft" scheme="https://www.cnzw.top/categories/Minecraft/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>Windows 无法连接到打印机 操作失败 错误 0x0000011b</title>
    <link href="https://www.cnzw.top/p/26042/"/>
    <id>https://www.cnzw.top/p/26042/</id>
    <published>2022-07-08T16:49:00.000Z</published>
    <updated>2024-03-14T14:55:49.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近在折腾店铺里的老旧三星打印机.</p><p>情况是三星打印机通过 USB 连接到一台老旧华硕笔记本,</p><p>但是店内打印需求庞大, 在上了 <a href="https://www.foxitcloud.cn/print/">云打印</a> 之后手机微信打印是解决了.</p><p>但是 PC 打印仍需通过网页, 有些麻烦, 并且伴有极高 Word 排版错乱的风险.</p><p>所以想通过 Windows 的打印机共享来实现局域网 PC 远程打印, 可以直接调用.</p><p>在折腾途中就遇到了这个坎:<br><img src="https://cdn.cnzw.top/blog/FGCWbpvzOogVmvxwQPncXUnsnAd.jpeg" alt="image"><br>经过一番搜索, 在某乎的评论区找到大佬 <strong>(注意是评论区)</strong> : <a href="https://zhuanlan.zhihu.com/p/426899882">局域网打印机突然连接不上&#x2F;不能打印0x0000011b 正式解决方案（无需卸载补丁）</a></p><p>以下为原文</p><blockquote><p>0x0000011b共享打印机连接错误问题是windows 10更新之后，共享资源调用使用的凭证或者凭据安全等级提高，并不是因为所有计算机都更新了补丁后导致不兼容！无须卸载补丁修复此问题的终极解决办法就是，在客户端添加打印机服务器的账户凭据，这样就可以安全进入打印机服务器使用资源！  </p><p>1，打开windows控制面板。<br>2，找到凭据管理器，选择windows凭据<br>3，点击 添加windows凭据<br>4，网络地址栏输入连接打印机的计算机ip地址，如：192.168.0.100<br>5，输入这台计算机的管理员用户名和密码<br>6，确定。<br>7，通过资源管理器打开\\共享打印机计算机ip地址，如：\\192.168.0.100<br>8，双击共享的打印机，安装共享打印机驱动，并测试打印机。  </p><p>附开启windows上帝模式（控制面板快捷方式）方法：<br>开启Windows上帝模式文件夹的具体操作如下：<br>1、桌面下右键新建一个新的文件夹。<br>2、将这个文件夹重命名为GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}  </p><p>注意：不要再重命名这个看似空名称的图标  </p><p>by bxadong，benxi，liaoning</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近在折腾店铺里的老旧三星打印机.&lt;/p&gt;
&lt;p&gt;情况是三星打印机通过 USB 连接到一台老旧华硕笔记本,&lt;/p&gt;
&lt;p&gt;但是店内打印需求庞大, 在上了 &lt;a href=&quot;https://www.foxitcloud.cn/print/&quot;&gt;云打印&lt;/a&gt; 之后手机微信打印是</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>手机消息推送解决方案</title>
    <link href="https://www.cnzw.top/p/27904/"/>
    <id>https://www.cnzw.top/p/27904/</id>
    <published>2021-04-22T09:23:00.000Z</published>
    <updated>2024-03-13T11:42:29.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>随着我在服务器上部署的软件越来越多,我也需要一个方便的通知推送来让我知道我的服务器发生了什么事.</p></blockquote><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a><strong>前言</strong></h2><p>最早接触到的自定义推送方式当然是邮件推送, 但是在国内的大环境下邮件推送并不流行. 一是手机推送环境并不统一, 就算邮件到达了用户的邮箱, 用户也接收不到邮件服务商下发的通知. 二是大多数(小白)用户并没有查看邮箱的习惯, 邮箱只是用来注册和找回账号用的.</p><p>直到我接触到一些服务器自动化脚本时我才知道还有依赖微信(公众号)的推送软件, 最有名的莫过于 <a href="https://sct.ftqq.com/">Server酱</a>.</p><p>iOS平台因其优秀且统一的推送也出现了推送软件 <a href="https://github.com/Finb/Bark">Bark</a>, 是iOS平台解决自定义推送的不二之选.</p><h2 id="Bark"><a href="#Bark" class="headerlink" title="Bark"></a><strong>Bark</strong></h2><h3 id="Bark的推送流程"><a href="#Bark的推送流程" class="headerlink" title="Bark的推送流程:"></a><strong>Bark的推送流程:</strong></h3><p>自动化脚本 -[POST&#x2F;GET]-&gt; Bark提供的API –&gt; Apple推送服务器 –&gt; iPhone</p><p>Bark APP在AppStore已上架</p><p><a href="https://github.com/Finb/bark-server">Bark后端</a> 是开源的并且支持Docker部署.</p><p>看样子应该是直接拿到了对应iPhone的类似于openID的东西, 直接给Apple推送服务器发消息即可. 因为是开源的所以没啥可担心的.</p><h2 id="WxPusher"><a href="#WxPusher" class="headerlink" title="WxPusher"></a><strong>WxPusher</strong></h2><blockquote><p>这是最近两天才接触到的基于微信公众号的推送接口, 类似于 Server酱 但功能更加强大.</p></blockquote><p><a href="https://wxpusher.dingliqc.com/docs/#/">WxPusher微信推送服务</a> (貌似证书出了点问题, 无碍)</p><h3 id="特点"><a href="#特点" class="headerlink" title="特点:"></a><strong>特点:</strong></h3><ul><li><p>实现了openID机制, 可获取用户信息和单独&#x2F;多人推送.</p></li><li><p>实现了关注消息应用(单发&#x2F;多发), 订阅消息应用(仅群发).</p></li><li><p>关注回调接口(带参数), 上行消息回调(向公众号发送内容开发者可获取).</p></li><li><p>更详细的内容请访问文档来获取.</p></li></ul><p>普通用户关注它的微信公众号, 开发者就可以拿到UID, 就可以做推送了. 如果走 Server酱 的话还需要用户去注册, 门槛大幅降低. 还支持上行消息, 做一些额外的骚操作.</p><p>下面记录一些常用的接口.</p><h3 id="发送消息"><a href="#发送消息" class="headerlink" title="发送消息"></a><strong>发送消息</strong></h3><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line">http<span class="punctuation">:</span><span class="comment">//wxpusher.zjiecode.com/api/send/message</span></span><br><span class="line"><span class="comment">//GET</span></span><br><span class="line">http<span class="punctuation">:</span><span class="comment">//wxpusher.zjiecode.com/api/send/message/?appToken=AT_xxxxM&amp;content=123&amp;uid=c1BcpqxEbD8irqlGUh9BhOqR2BvH8yWZ&amp;url=http%3a%2f%2fwxpusher.zjiecode.com</span></span><br><span class="line"><span class="comment">//POST</span></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;appToken&quot;</span><span class="punctuation">:</span><span class="string">&quot;AT_xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span><span class="string">&quot;Wxpusher祝你中秋节快乐!&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;summary&quot;</span><span class="punctuation">:</span><span class="string">&quot;消息摘要&quot;</span><span class="punctuation">,</span><span class="comment">//消息摘要，显示在微信聊天页面或者模版消息卡片上，限制长度100，可以不传，不传默认截取content前面的内容。</span></span><br><span class="line">  <span class="attr">&quot;contentType&quot;</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span><span class="comment">//内容类型 1表示文字  2表示html(只发送body标签内部的数据即可，不包括body标签) 3表示markdown </span></span><br><span class="line">  <span class="attr">&quot;topicIds&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span> <span class="comment">//发送目标的topicId，是一个数组！！！，也就是群发，使用uids单发的时候， 可以不传。</span></span><br><span class="line">    <span class="number">123</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;uids&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="comment">//发送目标的UID，是一个数组。注意uids和topicIds可以同时填写，也可以只填写一个。</span></span><br><span class="line">    <span class="string">&quot;UID_xxxx&quot;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span><span class="string">&quot;http://wxpusher.zjiecode.com&quot;</span> <span class="comment">//原文链接，可选参数</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="关注回调"><a href="#关注回调" class="headerlink" title="关注回调"></a><strong>关注回调</strong></h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span><span class="string">&quot;app_subscribe&quot;</span><span class="punctuation">,</span><span class="comment">//动作，app_subscribe 表示用户关注应用回调，后期可能会添加其他动作，请做好兼容。</span></span><br><span class="line">  <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;appId&quot;</span><span class="punctuation">:</span><span class="number">123</span><span class="punctuation">,</span><span class="comment">//创建的应用ID</span></span><br><span class="line">    <span class="attr">&quot;appKey&quot;</span><span class="punctuation">:</span><span class="string">&quot;AK_xxxxxx&quot;</span><span class="punctuation">,</span> <span class="comment">//关注应用的appKey，请不要再使用，将来可能会被删除</span></span><br><span class="line">    <span class="attr">&quot;appName&quot;</span><span class="punctuation">:</span><span class="string">&quot;应用名字&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;source&quot;</span><span class="punctuation">:</span><span class="string">&quot;scan&quot;</span><span class="punctuation">,</span> <span class="comment">//用户关注渠道，scan表示扫码关注，link表示链接关注，command表示通过消息关注应用，后期可能还会添加其他渠道。</span></span><br><span class="line">    <span class="attr">&quot;userName&quot;</span><span class="punctuation">:</span><span class="string">&quot;wxpusher&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;userHeadImg&quot;</span><span class="punctuation">:</span><span class="string">&quot;http://xxxxx/132&quot;</span><span class="punctuation">,</span><span class="comment">//最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空</span></span><br><span class="line">    <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span><span class="number">1569416451573</span><span class="punctuation">,</span> <span class="comment">//消息发生时间</span></span><br><span class="line">    <span class="attr">&quot;uid&quot;</span><span class="punctuation">:</span><span class="string">&quot;UID_xxxxxx&quot;</span><span class="punctuation">,</span> <span class="comment">//用户uid</span></span><br><span class="line">    <span class="attr">&quot;extra&quot;</span><span class="punctuation">:</span><span class="string">&quot;xxx&quot;</span>    <span class="comment">//用户扫描带参数的二维码，二维码携带的参数。扫描默认二维码为空</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="上行消息回调"><a href="#上行消息回调" class="headerlink" title="上行消息回调"></a><strong>上行消息回调</strong></h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span><span class="string">&quot;send_up_cmd&quot;</span><span class="punctuation">,</span><span class="comment">//动作，send_up_cmd 表示上行消息回调，后期可能会添加其他动作，请做好兼容。</span></span><br><span class="line">    <span class="attr">&quot;data&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;uid&quot;</span><span class="punctuation">:</span><span class="string">&quot;UID_xxx&quot;</span><span class="punctuation">,</span><span class="comment">//用户uid</span></span><br><span class="line">        <span class="attr">&quot;appId&quot;</span><span class="punctuation">:</span><span class="number">97</span><span class="punctuation">,</span> <span class="comment">//应用id</span></span><br><span class="line">        <span class="attr">&quot;appKey&quot;</span><span class="punctuation">:</span><span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span><span class="comment">//废弃字段</span></span><br><span class="line">        <span class="attr">&quot;appName&quot;</span><span class="punctuation">:</span><span class="string">&quot;WxPusher演示&quot;</span><span class="punctuation">,</span><span class="comment">//应用名称</span></span><br><span class="line">        <span class="attr">&quot;userName&quot;</span><span class="punctuation">:</span><span class="string">&quot;小明&quot;</span><span class="punctuation">,</span><span class="comment">//用户昵称</span></span><br><span class="line">        <span class="attr">&quot;userHeadImg&quot;</span><span class="punctuation">:</span><span class="string">&quot;http://thirdwx.qlogo.cn/mmopen/xxx/132&quot;</span><span class="punctuation">,</span><span class="comment">//最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空</span></span><br><span class="line">        <span class="attr">&quot;time&quot;</span><span class="punctuation">:</span><span class="number">1603002697386</span><span class="punctuation">,</span><span class="comment">//发生时间</span></span><br><span class="line">        <span class="attr">&quot;content&quot;</span><span class="punctuation">:</span><span class="string">&quot;内容&quot;</span> <span class="comment">//用户发送的内容</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="模板消息和内信"><a href="#模板消息和内信" class="headerlink" title="模板消息和内信"></a><strong>模板消息和内信</strong></h3><p>微信官方限制微信公众号发送内信(聊天消息)的数量. <a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/customer-message/send.html">文档</a></p><p>所以有模版消息的出现, 代替内信实现非用户交互时段下的消息下发.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;随着我在服务器上部署的软件越来越多,我也需要一个方便的通知推送来让我知道我的服务器发生了什么事.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>Elog 文章模板</title>
    <link href="https://www.cnzw.top/p/52606/"/>
    <id>https://www.cnzw.top/p/52606/</id>
    <published>2021-01-28T14:03:00.000Z</published>
    <updated>2025-06-27T03:10:27.000Z</updated>
    
    <content type="html"><![CDATA[<p>写法        解释</p><p>title        【必需】页面标题</p><p>date        【必需】页面创建日期</p><p>type        【必需】标签、分类和友情链接三个页面需要配置</p><p>updated        【可选】页面更新日期</p><p>description        【可选】页面描述</p><p>keywords        【可选】页面关键字</p><p>comments        【可选】显示页面评论模块 (默认 true)</p><p>top_img        【可选】页面顶部图片</p><p>mathjax        【可选】显示mathjax (当设置mathjax的per_page: false时，才需要配置，默认 false)</p><p>katex        【可选】显示katex (当设置katex的per_page: false时，才需要配置，默认 false)</p><p>aside        【可选】显示侧边栏 (默认 true)</p><p>aplayer        【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置</p><p>highlight_shrink        【可选】配置代码框是否展开 (true&#x2F;false) (默认为设置中highlight_shrink的配置)</p><p>random        【可选】配置友情链接是否随机排序（默认为 false)</p><p>作者: Jerry</p><p>連結: <a href="https://butterfly.js.org/posts/dc584b87/#Page-Front-matter">https://butterfly.js.org/posts/dc584b87/#Page-Front-matter</a></p><p>來源: Butterfly</p><h2 id="著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。"><a href="#著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。" class="headerlink" title="著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。"></a>著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。</h2><p>写法        解释</p><p>title        【必需】文章标题</p><p>date        【必需】文章创建日期</p><p>updated        【可选】文章更新日期</p><p>tags        【可选】文章标签</p><p>categories        【可选】文章分类</p><p>keywords        【可选】文章关键字</p><p>description        【可选】文章描述</p><p>top_img        【可选】文章顶部图片</p><p>cover        【可选】文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图，可设为false&#x2F;图片地址&#x2F;留空)</p><p>comments        【可选】显示文章评论模块(默认 true)</p><p>toc        【可选】显示文章TOC(默认为设置中toc的enable配置)</p><p>toc_number        【可选】显示toc_number(默认为设置中toc的number配置)</p><p>toc_style_simple        【可选】显示 toc 简洁模式</p><p>copyright        【可选】显示文章版权模块(默认为设置中post_copyright的enable配置)</p><p>copyright_author        【可选】文章版权模块的文章作者</p><p>copyright_author_href        【可选】文章版权模块的文章作者链接</p><p>copyright_url        【可选】文章版权模块的文章连结链接</p><p>copyright_info        【可选】文章版权模块的版权声明文字</p><p>mathjax        【可选】显示mathjax(当设置 mathjax 的 per_page: false 时，才需要配置，默认 false )</p><p>katex        【可选】显示 katex (当设置 katex 的 per_page: false 时，才需要配置，默认 false )</p><p>aplayer        【可选】在需要的页面加载 aplayer 的 js 和 css,请参考文章下面的音乐 配置</p><p>highlight_shrink        【可选】配置代码框是否展开(true&#x2F;false)(默认为设置中 highlight_shrink 的配置)</p><p>aside        【可选】显示侧边栏 (默认 true)</p><p>abcjs        【可选】加载 abcjs (当设置 abcjs 的 per_page: false 时，才需要配置，默认 false )</p><p>作者: Jerry</p><p>連結: <a href="https://butterfly.js.org/posts/dc584b87/#Post-Front-matter">https://butterfly.js.org/posts/dc584b87/#Post-Front-matter</a></p><p>來源: Butterfly</p><p>著作權歸作者所有。商業轉載請聯繫作者獲得授權，非商業轉載請註明出處。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;写法        解释&lt;/p&gt;
&lt;p&gt;title        【必需】页面标题&lt;/p&gt;
&lt;p&gt;date        【必需】页面创建日期&lt;/p&gt;
&lt;p&gt;type        【必需】标签、分类和友情链接三个页面需要配置&lt;/p&gt;
&lt;p&gt;updated        【</summary>
      
    
    
    
    <category term="Minecraft" scheme="https://www.cnzw.top/categories/Minecraft/"/>
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/Minecraft/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>一次关于智能家居网关的折腾</title>
    <link href="https://www.cnzw.top/p/26896/"/>
    <id>https://www.cnzw.top/p/26896/</id>
    <published>2021-01-28T14:03:00.000Z</published>
    <updated>2024-03-28T05:13:46.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原标题: 一次超出能力范围的尝试</p></blockquote><p>最近家里的智能家居被修复了(喊人修了一下午)</p><p>于是想把控制智能家居的接口扒出来,自己封装成wx小程序</p><p>应用类型: 智能家居控制</p><p>特征: 支持米家第三方控制, 局域网直连(无视账户绑定), APP控制.</p><h1 id="网关通信数据获取"><a href="#网关通信数据获取" class="headerlink" title="网关通信数据获取"></a>网关通信数据获取</h1><h2 id="抓包"><a href="#抓包" class="headerlink" title="抓包"></a>抓包</h2><p>首先想到的是抓包, 直接扒出接口.</p><p>应用的用户鉴权是走的HTTPS协议, 可以直接扒出来.</p><p>用户登录, 注册, 找回密码, 查询网关绑定(改绑), 用户信息, 修改密码, 操作日志. 这些都有接口(没错就是没有用户登出).</p><p>从查询绑定接口可以获得网关ID, 网关Code(类似校验码); 从操作日志可以获得各个智能家居元件的ID.</p><p>服务器是杭州阿里云, 鉴权接口是Java写的.(1&#x2F;26)</p><p>但是关键的控制数据走的是TLSv1.2.</p><p>而且包裹的不是HTTP协议, 而是其他数据, 尝试了Fiddler&#x2F;Wireshark&#x2F;Charles均扒不出内容无奈放弃.</p><p>借此熟悉了TCP三次握手&#x2F;TLS四次握手&#x2F;中间人攻击, 也算没有白折腾一趟吧.(1&#x2F;28)</p><h2 id="米家"><a href="#米家" class="headerlink" title="米家"></a>米家</h2><p>随后想了一下能不能通过米家曲线救国.</p><p>然后跑去米家官网查阅了第三方接入的文档 <a href="https://iot.mi.com/new/doc/guidelines-for-access/cloud-access/config-params">小米IoT开发者平台文档</a></p><p>发现是通过OAuth进行交互的, 那就没我啥事了…(1&#x2F;28)</p><p>这几天没事又看了一遍米家文档(顺便熟悉OAuth)(2&#x2F;21)</p><h2 id="局域网"><a href="#局域网" class="headerlink" title="局域网"></a>局域网</h2><p>那最后只有通过局域网方式解决了, 不行的话只能放弃, 用他开发的APP.</p><p>使用tcpdump抓取的APP局域网数据:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">C -&gt; 255.255.255.255:8818 574d05383838383838 //UDP广播五次</span><br><span class="line">S -&gt; C 574d0500c0a800670000000000000000000000000000000000158d00020365e8 //UDP回复 8-16是IP地址 -16是网关ID\r\n//TCP三次握手 (直到程序退出或其他原因断线)</span><br><span class="line">C &lt;-&gt; S:8018</span><br><span class="line">C -&gt; S 085f0100006801</span><br><span class="line">S -&gt; C 085f05000068019a5399bc //类似于FTP的Hello.(1/30)</span><br><span class="line">//随后是传输所有设备数据/区域分类/情景模式.</span><br><span class="line">//如果客户端已经有缓存, 就只传输设备开关状态.(2/1)</span><br><span class="line">//控制数据已经可以复现请求了, 但是是无序的(最少我没找到规律).(2/2)</span><br></pre></td></tr></table></figure><p>好消息是成功获取到了局域网下APP请求网关的控制数据, 并且网关没有校验流程(直接TCP连上就可以发送控制数据, 没有任何校验), 且控制数据看来长期不会变.</p><p>坏消息是每个设备的控制数据是无序的, 只能挨个请求并记录.</p><p>已经在着手编写PC的模拟请求了, 使用的是E(复现和记录控制数据用).(2&#x2F;3)</p><p>着手编写基于PHP的模拟请求.</p><h3 id="为啥不直接内网穿透-DDNS呢"><a href="#为啥不直接内网穿透-DDNS呢" class="headerlink" title="为啥不直接内网穿透+DDNS呢?"></a>为啥不直接内网穿透+DDNS呢?</h3><ol><li><p>首先当然是没钱, 家里的路由器过老, 没有各自服务商的DDNS服务, 只有向日葵的DDNS.(流量少还不支持自定义域名)</p></li><li><p>自己有云服务器可以整frp穿透.</p></li><li><p>wx小程序<strong>不支持TCP Socket</strong>, 所以需要”第三方”才能传递数据到网关.</p></li><li><p>直接暴露网关的TCP端口是非常不安全的, 所以我准备wx小程序封装-&gt;云主机反向代理-&gt;内网穿透-&gt;内网PHP来实现.</p></li></ol><h1 id="网关通讯程序编写"><a href="#网关通讯程序编写" class="headerlink" title="网关通讯程序编写"></a>网关通讯程序编写</h1><h2 id="E"><a href="#E" class="headerlink" title="E"></a>E</h2><p>自带的数据报(UDP广播)组件不支持显示对方IP.</p><p>随后折腾了HP-Socket, 尝试了”UDPCast””UDPServer””UDPClient”+各种参数组合后仍然拿不到对方IP.</p><p>最后突发奇想提取了网关UDP回应里第二段字符才发现这是十六进制的IPv4地址!!!</p><p>随后就是tcpdump抓取APP请求-&gt;Wireshark跟踪TCP流-&gt;E复现并记录数据, 记录了家里所有设备的控制数据.(2&#x2F;5)</p><h2 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h2><p>最开始想的是HTTPS请求, 然后在翻PHP TCP&#x2F;UDP通信相关文档时发现了WebSocket也许更适合这个项目.(wx小程序也支持WebSocket)</p><p>主要实现WebSocket的框架有俩, 一个是Swoole, 一个是Workerman. Swoole几乎没有对Win的支持, 放弃.(内网机器是Win兼任的)</p><p>Workerman实现WebSocket的方法异常简单, 直接照抄代码在对应的接收事件里写自己的代码即可.</p><p>我在WebSocket传输数据是使用JSON的, 共三个操作(UDP&#x2F;TCP&#x2F;HEATBEAT).</p><p>但是实际编写代码时还是遇到一些困难:</p><p>socket_recv() 在接收TCP&#x2F;UDP数据时必须要收到才会返回, 收不到就阻塞线程. 定位问题就费了老大功夫(因为WebSocket不会因为这个断连).</p><p>最后找到解决方案:</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_ invoke__">socket_set_option</span>(<span class="variable">$socket</span>, SOL_SOCKET, SO_RCVTIMEO, <span class="title function_ invoke__">Array</span>(<span class="string">&quot;sec&quot;</span>=&gt;<span class="number">2</span>, <span class="string">&quot;usec&quot;</span>=&gt;<span class="number">0</span>)); <span class="comment">//RECV超时两秒就返回</span></span><br><span class="line"><span class="title function_ invoke__">socket_set_option</span>(<span class="variable">$socket</span>, SOL_SOCKET, SO_SNDTIMEO, <span class="title function_ invoke__">Array</span>(<span class="string">&quot;sec&quot;</span>=&gt;<span class="number">2</span>, <span class="string">&quot;usec&quot;</span>=&gt;<span class="number">0</span>)); <span class="comment">//SEND超时两秒就返回</span></span><br></pre></td></tr></table></figure><p>因为TCP&#x2F;UDP的返回数据是十六进制的, 刚开始我是直接 json_encode() 就走WebSocket了. </p><p>然后在传输有些十六进制数据的时候 json_encode() 会FALSE, 返回空数据.</p><p>解决方法非常简单: (我还在 pack() 上纠结了许久)</p><p>hex2bin()&#x2F;bin2hex() 俩兄弟用一下就不会出现这些问题了</p><p>PHP端实现通过WebSocket与网关通信(UDP&#x2F;TCP).(2&#x2F;7)</p><p>PS. 推荐一个WebSocket测试的网址（<a href="http://www.easyswoole.com/wstool.html">EasySwoole-WebSocket在线测试工具</a>）带cookie记忆和心跳包发送功能, 我WebSocket测试全程用的这个.</p><p>在部署的是使用小皮面板(XP.CN), 全身上下都是坑(比如重启Apache覆盖httpd.conf配置), 都是解决的就不说了. 完成了frp穿透, 实现wss访问.(2&#x2F;8)</p><h2 id="wx小程序编写"><a href="#wx小程序编写" class="headerlink" title="wx小程序编写"></a>wx小程序编写</h2><p><del>几乎没接触过, 这个真的要容我折腾几天.</del></p><p><del>写了个demo, 实现了设备列表交互和ws通信</del></p><p><strong>放弃</strong>, 这个小程序的功能分类和我脆弱的CSS能力几乎过不了审核.(2&#x2F;9)</p><h2 id="控制网页的编写"><a href="#控制网页的编写" class="headerlink" title="控制网页的编写"></a>控制网页的编写</h2><p>我倾向于使用Vue来写网页.(虽然我只会写单页, 路由和Cli都不会)</p><p>虽然基础薄弱, 也就当练手的项目吧. 网页相比wx小程序限制更小, 也可以用第三方组件库.<del>弥补我脆弱的CSS基础</del></p><p>网页会部署在内网服务器, 走frp(HTTPS)穿透来实现外网访问.(主要还是内网使用, 穿透只是为了以防万一)</p><h3 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h3><ol><li><p>页面完成.(2&#x2F;11)</p></li><li><p>Vue.js 复习.(2&#x2F;12)(春节快乐!)</p></li><li><p>完成demo.(2&#x2F;13)</p></li><li><p>修改页面, 对小屏(手机)页面更加友好.(2&#x2F;15)</p></li><li><p>完善错误处理流程, 按钮点击流程.(2&#x2F;17)(过年这几天出去玩了)</p></li></ol><h2 id="项目总览"><a href="#项目总览" class="headerlink" title="项目总览"></a>项目总览</h2><p>下面回顾一下我为了方便控制家里的智能家居都做了什么事吧</p><p>使用网页进行交互.</p><p>HTML&#x2F;CSS 使用第三方组件 <a href="https://www.layui.com/">www.layui.com</a></p><p>JS 使用Vue.js</p><h3 id="Vue-js"><a href="#Vue-js" class="headerlink" title="Vue.js"></a>Vue.js</h3><p>提前使用第三方组件搭建出家里的布局, 绑定 @click + 传递参数 传递点击的具体区域.</p><p>使用Json存储家中不同区域的设备, 根据 @click 传递的参数再用 v-for 显示设备按钮, 以供点击.</p><p>使用WebSocket与后端进行通信, 做了错误处理和消息返回.</p><h3 id="后端"><a href="#后端" class="headerlink" title="后端"></a>后端</h3><p>后端使用PHP, Workerman实现Websocket通信, 使用PHP自带的TCP通讯函数实现与网关的TCP通讯.</p><p>服务器在家中内网, 使用frp穿透实现远程控制, 但是大多数操作都在内网完成, 穿透仅作为备用手段.</p><p>服务器使用定时任务上报状态到我的云主机, 云主机也使用定时任务检测家中服务器是否上报.</p><p>如无上报就通过 Server酱-&gt;Bark 推送消息到我的手机提醒.</p><p>控制智能设备的网关品牌为HBANG, 其他具体的情况我在上文已经写出了.(是我这的本地品牌哦)</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>这次尝试让我拓展了许多知识: TCP&#x2F;TLS握手挥手过程, 如何在电脑和手机上进行抓包, PHP中TCP通讯相关函数, WX小程序编写(萌新), Vue编写页面实战.</p><p>从开始到结束跨度半个多月(1&#x2F;27 - 2&#x2F;17), 上一次有这个热情还是在折腾MC服务器的时候.</p><p>感谢父母的鼓励<del>和神奇的百度</del>和支持.</p><p>如果没有意外的话, 这次的尝试就到此为止了, 我已经实现了我想要的功能, 也获得不少新的姿势.</p><p><strong>2021 &#x2F; 12 &#x2F; 17 —-Cnzw</strong></p><p><del>真难</del></p><p><a href="https://www.cnblogs.com/cocowool/p/wireshark_tcp_http.html">Wireshark使用入门 - Cocowool - 博客园</a></p><p><a href="https://www.cnblogs.com/mq0036/p/11187138.html">wireshark抓包新手使用教程 - jack_Meng - 博客园</a></p><p><a href="https://www.androidtcpdump.com/android-tcpdump/downloads">tcpdump Binary Downloads (32 Bit) | Android tcpdump</a></p><p><a href="https://blog.csdn.net/whatday/article/details/86493505">tcpdump for Android 移动端抓包</a></p><p><a href="https://www.jianshu.com/p/909dac698967">Android实时抓包：tcpdump+nc+wireshark</a></p><p><a href="https://blog.51cto.com/sunzeduo/1346226">使用wireshark 动态显示Android应用中的联网数据_51CTO博客_Android wireshark</a></p><p><a href="https://blog.csdn.net/xy010902100449/article/details/48274635">TCP 握手和挥手图解(有限状态机)_tlcp 连接-CSDN博客</a></p><p>坑-1:</p><p>adb版本过旧导致的安卓设备offline</p><p><a href="https://adbshell.com/downloads">Downloads - ADB Shell</a></p><p>坑-2:</p><p>WOL唤醒(Wake On Lan), 不能用半吊子的工具唤醒.</p><p>用正经的…害得我BIOS&#x2F;网卡设置折腾了半天(最后是2006年的一个26K的exe唤醒的).</p><p><del>稍后会尝试frpc的WOL唤醒.</del>成功是成功了, 但是不打算用.(没有第二台设备搭载frp实现WOL唤醒)</p><p>坑-3:</p><p>Vue配合axios使用时json数据保存失败的情况.</p><p>详情 -&gt; <a href="https://forum.vuejs.org/t/axios-null/111501">vuejs&#x2F;core · Discussions</a></p><p>最后也没找到解决方案, 只能换用 vue-resource.</p><p>&#x2F;data&#x2F;local&#x2F;tcpdump -i any -p -s 0 -w &#x2F;sdcard&#x2F;capture.pcap\r\nadb pull &#x2F;sdcard&#x2F;capture.pcap capture.pcap </p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原标题: 一次超出能力范围的尝试&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近家里的智能家居被修复了(喊人修了一下午)&lt;/p&gt;
&lt;p&gt;于是想把控制智能家居的接口扒出来,自己封装成wx小程序&lt;/p&gt;
&lt;p&gt;应用类型: 智能家居控制&lt;/p&gt;
&lt;p&gt;特</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
    <category term="家庭网络" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>中国移动 GS3101 超级管理员获取</title>
    <link href="https://www.cnzw.top/p/35580/"/>
    <id>https://www.cnzw.top/p/35580/</id>
    <published>2021-01-20T12:35:00.000Z</published>
    <updated>2024-03-28T05:13:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>家里是中国移动宽带, 使用 GS3101 光猫.</p><p>本文引用 <a href="https://note.guotianyu.cn/Archive/crack-gs3103-cmccadmin.html">关于破解移动宽带光猫 型号: GS3101 超级管理员密码</a></p><h1 id="登陆路由器打开Telnet"><a href="#登陆路由器打开Telnet" class="headerlink" title="登陆路由器打开Telnet"></a>登陆路由器打开Telnet</h1><p>打开路由器管理地址<code>192.168.1.1</code>(因人而异), 先使用路由器后面的账号密码登陆到路由器中.</p><p>登陆路由器之后打开这个地址 <a href="http://192.168.1.1/cgi-bin/getGateWay.cgi">http://192.168.1.1/cgi-bin/getGateWay.cgi</a>, 用于<strong>打开路由器Telnet功能</strong>, 页面返回Yes字样一般即为成功. (第一次访问时可能为No 多第二次就变了)</p><h1 id="连接Telnet"><a href="#连接Telnet" class="headerlink" title="连接Telnet"></a>连接Telnet</h1><p>Windows 10 需启用 Telnet 功能, 百度可解.</p><p><code>telnet 192.168.1.1</code></p><p>账号为<code>admin</code>密码为<code>s2@We3%Dc#</code></p><p>登陆成功后输入<code>cat /tmp/ctromfile.cfg | grep \&#39;Admin\&#39;</code> 就可以查看超级管理员的密码</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># cat /tmp/ctromfile.cfg | grep \&#x27;Admin\&#x27;</span><br><span class="line">&lt;Entry0 Active=\&quot;Yes\&quot; username=\&quot;CMCCAdmin\&quot; web_passwd=\&quot;aDm8H%MdA\&quot;</span><br></pre></td></tr></table></figure><p>由此可得超级管理员账号密码<code>CMCCAdmin</code> <code>aDm8H%MdA</code></p><p>嗯… 是通用的</p><p>PS: 又发现一位大佬 <a href="https://bbs.luobotou.org/thread-47185-1-1.html">移动GS3101光猫桥接设置教程与一些零碎的联想</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;家里是中国移动宽带, 使用 GS3101 光猫.&lt;/p&gt;
&lt;p&gt;本文引用 &lt;a href=&quot;https://note.guotianyu.cn/Archive/crack-gs3103-cmccadmin.html&quot;&gt;关于破解移动宽带光猫 型号: GS3101 超级管理员密</summary>
      
    
    
    
    <category term="折腾" scheme="https://www.cnzw.top/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
    <category term="家庭网络" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/%E5%AE%B6%E5%BA%AD%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>新年快乐!</title>
    <link href="https://www.cnzw.top/p/28267/"/>
    <id>https://www.cnzw.top/p/28267/</id>
    <published>2020-12-31T13:47:00.000Z</published>
    <updated>2024-01-29T09:14:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>2021 新年快乐！</p><p><a href="https://tv.cctv.com/2020/12/31/VIDEARNP0V59lWV9GkWpCNSU201231.shtml">国家主席习近平发表二〇二一年新年贺词</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;2021 新年快乐！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tv.cctv.com/2020/12/31/VIDEARNP0V59lWV9GkWpCNSU201231.shtml&quot;&gt;国家主席习近平发表二〇二一年新年贺词&lt;/a&gt;&lt;/p&gt;
</summary>
      
    
    
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
  <entry>
    <title>论如何正确使 Jdk 和 Jre 共存</title>
    <link href="https://www.cnzw.top/p/32289/"/>
    <id>https://www.cnzw.top/p/32289/</id>
    <published>2020-10-03T09:43:00.000Z</published>
    <updated>2024-01-26T08:20:43.000Z</updated>
    
    <content type="html"><![CDATA[<p>作者：文墨闲谈</p><p>链接：<a href="https://www.zhihu.com/question/28428426/answer/114375451">https://www.zhihu.com/question/28428426/answer/114375451</a></p><p>来源：知乎</p><p>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p><p>原因：这是因为安装 java 时把 jdk 的路径和 jre 的路径选择成一样，就造成覆盖了。</p><p>这时候你在 lib 下也找不到 tools.jar 和 dt.jar.</p><p>解决：</p><ol><li>首先卸载 java ,卸载很容易，直接把这两个有关 java 的程序给卸载了就行了（用 windows 自带的卸载）。</li></ol><p>卸载完你也会发现，原来放 java 的文件夹也空了。</p><ol><li><p>重新安装在 D 盘新建一个 java 文件夹，在 java 文件下新建两个文件夹，分别命名为 jdk 和 jre.</p></li><li><p>双击程序进行安装，安装时有两次选择路径的机会，第一次是让你选择 jdk 安装路径，选择为 D:\java\jdk，第二次是让你选择 jre 的安装路径，选择为 D:\java\jre</p></li><li><p>安装完成后，进行环境变量的配置，计算机右击属性，-高级系统设置-环境变量-选择下边的系统变量</p></li><li><p>创建系统变量</p></li></ol><p>新建变量名：<code>Path</code></p><p>变量值：<code>C:\ProgramData\Oracle\Java\javapath;%java_home%\bin;%java_home%\jre\bin</code></p><p>新建变量名：<code>JAVA_HOME</code></p><p>变量值：<code>D:\java\jdk</code></p><p>新建变量名：<code>ClassPath</code></p><p>变量值：<code>.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;</code></p><p>之所以把 JAVA_HOME 设为 D:\java\jdk, 是因为安装过程中生成的 dt.jar,tools.jar 是放在了 D:\java\jdk\lib 目录下，它都是 jdk 的东西。</p><p>classPath 用 JAVA_HOME 来做一个相对路径。</p><p>所以 JAVA_HOME 必须是 jdk 的安装目录，且后面不可以有分号，若它后面有分号，则 %JAVA_HOME%\lib\dt.jar就不是一个目录了。</p><ol><li>测试打开 cmd, 输入 java, 输入 javac, 输入 java -version 都有反应就代表安装成功</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;作者：文墨闲谈&lt;/p&gt;
&lt;p&gt;链接：&lt;a href=&quot;https://www.zhihu.com/question/28428426/answer/114375451&quot;&gt;https://www.zhihu.com/question/28428426/answer/11437</summary>
      
    
    
    
    <category term="Minecraft" scheme="https://www.cnzw.top/categories/Minecraft/"/>
    
    
    <category term="typecho" scheme="https://www.cnzw.top/%E6%A0%87%E7%AD%BE/typecho/"/>
    
  </entry>
  
</feed>
