<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>运来</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>http://24hl.cn/</id>
  <link href="http://24hl.cn/" rel="alternate"/>
  <link href="http://24hl.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 运来</rights>
  <subtitle>分享与收获</subtitle>
  <title>运来</title>
  <updated>2026-10-07T02:55:08.000Z</updated>
  <entry>
    <author>
      <name>运来</name>
    </author>
    <category term="日常记录" scheme="http://24hl.cn/categories/%E6%97%A5%E5%B8%B8%E8%AE%B0%E5%BD%95/"/>
    <category term="配置" scheme="http://24hl.cn/tags/%E9%85%8D%E7%BD%AE/"/>
    <category term="macOS" scheme="http://24hl.cn/tags/macOS/"/>
    <content>
      <![CDATA[<html><head></head><body><p>记录一下运来的 macOS 配置习惯，之前也记录过 macOS 软件清单，方便以后更换换设备重新配置，也顺便给其他网友做个配置参考，让大家少走一点配置环境的弯路。</p><h1 id="系统设置"><a href="#系统设置" class="headerlink" title="系统设置"></a> 系统设置</h1><h2 id="实用命令"><a href="#实用命令" class="headerlink" title="实用命令"></a> 实用命令</h2><ol><li><p><strong>xcode 命令行工具</strong></p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">xcode-select --install</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>允许安装任意来源的 App</strong></p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 执行以下命令</span></span><br><span class="line"><span class="comment"># 进入「系统设置」-&gt;「隐私与安全性」-&gt;「安全性」，允许任何来源</span></span><br><span class="line"><span class="built_in">sudo</span> spctl --master-disable</span><br></pre></td></tr></tbody></table></figure></li><li><p>移除 APP「隔离属性」（APP 已损坏提示）</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">sudo</span> xattr -rd com.apple.quarantine /Applications/[your_app_name]</span><br></pre></td></tr></tbody></table></figure></li></ol><h2 id="关闭-SIP（系统完整性保护）"><a href="#关闭-SIP（系统完整性保护）" class="headerlink" title="关闭 SIP（系统完整性保护）"></a> 关闭 SIP（系统完整性保护）</h2><ol><li>将 Mac 完全关机</li><li>长按 **「电源键」<strong>直至出现启动选项，进入</strong>「恢复模式」**</li><li>在顶部菜单栏，点击 <strong>「实用工具」 &gt;「终端」</strong></li><li>在终端中输入以下命令并执行： <code>csrutil disable</code></li><li>重启 Mac</li></ol><h1 id="软件设置"><a href="#软件设置" class="headerlink" title="软件设置"></a> 软件设置</h1><h2 id="iTerm2"><a href="#iTerm2" class="headerlink" title="iTerm2"></a> iTerm2</h2><p>主题运来选择的是自带的 <strong>「Minima」</strong>， Status bar location 选择 <strong>「Bottom」</strong> 在底部显示</p><p><img src="https://oss.24hl.cn/post/2026/10/05/4a5902892adbfec8.webp" alt="PixPin_2026-10-05_15-49-08"></p><p>新建一个自己的配置，并设置为默认 <strong>「Set as Default」</strong></p><ul><li><p>字体：<a href="https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf">MesloLGS NF Regular.ttf</a></p></li><li><p>字体大小：16</p></li></ul><p><img src="https://oss.24hl.cn/post/2026/10/05/abd3424e98389ee4.webp" alt="PixPin_2026-10-05_18-41-14"></p><p>运来的窗口设置一些喜好</p><p><img src="https://oss.24hl.cn/post/2026/10/05/ada9d6168b969ba1.webp" alt="PixPin_2026-10-05_16-04-02"></p><p><img src="https://oss.24hl.cn/post/2026/10/05/4810061de810ba45.webp" alt="PixPin_2026-10-05_16-04-42"></p><p>设置底部 Status bar</p><p><img src="https://oss.24hl.cn/post/2026/10/05/3d63b13e0b6d16c7.webp" alt="PixPin_2026-10-05_16-09-28"></p><p><img src="https://oss.24hl.cn/post/2026/10/05/90f5c62a9183e124.webp" alt="PixPin_2026-10-05_16-18-01"></p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">CPU</span><br><span class="line">Text Color: dba3a2</span><br><span class="line"></span><br><span class="line">Memory</span><br><span class="line">Text Color: b8e3a7</span><br><span class="line"></span><br><span class="line">Network Throughput</span><br><span class="line">Text Color: a5b8e1</span><br><span class="line">Download Color: 3eaaff</span><br><span class="line">Download Text Color: 3eaaff</span><br><span class="line">Upload Color: eb88ff</span><br><span class="line">Upload Text Color: eb88ff</span><br><span class="line"></span><br><span class="line">Current Directory</span><br><span class="line">Text Color: 7876df</span><br></pre></td></tr></tbody></table></figure><h2 id="Burp-安装与配置"><a href="#Burp-安装与配置" class="headerlink" title="Burp 安装与配置"></a> Burp 安装与配置</h2><ul><li><strong>官方下载</strong>: <a href="https://portswigger.net/burp/releases">Burp Suite Releases</a></li><li><strong>破解汉化</strong>: <a href="https://github.com/Leon406/BurpSuiteCN-Release/releases">burpsuitloader-all</a></li></ul><p><strong>破解流程</strong>:</p><ol><li><p>将下载的 <code>burpsuitloader-4.11.22-all.jar</code> 放入 Burp 的应用资源目录： </p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> <span class="string">'/Applications/Burp Suite.app/Contents/Resources/app'</span> &amp;&amp; open .</span><br></pre></td></tr></tbody></table></figure></li><li><p>编辑 Burp 的虚拟机选项文件 <code>/Applications/Burp Suite.app/Contents/vmoptions.txt</code>，添加以下行： </p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">--add-opens=java.base/java.lang=ALL-UNNAMED</span><br><span class="line">--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED</span><br><span class="line">--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED</span><br><span class="line">--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED</span><br><span class="line">-javaagent:burpsuitloader-4.11.22-all.jar=loader,han -noverify</span><br></pre></td></tr></tbody></table></figure></li><li><p>替换 Burp <code>/Applications/Burp Suite.app/Contents/Resources/jre.bundle/Contents</code></p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> <span class="string">'/Applications/Burp Suite.app/Contents/Resources/jre.bundle/'</span></span><br><span class="line"><span class="built_in">mv</span> Contents Contents.bak</span><br><span class="line"><span class="built_in">cp</span> -R /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents Contents</span><br></pre></td></tr></tbody></table></figure></li><li><p>从注册机界面点击 <strong>Run</strong> 启动 Burp Suite，完成授权后即可正常使用。</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 注意需要 jdk21</span></span><br><span class="line">java -jar burpsuitloader-4.11.22-all.jar</span><br></pre></td></tr></tbody></table></figure></li></ol><h1 id="开发配置"><a href="#开发配置" class="headerlink" title="开发配置"></a> 开发配置</h1><h2 id="oh-my-zsh"><a href="#oh-my-zsh" class="headerlink" title="oh-my-zsh"></a> oh-my-zsh</h2><p>安装：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">sh -c <span class="string">"<span class="subst">$(curl -fsSL https://gitee.com/pocmon/ohmyzsh/raw/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></tbody></table></figure><p>安装插件：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 自动建议提示接下来可能要输入的命令</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-autosuggestions <span class="variable">${ZSH_CUSTOM:-~/.oh-my-zsh/custom}</span>/plugins/zsh-autosuggestions</span><br><span class="line"></span><br><span class="line"><span class="comment"># 命令语法检测</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/zsh-users/zsh-syntax-highlighting.git <span class="variable">${ZSH_CUSTOM:-~/.oh-my-zsh/custom}</span>/plugins/zsh-syntax-highlighting</span><br></pre></td></tr></tbody></table></figure><p>在 <code>~/.zshrc</code> 中配置启用这些插件：</p><ul><li><code>z</code>：内置插件，使用 z [目录名] 快速跳转到访问过的路径</li><li><code>extract</code>：内置插件，使用 x filename.tar.gz 解压各种格式的压缩包</li><li><code>sudo</code>：内置插件，双击「ESC」，再命令前快速加 sudo</li><li><code>web-search</code>：内置插件，快速网页搜索，使用 google [搜索内容]</li><li><code>encode64</code>：内置插件，快速 base64 编码</li><li><code>python</code>：python 增强工具<ul><li><code>py</code>：运行 python3</li><li><code>mkv</code>：创建虚拟环境</li><li><code>vrun</code>：激活虚拟环境</li><li><code>pyfind</code>：递归查找。py 文件</li><li><code>pyclean</code>：清理字节码和缓存</li><li><code>pygrep</code>：在。py 文件中递归搜索文本</li></ul></li><li><code>git</code>：提供丰富的 git 别名<ul><li><code>gst</code> -&gt; <code>git status</code></li><li><code>ga</code> -&gt; <code>git add</code></li><li><code>gcmsg</code> -&gt; <code>git commit -m</code></li><li><code>gp</code> -&gt; <code>git push</code></li></ul></li></ul><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">plugins=(python git z extract zsh-syntax-highlighting zsh-autosuggestions sudo web-search encode64 br    ew adb docker)</span><br><span class="line"></span><br><span class="line"># 若存在 python 虚拟环境 venv 目录，则自动激活</span><br><span class="line">PYTHON_AUTO_VRUN=true</span><br><span class="line">PYTHON_VENV_NAME="venv"</span><br></pre></td></tr></tbody></table></figure><p>安装主题：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># Powerlevel10k 主题</span></span><br><span class="line">git <span class="built_in">clone</span> --depth=1 https://github.com/romkatv/powerlevel10k.git <span class="variable">${ZSH_CUSTOM:-<span class="variable">$HOME</span>/.oh-my-zsh/custom}</span>/themes/powerlevel10k</span><br></pre></td></tr></tbody></table></figure><p>在 <code>~/.zshrc</code> 中配置启用 Powerlevel10k 主题：</p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">ZSH_THEME="powerlevel10k/powerlevel10k"</span><br></pre></td></tr></tbody></table></figure><p>其他配置：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 关掉 URL 反斜杠转义</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"DISABLE_MAGIC_FUNCTIONS=true"</span> &gt;&gt; ~/.zshrc</span><br></pre></td></tr></tbody></table></figure><h2 id="Homebrew"><a href="#Homebrew" class="headerlink" title="Homebrew"></a> Homebrew</h2><p>一款 macOS 强大的开源包管理器，你可以没有 App Store，但不能没有 Homebrew</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 一键安装配置</span></span><br><span class="line">/bin/zsh -c <span class="string">"<span class="subst">$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)</span>"</span></span><br></pre></td></tr></tbody></table></figure><p>brew 的基本使用：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 更新 Homebrew</span></span><br><span class="line">brew update</span><br><span class="line"></span><br><span class="line"><span class="comment">#  搜索相关的包</span></span><br><span class="line">brew search [关键词] </span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看包的信息</span></span><br><span class="line">rew info [软件名]</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 查看已安装的包</span></span><br><span class="line">brew list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新某个软件</span></span><br><span class="line">brew upgrade [软件名]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理所有软件的旧版</span></span><br><span class="line">brew cleanup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载某个软件</span></span><br><span class="line">brew uninstall [软件名]</span><br></pre></td></tr></tbody></table></figure><p>brew 常用软件推荐：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 空格预览 markdown</span></span><br><span class="line">brew install qlmarkdown</span><br><span class="line"></span><br><span class="line"><span class="comment"># 空格高亮预览代码文件</span></span><br><span class="line">brew install syntax-highlight</span><br></pre></td></tr></tbody></table></figure><h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a> Git</h2><p>如果要使用 Github 协作项目的话，那么 GitHub 会根据我们本地的 Git 配置去箱显示对应的 commit 记录的头像</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 配置邮箱 </span></span><br><span class="line">git config --global user.email <span class="string">"xxxxx@xxx.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置用户名</span></span><br><span class="line">git config --global user.name <span class="string">"运来"</span></span><br></pre></td></tr></tbody></table></figure><h2 id="Vim"><a href="#Vim" class="headerlink" title="Vim"></a> Vim</h2><p>下面是运来的配置方案，先在用户目录下新建一个 vim 的配置文件</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">vim ~/.vimrc</span><br></pre></td></tr></tbody></table></figure><p>内容如下：</p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">" 主题</span><br><span class="line">set background=dark           " 设置背景为暗色</span><br><span class="line">colorscheme desert            " 设置配色为desert</span><br><span class="line"></span><br><span class="line">" 基本设置</span><br><span class="line">set mouse=a                   " 启用鼠标支持</span><br><span class="line">filetype plugin indent on     " 启用文件类型检测、插件和缩进</span><br><span class="line">syntax on                     " 语法高亮</span><br><span class="line">set nu                        " 显示行号</span><br><span class="line">set tabstop=2                 " 设置 Tab 缩进长度为 2 空格</span><br><span class="line">set shiftwidth=2              " 设置自动缩进为 2 空格</span><br><span class="line">set softtabstop=2             " 按 Tab 时按 2 个空格宽度处理</span><br><span class="line">set autoindent                " 新行继承上一行缩进</span><br><span class="line">set cursorline                " 高亮当前行</span><br><span class="line">set showmatch                 " 光标在括号上时，显示匹配的括号</span><br><span class="line">set ignorecase                " 搜索忽略大小写</span><br></pre></td></tr></tbody></table></figure><h2 id="Python"><a href="#Python" class="headerlink" title="Python"></a> Python</h2><p>pyenv 是一个强大 Python 包管理工具，可以灵活地切换各种 Python 版本，Linux 和 macOS 强烈建议使用 pyenv 来管理我们的 Python 版本，优雅高效且不会破坏掉系统自带的 Python 环境：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 安装 pyenv</span></span><br><span class="line">brew install pyenv</span><br></pre></td></tr></tbody></table></figure><p><code>~/.zshrc</code> 新增以下配置</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">eval</span> <span class="string">"<span class="subst">$(pyenv init -)</span>"</span></span><br></pre></td></tr></tbody></table></figure><p>基本用法：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 查看已经安装的Python版本</span></span><br><span class="line">pyenv versions</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看当前的 Python 版本</span></span><br><span class="line">pyenv version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看可安装的版本</span></span><br><span class="line">pyenv install -l</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装与卸载 python 3.10.17</span></span><br><span class="line">pyenv install 3.10.17</span><br><span class="line">pyenv uninstall 3.10.17</span><br><span class="line"></span><br><span class="line"><span class="comment"># shell 会话设置 只影响当前的shell会话</span></span><br><span class="line">pyenv shell &lt;python版本&gt;</span><br><span class="line"><span class="comment"># 取消 shell 会话的设置</span></span><br><span class="line">pyenv shell --<span class="built_in">unset</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># local 本地设置 只影响所在文件夹</span></span><br><span class="line">pyenv <span class="built_in">local</span> &lt;python版本&gt;</span><br><span class="line"><span class="comment"># 取消 本地会话的设置</span></span><br><span class="line">pyenv <span class="built_in">local</span> --<span class="built_in">unset</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># global 全局设置 一般不建议改变全局设置</span></span><br><span class="line"><span class="comment"># pyenv 的 global、local、shell 的优先级关系是：shell &gt; local &gt; global</span></span><br><span class="line">pyenv global &lt;python版本&gt;</span><br></pre></td></tr></tbody></table></figure><p>pip 换源</p><p>手动创建 pip.conf</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/.config/pip &amp;&amp; vim ~/.config/pip/pip.conf</span><br></pre></td></tr></tbody></table></figure><p>写入：</p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">[global]</span><br><span class="line">index-url = https://mirrors.ctyun.cn/pypi/simple</span><br><span class="line">trusted-host = mirrors.ctyun.cn</span><br><span class="line">timeout = 120</span><br></pre></td></tr></tbody></table></figure><h2 id="Java"><a href="#Java" class="headerlink" title="Java"></a> Java</h2><p> <a href="https://www.oracle.com/hk/java/technologies/downloads/">Oracle JDK</a> 需要自己手动安装，默认都在安装在 <code>/Library/Java/JavaVirtualMachines</code> 目录下：</p><p><img src="https://oss.24hl.cn/post/2026/10/05/12cc830e765f1898.webp" alt="PixPin_2026-10-05_20-47-06"></p><p>所以我们切换版本时候就不是很优雅，这里推荐使用 jevn 来切换我们的 Java 版本，类似于 pyenv 一样，很优雅：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 安装 jenv</span></span><br><span class="line">brew instal jenv</span><br></pre></td></tr></tbody></table></figure><p><code>~/.zshrc</code> 新增以下配置</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=<span class="string">"<span class="variable">$HOME</span>/.jenv/bin:<span class="variable">$PATH</span>"</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">"<span class="subst">$(jenv init -)</span>"</span></span><br></pre></td></tr></tbody></table></figure><p>基本用法：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 查看当前的 Java 版本</span></span><br><span class="line">jenv version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 手动添加本地的 Java Home 路径</span></span><br><span class="line">jenv add /Library/Java/JavaVirtualMachines/jdk-25.jdk/Contents/Home/</span><br><span class="line">jenv add /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/</span><br><span class="line">jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出目前 jenv 所有可切换管理的版本</span></span><br><span class="line">jenv versions</span><br><span class="line"></span><br><span class="line"><span class="comment"># local 本地设置 只影响所在文件夹</span></span><br><span class="line">jenv <span class="built_in">local</span> &lt;java 版本&gt;</span><br><span class="line"><span class="comment"># 取消 本地的设置</span></span><br><span class="line">jenv <span class="built_in">local</span> --<span class="built_in">unset</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># shell 会话设置 只影响当前的shell会话</span></span><br><span class="line">jenv shell &lt;java 版本&gt;</span><br><span class="line"><span class="comment"># 取消 shell 会话的设置</span></span><br><span class="line">jenv shell --<span class="built_in">unset</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#global 全局设置 一般不建议改变全局设置</span></span><br><span class="line">jenv global &lt;java 版本&gt;</span><br></pre></td></tr></tbody></table></figure><h2 id="Node-js"><a href="#Node-js" class="headerlink" title="Node.js"></a> Node.js</h2><p>由于 Node.js 版本也比较凌乱，所以这里主要是通过 nvm 来进行配置管理</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 安装 nvm</span></span><br><span class="line">brew install nvm</span><br></pre></td></tr></tbody></table></figure><p><code>~/.zshrc</code> 新增以下配置</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># nvm，node 多版本管理工具</span></span><br><span class="line"><span class="built_in">export</span> NVM_DIR=<span class="string">"<span class="variable">$HOME</span>/.nvm"</span></span><br><span class="line"><span class="built_in">export</span> NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node</span><br><span class="line">[ -s <span class="string">"/opt/homebrew/opt/nvm/nvm.sh"</span> ] &amp;&amp; \. <span class="string">"/opt/homebrew/opt/nvm/nvm.sh"</span>  <span class="comment"># This loads nvm</span></span><br><span class="line">[ -s <span class="string">"/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"</span> ] &amp;&amp; \. <span class="string">"/opt/homebrew/opt/nvm/etc/bash_comple    tion.d/nvm"</span>  <span class="comment"># This loads nvm bash_completion</span></span><br></pre></td></tr></tbody></table></figure><p>基本用法</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 查看版本信息</span></span><br><span class="line">nvm --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出所有已安装的版本</span></span><br><span class="line">nvm <span class="built_in">ls</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看当前 node 的版本</span></span><br><span class="line">nvm version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换使用指定的版本node</span></span><br><span class="line">nvm use &lt;version&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 显示当前的版本</span></span><br><span class="line">nvm current</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装最新稳定版 node</span></span><br><span class="line">nvm install stable</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出所有远程服务器的版本</span></span><br><span class="line">nvm ls-remote</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装指定版本</span></span><br><span class="line">nvm install v18.16.1</span><br><span class="line">nvm install &lt;version&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载指定的版本</span></span><br><span class="line">nvm uninstall &lt;version&gt;</span><br></pre></td></tr></tbody></table></figure><p>npm 换源</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmmirror.com</span><br><span class="line">npm config get registry</span><br></pre></td></tr></tbody></table></figure><h2 id="MySQL"><a href="#MySQL" class="headerlink" title="MySQL"></a> MySQL</h2><p>安装：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 搜索可以安装的版本</span></span><br><span class="line">brew search mysql</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装对应的版本</span></span><br><span class="line">brew install mysql@9.3</span><br></pre></td></tr></tbody></table></figure><p><code>~/.zshrc</code> 新增以下配置</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 写入环境变量</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">"/opt/homebrew/opt/mysql@9.3/bin:<span class="variable">$PATH</span>"</span></span><br></pre></td></tr></tbody></table></figure><p>基本用法</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 查看 M有SQL 服务状态</span></span><br><span class="line">brew services info mysql@9.3</span><br><span class="line">mysql.server status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 MySQL 服务</span></span><br><span class="line">brew services start mysql@9.3</span><br><span class="line">mysql.server start</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 MySQL 服务</span></span><br><span class="line">brew services restart mysql@9.3</span><br><span class="line">mysql.server restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止 MySQL 服务</span></span><br><span class="line">brew services stop mysql@9.3</span><br><span class="line">mysql.server stop</span><br></pre></td></tr></tbody></table></figure><p>接着初始化 MySQL 设置，主要配置一下 root 密码以及是否允许远程登录，根据提示来操作就行了：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">mysql_secure_installation</span><br></pre></td></tr></tbody></table></figure><p>数据库外连，这是个可选操作 根据自己的实际情况自行决定是否开启（有被攻击的风险）：</p><figure class="highlight sql"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">USER</span> <span class="string">'root'</span>@<span class="string">'%'</span> IDENTIFIED <span class="keyword">BY</span> <span class="string">'你设置的密码'</span>;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">ALL</span> PRIVILEGES <span class="keyword">ON</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">TO</span> <span class="string">'root'</span>@<span class="string">'%'</span> <span class="keyword">WITH</span> <span class="keyword">GRANT</span> OPTION;</span><br><span class="line">flush privileges;</span><br></pre></td></tr></tbody></table></figure><h2 id="Redis"><a href="#Redis" class="headerlink" title="Redis"></a> Redis</h2><p>安装：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line">brew install redis</span><br></pre></td></tr></tbody></table></figure><p>基本用法：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 查看 redis 服务状态</span></span><br><span class="line">brew services info redis</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 redis 服务端</span></span><br><span class="line">brew services start redis</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 redis 客户端</span></span><br><span class="line">redis-cli</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑默认配置文件</span></span><br><span class="line"><span class="built_in">sudo</span> vim /opt/homebrew/etc/redis.conf</span><br></pre></td></tr></tbody></table></figure><h2 id="proxychains-ng"><a href="#proxychains-ng" class="headerlink" title="proxychains-ng"></a> proxychains-ng</h2><p>终端命令行下代理神器，可以让指定的命令走设置好的代理，内网渗透、XX 上网必备工具。</p><div class="note flat warning no-icon"><p><strong>WARNING</strong></p><p>使用 brew 安装，大概率是不可以用的。需要使用源码安装并且关闭 SIP</p></div><p>确保已经关闭了 SIP，启用 arm64e 预览 ABI：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 执行完后需要重启 MAC</span></span><br><span class="line"><span class="built_in">sudo</span> nvram boot-args=-arm64e_preview_abi</span><br></pre></td></tr></tbody></table></figure><p>下载源码编译安装</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 1. 克隆源码</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/rofl0r/proxychains-ng.git</span><br><span class="line"><span class="built_in">cd</span> proxychains-ng</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 配置编译选项，指定目标架构为 arm64e</span></span><br><span class="line">CFLAGS=<span class="string">"-arch arm64e"</span> LDFLAGS=<span class="string">"-arch arm64e"</span> ./configure --prefix=/usr/local --bindir=/usr/local/bin --libdir=/usr/local/lib --fat-binary-m1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 编译并安装</span></span><br><span class="line">make</span><br><span class="line"><span class="built_in">sudo</span> make install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 安装默认配置文件</span></span><br><span class="line"><span class="built_in">sudo</span> make install-config</span><br></pre></td></tr></tbody></table></figure><p>配置文件位置：<code>/usr/local/etc/proxychains.conf</code></p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 将结尾的 socks4 127.0.0.1 9095 改为我们自己的代理即可，注意 socks4 与 socks5</span></span><br><span class="line"><span class="built_in">sudo</span> vim /usr/local/etc/proxychains.conf</span><br></pre></td></tr></tbody></table></figure><p>基本用法：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 代理终端基本示例</span></span><br><span class="line">proxychains4 curl https://www.google.com.hk</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局代理 zsh shell</span></span><br><span class="line">proxychains4 -q /bin/zsh</span><br></pre></td></tr></tbody></table></figure><h2 id="Hexo"><a href="#Hexo" class="headerlink" title="Hexo"></a> Hexo</h2><p>快速简约强大的博客框架：</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="comment"># 安装 hexo</span></span><br><span class="line">brew install hexo</span><br><span class="line"></span><br><span class="line"><span class="comment"># Hexo 基础命令</span></span><br><span class="line">hexo clean <span class="comment"># 清除缓存</span></span><br><span class="line">hexo g     <span class="comment"># 生成静态文件</span></span><br><span class="line">hexo s     <span class="comment"># 启动 Hexo 服务</span></span><br><span class="line">hexo d<span class="comment"># 部署 Hexo 到 Github</span></span><br></pre></td></tr></tbody></table></figure><h2 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a> Docker</h2><p>运来这里使用的比官方更加轻量化的 <a href="https://orbstack.dev/">Orbstack</a>，下载安装好后，换源：</p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">{</span><br><span class="line">  "registry-mirrors" : [</span><br><span class="line">    "https:\\docker.m.daocloud.io",</span><br><span class="line">    "https:\\ccr.ccs.tencentyun.com",</span><br><span class="line">    "https:\\docker.1ms.run"</span><br><span class="line">  ]</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><img src="https://oss.24hl.cn/post/2026/10/05/b323a45c261b4f4d.webp" alt="PixPin_2026-10-05_23-04-24"></p></body></html>]]>
    </content>
    <id>http://24hl.cn/posts/20261005/1518525014.html</id>
    <link href="http://24hl.cn/posts/20261005/1518525014.html"/>
    <published>2026-10-05T07:27:34.000Z</published>
    <summary>记录一下运来的 macOS Sequoia 优化配置，之前也记录过 macOS 软件清单，方便以后更换设备重新配置，也顺便给其他网友做个配置参考，让大家少走一点配置环境的弯路。</summary>
    <title>运来的 macOS Sequoia 15 优化配置</title>
    <updated>2026-10-07T02:55:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>运来</name>
    </author>
    <category term="日常记录" scheme="http://24hl.cn/categories/%E6%97%A5%E5%B8%B8%E8%AE%B0%E5%BD%95/"/>
    <category term="配置" scheme="http://24hl.cn/tags/%E9%85%8D%E7%BD%AE/"/>
    <category term="macOS" scheme="http://24hl.cn/tags/macOS/"/>
    <content>
      <![CDATA[<html><head></head><body><h1 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a> 背景介绍</h1><p>磨刀不误砍柴工，工欲善其事必先利其器，新到的电脑又得安装一堆新软件，为了自己也为了方便大家快速查看，运来我还单独写了个前端页面。</p><p>为什么 2026 年了还在用 Sequoia 系统？很简单，最后一个保留启动台的系统，且运来不喜欢液态玻璃的设计风格。</p><p>前端页面的设计思路，深色、简单、易用，包含了运来一直在用的 macOS 软件。</p><p><a href="https://static.24hl.cn/macApps/">https://static.24hl.cn/macApps/</a></p><h1 id="社交娱乐"><a href="#社交娱乐" class="headerlink" title="社交娱乐"></a> 社交娱乐</h1><p>主要是一些社交、音乐、视频类软件。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/9c09817c2a103f0f.webp" alt="PixPin_2026-10-05_13-36-46"></p><h1 id="系统增强"><a href="#系统增强" class="headerlink" title="系统增强"></a> 系统增强</h1><p>让你的 MAC 用起来更加顺手。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/9c84a4c72c8fc9c9.webp" alt="image-20261005140817096"></p><h1 id="文档办公"><a href="#文档办公" class="headerlink" title="文档办公"></a> 文档办公</h1><p>主要是日常文档办公用到的软件，可以不用，但不能没有。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/305171702b22bc19.webp" alt="image-20261005133915909"></p><h1 id="编程开发"><a href="#编程开发" class="headerlink" title="编程开发"></a> 编程开发</h1><p>运来常用的一些编程开发软件。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/4cc4d93f43741bb0.webp" alt="image-20261005133945264"></p><h1 id="虚拟远程"><a href="#虚拟远程" class="headerlink" title="虚拟远程"></a> 虚拟远程</h1><p>主要是一些虚拟机、Docker 还有一些远程软件。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/a7f01e5d370bf3c4.webp" alt="PixPin_2026-10-05_13-40-06"></p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a> 其他</h1><p>大家懂得自然懂。</p><p><img src="https://oss.24hl.cn/post/2026/10/05/a0c237a258992af9.webp" alt="image-20261005134035091"></p></body></html>]]>
    </content>
    <id>http://24hl.cn/posts/20261005/1132284761.html</id>
    <link href="http://24hl.cn/posts/20261005/1132284761.html"/>
    <published>2026-10-05T05:11:58.000Z</published>
    <summary>磨刀不误砍柴工，工欲善其事必先利其器，新到的电脑又得安装一堆新软件，为了自己也为了方便大家快速查看，运来我还单独写了个前端页面。</summary>
    <title>运来的 macOS Sequoia 15 软件清单</title>
    <updated>2026-10-05T05:11:58.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>运来</name>
    </author>
    <category term="日常记录" scheme="http://24hl.cn/categories/%E6%97%A5%E5%B8%B8%E8%AE%B0%E5%BD%95/"/>
    <category term="工具" scheme="http://24hl.cn/tags/%E5%B7%A5%E5%85%B7/"/>
    <category term="cloudflare" scheme="http://24hl.cn/tags/cloudflare/"/>
    <category term="worker" scheme="http://24hl.cn/tags/worker/"/>
    <content>
      <![CDATA[<html><head></head><body><h1 id="概述"><a href="#概述" class="headerlink" title="概述"></a> 概述</h1><p>一直在寻找可以跨平台听正版音乐的 APP，尝试了很多第三方开源音乐客户端，绝大多数都需要自己去收集音源，实在是不方便，而且音源还有可能失效，最后还是选择酷狗概念版。</p><p>为什么选择酷狗概念版</p><ul><li>音乐相对较全</li><li>可以通过听歌、看广告领取 VIP</li><li>手机版可以直接下载旧版，清新无广，支持 <a href="https://android-apps.pp.cn/fs08/2022/03/17/8/110_dded46eda6aa40e98377c1ac590de063.apk">Android</a> / <a href="https://i4.cn/">IOS</a>（推荐下载 2.4.5 版本）</li><li>桌面版也有第三方开源客户端，支持 Windows / macOS（<a href="https://github.com/hoowhoami/EchoMusic">点我下载</a>）</li></ul><p>说了这么多，想必你也能一眼看到缺点，就是想听歌的时候，还得手动领取一下 VIP，这一步还是挺影响体验的。</p><p>基于此，我设计了一个小工具，可以部署在 Cloudflare Workers 上，实现多账号自动签到服务。</p><ul><li>图形化控制台（所见即所得）</li><li>支持手机验证码登录、扫码登录（快速添加托管账号），只需一次登录添加账号，后续自动续期</li><li>无需服务器（免费部署，无需在本地进行配置，哪怕一台手机也能完成所有操作进行部署）</li><li>操作简单（粘贴一份 JS 代码、绑定一个 KV 即可）</li></ul><h1 id="功能特性"><a href="#功能特性" class="headerlink" title="功能特性"></a> 功能特性</h1><table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td>🖥 图形化控制台</td><td>暗色调单页界面，零 CDN 依赖，手机浏览器同样可用</td></tr><tr><td>👥 多账号托管</td><td>账号保存在 Cloudflare KV，可分别设置签到时间、单独启用 / 停用</td></tr><tr><td>📷 扫码登录</td><td>页面内展示酷狗官方二维码，手机 App 扫码即完成登录（<strong>推荐</strong>）</td></tr><tr><td>📱 手机验证码登录</td><td>页面内直接发送验证码并登录，自动加入托管</td></tr><tr><td>🍪 Cookie 导入</td><td>已有酷狗 <code>token</code> + <code>userid</code> 可直接导入，导入时自动校验</td></tr><tr><td>🏷 新老账号识别</td><td>按接口返回自动判定「老账号（有广告领取活动）/ 新账号」，首页附说明</td></tr><tr><td>⏰ 定时自动签到</td><td>Cron 每 5 分钟检查一次，到点自动领取，错过可补签</td></tr><tr><td>🎁 完整领取流程</td><td>听歌领取 + 广告领取（默认 8 次）+ VIP 到期时间回写</td></tr><tr><td>🔄 token 自动续期</td><td>每周日自动刷新酷狗 token，也可手动续期</td></tr><tr><td>🔐 双重安全</td><td><code>ADMIN_TOKEN</code> 接口鉴权 + <code>SECRET_KEY</code> 加密 KV 中的账号 token</td></tr><tr><td>📜 运行日志</td><td>保留最近 100 条记录与分步明细，失败原因一目了然</td></tr><tr><td>🚫 自定义 404</td><td>未知路径返回同风格错误页，另附 <code>robots.txt</code> 禁止收录</td></tr><tr><td>💰 额度友好</td><td>针对 KV 免费额度优化写操作，5 个账号约 55 次写/天（上限 1000/天）</td></tr></tbody></table><h1 id="界面预览"><a href="#界面预览" class="headerlink" title="界面预览"></a> 界面预览</h1><h2 id="登录页"><a href="#登录页" class="headerlink" title="登录页"></a> 登录页</h2><p><img src="https://oss.24hl.cn/post/2026/09/26/36dbcc30c0f52905.webp" alt="登录页"></p><h2 id="扫码登录"><a href="#扫码登录" class="headerlink" title="扫码登录"></a> 扫码登录</h2><p><img src="https://oss.24hl.cn/post/2026/09/26/2e9d5550bb39609f.webp" alt="image-20260925195840088"></p><h2 id="手机验证码登录"><a href="#手机验证码登录" class="headerlink" title="手机验证码登录"></a> 手机验证码登录</h2><p><img src="https://oss.24hl.cn/post/2026/09/26/4402674e50675514.webp" alt="image-20260925195929186"></p><h2 id="运行日志"><a href="#运行日志" class="headerlink" title="运行日志"></a> 运行日志</h2><p><img src="https://oss.24hl.cn/post/2026/09/26/d7c39a62712baafb.webp" alt="image-20260925195945482"></p><h2 id="全局设置"><a href="#全局设置" class="headerlink" title="全局设置"></a> 全局设置</h2><p><img src="https://oss.24hl.cn/post/2026/09/26/489d157d13ea66b5.webp" alt="image-20260925200031081"></p><h1 id="部署"><a href="#部署" class="headerlink" title="部署"></a> 部署</h1><h2 id="创建-Worker"><a href="#创建-Worker" class="headerlink" title="创建 Worker"></a> 创建 Worker</h2><ol><li>打开 <a href="https://dash.cloudflare.com/">Cloudflare 控制台</a> 并登录</li><li>左侧选择 <strong>「计算」→ 「Workers 和 Pages」</strong></li><li>点击 <strong>「创建应用程序」 → 「从 Hello World！开始」</strong> 创建 Worker</li><li>随便起个名字（例如 <code>kg-qiandao</code>），点击 <strong>「部署」</strong></li></ol><h2 id="修改代码"><a href="#修改代码" class="headerlink" title="修改代码"></a> 修改代码</h2><ol><li>部署完成后点击 <strong>「编辑代码」</strong></li><li>复制 <a href="https://cdn.jsdelivr.net/gh/luckyyy60/auto-kgvip@main/worker.js">worker.js</a> 全部内容，覆盖原有的示例代码</li><li>点击右上角 <strong>「部署」</strong></li></ol><h2 id="创建-KV-命名空间"><a href="#创建-KV-命名空间" class="headerlink" title="创建 KV 命名空间"></a> 创建 KV 命名空间</h2><ol><li>左侧选择 <strong>「存储和数据库」 → 「Workers KV」</strong></li><li>点击 <strong>「创建命名空间」</strong>，名称填 <code>your_KV_name</code>（名字随意）</li></ol><h2 id="把-KV-绑定到-Worker"><a href="#把-KV-绑定到-Worker" class="headerlink" title="把 KV 绑定到 Worker"></a> 把 KV 绑定到 Worker</h2><ol><li>回到 <strong>「Workers 和 Pages」</strong>，进入刚才创建的 Worker</li><li>打开 <strong>「设置」 → 「绑定」</strong> </li><li>点击 <strong>「添加绑定」 → 「KV 命名空间」</strong></li><li><strong>「变量名称」</strong> 必须填写 <code>KG_KV</code>（区分大小写，写错会提示未绑定）</li><li><strong>「KV 命名空间」</strong> 选择上一步你创建的命名空间 <code>your_KV_name</code></li><li>保存后需要重新部署一次才会生效，按提示操作即可。</li></ol><h2 id="设置登录密码"><a href="#设置登录密码" class="headerlink" title="设置登录密码"></a> 设置登录密码</h2><ol><li>回到 Worker 详情页选择 <strong>「设置」 → 「运行时变量和密钥」</strong></li><li>点击 <strong>「添加变量」</strong>，值勾选 <strong>「密钥」</strong></li><li><strong>「密钥」</strong> 名称填 <code>ADMIN_TOKEN</code>，<strong>「值」</strong> 填一个你自己的复杂口令（这就是控制台登录密码）</li><li>保存并重新部署</li><li>再添加一个名为 <code>SECRET_KEY</code> 的密钥，用于加密 KV 中保存的酷狗账号 token（可选）</li></ol><h2 id="添加定时触发器（自动签到必需）"><a href="#添加定时触发器（自动签到必需）" class="headerlink" title="添加定时触发器（自动签到必需）"></a> 添加定时触发器（自动签到必需）</h2><ol><li>在 Worker 的 <strong>「设置」 → 「触发事件」 → 「Cron 触发器」</strong></li><li>点击 <strong>「添加 Cron 触发器」</strong>，表达式填写：<code>*/5 * * * *</code></li></ol><h2 id="愉快的使用"><a href="#愉快的使用" class="headerlink" title="愉快的使用"></a> 愉快的使用</h2><ol><li>打开 Worker 的访问地址（形如 <code>https://kg-qiandao.&lt;你的子域&gt;.workers.dev</code>）</li><li>输入第 5 步设置的 <code>ADMIN_TOKEN</code> 进入控制台</li><li>点击 <strong>「添加账号」</strong>，推荐用 <strong>「扫码登录」</strong></li><li>调整每个账号的签到时间（北京时间），到点后会自动执行，想立即验证可点该账号的 <strong>「执行」</strong></li></ol><h1 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a> 使用说明</h1><h2 id="账号列表"><a href="#账号列表" class="headerlink" title="账号列表"></a> 账号列表</h2><ul><li><strong>【账号名后的标签】</strong>：<code>老账号</code> / <code>新账号</code> / <code>类型未知</code>，由接口返回自动判定。<ul><li>老账号拥有「看广告领 VIP」活动，除听歌外每天还能通过广告额外领取（默认最多 8 次）</li><li>新账号没有该活动（广告接口返回 <code>20028</code>），每天只能靠听歌领取，这是账号本身的差异，不是故障</li></ul></li><li><strong>【签到时间】</strong>：改动后「确认」按钮会变成 <strong>绿色</strong>，点击才保存（不会自动提交）</li><li><strong>【账号操作】</strong>：<ul><li><code>执行</code>：立即跑一次，页面会等待并显示结果</li><li><code>日志</code>：展开分步明细</li><li><code>续期</code>：手动刷新酷狗账号 token</li><li><code>删除</code>：删除账号</li></ul></li><li><strong>【待续跑 / 待重试】</strong>：广告次数没领完或听歌未领到时出现，定时任务会自动继续，无需人工干预</li></ul><h2 id="定时任务怎么工作"><a href="#定时任务怎么工作" class="headerlink" title="定时任务怎么工作"></a> 定时任务怎么工作</h2><ul><li>每 5 分钟检查一次：账号到达签到时间且 <strong>当天未执行过</strong> 时自动执行<figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">*/5  *  *  *  *</span><br><span class="line"> │   │  │  │  └─ 星期几</span><br><span class="line"> │   │  │  └──── 月份</span><br><span class="line"> │   │  └─────── 日期</span><br><span class="line"> │   └────────── 小时</span><br><span class="line"> └────────────── 分钟：每 5 分钟触发一次</span><br></pre></td></tr></tbody></table></figure></li><li>单次执行有时间上限，8 次广告领取会分摊到多次执行中自动续跑<br>（8 次 × 30 秒间隔 ≈ 3.5 分钟，一次跑完会被平台中断）</li><li>同一天最多自动重试 3 次，可在设置里开启 <strong>「错过签到时间后自动补签」</strong></li><li>每周日刷新酷狗 token 只执行一次（用 <code>lastRefreshDate</code> 去重），不会每个 Cron 周期重复刷新</li></ul><h2 id="全局设置-1"><a href="#全局设置-1" class="headerlink" title="全局设置"></a> 全局设置</h2><table><thead><tr><th>设置项</th><th>默认</th><th>说明</th></tr></thead><tbody><tr><td>新账号默认签到时间</td><td><code>01:15</code></td><td>北京时间，24 小时制</td></tr><tr><td>每日广告领取次数</td><td><code>8</code></td><td>酷狗「看广告领 VIP」上限，<code>0</code> 表示只做听歌领取</td></tr><tr><td>广告领取间隔</td><td><code>30</code> 秒</td><td>每次广告领取之间的等待时间</td></tr><tr><td>每周日自动刷新 token</td><td>开</td><td>与常见做法一致</td></tr><tr><td>错过时间自动补签</td><td>关</td><td>开启后当天错过的账号会在后续 Cron 补跑</td></tr><tr><td>执行前设备注册获取 dfid</td><td>关</td><td>更接近真实客户端，但可能引入额外失败点</td></tr></tbody></table><h1 id="免责声明"><a href="#免责声明" class="headerlink" title="免责声明"></a> 免责声明</h1><ol><li>本项目仅供学习与技术研究使用，请勿用于商业用途或任何非法用途。</li><li>使用过程中可能产生版权数据，本项目不拥有其所有权，请于 24 小时内清除。</li><li>使用本项目所产生的任何直接或间接损失由使用者自行承担。</li><li>请遵守当地法律法规以及酷狗音乐的用户协议；音乐平台不易，请支持正版。</li><li>若官方认为本项目不妥，可联系删除。</li></ol></body></html>]]>
    </content>
    <id>http://24hl.cn/posts/20260925/973846201.html</id>
    <link href="http://24hl.cn/posts/20260925/973846201.html"/>
    <published>2026-09-25T11:27:20.000Z</published>
    <summary>一直在寻找可以跨平台听正版音乐的 APP，尝试了很多第三方开源音乐客户端，绝大多数都需要自己去收集音源，实在是不方便，而且音源还有可能失效，最后还是选择酷狗概念版。</summary>
    <title>酷狗概念版自动签到</title>
    <updated>2026-10-05T05:13:23.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>运来</name>
    </author>
    <category term="日常记录" scheme="http://24hl.cn/categories/%E6%97%A5%E5%B8%B8%E8%AE%B0%E5%BD%95/"/>
    <category term="工具" scheme="http://24hl.cn/tags/%E5%B7%A5%E5%85%B7/"/>
    <category term="cloudflare" scheme="http://24hl.cn/tags/cloudflare/"/>
    <category term="worker" scheme="http://24hl.cn/tags/worker/"/>
    <content>
      <![CDATA[<html><head></head><body><div class="note flat primary no-icon"><p><strong>NOTE</strong></p><p><strong>什么是图床</strong></p><p>图床就是将图片上传到相关服务商或者个人服务器，通过上传文件的网络地址进行远程访问，可以方便快速的将图片插入到文章中，方便后续图片二次使用、迁移、分享。</p></div><h1 id="阿里云-OSS-搭建图床"><a href="#阿里云-OSS-搭建图床" class="headerlink" title="阿里云 OSS 搭建图床"></a> 阿里云 OSS 搭建图床</h1><p>优点：</p><ul><li>国内访问速度快</li></ul><p>缺点：</p><ul><li>需要收费</li></ul><p>最最重要的阿里云 OSS 计费有延迟，真遇到别人狂刷流量，当你收到流量异常通知时，通常已经欠了一笔钱了。</p><p>免费额度说明：</p><table><thead><tr><th>限制项</th><th>说明</th></tr></thead><tbody><tr><td><strong>标准存储</strong></td><td>本地冗余：0.12 元/GB/月；同城冗余：0.15 元/GB/月</td></tr><tr><td>流量费用</td><td>外网流出流量：00:00-08:00，0.25 元/GB；08:00-24:00，0.50 元/GB</td></tr></tbody></table><p>那么为了防止被有心之人狂刷流量，可以搭配 CF 带宽联盟实现流量免费</p><h2 id="CF带宽联盟免流原理"><a href="#CF带宽联盟免流原理" class="headerlink" title="CF带宽联盟免流原理"></a> CF 带宽联盟免流原理</h2><p>带宽联盟是由 CloudFlare 主导组建的旨在节省云计算服务商间数据流量开销的组织，换句话说就是节省 IDC 间的流量传输，减少各 IDC 通过基础 ISP 向互联网传输资源支付的费用。在这个联盟中，受益最大的就是 CF 和末端用户，CF 借此巩固自身的互联网带宽权益地位，更有底气向 ISP 压低带宽价格，用户则获得了来自服务商的流量费用豁免。</p><p>带宽联盟官方简介：<a href="https://www.cloudflare.com/zh-cn/bandwidth-alliance">https://www.cloudflare.com/zh-cn/bandwidth-alliance</a></p><p>阿里云 OSS 已确认除 <strong>迪拜</strong> 和 <strong>中国大陆</strong> 地域外流量传出至 CF 边缘节点不计费，计费项目包括存储费用和请求费用。</p><p>阿里云官方说明：<a href="https://www.aliyun.com/product/news/17749">https://www.aliyun.com/product/news/17749</a></p><h2 id="创建阿里云存储桶"><a href="#创建阿里云存储桶" class="headerlink" title="创建阿里云存储桶"></a> 创建阿里云存储桶</h2><p>注意，创建存储桶一定一定不要选中国大陆的地域，推荐推荐地域选择 <strong>香港</strong>。</p><h2 id="自定义访问域名（可选）"><a href="#自定义访问域名（可选）" class="headerlink" title="自定义访问域名（可选）"></a> 自定义访问域名（可选）</h2><p>进入 <strong>Bucket 配置</strong> -&gt; <strong>域名管理</strong>，配置自定义域名</p><p><img src="https://oss.24hl.cn/post/2026/09/26/72406a313323e808.webp" alt="PixPin_2026-09-24_15-55-24"></p><p>添加自定义域名 DNS 记录</p><p><img src="https://oss.24hl.cn/post/2026/09/26/812f5363650a77cc.webp" alt="PixPin_2026-09-24_15-59-26"></p><p>添加完后再回到阿里云 OSS 域名管理页面，验证域名状态（若验证不成功，关闭小黄云即可验证成功）</p><p>注意：完成验证域名状态后一定一定要回到 Cloudflare，开启自定义域名的小黄云代理，这样访问存储桶的流量才会先经过 Cloudflare 的代理，从而实现通过带宽联盟免流。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/107eebc230abf5a5.webp" alt="PixPin_2026-09-24_16-18-46"></p><h2 id="自定义错误处理页面"><a href="#自定义错误处理页面" class="headerlink" title="自定义错误处理页面"></a> 自定义错误处理页面</h2><ol><li>上传自定义 <code>404.html</code>、<code>index.html</code> 到存储桶。</li><li>进入 <strong>数据管理</strong> -&gt; <strong>静态页面</strong>，设置默认首页、默认 404 页面。<br><img src="https://oss.24hl.cn/post/2026/09/26/5e08bec520b3d833.webp" alt="PixPin_2026-09-24_18-24-42"></li></ol><h2 id="前置-Worker-代理"><a href="#前置-Worker-代理" class="headerlink" title="前置 Worker 代理"></a> 前置 Worker 代理</h2><p>设置完私有域名后，出于安全性考虑，存储桶一般都会设置成私有权限，不允许公共读写。</p><p>想要访问到相关图片资源只能通过生成临时令牌来实现，预览你存储桶的图片时，你会发现生成的访问 URL 会很长，而且时间过期后 URL 失效，具体如下：</p><p><code>https://test.24hl.cn/test.jpg?Expires=1790245016&amp;OSSAccessKeyId=TMP.3KyX1s6YMUx4NtPpYTWVHx4iobaCdSbafSzYXa7dNB51Bb8C4MbEXHNmBppe68bmMfWGUfjEibSk382L94StazgZiL32wp&amp;Signature=f3qPggCQPlpFzgyiZMGds%2BLNqi0%3D</code></p><p>这样的话，访问起来是非常不方便且不美观的。</p><h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a> 概述</h3><p>通过 Cloudflare Worker 代理自动生成临时访问令牌进行访问</p><p><img src="https://oss.24hl.cn/post/2026/09/26/b54c090703e7cbb9.webp" alt="PixPin_2026-09-24_18-37-30"></p><p>那么这样就只需要通过访问 <code>https://your-worker.workers.dev/test.jpg</code>，Worker 便会自动为你生成临时令牌并返回资源，当资源存在于 Cloudflare 的边缘缓存时，还可以直接访问边缘缓存的资源，而不是重新请求资源。</p><h3 id="Aliyun-OSS-授权"><a href="#Aliyun-OSS-授权" class="headerlink" title="Aliyun OSS 授权"></a> Aliyun OSS 授权</h3><p>创建一个 OSS 只读权限的用户，务必保存好 <code>AccessKey ID </code>、<code>AccessKey Secret</code>。（<a href="https://ram.console.aliyun.com/users">点击创建</a>）</p><p>这个用户是没有上传权限的，因此不能直接在 picGo / picList 中使用，如果要使用，请重新新建一个具有上传权限的用户，尽量最小化权限。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/fd95821954c85d1c.webp" alt="PixPin_2026-09-24_16-49-22"></p><p>新创建的用户默认是零权限，需要授予权限 OSS 只读权限</p><p><img src="https://oss.24hl.cn/post/2026/09/26/e4495c98c8943c5f.webp" alt="PixPin_2026-09-24_16-53-08"></p><p><img src="https://oss.24hl.cn/post/2026/09/26/811b56ba33623bc5.webp" alt="PixPin_2026-09-24_16-51-48"></p><h3 id="创建-Worker"><a href="#创建-Worker" class="headerlink" title="创建 Worker"></a> 创建 Worker</h3><ol><li><p>登录 Cloudflare Dashboard，进入 <strong>计算</strong> -&gt; <strong>Workers &amp; Pages</strong> 页面，创建一个 Worker。</p></li><li><p>进入该 Worker 详情页，进入 <strong>设置</strong> -&gt; <strong>Runtime variables and secrets</strong> -&gt; <strong>添加变量</strong>。</p><ul><li>变量名：<code>OSS_ACCESS_KEY_ID</code>，值：阿里云 AccessKey ID</li><li>变量名：<code>OSS_ACCESS_KEY_SECRET</code>，值：阿里云 AccessKey Secret</li><li>变量名：<code> OSS_BUCKET</code>，值：你的存储名称</li><li>变量名：<code>OSS_REGION</code>，值：oss-cn-hongkong</li></ul><p><img src="https://oss.24hl.cn/post/2026/09/26/065eb9737af929e8.webp" alt="PixPin_2026-09-24_18-53-01"></p></li><li><p>进入 <strong>域</strong> -&gt; <strong>添加域名</strong>，绑定自定义域名。</p></li><li><p>修改自定义代码，重新部署 Worker。</p><figure class="highlight javascript"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> {</span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">fetch</span>(<span class="params">request, env</span>) {</span><br><span class="line">    <span class="comment">// 仅允许 GET 和 HEAD 请求</span></span><br><span class="line">    <span class="keyword">if</span> (request.<span class="property">method</span> !== <span class="string">'GET'</span> &amp;&amp; request.<span class="property">method</span> !== <span class="string">'HEAD'</span>) {</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">'Method Not Allowed'</span>, { <span class="attr">status</span>: <span class="number">405</span> });</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 1. 提取路径：访问 / 时自动映射为 index.html</span></span><br><span class="line">    <span class="keyword">let</span> objectKey = url.<span class="property">pathname</span>.<span class="title function_">slice</span>(<span class="number">1</span>);</span><br><span class="line">    <span class="keyword">if</span> (!objectKey || objectKey === <span class="string">'/'</span>) {</span><br><span class="line">      objectKey = <span class="string">'index.html'</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 防范 URI 编码问题</span></span><br><span class="line">    objectKey = <span class="built_in">decodeURIComponent</span>(objectKey);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">      <span class="comment">// 2. 尝试向 OSS 请求目标文件</span></span><br><span class="line">      <span class="keyword">let</span> response = <span class="keyword">await</span> <span class="title function_">fetchFromOSS</span>(objectKey, request.<span class="property">method</span>, env);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 3. 如果文件不存在 (404)，尝试请求 404.html</span></span><br><span class="line">      <span class="keyword">if</span> (response.<span class="property">status</span> === <span class="number">404</span>) {</span><br><span class="line">        <span class="keyword">const</span> notFoundResponse = <span class="keyword">await</span> <span class="title function_">fetchFromOSS</span>(<span class="string">'404.html'</span>, request.<span class="property">method</span>, env);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (notFoundResponse.<span class="property">ok</span>) {</span><br><span class="line">          <span class="keyword">const</span> headers = <span class="title function_">cleanAndPrepareHeaders</span>(notFoundResponse.<span class="property">headers</span>, <span class="string">'404.html'</span>);</span><br><span class="line">          <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(notFoundResponse.<span class="property">body</span>, {</span><br><span class="line">            <span class="attr">status</span>: <span class="number">404</span>,</span><br><span class="line">            <span class="attr">statusText</span>: <span class="string">'Not Found'</span>,</span><br><span class="line">            <span class="attr">headers</span>: headers</span><br><span class="line">          });</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">'404 Not Found'</span>, { <span class="attr">status</span>: <span class="number">404</span> });</span><br><span class="line">      }</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 4. 其他 OSS 错误透传</span></span><br><span class="line">      <span class="keyword">if</span> (!response.<span class="property">ok</span>) {</span><br><span class="line">        <span class="keyword">const</span> errorText = <span class="keyword">await</span> response.<span class="title function_">text</span>();</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">`OSS Error [<span class="subst">${response.status}</span>]:\n<span class="subst">${errorText}</span>`</span>, {</span><br><span class="line">          <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">          <span class="attr">headers</span>: { <span class="string">'Content-Type'</span>: <span class="string">'text/plain;charset=UTF-8'</span> }</span><br><span class="line">        });</span><br><span class="line">      }</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 5. 成功拿到资源，清理并覆盖 Header 后返回</span></span><br><span class="line">      <span class="keyword">const</span> responseHeaders = <span class="title function_">cleanAndPrepareHeaders</span>(response.<span class="property">headers</span>, objectKey);</span><br><span class="line"></span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(response.<span class="property">body</span>, {</span><br><span class="line">        <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">        <span class="attr">statusText</span>: response.<span class="property">statusText</span>,</span><br><span class="line">        <span class="attr">headers</span>: responseHeaders</span><br><span class="line">      });</span><br><span class="line"></span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">`Worker Internal Error: <span class="subst">${e.message}</span>`</span>, { <span class="attr">status</span>: <span class="number">500</span> });</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// ================= Header 处理逻辑 =================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">cleanAndPrepareHeaders</span>(<span class="params">originalHeaders, objectKey</span>) {</span><br><span class="line">  <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>(originalHeaders);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 1. 核心修复：移除强制下载标头，允许浏览器直接渲染 HTML</span></span><br><span class="line">  headers.<span class="title function_">delete</span>(<span class="string">'content-disposition'</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 2. 补全或校准 HTML 的 Content-Type (防止 UTF-8 乱码)</span></span><br><span class="line">  <span class="keyword">if</span> (objectKey.<span class="title function_">endsWith</span>(<span class="string">'.html'</span>) || objectKey.<span class="title function_">endsWith</span>(<span class="string">'.htm'</span>)) {</span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Content-Type'</span>, <span class="string">'text/html; charset=UTF-8'</span>);</span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'public, max-age=3600'</span>); <span class="comment">// HTML 页面缓存 1 小时</span></span><br><span class="line">  } <span class="keyword">else</span> {</span><br><span class="line">    <span class="comment">// 静态资源（图片、CSS、JS 等）强缓存 1 年</span></span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'public, max-age=31536000, immutable'</span>);</span><br><span class="line">  }</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 3. 移除暴露的敏感 OSS 标头</span></span><br><span class="line">  headers.<span class="title function_">delete</span>(<span class="string">'x-oss-request-id'</span>);</span><br><span class="line">  headers.<span class="title function_">delete</span>(<span class="string">'x-oss-server-time'</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> headers;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// ================= OSS 签名与 Fetch 请求封装 =================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fetchFromOSS</span>(<span class="params">objectKey, method, env</span>) {</span><br><span class="line">  <span class="keyword">const</span> expires = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Date</span>.<span class="title function_">now</span>() / <span class="number">1000</span>) + <span class="number">60</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> signedOssUrl = <span class="keyword">await</span> <span class="title function_">generateV2SignedUrl</span>(</span><br><span class="line">    objectKey,</span><br><span class="line">    expires,</span><br><span class="line">    env.<span class="property">OSS_ACCESS_KEY_ID</span>,</span><br><span class="line">    env.<span class="property">OSS_ACCESS_KEY_SECRET</span>,</span><br><span class="line">    env.<span class="property">OSS_BUCKET</span>,</span><br><span class="line">    env.<span class="property">OSS_REGION</span></span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">fetch</span>(signedOssUrl, {</span><br><span class="line">    <span class="attr">method</span>: method,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'User-Agent'</span>: <span class="string">'Cloudflare-Worker-Proxy'</span></span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// ================= OSS V2 签名生成核心算法 =================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">generateV2SignedUrl</span>(<span class="params">objectKey, expires, accessKeyId, accessKeySecret, bucket, region</span>) {</span><br><span class="line">  <span class="keyword">const</span> host = <span class="string">`<span class="subst">${bucket}</span>.<span class="subst">${region}</span>.aliyuncs.com`</span>;</span><br><span class="line">  <span class="keyword">const</span> canonicalResource = <span class="string">`/<span class="subst">${bucket}</span>/<span class="subst">${objectKey.startsWith(<span class="string">'/'</span>) ? objectKey.slice(<span class="number">1</span>) : objectKey}</span>`</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> stringToSign = <span class="string">`GET\n\n\n<span class="subst">${expires}</span>\n<span class="subst">${canonicalResource}</span>`</span>;</span><br><span class="line">  <span class="keyword">const</span> signature = <span class="keyword">await</span> <span class="title function_">hmacSha1Base64</span>(accessKeySecret, stringToSign);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> params = <span class="keyword">new</span> <span class="title class_">URLSearchParams</span>();</span><br><span class="line">  params.<span class="title function_">set</span>(<span class="string">'OSSAccessKeyId'</span>, accessKeyId);</span><br><span class="line">  params.<span class="title function_">set</span>(<span class="string">'Expires'</span>, expires.<span class="title function_">toString</span>());</span><br><span class="line">  params.<span class="title function_">set</span>(<span class="string">'Signature'</span>, signature);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> encodedPath = objectKey.<span class="title function_">split</span>(<span class="string">'/'</span>).<span class="title function_">map</span>(<span class="function"><span class="params">segment</span> =&gt;</span> <span class="built_in">encodeURIComponent</span>(segment)).<span class="title function_">join</span>(<span class="string">'/'</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`https://<span class="subst">${host}</span>/<span class="subst">${encodedPath}</span>?<span class="subst">${params.toString()}</span>`</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// ================= Web Crypto 原生加密工具函数 =================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">hmacSha1Base64</span>(<span class="params">secret, message</span>) {</span><br><span class="line">  <span class="keyword">const</span> encoder = <span class="keyword">new</span> <span class="title class_">TextEncoder</span>();</span><br><span class="line">  <span class="keyword">const</span> keyData = encoder.<span class="title function_">encode</span>(secret);</span><br><span class="line">  <span class="keyword">const</span> messageData = encoder.<span class="title function_">encode</span>(message);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> cryptoKey = <span class="keyword">await</span> crypto.<span class="property">subtle</span>.<span class="title function_">importKey</span>(</span><br><span class="line">    <span class="string">'raw'</span>,</span><br><span class="line">    keyData,</span><br><span class="line">    { <span class="attr">name</span>: <span class="string">'HMAC'</span>, <span class="attr">hash</span>: <span class="string">'SHA-1'</span> },</span><br><span class="line">    <span class="literal">false</span>,</span><br><span class="line">    [<span class="string">'sign'</span>]</span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> signature = <span class="keyword">await</span> crypto.<span class="property">subtle</span>.<span class="title function_">sign</span>(<span class="string">'HMAC'</span>, cryptoKey, messageData);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">let</span> binary = <span class="string">''</span>;</span><br><span class="line">  <span class="keyword">const</span> bytes = <span class="keyword">new</span> <span class="title class_">Uint8Array</span>(signature);</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; bytes.<span class="property">byteLength</span>; i++) {</span><br><span class="line">    binary += <span class="title class_">String</span>.<span class="title function_">fromCharCode</span>(bytes[i]);</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">btoa</span>(binary);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a> 效果展示</h3><ul><li><p>index<br><img src="https://oss.24hl.cn/post/2026/09/26/099f8a8a7f69925d.webp" alt="PixPin_2026-09-24_19-01-05"></p></li><li><p>404<br><img src="https://oss.24hl.cn/post/2026/09/26/2b680be970045e34.webp" alt="PixPin_2026-09-24_19-09-21"></p></li><li><p>正常访问<br><img src="https://oss.24hl.cn/post/2026/09/26/00edc925afb24931.webp" alt="PixPin_2026-09-24_19-10-10"></p></li></ul><h1 id="Cloudflare-R2-搭建图床"><a href="#Cloudflare-R2-搭建图床" class="headerlink" title="Cloudflare R2 搭建图床"></a> Cloudflare R2 搭建图床</h1><p>cloudflare R2 对象存储，其免费额度每月 10GB 存储和 1000 万次读取，对于日均访问量不大的个人博客通常绰绰有余。</p><table><thead><tr><th>限制项</th><th>免费计划限制</th><th>说明</th></tr></thead><tbody><tr><td><strong>存储容量</strong></td><td>每月 10 GB</td><td>超出后 <strong>$0.015/GB/月</strong></td></tr><tr><td><strong>A 类操作</strong>（写入/更新/删除）</td><td>每月 100 万次</td><td>超出后 <strong>$4.50</strong> / 百万次请求</td></tr><tr><td><strong>B 类操作</strong>（读取）</td><td>每月 1000 万次</td><td>超出后 <strong>$0.36</strong> / 百万次请求</td></tr><tr><td><strong>出站流量</strong></td><td>完全免费</td><td>～</td></tr></tbody></table><h2 id="创建-R2-存储桶"><a href="#创建-R2-存储桶" class="headerlink" title="创建 R2 存储桶"></a> 创建 R2 存储桶</h2><p>进入 <strong>cloudflare dashboard</strong> -&gt; <strong>存储和数据库</strong> -&gt; <strong>R2 对象存储</strong>，选择 <strong>创建存储桶</strong> 即可。</p><h2 id="前置-Worker-代理-1"><a href="#前置-Worker-代理-1" class="headerlink" title="前置 Worker 代理"></a> 前置 Worker 代理</h2><h3 id="概述-1"><a href="#概述-1" class="headerlink" title="概述"></a> 概述</h3><p>Cloudflare Workers 免费限制是每天 100,000 次请求，当你账户下所有 Worker 产生的请求总数超过次数限制，页面会停止服务，并且返回 <code>429 Too Many Requests</code>。</p><p>那么利用这个特性，可以在 R2 图床前置一个 Worker，这样便可以有效防止你的博客被一些别有用心的人爆刷。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/bfb5e42eb27912b5.webp" alt="PixPin_2026-09-24_14-00-37"></p><p>免费额度说明：</p><table><thead><tr><th align="left">限制项</th><th align="left">免费计划限制</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left">每日请求数</td><td align="left"><strong>100,000 次 / 天</strong></td><td align="left">所有 Worker 脚本共享此额度，UTC 0 点重置。</td></tr><tr><td align="left">CPU 时间</td><td align="left"><strong>10 毫秒 / 请求</strong></td><td align="left">仅计算 CPU 执行时间，等待网络（如 <code>fetch</code>）的时间不计入。</td></tr><tr><td align="left">子请求</td><td align="left"><strong>50 次 / 请求</strong></td><td align="left">单个请求内可以发起的子请求（如 <code>fetch</code>）上限。</td></tr><tr><td align="left">Worker 数量</td><td align="left"><strong>100 个</strong></td><td align="left">一个账户最多可以创建 100 个 Worker 脚本。</td></tr><tr><td align="left">环境变量</td><td align="left"><strong>64 个 / Worker</strong></td><td align="left">每个 Worker 可设置的环境变量数量上限。</td></tr><tr><td align="left">内存</td><td align="left"><strong>128 MB</strong></td><td align="left">每次请求可使用的内存上限。</td></tr><tr><td align="left">日志</td><td align="left"><strong>200,000 条 / 天</strong></td><td align="left">每天可记录的 Workers 日志条数。</td></tr></tbody></table><h3 id="创建-Worker-1"><a href="#创建-Worker-1" class="headerlink" title="创建 Worker"></a> 创建 Worker</h3><ol><li><p>登录 Cloudflare Dashboard，进入 <strong>计算</strong> -&gt; <strong>Workers &amp; Pages</strong> 页面，创建一个 Worker。</p></li><li><p>进入该 Worker 详情页，进入 <strong>设置</strong> -&gt; <strong>绑定</strong> -&gt; <strong>添加绑定</strong>，添加绑定页面选择 <strong>R2 存储桶</strong>。</p><ul><li><strong>变量名称</strong>： <code>MY_BUCKET</code></li><li><strong>R2 存储桶</strong>： <code>your_bucket_name</code></li></ul></li><li><p>进入 <strong>域</strong> -&gt; <strong>添加域名</strong>，绑定自定义域名。</p></li><li><p>修改自定义代码，重新部署 Worker。</p><figure class="highlight javascript"><table><tbody><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> {</span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">fetch</span>(<span class="params">request, env, ctx</span>) {</span><br><span class="line">    <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">    <span class="keyword">let</span> path = url.<span class="property">pathname</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 仅允许 GET 和 HEAD 请求</span></span><br><span class="line">    <span class="keyword">if</span> (request.<span class="property">method</span> !== <span class="string">'GET'</span> &amp;&amp; request.<span class="property">method</span> !== <span class="string">'HEAD'</span>) {</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">'Method Not Allowed'</span>, { <span class="attr">status</span>: <span class="number">405</span> });</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ================= 1. 处理首页与路径 =================</span></span><br><span class="line">    <span class="comment">// 访问根目录 / 重写为 /static/index.html</span></span><br><span class="line">    <span class="keyword">if</span> (path === <span class="string">'/'</span>) {</span><br><span class="line">      path = <span class="string">'/static/index.html'</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> objectKey = path.<span class="title function_">slice</span>(<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">      <span class="comment">// 2. 从 R2 读取对象</span></span><br><span class="line">      <span class="keyword">const</span> object = <span class="keyword">await</span> env.<span class="property">MY_BUCKET</span>.<span class="title function_">get</span>(objectKey);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 3. 对象存在，正常返回文件</span></span><br><span class="line">      <span class="keyword">if</span> (object !== <span class="literal">null</span>) {</span><br><span class="line">        <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>();</span><br><span class="line">        object.<span class="title function_">writeHttpMetadata</span>(headers);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 处理 Content-Type、Cache-Control 与标头清洗</span></span><br><span class="line">        <span class="title function_">applyHeaderRules</span>(headers, objectKey);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(request.<span class="property">method</span> === <span class="string">'HEAD'</span> ? <span class="literal">null</span> : object.<span class="property">body</span>, { headers });</span><br><span class="line">      }</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 4. 读取并返回自定义 404 页面</span></span><br><span class="line">      <span class="keyword">const</span> notFoundPage = <span class="keyword">await</span> env.<span class="property">MY_BUCKET</span>.<span class="title function_">get</span>(<span class="string">'static/404.html'</span>);</span><br><span class="line">      <span class="keyword">if</span> (notFoundPage !== <span class="literal">null</span>) {</span><br><span class="line">        <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>();</span><br><span class="line">        notFoundPage.<span class="title function_">writeHttpMetadata</span>(headers);</span><br><span class="line"></span><br><span class="line">        headers.<span class="title function_">set</span>(<span class="string">'Content-Type'</span>, <span class="string">'text/html; charset=UTF-8'</span>);</span><br><span class="line">        headers.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'no-cache'</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(request.<span class="property">method</span> === <span class="string">'HEAD'</span> ? <span class="literal">null</span> : notFoundPage.<span class="property">body</span>, {</span><br><span class="line">          <span class="attr">status</span>: <span class="number">404</span>,</span><br><span class="line">          headers</span><br><span class="line">        });</span><br><span class="line">      }</span><br><span class="line"></span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">'404 Not Found'</span>, { <span class="attr">status</span>: <span class="number">404</span> });</span><br><span class="line"></span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">`Worker Internal Error: <span class="subst">${e.message}</span>`</span>, { <span class="attr">status</span>: <span class="number">500</span> });</span><br><span class="line">    }</span><br><span class="line">  },</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// ================= Header 处理逻辑 =================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">applyHeaderRules</span>(<span class="params">headers, objectKey</span>) {</span><br><span class="line">  headers.<span class="title function_">delete</span>(<span class="string">'content-disposition'</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> ext = objectKey.<span class="title function_">split</span>(<span class="string">'.'</span>).<span class="title function_">pop</span>().<span class="title function_">toLowerCase</span>();</span><br><span class="line">  <span class="keyword">const</span> mimeTypes = {</span><br><span class="line">    <span class="string">'html'</span>: <span class="string">'text/html; charset=UTF-8'</span>,</span><br><span class="line">    <span class="string">'htm'</span>: <span class="string">'text/html; charset=UTF-8'</span>,</span><br><span class="line">    <span class="string">'css'</span>: <span class="string">'text/css; charset=UTF-8'</span>,</span><br><span class="line">    <span class="string">'js'</span>: <span class="string">'application/javascript; charset=UTF-8'</span>,</span><br><span class="line">    <span class="string">'json'</span>: <span class="string">'application/json; charset=UTF-8'</span>,</span><br><span class="line">    <span class="string">'png'</span>: <span class="string">'image/png'</span>,</span><br><span class="line">    <span class="string">'jpg'</span>: <span class="string">'image/jpeg'</span>,</span><br><span class="line">    <span class="string">'jpeg'</span>: <span class="string">'image/jpeg'</span>,</span><br><span class="line">    <span class="string">'webp'</span>: <span class="string">'image/webp'</span>,</span><br><span class="line">    <span class="string">'svg'</span>: <span class="string">'image/svg+xml'</span>,</span><br><span class="line">    <span class="string">'ico'</span>: <span class="string">'image/x-icon'</span></span><br><span class="line">  };</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (mimeTypes[ext]) {</span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Content-Type'</span>, mimeTypes[ext]);</span><br><span class="line">  }</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (ext === <span class="string">'html'</span> || ext === <span class="string">'htm'</span>) {</span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'public, max-age=3600'</span>);</span><br><span class="line">  } <span class="keyword">else</span> {</span><br><span class="line">    headers.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'public, max-age=31536000, immutable'</span>);</span><br><span class="line">  }</span><br><span class="line"></span><br><span class="line">  headers.<span class="title function_">set</span>(<span class="string">'X-Content-Type-Options'</span>, <span class="string">'nosniff'</span>);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="创建自定义页面"><a href="#创建自定义页面" class="headerlink" title="创建自定义页面"></a> 创建自定义页面</h3><ol><li><p>进入 <strong>Cloudflare Dashboard</strong> -&gt; <strong>存储和数据库</strong> -&gt; <strong>R2 对象存储</strong>，进入你的存储桶。</p></li><li><p>在存储桶根目录下，创建一个名为 <code>static</code> 的文件夹。</p></li><li><p>上传自定义 <code>index.html</code> 和 <code>404.html</code>，上传到 <code>static</code> 文件夹内。</p><ul><li><code>index.html</code></li></ul><figure class="highlight html"><table><tbody><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"zh-CN"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>Welcome<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="selector-pseudo">:root</span> {</span></span><br><span class="line"><span class="language-css">      <span class="attr">--bg-color</span>: <span class="number">#121212</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attr">--text-main</span>: <span class="number">#e0e0e0</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attr">--text-sub</span>: <span class="number">#a0a0a0</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attr">--accent</span>: <span class="number">#3b82f6</span>;</span></span><br><span class="line"><span class="language-css">    }</span></span><br><span class="line"><span class="language-css">    * { <span class="attribute">margin</span>: <span class="number">0</span>; <span class="attribute">padding</span>: <span class="number">0</span>; <span class="attribute">box-sizing</span>: border-box; }</span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">body</span> {</span></span><br><span class="line"><span class="language-css">      <span class="attribute">background-color</span>: <span class="built_in">var</span>(--bg-color);</span></span><br><span class="line"><span class="language-css">      <span class="attribute">color</span>: <span class="built_in">var</span>(--text-main);</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-family</span>: -apple-system, BlinkMacSystemFont, <span class="string">"Segoe UI"</span>, Roboto, <span class="string">"Helvetica Neue"</span>, Arial, sans-serif;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">height</span>: <span class="number">100vh</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">flex-direction</span>: column;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">text-align</span>: center;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">padding</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">    }</span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">h1</span> {</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-size</span>: <span class="number">2.5rem</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-weight</span>: <span class="number">600</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">margin-bottom</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">90deg</span>, <span class="number">#3b82f6</span>, <span class="number">#8b5cf6</span>);</span></span><br><span class="line"><span class="language-css">      -webkit-<span class="attribute">background-clip</span>: text;</span></span><br><span class="line"><span class="language-css">      -webkit-<span class="selector-tag">text</span>-<span class="attribute">fill</span>-<span class="attribute">color</span>: transparent;</span></span><br><span class="line"><span class="language-css">    }</span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">p</span> {</span></span><br><span class="line"><span class="language-css">      <span class="attribute">color</span>: <span class="built_in">var</span>(--text-sub);</span></span><br><span class="line"><span class="language-css">      <span class="attribute">font-size</span>: <span class="number">1.1rem</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">line-height</span>: <span class="number">1.6</span>;</span></span><br><span class="line"><span class="language-css">      <span class="attribute">max-width</span>: <span class="number">500px</span>;</span></span><br><span class="line"><span class="language-css">    }</span></span><br><span class="line"><span class="language-css">  </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">h1</span>&gt;</span>Hello World<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><ul><li><code>404.html</code></li></ul><figure class="highlight html"><table><tbody><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!doctype <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"zh-CN"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>404 - 页面未找到<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">      <span class="selector-pseudo">:root</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attr">--bg-color</span>: <span class="number">#121212</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attr">--card-bg</span>: <span class="number">#1e1e1e</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attr">--text-main</span>: <span class="number">#e0e0e0</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attr">--text-sub</span>: <span class="number">#a0a0a0</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attr">--accent</span>: <span class="number">#3b82f6</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attr">--accent-hover</span>: <span class="number">#2563eb</span>;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      * {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">padding</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-sizing</span>: border-box;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-tag">body</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">var</span>(--bg-color);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">color</span>: <span class="built_in">var</span>(--text-main);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-family</span>:</span></span><br><span class="line"><span class="language-css">          -apple-system, BlinkMacSystemFont, <span class="string">'Segoe UI'</span>, Roboto,</span></span><br><span class="line"><span class="language-css">          <span class="string">'Helvetica Neue'</span>, Arial, sans-serif;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">height</span>: <span class="number">100vh</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">padding</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-class">.container</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">var</span>(--card-bg);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">padding</span>: <span class="number">40px</span> <span class="number">30px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">10px</span> <span class="number">30px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.5</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">text-align</span>: center;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">max-width</span>: <span class="number">400px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#2a2a2a</span>;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-class">.error-code</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-size</span>: <span class="number">6rem</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-weight</span>: <span class="number">800</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">line-height</span>: <span class="number">1</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin-bottom</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">135deg</span>, <span class="number">#f87171</span>, <span class="number">#ef4444</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">background-clip</span>: text;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-clip</span>: text;</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="selector-tag">text</span>-<span class="attribute">fill</span>-<span class="attribute">color</span>: transparent;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-tag">h1</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-size</span>: <span class="number">1.5rem</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin-bottom</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">color</span>: <span class="built_in">var</span>(--text-main);</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-tag">p</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">color</span>: <span class="built_in">var</span>(--text-sub);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-size</span>: <span class="number">0.95rem</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">line-height</span>: <span class="number">1.6</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin-bottom</span>: <span class="number">30px</span>;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-class">.btn</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">display</span>: inline-block;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">var</span>(--accent);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">color</span>: <span class="number">#ffffff</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">text-decoration</span>: none;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">padding</span>: <span class="number">12px</span> <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="number">8px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-weight</span>: <span class="number">500</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">transition</span>:</span></span><br><span class="line"><span class="language-css">          background-color <span class="number">0.2s</span> ease,</span></span><br><span class="line"><span class="language-css">          transform <span class="number">0.1s</span> ease;</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-class">.btn</span><span class="selector-pseudo">:hover</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">var</span>(--accent-hover);</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">      <span class="selector-class">.btn</span><span class="selector-pseudo">:active</span> {</span></span><br><span class="line"><span class="language-css">        <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">0.97</span>);</span></span><br><span class="line"><span class="language-css">      }</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"container"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"error-code"</span>&gt;</span>404<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">h1</span>&gt;</span>页面未找到<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">p</span>&gt;</span>抱歉，您访问的内容不存在或已被移除。<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"/"</span> <span class="attr">class</span>=<span class="string">"btn"</span>&gt;</span>返回首页<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="效果展示-1"><a href="#效果展示-1" class="headerlink" title="效果展示"></a> 效果展示</h3><ul><li>自定义 index<br><img src="https://oss.24hl.cn/post/2026/09/26/aaf04f1291ead6bd.webp" alt="PixPin_2026-09-24_14-29-37"></li><li>自定义 404<br><img src="https://oss.24hl.cn/post/2026/09/26/078889089b9aad0d.webp" alt="PixPin_2026-09-26_13-49-48"></li></ul><h3 id="设置缓存规则"><a href="#设置缓存规则" class="headerlink" title="设置缓存规则"></a> 设置缓存规则</h3><p>进入 <strong>域名详情页</strong> -&gt; <strong>规则</strong> -&gt; <strong>概述</strong>，选择 <strong>创建规则</strong> -&gt; <strong>缓存规则</strong>。</p><ul><li><p>规则名称：随意<br><img src="https://oss.24hl.cn/post/2026/09/26/0e55ade86d5b5b72.webp" alt="PixPin_2026-09-24_14-53-22"></p></li><li><p>传入请求匹配：自定义筛选表达式</p><figure class="highlight plaintext"><table><tbody><tr><td class="code"><pre><span class="line">(http.request.uri.path.extension in {"jpg" "jpeg" "mkv" "mp3" "mp4" "png" "svg" "swf" "webp" "woff" "woff2" "gif" "icon" "ico"})</span><br></pre></td></tr></tbody></table></figure><p><img src="https://oss.24hl.cn/post/2026/09/26/6ab819708dc4eb72.webp" alt="PixPin_2026-09-24_14-54-02"></p></li><li><p>缓存资格：符合缓存条件<br><img src="https://oss.24hl.cn/post/2026/09/26/c670161cdbb79879.webp" alt="PixPin_2026-09-24_14-54-13"></p></li><li><p>边缘 TTL：1 天<br><img src="https://oss.24hl.cn/post/2026/09/26/42f8ed6a87676a22.webp" alt="PixPin_2026-09-24_14-54-32"></p></li><li><p>浏览器 TTL：12 小时<br><img src="https://oss.24hl.cn/post/2026/09/26/d406f2e2f5f77341.webp" alt="PixPin_2026-09-24_14-54-43"></p></li></ul><h3 id="创建访问密钥（配合-picList-使用）"><a href="#创建访问密钥（配合-picList-使用）" class="headerlink" title="创建访问密钥（配合 picList 使用）"></a> 创建访问密钥（配合 picList 使用）</h3><p>进入 <strong>存储与数据库</strong> -&gt; <strong>R2 对象存储</strong>，选择右下角的 <strong>管理 API 令牌</strong>，选择 <strong>创建 Account API 令牌</strong></p><ul><li>令牌名称：随意</li><li>权限：对象读和写</li><li>指定存储桶：选择你自己的存储桶（最小权限原则）</li><li>TTL：永久</li></ul><p>创建好后记住以下值（只会显示一次，请务必记住）</p><ul><li><p>S3_ACCESS_KEY_ID（访问密钥 ID）</p></li><li><p>S3_SECRET_ACCESS_KEY（机密访问密钥）</p></li><li><p>S3_ENDPOINT（为 S3 客户端使用管辖权地特定的终结点）</p></li></ul><p><img src="https://oss.24hl.cn/post/2026/09/26/912566f8b357dc1c.webp" alt="PixPin_2026-09-24_15-09-25"></p><p>最后进入 picList / picGo 配置好，就能愉快使用你的图床啦。</p></body></html>]]>
    </content>
    <id>http://24hl.cn/posts/20260924/4155368839.html</id>
    <link href="http://24hl.cn/posts/20260924/4155368839.html"/>
    <published>2026-09-24T12:06:18.000Z</published>
    <summary>一片文章教你如何尽可能免费的搭建并使用图床服务</summary>
    <title>博客图床搭建</title>
    <updated>2026-09-24T12:06:18.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>运来</name>
    </author>
    <category term="日常记录" scheme="http://24hl.cn/categories/%E6%97%A5%E5%B8%B8%E8%AE%B0%E5%BD%95/"/>
    <category term="配置" scheme="http://24hl.cn/tags/%E9%85%8D%E7%BD%AE/"/>
    <category term="macOS" scheme="http://24hl.cn/tags/macOS/"/>
    <content>
      <![CDATA[<html><head></head><body><h1 id="软件下载"><a href="#软件下载" class="headerlink" title="软件下载"></a> 软件下载</h1><p>本次测试的硬件平台为：MacBook Pro M3 Max Sequoia 15.8</p><ul><li>App Cleaner &amp; Uninstaller: <a href="https://t.me/qiuchenlymac">点击下载</a></li><li>Little Snitch: <a href="https://macwk.cn/app/2618.html">点击下载</a></li><li>MuMuPlayer Pro 1.4.11: <a href="https://pan.baidu.com/s/1SiovqotoxeAoEs7_pToPNA?pwd=mudb">点击下载</a></li></ul><h1 id="软件配置"><a href="#软件配置" class="headerlink" title="软件配置"></a> 软件配置</h1><h2 id="应用已损坏报错解决"><a href="#应用已损坏报错解决" class="headerlink" title="应用已损坏报错解决"></a> 应用已损坏报错解决</h2><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">sudo xattr -rd com.apple.quarantine /Applications/MuMuPlayer.app</span><br></pre></td></tr></tbody></table></figure><h2 id="Little-Snitch-设置"><a href="#Little-Snitch-设置" class="headerlink" title="Little Snitch 设置"></a> Little Snitch 设置</h2><p>MuMu 模拟器安装好后，确保已经打开了 Little Snitch，然后再打开安卓模拟器，此时 Little Snitch 便会记录所有 MuMu 模拟器对外建立的连接。</p><p>打开 <strong>LittleSnitchNetworkMonitor</strong>（如果找不到，使用快捷键：<strong>control + option + command + M</strong>），禁止所有包含 <code>mumu.nie.netease.com</code> 的连接。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/5ac28abf3aa638f4.webp"></p><p>若不做这步设置你会发现，新建模拟器在你关闭后就无法再次重新打开</p><div class="note flat warning no-icon"><p><strong>WARNING</strong></p><p>亲测，设置 /etc/hosts 是行不通的，必须用 Little Snitch</p></div><p><img src="https://oss.24hl.cn/post/2026/09/26/7845123349a86691.webp" alt="PixPin_2026-09-26_17-03-06"></p><h1 id="抓包调试"><a href="#抓包调试" class="headerlink" title="抓包调试"></a> 抓包调试</h1><h2 id="磁盘模式"><a href="#磁盘模式" class="headerlink" title="磁盘模式"></a> 磁盘模式</h2><p>模拟器的硬盘切换成 <strong>可写系统盘</strong> 模式，开启 Root 权限，修改完后需要重启模拟器。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/6f6926c7aa43e5cf.webp" alt="PixPin_2026-09-26_17-44-19"></p><h2 id="导入证书"><a href="#导入证书" class="headerlink" title="导入证书"></a> 导入证书</h2><p>将 burp 的 cacert.der 证书转换一下格式，然后导入到手机 system 证书文件夹下。</p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">cer 证书转为 pem 证书</span></span><br><span class="line">openssl x509 -inform DER -in cacert.der -out cacert.pem</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">获取证书的 <span class="built_in">hash</span> 值</span></span><br><span class="line">hash=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -n 1)</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将 pem 证书改成 <span class="built_in">hash</span> + .0 的格式</span></span><br><span class="line">new_hash="${hash}.0"</span><br><span class="line">mv cacert.pem "$new_hash"  </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将证书直接放到系统证书文件夹下</span></span><br><span class="line">adb push "$new_hash" /system/etc/security/cacerts/</span><br></pre></td></tr></tbody></table></figure><h2 id="抓包测试"><a href="#抓包测试" class="headerlink" title="抓包测试"></a> 抓包测试</h2><div class="note flat warning no-icon"><p><strong>WARNING</strong></p><p>这里一定不要立刻抓包，否则下次重新启动模拟器 100% 报错「1002」</p><p>请一定完成前置操作，具体详见：<a href="#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95">启动超时 / 概率崩溃 - 解决方法</a>。</p><p><strong>为什么？</strong></p><p>因为当模拟器设置代理后，Little Snitch 的禁用 <code>mumu.nie.netease.com</code> 的规则就失效了。</p></div><p>BP 开启局域网监听，然后将模拟器的代理指向 BP 的监听端口。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/60a1ba3324e8f5cd.webp" alt="PixPin_2026-09-26_18-05-54"></p><p>最后找个开启 SSL 的网站抓包测试看看，成功抓包</p><p><img src="https://oss.24hl.cn/post/2026/09/26/6e8911d2763cd38d.webp" alt="PixPin_2026-09-26_18-11-25"></p><h1 id="Frida-测试"><a href="#Frida-测试" class="headerlink" title="Frida 测试"></a> Frida 测试</h1><p>下载最新的 arm 架构的 frida-server-16.2.1-android-arm64 包，使用 adb push 到模拟器里。<a href="https://github.com/frida/frida/releases">点我下载</a></p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">adb push frida-server-16.2.1-android-arm64 /data/local/tmp/</span><br></pre></td></tr></tbody></table></figure><p>手机端直接运行 frida server，为了稳定建议模拟器里面安装个 <a href="https://github.com/termux/termux-app/releases">Termux</a> 终端模拟器。先使用 su 命令申请并切换 Root 权限：</p><p><img src="https://oss.24hl.cn/post/2026/09/26/9ef3e11a3ddccd13.webp" alt="PixPin_2026-09-26_20-12-03"></p><p>手动给 frida server 执行权限并运行</p><figure class="highlight shell"><table><tbody><tr><td class="code"><pre><span class="line">cd /data/local/tmp/</span><br><span class="line">chmod +x frida-server-16.2.1-android-arm64</span><br><span class="line">./frida-server-16.2.1-android-arm64</span><br></pre></td></tr></tbody></table></figure><p><img src="https://oss.24hl.cn/post/2026/09/26/a263069d0abf3306.webp" alt="PixPin_2026-09-26_20-18-17"></p><p>使用 <code>frida-ls-devices</code> 查看模拟器的连接类型为 USB 类型，可以正常与模拟器进行 hook 测试。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/1da9e054586b515a.webp" alt="PixPin_2026-09-26_20-21-24"></p><h1 id="面具安装"><a href="#面具安装" class="headerlink" title="面具安装"></a> 面具安装</h1><p>模拟器设置 <strong>可写系统盘</strong>，开启 Root 权限。</p><h2 id="Kitsune-Mask"><a href="#Kitsune-Mask" class="headerlink" title="Kitsune Mask"></a> Kitsune Mask</h2><p>直接使用官方的面具我们大概率是无法直接安装成功的，所以这里使用 <a href="https://github.com/Scratch2033Alt/KitsuneMagisk">Kitsune Mask</a> 这种第三方为模拟器适配的面具。</p><p>Kitsune Mask 直接使用「直接安装 （直接修改 /system）」方式即可。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/2350d4088ac072fb.webp" alt="PixPin_2026-09-26_23-57-27"></p><p><img src="https://oss.24hl.cn/post/2026/09/26/01680e6923c5486e.webp" alt="PixPin_2026-09-26_23-57-11"></p><h2 id="修复异常"><a href="#修复异常" class="headerlink" title="修复异常"></a> 修复异常</h2><p>重启后发现提示 su 文件冲突了，需要手动修复一下异常。</p><p><img src="https://oss.24hl.cn/post/2026/09/26/55d40ae2386e7489.webp" alt="PixPin_2026-09-26_23-59-17"></p><p>原理很简单，使用 Root 权限删除之前冲突的 su 相关文件即可，这里直接使用 adb 连接，手动将之前冲突的 su 相关文件直接备份一下。</p><figure class="highlight bash"><table><tbody><tr><td class="code"><pre><span class="line"><span class="built_in">mv</span> /system/xbin/su /system/xbin/su.bak</span><br><span class="line"><span class="built_in">mv</span> /system/app/SuperUser/ /system/app/SuperUser-Bak/</span><br></pre></td></tr></tbody></table></figure><p><img src="https://oss.24hl.cn/post/2026/09/27/0fa37bba351d933b.webp" alt="PixPin_2026-09-27_00-04-28"></p><h2 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a> 最终效果</h2><p>删除冲突 su 文件后，就不会报错了</p><p><img src="https://oss.24hl.cn/post/2026/09/27/267a4caaf31719e3.webp" alt="PixPin_2026-09-27_00-05-37"></p><h1 id="启动超时-概率崩溃"><a href="#启动超时-概率崩溃" class="headerlink" title="启动超时/概率崩溃"></a> 启动超时 / 概率崩溃</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a> 前言</h2><p>在使用的过程中，我发现如果长时间通过 adb 控制模拟器，模拟器会卡死崩溃或者启动超时「1002」。</p><h2 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a> 解决方法</h2><p>burp 抓包设置拦截开启，只拦截 <code>mumu.nie.netease.com</code></p><p><img src="https://oss.24hl.cn/post/2026/09/26/98411258509b3ee1.webp" alt="PixPin_2026-09-26_18-50-56"></p><p>新建一个模拟器，设置磁盘写权限、Root 权限，安装好 burp 证书，设置好代理。（开启代理后 Little Snitch 的禁用规则就会失效）</p><p>修改数据包 <code>/api/v1/rom/file_update/config/fetch</code>，<code>version</code> 参数修改为最新版本 <code>1.9.2</code></p><p><img src="https://oss.24hl.cn/post/2026/09/26/cca162bfaeafaa9a.webp" alt="PixPin_2026-09-26_19-17-04"></p><p>修改之后会远程获取 MuMu 模拟器 Pro 1.9.2 版本的所有远程热更新</p><p><img src="https://oss.24hl.cn/post/2026/09/29/b0ea804e2f0dba05.webp" alt="PixPin_2026-09-29_16-50-13"></p><p>如果恰巧你有玩网易游戏的需求（没错，我玩痒痒鼠），丢弃数据包 <code>/api/v1/release/game/update/rom/hotfile</code>，没有就不要管。</p><div class="note flat warning no-icon"><p><strong>WARNING</strong></p><p>非常重要，如果不丢弃这个数据包，痒痒鼠可能会进不去直接闪退</p></div><p><img src="https://oss.24hl.cn/post/2026/09/29/c961a50d47a2e8a1.webp" alt="PixPin_2026-09-29_18-01-39"></p><p>亲测完成上述操作后，就算 Little Snitch 没有禁用 <code>mumu.nie.netease.com</code>，重启也不会再出现启动失败「1002」了。</p><blockquote><p>PS：我没有测试 mumu 更新版本之后，是否需要重新抓包 <code>/api/v1/rom/file_update/config/fetch</code> 将 <code>version</code> 参数修改为最新版本。如果你实在不放心，可以继续使用 Little Snitch 禁用 <code>mumu.nie.netease.com</code>。</p></blockquote><h1 id="MuMu-1-6-10"><a href="#MuMu-1-6-10" class="headerlink" title="MuMu 1.6.10"></a> MuMu 1.6.10</h1><p>从 1.4.11 到 1.6.10，增加了很多使用功能。【 <a href="https://appstorrent.ru/3444-mumu-player-pro.html">点我下载</a> 】</p><p>由于是国际版，拦截域名从 <code>mumu.nie.netease.com</code> 改为 <code>api.mumuglobal.com</code></p><figure class="highlight text"><table><tbody><tr><td class="code"><pre><span class="line">GET /api/v1/rom/file_update/config/fetch?uuid=CF98EC9D-8A7F-58DC-8A8A-6F1EE6FC7F17&amp;channel=default&amp;engine=MACPRO&amp;package=mumu&amp;version=1.9.2&amp;architecture=arm64&amp;product=&amp;product_version=&amp;usage=1&amp;rhf_version=12.1216 HTTP/2</span><br><span class="line">Host: api.mumuglobal.com</span><br><span class="line">......</span><br></pre></td></tr></tbody></table></figure><p><img src="https://oss.24hl.cn/post/2026/10/01/3043235a9e5a0adb.webp" alt="PixPin_2026-10-01_19-42-38"></p><div class="note flat warning no-icon"><p><strong>WARNING</strong></p><p>关于界面汉化</p></div><p>若直接修改 <code>Contents/Info.plist</code>，会导致签名失效，运行会有「BUG」，目前还没找到有效的解决方法。</p><p>也欢迎大家分享解决方法。</p></body></html>]]>
    </content>
    <id>http://24hl.cn/posts/20260920/247211965.html</id>
    <link href="http://24hl.cn/posts/20260920/247211965.html"/>
    <published>2026-09-20T10:07:06.000Z</published>
    <summary>还在为学习版 MuMu模拟器Pro 频繁闪退、无响应而烦恼吗？一片文章教你如何优雅的安装MuMu模拟器Pro</summary>
    <title>ARM MacBook MuMu 模拟器 Pro 安装及使用</title>
    <updated>2026-09-27T04:56:10.000Z</updated>
  </entry>
</feed>
