<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
            <title>Qaiu blog</title>
            <link>https://blog.qaiu.top</link>
        <generator>Halo 1.6.0</generator>
        <lastBuildDate>Sun, 01 Nov 2026 18:43:31 CST</lastBuildDate>
                <item>
                    <title>
                        <![CDATA[云盘直链解析专业版宝塔部署（新手向）：Java项目部署]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/nfd-vip-baota-deploy-055</link>
                    <description>
                            <![CDATA[<h1 id="%E4%B8%93%E4%B8%9A%E7%89%88%E5%AE%9D%E5%A1%94%E9%83%A8%E7%BD%B2%EF%BC%88%E6%96%B0%E6%89%8B%E5%90%91%EF%BC%89%EF%BC%9Ajava%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2" tabindex="-1">专业版宝塔部署（新手向）：Java项目部署</h1><blockquote><p>以宝塔 9.x 为例。专业版和开源版流程几乎一样，差别主要是<strong>多几个后台入口</strong>；用宝塔「<strong>Java项目</strong>」部署最省事。<br />安装包从<strong>授权渠道</strong>获取（本文无公开直链）。交流群：<code>1017480890</code><br />开源版可对照：<a href="https://blog.qaiu.top/archives/netdisk-fast-download-bao-ta-an-zhuang-jiao-cheng" target="_blank">宝塔安装教程</a><br />装好后的后台配置见：<a href="https://blog.qaiu.top/archives/nfdvipconfig" target="_blank">后台配置版使用指南</a></p></blockquote><hr /><h2 id="1.-java-%E7%8E%AF%E5%A2%83%E5%88%9D%E5%A7%8B%E5%8C%96" tabindex="-1">1. Java 环境初始化</h2><ol><li>进入宝塔后台 → <strong>网站</strong> → <strong>Java项目</strong> → <strong>Java环境管理</strong> → 下载 <strong>JDK 17.0.8</strong>（更高版本新手别追新）。</li><li>装完再打开一次环境管理，能看到 JDK 路径就说明成功了。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-09.png?v=2" alt="Java环境管理下载 JDK17" /></p><p>若还要绑域名、上 HTTPS，顺手在 <strong>软件商店</strong> 安装 <strong>Nginx</strong>（稳定版即可）：</p><p><img src="https://dl.qaiu.cn/blog/step-08.png?v=2" alt="软件商店安装 Nginx / Java" /></p><hr /><h2 id="2.-%E6%B7%BB%E5%8A%A0%E9%A1%B9%E7%9B%AE" tabindex="-1">2. 添加项目</h2><p>按下面一步一步点就行（专业版 jar 一般是 <code>app-start.jar</code>）。</p><h3 id="2.1-%E4%B8%8A%E4%BC%A0%E5%B9%B6%E8%A7%A3%E5%8E%8B%E5%AE%89%E8%A3%85%E5%8C%85" tabindex="-1">2.1 上传并解压安装包</h3><ol><li>打开宝塔左侧 <strong>文件</strong>，进入 <code>/www/wwwroot/</code>。</li><li>点 <strong>上传</strong>，把授权渠道拿到的 Linux 发行包（zip）传上去。</li><li>右键压缩包 → <strong>解压</strong>，解压到例如 <code>/www/wwwroot/nfd-vip/</code>（目录名随意，后面路径要一致）。</li><li>进解压目录，确认能看到 <code>app-start.jar</code>，以及 <code>resources/</code> 下的配置文件；按包内说明改好域名等项（如 <code>domainName</code>）。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-2a-files.png" alt="文件管理上传解压" /></p><h3 id="2.2-%E6%89%93%E5%BC%80-java-%E9%A1%B9%E7%9B%AE" tabindex="-1">2.2 打开 Java 项目</h3><ol><li>左侧点 <strong>网站</strong>。</li><li>顶部切到 <strong>Java项目</strong> 标签。</li><li>确认右上角 <strong>Java环境管理</strong> 里已有 JDK 17（没有就回到上一节先装）。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-2b-java-tab.png" alt="Java项目列表" /></p><h3 id="2.3-%E5%A1%AB%E5%86%99%E3%80%8C%E6%B7%BB%E5%8A%A0-java-%E9%A1%B9%E7%9B%AE%E3%80%8D" tabindex="-1">2.3 填写「添加 Java 项目」</h3><ol><li>点绿色 <strong>添加项目</strong>。</li><li><strong>项目类型</strong> 选 <strong>SpringBoot</strong>（不要选 Tomcat）。</li><li><strong>项目路径</strong> 选刚才解压目录，例如 <code>/www/wwwroot/nfd-vip</code>；选好后在目录里点到 <code>app-start.jar</code>（有的宝塔版本是「项目 jar」单独一项）。</li><li><strong>项目名称</strong> 自己起，<strong>不超过 20 个字</strong>（宝塔有长度限制）。</li><li><strong>项目 JDK</strong> 选 <strong>jdk-17.0.8</strong>（或你刚装的 17）。</li><li>点 <strong>确定</strong>，回到列表，状态变成「运行中」即可。<br /><strong>只用 Java 项目守护</strong>，不要再叠一层 systemd / Supervisor。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-2c-add-click.png" alt="添加项目弹窗" /></p><p><img src="https://dl.qaiu.cn/blog/step-2d-path-jdk.png" alt="路径与 JDK" /></p><blockquote><p>若列表显示启动失败，先点该行的「日志」看是缺 JDK、路径不对，还是端口被占用。</p></blockquote><hr /><h2 id="3.-java-%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%EF%BC%9A%E5%9F%9F%E5%90%8D-%2F-%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE-%2F-ssl-%2F-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" tabindex="-1">3. Java 项目管理：域名 / 外网访问 / SSL / 配置文件</h2><p>列表里点项目名称（或「设置」），打开 <strong>Java项目管理</strong> 弹窗。左侧菜单按下面顺序配一遍即可。<br />前置：域名 A 记录已解析到当前服务器；面板已装好 Nginx。</p><h3 id="3.1-%E5%9F%9F%E5%90%8D%E7%AE%A1%E7%90%86" tabindex="-1">3.1 域名管理</h3><ol><li>左侧点 <strong>域名管理</strong>。</li><li>在输入框里填域名，<strong>一行一个</strong>（默认走 80 端口）。</li><li>点绿色 <strong>添加</strong>，列表里出现你的域名。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-3b-domain.png?v=2" alt="域名管理添加域名" /></p><blockquote><p>没加域名之前，下面的「外网映射」开不了（宝塔会提示先加域名）。</p></blockquote><h3 id="3.2-%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE%EF%BC%88%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%EF%BC%89" tabindex="-1">3.2 外网访问（端口映射）</h3><ol><li>左侧点 <strong>外网访问</strong>。</li><li>打开顶部的 <strong>外网映射</strong> 开关。</li><li>在端口列表里给<strong>前台入口</strong>开启映射，代理路由填 <strong><code>/</code></strong>（不要指到仅本机用的 API 口）。</li><li>若要用备用管理路径，可再给对应端口开映射，代理路由填 <strong><code>/nfdadmin/</code></strong>（详见<a href="https://blog.qaiu.top/archives/nfdvipconfig" target="_blank">后台配置指南</a>）。</li><li><strong>静态文件</strong>一般保持关闭即可。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-3a-ext-access.png?v=2" alt="外网访问端口映射" /></p><blockquote><p>开启后，宝塔会自动写 Nginx 反代；要改细节到左侧 <strong>配置文件</strong> 看。</p></blockquote><h3 id="3.3-ssl%EF%BC%88https%EF%BC%89" tabindex="-1">3.3 SSL（HTTPS）</h3><ol><li>左侧点 <strong>SSL</strong>。</li><li>可用 <strong>免费证书</strong> 一键申请 Let’s Encrypt，或把已有证书的 KEY / PEM 贴进去点 <strong>保存</strong>。</li><li>证书显示「已部署」后，按需打开 <strong>强制 HTTPS</strong>。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-3c-ssl.png?v=2" alt="SSL 证书部署" /></p><h3 id="3.4-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" tabindex="-1">3.4 配置文件</h3><ol><li>左侧点 <strong>配置文件</strong>。</li><li>这里就是外网映射生成的 Nginx（或 Apache）站点配置；路径不对、多一层斜杠、要加自定义 location，都可以在这里改完保存并重载。</li><li>改完若访问异常，先回 <strong>外网访问</strong> 核对映射是否还在，再看本页语法有没有写坏。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-3d-config.png" alt="配置文件查看与修改（界面示意）" /></p><p>装好后浏览器打开 <code>https://你的域名/</code> 进前台；<code>https://你的域名/admin/</code> 走安装向导 / 管理后台。</p><h3 id="%E5%A4%87%E9%80%89%EF%BC%9A%E7%BD%91%E7%AB%99%E9%87%8C%E5%8D%95%E7%8B%AC%E5%81%9A-nginx-%E5%8F%8D%E4%BB%A3" tabindex="-1">备选：网站里单独做 Nginx 反代</h3><p>访问量大、或想和别的站点共用一套站点规则时，也可以不用 Java 项目自带映射：</p><ol><li><strong>网站 → 添加站点</strong>（或「反向代理」），填域名。</li><li>目标填本机前台地址（形如 <code>http://127.0.0.1:前台端口</code>），专业版可<strong>整站反代</strong>。</li><li>在站点 SSL 里申请证书并打开强制 HTTPS。</li></ol><hr /><h2 id="4.-%E6%89%93%E5%BC%80%E5%89%8D%E5%8F%B0%E5%B9%B6%E8%B5%B0%E5%AE%89%E8%A3%85%E6%8C%87%E5%BC%95" tabindex="-1">4. 打开前台并走安装指引</h2><p>服务在 Java 项目里显示「运行中」之后：</p><ol><li>浏览器打开前台入口：已绑域名就用 <code>https://你的域名/</code>；还没绑的话临时用 <code>http://服务器IP:前台端口/</code>（以包内实际对外入口为准）。</li><li>再打开后台：<code>https://你的域名/admin/</code>（或临时 <code>http://服务器IP:前台端口/admin/</code>）。未初始化时会弹出 <strong>「安装指引」</strong>。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-4a-open-admin.png" alt="打开安装指引" /></p><h3 id="4.1-%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%BA%93%E9%85%8D%E7%BD%AE%EF%BC%88%E9%80%89%E6%95%B0%E6%8D%AE%E6%BA%90%EF%BC%89" tabindex="-1">4.1 第一步：数据库配置（选数据源）</h3><p>向导第一步是 <strong>数据库配置</strong>：</p><ol><li><strong>数据库类型</strong> 二选一：<ul><li><strong>H2（内置轻量数据库）</strong>：新手默认选这个，数据在程序目录 <code>./db/nfdData</code>，不用另装库。</li><li><strong>MySQL</strong>：已有 MySQL 时再选；可粘贴 JDBC URL 点「自动识别」，填主机 / 端口 / 库名 / 用户名 / 密码，再点 <strong>测试连接</strong>。</li></ul></li><li>若检测到本机旧的 H2 数据文件，可按需打开 <strong>迁移历史数据</strong>（没有旧库就不用管）。</li><li>点 <strong>下一步</strong>（选 H2 时会先初始化内置库）。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-4b-db-h2.png" alt="安装指引选数据源" /></p><p><img src="https://dl.qaiu.cn/blog/step-4c-db-mysql.png" alt="安装指引选 MySQL" /></p><blockquote><p>个人 / 小流量站直接用 H2 即可；要上正式库、多实例再换 MySQL。</p></blockquote><h3 id="4.2-%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E7%AE%A1%E7%90%86%E5%91%98-%2B-%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE" tabindex="-1">4.2 第二步：管理员 + 系统配置</h3><ol><li>填 <strong>管理员用户名</strong>、<strong>管理员密码</strong>、邮箱可选。<strong>安装时就要设强密码</strong>（字母+数字+符号，别用 <code>123456</code> / <code>admin</code> 这类），这就是以后进后台的账号。</li><li><strong>主域名</strong> 填你对外访问的根地址（有域名填 <code>https://你的域名</code>，临时调试可填 <code>http://服务器IP:前台端口</code>）。</li><li><strong>预览地址</strong>、<strong>微信中间页</strong> 可按默认或以后再改；<strong>服务端口</strong> 以配置文件为准，向导里一般改不了。</li><li>点 <strong>完成安装</strong> → 出现成功页后，<strong>务必截图保存后台账号密码信息</strong>（用户名、密码、访问地址），再点 <strong>开始使用</strong> 进登录页。丢了只能改库或重装，很麻烦。</li></ol><p><img src="https://dl.qaiu.cn/blog/step-4d-sys-config.png" alt="安装指引系统配置" /></p><p>装完后建议立刻：核对后台能否用刚设的账号登录、按需加网盘配置（见 <a href="https://blog.qaiu.top/archives/nfdvipconfig" target="_blank">后台配置指南</a>）；公网环境用 Nginx 禁掉 <code>/admin/api/install/setup</code>，避免安装接口裸奔。</p><hr /><h2 id="5.-%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8C%E6%97%A5%E5%BF%97" tabindex="-1">5. 查看运行日志</h2><p>日志一般在项目目录，例如 <code>/www/wwwroot/nfd-vip/logs/</code>（以包说明为准）。也可在 Java 项目列表里点「日志」，或在 Java 项目管理左侧 <strong>日志管理</strong> 看启动是否报错。</p><hr /><h2 id="%E6%96%B0%E6%89%8B%E6%B3%A8%E6%84%8F" tabindex="-1">新手注意</h2><ol><li>必须用 <strong>JDK 17+</strong>，JDK 11 跑不起来当前专业版主线。</li><li>生产尽量只把 <strong>80 / 443</strong>（以及你自己的面板、SSH）暴露给公网；API 口不要对公网。</li><li>安装时就设<strong>强密码</strong>，并<strong>截图保存</strong>后台账号密码；装完尽快<strong>禁用安装接口</strong>。</li><li>安装包只从<strong>授权渠道</strong>拿，勿与开源版发行说明混用。</li><li>路径、入口以<strong>包内 yml</strong>为准；和本文不一致时，改外网映射 / 反代目标即可。</li></ol>]]>
                    </description>
                    <pubDate>Thu, 29 Oct 2026 11:58:51 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[从寿星天文历到 3D 太阳系：一个老牌天文历算项目的现代化表达]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/sxwnl-cpp-3d</link>
                    <description>
                            <![CDATA[<h1 id="%E4%BB%8E%E5%AF%BF%E6%98%9F%E5%A4%A9%E6%96%87%E5%8E%86%E5%88%B0-3d-%E5%A4%AA%E9%98%B3%E7%B3%BB%EF%BC%9A%E4%B8%80%E4%B8%AA%E8%80%81%E7%89%8C%E5%A4%A9%E6%96%87%E5%8E%86%E7%AE%97%E9%A1%B9%E7%9B%AE%E7%9A%84%E7%8E%B0%E4%BB%A3%E5%8C%96%E8%A1%A8%E8%BE%BE" tabindex="-1">从寿星天文历到 3D 太阳系：一个老牌天文历算项目的现代化表达</h1><p><img src="https://bd2.qaiu.cn/blog/image-1784191412733.png" alt="image-1784191412733" /></p><p>最近整理 <code>sxwnl</code> 相关项目时，重新看了一遍寿星天文历的历史，以及它后来发展出来的 C++ 3D 版本。</p><p>这其实是一个很有意思的项目：一边是传统的农历、节气、朔望、日月食和行星星历计算，另一边则是 OpenGL、Dear ImGui 和 3D 太阳系可视化。</p><p>它没有把“万年历”停留在日期查询和表格展示上，而是试着回答一个更直观的问题：</p><blockquote><p>我们能不能把这些天文历算结果真正“看见”？</p></blockquote><p>项目地址：</p><ul><li>原版来源: <a href="http://bbs.nongli.net/dispbbs_2_14995.html" target="_blank">http://bbs.nongli.net/dispbbs_2_14995.html</a></li><li>git仓库：<a href="https://github.com/sxwnl/sxwnl" target="_blank">https://github.com/sxwnl/sxwnl</a></li><li>C++ 3D 版本：<a href="https://github.com/sxwnl/sxwnl-cpp-3d" target="_blank">https://github.com/sxwnl/sxwnl-cpp-3d</a></li><li>在线参考页面：<a href="https://sxwnl.github.io" target="_blank">https://sxwnl.github.io</a></li></ul><hr /><h2 id="%E4%B8%80%E3%80%81%E5%AF%BF%E6%98%9F%E5%A4%A9%E6%96%87%E5%8E%86%E7%9A%84%E6%9D%A5%E6%BA%90" tabindex="-1">一、寿星天文历的来源</h2><p>寿星天文历并不是一个普通的日历程序。</p><p>它的名称是：</p><blockquote><p><strong>寿星天文历（万年历）5.10</strong></p></blockquote><p>原作者为 <strong>许剑伟</strong>。</p><p>早期版本的相关资料曾发布于农历论坛：</p><p><a href="http://bbs.nongli.net/dispbbs_2_14995.html" target="_blank">http://bbs.nongli.net/dispbbs_2_14995.html</a></p><p>随着项目不断发展，相关内容也逐渐整理到了 <code>sxwnl.github.io</code> 以及后续的 GitHub 仓库中。现在常见的 <code>sxwnl/sxwnl</code>，可以看作寿星天文历原有历算体系的开源延续和整理版本。</p><p>这段历史很重要，因为 <code>sxwnl</code> 并不是为了做一个简单的“日期显示器”才开始开发的。它背后真正关注的是一整套天文历算问题：</p><ul><li>农历如何计算</li><li>节气如何确定</li><li>月相和朔望如何推算</li><li>日食、月食在什么时候发生</li><li>行星在天空中的位置如何计算</li><li>真太阳时和地方时间有什么关系</li><li>日出、日落、月出、月落如何得到</li></ul><p>从这个角度看，寿星天文历更像是一套长期积累的天文计算工具，而不是单纯意义上的万年历。</p><hr /><h2 id="%E4%BA%8C%E3%80%81%E4%BB%8E%E4%B8%87%E5%B9%B4%E5%8E%86%E5%88%B0%E5%A4%A9%E6%96%87%E5%8E%86%E7%AE%97" tabindex="-1">二、从万年历到天文历算</h2><p><img src="https://bd2.qaiu.cn/blog/QQ_1784191515819.png" alt="QQ_1784191515819" /><br />很多人第一次接触万年历，可能只是为了查询：</p><ul><li>某一天对应的农历日期</li><li>今天是什么节气</li><li>某个节日是哪一天</li><li>某年的生肖和干支</li></ul><p>但真正深入之后会发现，这些内容并不是互相独立的。</p><p>农历月份和月相有关，节气和太阳周年运动有关，日月食又和太阳、地球、月球之间的空间位置有关。八字、真太阳时、日出日落等功能，也都离不开时间系统和天体位置计算。</p><p>因此，寿星天文历的核心并不只是“查日期”，而是把这些内容放进了一个完整的天文历算框架里。</p><p>原版主要覆盖了以下内容：</p><ul><li>农历万年历</li><li>公历、农历、回历等历法转换</li><li>二十四节气</li><li>月相与朔望</li><li>日月食</li><li>行星星历</li><li>八字与干支</li><li>真太阳时</li><li>日出日落</li><li>月出月落</li><li>天体升降</li></ul><p>这些功能共同构成了寿星天文历的基础。</p><hr /><h2 id="%E4%B8%89%E3%80%81c%2B%2B-%E7%89%88%E6%9C%AC%EF%BC%9A%E6%8A%8A%E6%A0%B8%E5%BF%83%E8%83%BD%E5%8A%9B%E5%B8%A6%E5%88%B0%E6%A1%8C%E9%9D%A2%E7%AB%AF" tabindex="-1">三、C++ 版本：把核心能力带到桌面端</h2><p><img src="https://bd2.qaiu.cn/blog/image-1784191675062.png" alt="image-1784191675062" /></p><p>在原有寿星天文历体系的基础上，后来出现了 <code>sxwnl/sxwnl-cpp-3d</code>。</p><p>顾名思义，这是一个 C++ 移植版本，并且加入了新的 3D 图形界面。</p><p>它的目标并不是重新发明一套历法，而是把原有的天文历算能力以更适合 C++ 和桌面程序的方式组织起来，同时增加可视化和交互功能。</p><p>C++ 版本包含：</p><ul><li>农历万年历</li><li>节气计算</li><li>日月食搜索</li><li>行星星历</li><li>八字与真太阳时</li><li>日月升降</li><li>3D 太阳系</li><li>3D 日月食演示</li></ul><p>原本只能通过文本、表格或网页结果查看的数据，现在可以进一步放进一个可操作的图形界面里。</p><p>这也是这个版本比较有意思的地方：</p><blockquote><p>计算引擎负责把结果算出来，3D 界面负责让人理解这些结果。</p></blockquote><hr /><h2 id="%E5%9B%9B%E3%80%813d-%E5%A4%AA%E9%98%B3%E7%B3%BB%EF%BC%9A%E6%8A%8A%E6%8A%BD%E8%B1%A1%E7%9A%84%E8%BD%A8%E9%81%93%E5%8F%98%E6%88%90%E5%8F%AF%E4%BB%A5%E8%A7%82%E5%AF%9F%E7%9A%84%E5%9C%BA%E6%99%AF" tabindex="-1">四、3D 太阳系：把抽象的轨道变成可以观察的场景</h2><p><img src="https://bd2.qaiu.cn/blog/QQ_1784191726292.png" alt="QQ_1784191726292" /><br />天文计算中有很多数据对程序来说非常明确，但对普通人来说并不容易理解。</p><p>例如：</p><ul><li>黄经是多少度</li><li>赤经是多少小时</li><li>天体距离是多少</li><li>某一时刻的方位角和高度角是多少</li></ul><p>这些数据当然有用，但如果只看一串数字，很难形成空间概念。</p><p>3D 太阳系提供了另一种表达方式。</p><p>在这个场景中，可以查看太阳系中的行星轨道，并观察行星随时间变化的位置。项目还支持根据时间推进，让行星按照计算结果运行起来。</p><p>目前 3D 部分主要包括：</p><ul><li>日心轨道展示</li><li>行星实时位置</li><li>光照球体</li><li>轨道和行星大小控制</li><li>线性或对数距离压缩</li><li>行星运行速度控制</li><li>行星详细星历参数</li></ul><p>由于太阳系中各天体之间的真实距离差别很大，如果完全按照实际比例显示，内行星和外行星很容易挤在一起，或者部分天体看不清楚。因此，界面提供了距离压缩和大小调节功能。</p><p>这并不是为了追求严格的视觉比例，而是为了让用户能够在一个场景中同时观察整个太阳系。</p><hr /><h2 id="%E4%BA%94%E3%80%813d-%E6%97%A5%E6%9C%88%E9%A3%9F%EF%BC%9A%E4%BB%8E%E7%BB%93%E6%9E%9C%E6%9F%A5%E8%AF%A2%E5%88%B0%E7%A9%BA%E9%97%B4%E6%BC%94%E7%A4%BA" tabindex="-1">五、3D 日月食：从结果查询到空间演示</h2><p><img src="https://bd2.qaiu.cn/blog/image-1784191974002.png" alt="image-1784191974002" /><br />日月食是寿星天文历的重要功能之一。</p><p>传统方式通常是查询一张表：</p><ul><li>发生时间</li><li>食甚时间</li><li>食分</li><li>初亏</li><li>复圆</li><li>可见地区</li><li>食带范围</li></ul><p>这些数据很精确，但对于没有天文学基础的人来说，还是比较抽象。</p><p>3D 版本增加了日月食可视化功能，可以从空间角度观察：</p><ul><li>太阳、地球、月球三者的位置关系</li><li>月球经过地球阴影的过程</li><li>日食时月球阴影落在地球表面的情况</li><li>本影与半影的范围</li><li>地球上的食带变化</li><li>三体光锥的空间关系</li></ul><p>其中比较有特色的是“三体光锥”演示。</p><p>日食和月食本质上都是光影关系：</p><ul><li>日食时，月球挡住了太阳光，月球的影子投射到地球表面</li><li>月食时，月球进入地球的本影或半影区域</li><li>本影、半影和天体之间形成了具有空间方向的几何结构</li></ul><p>通过 3D 场景，这些内容不再只是几个时间点和一张地图，而是可以旋转、缩放和播放的空间模型。</p><hr /><h2 id="%E5%85%AD%E3%80%813d-%E7%89%88%E6%9C%AC%E9%80%82%E5%90%88%E5%93%AA%E4%BA%9B%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF%EF%BC%9F" tabindex="-1">六、3D 版本适合哪些应用场景？</h2><p>这个项目的 3D 部分并不只是为了增加视觉效果。它其实有不少实际应用场景。</p><h3 id="1.-%E5%A4%A9%E6%96%87%E6%95%99%E8%82%B2" tabindex="-1">1. 天文教育</h3><p><img src="https://bd2.qaiu.cn/blog/QQ_1784192023760.png" alt="QQ_1784192023760" /><br />这是最直接的用途。</p><p>在课堂上讲解太阳系、月相、日食、月食时，二维图片往往不够直观。3D 模型可以帮助学生建立空间关系，理解：</p><ul><li>行星的公转</li><li>地球和月球的相对运动</li><li>月相为什么会变化</li><li>日食和月食为什么不会每个月都发生</li><li>本影和半影有什么区别</li></ul><p>它可以用于：</p><ul><li>中学地理课堂</li><li>中学物理课堂</li><li>天文兴趣课程</li><li>科学教育活动</li><li>青少年天文科普</li></ul><hr /><h3 id="2.-%E5%A4%A9%E6%96%87%E7%A7%91%E6%99%AE%E5%B1%95%E7%A4%BA" tabindex="-1">2. 天文科普展示</h3><p>天文馆、科技馆和博物馆经常需要把复杂知识解释给普通观众。</p><p>相比单纯展示数据，3D 模型更容易吸引注意，也更方便现场讲解。</p><p>例如，可以通过控制时间来演示：</p><ul><li>某次日食的发生过程</li><li>月球穿过地影的全过程</li><li>行星在一段时间内的轨道运动</li><li>某个节气时太阳的位置变化</li></ul><p>这种方式比直接告诉观众“某年某月某日发生月食”更容易留下印象。</p><hr /><h3 id="3.-%E4%BC%A0%E7%BB%9F%E5%8E%86%E6%B3%95%E5%B1%95%E7%A4%BA" tabindex="-1">3. 传统历法展示</h3><p>寿星天文历本身和中国传统历法关系密切。</p><p>节气、月相、农历月份、干支和真太阳时，都是中国传统时间体系的重要组成部分。</p><p>如果只从文字角度介绍这些内容，容易让人觉得它们比较遥远。<br />但如果把它们和太阳、地球、月球的实际运动联系起来，就能更清楚地看到传统历法背后的天文基础。</p><p>这类 3D 应用可以用于：</p><ul><li>传统文化数字化展示</li><li>农历和节气科普</li><li>古代历法介绍</li><li>汉文化相关展览</li><li>天文与传统文化结合的互动项目</li></ul><hr /><h3 id="4.-%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%92%8C%E5%9B%BE%E5%BD%A2%E5%AD%A6%E6%BC%94%E7%A4%BA" tabindex="-1">4. 软件工程和图形学演示</h3><p>对于开发者来说，这个项目还有另外一层价值。</p><p>它把几个通常分开出现的模块放到了一起：</p><ul><li>天文算法</li><li>C++ 工程</li><li>CMake 构建</li><li>OpenGL 渲染</li><li>Dear ImGui 界面</li><li>时间控制</li><li>数据与图形同步</li><li>3D 相机交互</li></ul><p>如果想学习如何把一个计算型项目扩展成桌面可视化工具，这类项目很适合作为参考。</p><p>尤其是下面这些问题，都可以从中找到实际案例：</p><ul><li>如何把计算结果传给渲染场景</li><li>如何设计一个可播放的天文时间轴</li><li>如何在 3D 场景中表达不同比例的空间距离</li><li>如何让 ImGui 面板和 OpenGL 画面配合工作</li><li>如何组织天文数据、轨道数据和 UI 状态</li></ul><hr /><h2 id="%E4%B8%83%E3%80%81%E9%A1%B9%E7%9B%AE%E4%BD%BF%E7%94%A8%E7%9A%84%E6%8A%80%E6%9C%AF" tabindex="-1">七、项目使用的技术</h2><p>3D 版本的图形界面主要基于以下技术：</p><ul><li><strong>C++</strong></li><li><strong>OpenGL</strong></li><li><strong>Dear ImGui</strong></li><li><strong>GLFW</strong></li><li><strong>CMake</strong></li></ul><p>项目的 GUI 部分大致包括：</p><pre><code class="language-text">gui/├── main.cpp         GLFW、OpenGL 和 ImGui 主循环├── scene.{h,cpp}    太阳系场景与天文引擎对接├── renderer.{h,cpp} OpenGL 渲染、球体、轨道和着色器├── panels.{h,cpp}   控制、历法、星历、日月食等面板├── camera.h         轨道相机└── mathx.h          向量和矩阵工具</code></pre><p>天文引擎部分则主要分布在：</p><pre><code class="language-text">eph/       天文历算、行星、章动、日月食等lunar/     农历、节气、气朔、八字mylib/     工具库和数学功能test/      控制台程序与回归测试</code></pre><p>从结构上看，它采用了比较清晰的分层方式：</p><ul><li>历算模块负责计算</li><li>场景模块负责组织天体和时间</li><li>渲染模块负责绘制</li><li>面板模块负责交互</li><li>测试模块负责验证结果</li></ul><hr /><h2 id="%E5%85%AB%E3%80%81%E5%A6%82%E4%BD%95%E6%9E%84%E5%BB%BA-3d-%E7%89%88%E6%9C%AC%EF%BC%9F" tabindex="-1">八、如何构建 3D 版本？</h2><p>项目提供了脚本构建和 CMake 构建两种方式。</p><h3 id="windows" tabindex="-1">Windows</h3><pre><code class="language-powershell">Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.\build_gui.ps1</code></pre><p>也可以使用：</p><pre><code class="language-powershell">.\build_gui.ps1 -Clean.\build_gui.ps1 -Debug.\build_gui.ps1 -MinGW.\build_gui.ps1 -NoGui</code></pre><h3 id="linux%E3%80%81macos%E3%80%81msys2" tabindex="-1">Linux、macOS、MSYS2</h3><pre><code class="language-bash">bash build_gui.sh</code></pre><p>其他选项：</p><pre><code class="language-bash">bash build_gui.sh --cleanbash build_gui.sh --debugbash build_gui.sh --no-gui</code></pre><h3 id="%E6%89%8B%E5%8A%A8%E4%BD%BF%E7%94%A8-cmake" tabindex="-1">手动使用 CMake</h3><pre><code class="language-bash">cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build --config Release -j$(nproc)</code></pre><p>如果只构建控制台版本，可以关闭 GUI：</p><pre><code class="language-bash">cmake -B build -DSXWNL_BUILD_GUI=OFFcmake --build build</code></pre><p>第一次构建 GUI 时，CMake 会通过 FetchContent 获取相关依赖，通常包括 GLFW、Dear ImGui 等。</p><hr /><h2 id="%E4%B9%9D%E3%80%81%E8%BF%90%E8%A1%8C%E5%92%8C%E6%93%8D%E4%BD%9C%E6%96%B9%E5%BC%8F" tabindex="-1">九、运行和操作方式</h2><p>构建完成后，可以直接运行 GUI：</p><pre><code class="language-bash">./build/sxwnl_gui</code></pre><p>控制台版本：</p><pre><code class="language-bash">./build/test1</code></pre><p>GUI 中提供了比较常见的 3D 操作：</p><table><thead><tr><th>操作</th><th>功能</th></tr></thead><tbody><tr><td>左键拖拽</td><td>旋转相机</td></tr><tr><td>右键拖拽</td><td>平移相机</td></tr><tr><td>滚轮</td><td>缩放</td></tr><tr><td>播放/暂停</td><td>控制天体运动</td></tr><tr><td>日期跳转</td><td>跳到指定时间</td></tr><tr><td>速度预设</td><td>按秒、小时或日期推进</td></tr><tr><td>负速度</td><td>反向播放</td></tr><tr><td>行星列表</td><td>查看详细星历</td></tr><tr><td>日月食面板</td><td>搜索和查看食象事件</td></tr><tr><td>3D 食影</td><td>观察地球食带和光锥</td></tr></tbody></table><p>项目还支持固定 UTC 时区，默认可以按北京、上海等 UTC+8 时区显示时间。</p><p>中文字体方面，程序会尝试检测系统中的微软雅黑等字体。如果系统没有合适的中文字体，则会回退到默认字体，中文可能显示为方块。</p><hr /><h2 id="%E5%8D%81%E3%80%81%E4%B8%80%E4%B8%AA%E8%80%81%E9%A1%B9%E7%9B%AE%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%98%E5%80%BC%E5%BE%97%E7%BB%A7%E7%BB%AD%E5%81%9A%EF%BC%9F" tabindex="-1">十、一个老项目为什么还值得继续做？</h2><p>寿星天文历的特别之处，在于它并不是一个追逐新框架的项目。</p><p>它的核心价值来自长期积累：</p><ul><li>算法积累</li><li>历法资料积累</li><li>计算结果验证</li><li>用户使用反馈</li><li>不同平台上的持续维护</li></ul><p>这类项目往往不会因为界面简单就失去价值。相反，真正稳定的天文历算核心，通常需要经过很长时间的验证。</p><p>而 3D 版本做的事情，是在不放弃原有计算能力的前提下，给这个老项目增加了一种新的表达方式。</p><p>以前我们看到的是：</p><pre><code class="language-text">日期 → 计算结果</code></pre><p>现在还可以看到：</p><pre><code class="language-text">日期 → 天体位置 → 空间运动 → 可视化结果</code></pre><p>这让很多原本只能通过数字理解的内容，变得更容易观察和解释。</p><hr /><h2 id="%E5%8D%81%E4%B8%80%E3%80%81%E6%80%BB%E7%BB%93" tabindex="-1">十一、总结</h2><p>如果说 <code>sxwnl/sxwnl</code> 代表的是寿星天文历的计算基础，那么 <code>sxwnl/sxwnl-cpp-3d</code> 更像是这个基础上的一次现代化延伸。</p><p>它保留了原有的：</p><ul><li>农历万年历</li><li>节气</li><li>月相</li><li>日月食</li><li>行星星历</li><li>八字</li><li>真太阳时</li><li>日月升降</li></ul><p>同时又增加了：</p><ul><li>3D 太阳系</li><li>行星轨道</li><li>实时运行参数</li><li>3D 日月食</li><li>地球食带</li><li>本影和半影</li><li>太阳—地球—月球三体光锥</li></ul><p>从寿星天文历最初的历算工具，到现在的 C++ 3D 可视化程序，这条发展路线其实很有代表性：</p><blockquote><p>先把复杂的东西算准确，再想办法把它讲清楚。</p></blockquote><p>这也是这个项目最值得记录的地方。</p><p>它既可以是一个实用的天文历算工具，也可以是一个天文教育和科普演示程序；既能服务传统历法相关应用，也能作为 C++、OpenGL 和 ImGui 结合使用的工程案例。</p><p>如果你对天文历法、传统文化数字化、3D 可视化，或者 C++ 图形界面开发感兴趣，都可以从这个项目开始了解。</p><p>项目地址：</p><ul><li><code>sxwnl/sxwnl</code>：<a href="https://github.com/sxwnl/sxwnl" target="_blank">https://github.com/sxwnl/sxwnl</a></li><li><code>sxwnl/sxwnl-cpp-3d</code>：<a href="https://github.com/sxwnl/sxwnl-cpp-3d" target="_blank">https://github.com/sxwnl/sxwnl-cpp-3d</a></li><li><code>sxwnl.github.io</code>：<a href="https://sxwnl.github.io" target="_blank">https://sxwnl.github.io</a></li></ul><hr /><h2 id="%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99" tabindex="-1">参考资料</h2><ul><li>寿星天文历（万年历）5.10</li><li>原作者：许剑伟</li><li>早期相关资料：<a href="http://bbs.nongli.net/dispbbs_2_14995.html" target="_blank">http://bbs.nongli.net/dispbbs_2_14995.html</a></li><li>寿星天文历项目主页：<a href="https://sxwnl.github.io" target="_blank">https://sxwnl.github.io</a></li><li><code>sxwnl/sxwnl</code> GitHub 仓库：<a href="https://github.com/sxwnl/sxwnl" target="_blank">https://github.com/sxwnl/sxwnl</a></li><li><code>sxwnl/sxwnl-cpp-3d</code> GitHub 仓库：<a href="https://github.com/sxwnl/sxwnl-cpp-3d" target="_blank">https://github.com/sxwnl/sxwnl-cpp-3d</a></li></ul><p>–本篇文章由AI辅助编写–</p>]]>
                    </description>
                    <pubDate>Thu, 16 Jul 2026 16:50:57 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[关于123云盘在线解析配合nfdproxy绕过IP限制的方法]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/123parser</link>
                    <description>
                            <![CDATA[<blockquote><p>nfd云解析专业版已支持配合分布代理客户端即nfd−proxy(应用dnode技术)<br />在线解析网站：189.qaiu.top</p></blockquote><h3 id="%E4%B8%8B%E8%BD%BD%E5%AE%89%E5%8D%93%E5%AE%A2%E6%88%B7%E7%AB%AF" tabindex="-1">下载安卓客户端</h3><p>这里提供3种方式运行客户端，你可以任选一种，临时使用建议选择1，安装包体积很小，下载比较快，开发者可以选择第三种，执行python脚本</p><ol><li>原生apk包<br /><a href="https://lz0.qaiu.top/lz/iQw5D3llff1c" target="_blank">https://lz0.qaiu.top/lz/iQw5D3llff1c</a></li><li>带后台运行的apk包<br /><a href="https://lz0.qaiu.top/lz/iOpmn3llfrqj" target="_blank">https://lz0.qaiu.top/lz/iOpmn3llfrqj</a></li><li>源码运行<br />参考 <a href="https://blog.qaiu.top/archives/dnode-ke-hu-duan" target="_blank">https://blog.qaiu.top/archives/dnode-ke-hu-duan</a></li></ol><h2 id="%E8%BF%9B%E5%85%A5189.qaiu.top%E8%A7%A3%E6%9E%90%E7%AB%99" tabindex="-1">进入189.qaiu.top解析站</h2><p>然后就可以利用189.qaiu.top解析123网盘了</p><p>关于技术原理，可以参考另一篇文章<br /><a href="https://blog.qaiu.top/archives/2026-03-18-02-12-02" target="_blank">https://blog.qaiu.top/archives/2026-03-18-02-12-02</a></p>]]>
                    </description>
                    <pubDate>Thu, 26 Mar 2026 16:25:07 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[dnode-py客户端]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/dnode-ke-hu-duan</link>
                    <description>
                            <![CDATA[<blockquote><p>下载pydroid 参考 <a href="https://blog.qaiu.top/archives/pydroid3v72" target="_blank">https://blog.qaiu.top/archives/pydroid3v72</a></p></blockquote><h3 id="nfd%E2%88%92proxy%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%A3%E7%90%86%E8%8A%82%E7%82%B9%E5%AE%A2%E6%88%B7%E7%AB%AF(%E7%AE%80%E7%A7%B0dnode)" tabindex="-1">nfd−proxy分布式代理节点客户端(简称dnode)</h3><p>用于处理netdisk-fast-download服务端解析ip问题，当前nfd解析服务端IP有时候会被ban，或者云盘本身禁止云服务商解析下载 此时就需要配置代理节点，而代理最真实的就是用户自身的IP，因此本项目应运而生…废话不多说，直接提供代码，可以运行在任意python3环境</p><p>dnode技术文档参考另一篇文章</p><h3 id="pydroid%E8%BF%90%E8%A1%8C" tabindex="-1">pydroid运行</h3><pre><code class="language-python">#!/usr/bin/env python3&quot;&quot;&quot;NFD DNode 启动器  run.py════════════════════════════════════════════════════════════════功能:  · 检查 Python 版本 (&gt;= 3.8)  · 检测/创建虚拟环境 (可选)  · 自动安装缺失依赖 (websockets)  · 运行本地 dnode_client.py 或从 URL 拉取执行用法:  python run.py                          # 运行本地 dnode_client.py  python run.py wss://host:9000/ws/node  # 传参给客户端  python run.py --url https://qaiu.top/src/py/dnode_client.py  python run.py --venv                   # 强制使用 venv  python run.py --no-venv                # 跳过 venv  python run.py --debug                  # DEBUG 模式Pydroid / 嵌入式 Python 一行启动:  exec(open(&#39;run.py&#39;).read())            # 本地  from urllib.request import urlopen  exec(urlopen(&#39;https://qaiu.top/src/py/run.py&#39;).read())  # 远程════════════════════════════════════════════════════════════════&quot;&quot;&quot;import osimport sysimport subprocessimport argparseimport platform# ── 配置 ────────────────────────────────────────────────# 本地客户端文件名（与 run.py 同目录）LOCAL_CLIENT  = &quot;dnode_client.py&quot;# 远程客户端 URL（--url 未指定时的默认远程地址）REMOTE_CLIENT = &quot;https://qaiu.top/src/py/dnode_client_v5.py&quot;# 唯一依赖REQUIRED_PKGS = [&quot;websockets&quot;]# 虚拟环境目录名VENV_DIR      = &quot;.venv&quot;# Python 最低版本MIN_PYTHON    = (3, 8)IS_ANDROID = (    os.path.exists(&quot;/data/data&quot;) or    os.environ.get(&quot;ANDROID_ROOT&quot;) is not None)IS_WIN = sys.platform == &quot;win32&quot;# ════════════════════════════════════════════════════════#  版本检查# ════════════════════════════════════════════════════════def check_python():    v = sys.version_info[:2]    if v &lt; MIN_PYTHON:        print(f&quot;[run] ✗ Python {&#39;.&#39;.join(map(str, MIN_PYTHON))}+ 必需，当前 {sys.version.split()[0]}&quot;)        sys.exit(1)    print(f&quot;[run] ✓ Python {sys.version.split()[0]}  {platform.system()} {platform.machine()}&quot;)# ════════════════════════════════════════════════════════#  虚拟环境# ════════════════════════════════════════════════════════def _in_venv() -&gt; bool:    &quot;&quot;&quot;当前进程是否已在 venv/conda 环境中&quot;&quot;&quot;    return (        sys.prefix != sys.base_prefix or        os.environ.get(&quot;CONDA_DEFAULT_ENV&quot;) is not None or        os.environ.get(&quot;VIRTUAL_ENV&quot;) is not None    )def ensure_venv(force: bool = False) -&gt; bool:    &quot;&quot;&quot;    检测/创建 venv。    返回 True  → 已在合适环境，继续本进程    返回 False → 已重启到 venv Python（当前进程应退出）    &quot;&quot;&quot;    if IS_ANDROID:        print(&quot;[run] Android 环境，跳过 venv&quot;)        return True    if _in_venv() and not force:        print(f&quot;[run] ✓ 已在虚拟环境: {sys.prefix}&quot;)        return True    venv_python = (        os.path.join(VENV_DIR, &quot;Scripts&quot;, &quot;python.exe&quot;) if IS_WIN        else os.path.join(VENV_DIR, &quot;bin&quot;, &quot;python&quot;)    )    if not os.path.exists(venv_python):        print(f&quot;[run] 创建虚拟环境 {VENV_DIR}/ ...&quot;)        try:            subprocess.run(                [sys.executable, &quot;-m&quot;, &quot;venv&quot;, VENV_DIR],                check=True            )        except subprocess.CalledProcessError as e:            print(f&quot;[run] ✗ venv 创建失败: {e}，使用系统 Python 继续&quot;)            return True    print(f&quot;[run] 重启到 venv: {venv_python}&quot;)    # 用 venv Python 重新运行当前脚本，透传所有参数    os.execv(venv_python, [venv_python] + sys.argv)    # os.execv 不会返回；下面代码不会执行    return False   # pragma: no cover# ════════════════════════════════════════════════════════#  依赖安装# ════════════════════════════════════════════════════════def _pkg_available(pkg: str) -&gt; bool:    &quot;&quot;&quot;检查包是否可 import（用包名去掉版本约束）&quot;&quot;&quot;    import importlib    name = pkg.split(&quot;&gt;=&quot;)[0].split(&quot;==&quot;)[0].split(&quot;[&quot;)[0].strip()    try:        importlib.import_module(name)        return True    except ImportError:        return Falsedef install_deps(pkgs: list):    missing = [p for p in pkgs if not _pkg_available(p)]    if not missing:        print(f&quot;[run] ✓ 依赖就绪: {&#39;, &#39;.join(pkgs)}&quot;)        return    print(f&quot;[run] 安装依赖: {&#39;, &#39;.join(missing)}&quot;)    # Android Termux / 受限环境需要 --break-system-packages    extra = []    if IS_ANDROID or os.environ.get(&quot;TERMUX_VERSION&quot;):        extra = [&quot;--break-system-packages&quot;]    cmd = [sys.executable, &quot;-m&quot;, &quot;pip&quot;, &quot;install&quot;, &quot;--upgrade&quot;,           &quot;--quiet&quot;, *extra, *missing]    try:        subprocess.run(cmd, check=True)        print(f&quot;[run] ✓ 安装完成: {&#39;, &#39;.join(missing)}&quot;)    except subprocess.CalledProcessError:        # pip 失败时尝试 --user        try:            cmd_user = [sys.executable, &quot;-m&quot;, &quot;pip&quot;, &quot;install&quot;,                        &quot;--user&quot;, &quot;--quiet&quot;, *missing]            subprocess.run(cmd_user, check=True)            print(f&quot;[run] ✓ 安装完成 (--user): {&#39;, &#39;.join(missing)}&quot;)        except subprocess.CalledProcessError as e:            print(f&quot;[run] ✗ 依赖安装失败: {e}&quot;)            print(f&quot;      请手动运行: pip install {&#39; &#39;.join(missing)}&quot;)            sys.exit(1)# ════════════════════════════════════════════════════════#  客户端加载# ════════════════════════════════════════════════════════def _load_local(path: str) -&gt; str:    with open(path, encoding=&quot;utf-8&quot;) as f:        return f.read()def _load_remote(url: str) -&gt; str:    print(f&quot;[run] 从远程加载客户端: {url}&quot;)    try:        from urllib.request import urlopen, Request        req = Request(url, headers={&quot;User-Agent&quot;: f&quot;NFD-run/{sys.version.split()[0]}&quot;})        with urlopen(req, timeout=15) as r:            return r.read().decode(&quot;utf-8&quot;)    except Exception as e:        print(f&quot;[run] ✗ 远程加载失败: {e}&quot;)        sys.exit(1)def run_client(source: str, extra_argv: list):    &quot;&quot;&quot;在当前进程内 exec 客户端代码，透传命令行参数&quot;&quot;&quot;    # 注入参数：让客户端的 argparse 能拿到    sys.argv = [LOCAL_CLIENT] + extra_argv    code = compile(source, LOCAL_CLIENT, &quot;exec&quot;)    ns = {&quot;__name__&quot;: &quot;__main__&quot;, &quot;__file__&quot;: LOCAL_CLIENT}    exec(code, ns)# ════════════════════════════════════════════════════════#  参数解析# ════════════════════════════════════════════════════════def parse_launcher_args():    &quot;&quot;&quot;    解析 run.py 自身参数；未识别的参数全部透传给客户端    &quot;&quot;&quot;    parser = argparse.ArgumentParser(        description=&quot;NFD DNode 启动器&quot;,        add_help=False,     # 让客户端处理 -h/--help    )    parser.add_argument(&quot;--url&quot;,      default=None,                        help=f&quot;远程客户端 URL (默认: {REMOTE_CLIENT})&quot;)    parser.add_argument(&quot;--venv&quot;,     action=&quot;store_true&quot;,                        help=&quot;强制创建/使用 venv&quot;)    parser.add_argument(&quot;--no-venv&quot;,  action=&quot;store_true&quot;,                        help=&quot;跳过 venv 检查，直接运行&quot;)    parser.add_argument(&quot;--no-check&quot;, action=&quot;store_true&quot;,                        help=&quot;跳过版本和依赖检查（加速启动）&quot;)    # 其余参数透传给客户端    known, passthrough = parser.parse_known_args()    return known, passthrough# ════════════════════════════════════════════════════════#  入口# ════════════════════════════════════════════════════════def main():    opts, client_argv = parse_launcher_args()    if not opts.no_check:        check_python()    # venv 管理（Android 跳过）    if not opts.no_venv and not IS_ANDROID:        if opts.venv:            ensure_venv(force=True)        elif not _in_venv():            # 自动检测：如果有 .venv 目录就进入，否则不创建（静默）            venv_python = (                os.path.join(VENV_DIR, &quot;Scripts&quot;, &quot;python.exe&quot;) if IS_WIN                else os.path.join(VENV_DIR, &quot;bin&quot;, &quot;python&quot;)            )            if os.path.exists(venv_python):                print(f&quot;[run] 检测到 {VENV_DIR}/，切换到 venv Python&quot;)                os.execv(venv_python, [venv_python] + sys.argv)    # 安装依赖    if not opts.no_check:        install_deps(REQUIRED_PKGS)    # 加载客户端源码    if opts.url:        # 指定了 --url，从远程加载        source = _load_remote(opts.url)    else:        # 优先本地文件        local_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), LOCAL_CLIENT)        if os.path.exists(local_path):            print(f&quot;[run] 加载本地客户端: {local_path}&quot;)            source = _load_local(local_path)        else:            # 本地文件不存在，从远程拉取            source = _load_remote(REMOTE_CLIENT)    print(&quot;[run] 启动客户端...\n&quot; + &quot;─&quot; * 50)    run_client(source, client_argv)if __name__ == &quot;__main__&quot;:    main()</code></pre><h3 id="dnode_client_v4%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81" tabindex="-1">dnode_client_v4完整代码</h3><pre><code class="language-">#!/usr/bin/env python3&quot;&quot;&quot;NFD 客户端节点  ── Android APK / 跨平台════════════════════════════════════════════════════════════════服务端地址优先级（高→低）:  1. 命令行参数    python node_client.py wss://host:9000/ws/node  2. 环境变量      NFD_SERVER=wss://host:9000/ws/node  3. 配置文件      node_config.json  中的 server_url 字段  4. 内置默认值    ws://proxy.nfd.com:9000/ws/node其他可选参数:  --secret  &lt;token&gt;     接入密钥（也可在配置文件或 NFD_SECRET 环境变量中设置）  --id      &lt;node_id&gt;   指定设备 ID（默认自动生成并持久化）  --debug               等同于 LOG_LEVEL=DEBUGAndroid 配置文件路径优先级:  $NFD_CONFIG_DIR/node_config.json  /sdcard/nfd/node_config.json  &lt;脚本同级目录&gt;/node_config.json用法示例:  python node_client.py wss://proxy.example.com:9000/ws/node  python node_client.py wss://proxy.example.com:9000/ws/node --secret abc123  NFD_SERVER=wss://... python node_client.py&quot;&quot;&quot;import argparseimport asyncioimport hashlibimport jsonimport loggingimport osimport platformimport signalimport socketimport sslimport structimport sysimport timeimport uuidfrom typing import Dict, Optionalimport aiohttp# ══════════════════════════════════════════════════════════#  Android 检测# ══════════════════════════════════════════════════════════def _is_android() -&gt; bool:    return (        os.path.exists(&quot;/data/data&quot;) or        os.environ.get(&quot;ANDROID_ROOT&quot;) is not None or        os.environ.get(&quot;ANDROID_DATA&quot;) is not None    )IS_ANDROID = _is_android()PLATFORM   = &quot;Android&quot; if IS_ANDROID else platform.system()# ══════════════════════════════════════════════════════════#  配置文件路径（Android 友好）# ══════════════════════════════════════════════════════════def _config_path() -&gt; str:    # 1. 环境变量指定目录    env_dir = os.environ.get(&quot;NFD_CONFIG_DIR&quot;, &quot;&quot;)    if env_dir:        return os.path.join(env_dir, &quot;node_config.json&quot;)    # 2. Android：优先 SD 卡可读目录    if IS_ANDROID:        sdcard = &quot;/sdcard/nfd&quot;        try:            os.makedirs(sdcard, exist_ok=True)            return os.path.join(sdcard, &quot;node_config.json&quot;)        except OSError:            pass    # 3. 脚本同级目录    return os.path.join(os.path.dirname(os.path.abspath(__file__)), &quot;node_config.json&quot;)CONFIG_FILE = _config_path()# ══════════════════════════════════════════════════════════#  日志# ══════════════════════════════════════════════════════════def _setup_logging(debug: bool = False) -&gt; None:    level = logging.DEBUG if debug else getattr(        logging, os.environ.get(&quot;LOG_LEVEL&quot;, &quot;INFO&quot;).upper(), logging.INFO    )    fmt = &quot;%(asctime)s.%(msecs)03d [%(levelname)-5s] %(name)s - %(message)s&quot;    # Android 下 basicConfig 可能已被 chaquopy 初始化，安全地重设    root = logging.getLogger()    root.setLevel(level)    if not root.handlers:        handler = logging.StreamHandler(sys.stdout)        handler.setFormatter(logging.Formatter(fmt, datefmt=&quot;%H:%M:%S&quot;))        root.addHandler(handler)    else:        for h in root.handlers:            h.setFormatter(logging.Formatter(fmt, datefmt=&quot;%H:%M:%S&quot;))logger   = logging.getLogger(&quot;nfd.node&quot;)flow_log = logging.getLogger(&quot;nfd.flow&quot;)# ══════════════════════════════════════════════════════════#  工具函数# ══════════════════════════════════════════════════════════def _fmt_bytes(n: int) -&gt; str:    n = int(n or 0)    for unit in (&quot;B&quot;, &quot;KB&quot;, &quot;MB&quot;, &quot;GB&quot;):        if n &lt; 1024:            return f&quot;{n:.1f}{unit}&quot;        n /= 1024    return f&quot;{n:.1f}TB&quot;def _local_ip() -&gt; str:    &quot;&quot;&quot;获取本机出口 IP（Android/Linux/Windows 均可用）&quot;&quot;&quot;    targets = [(&quot;8.8.8.8&quot;, 80), (&quot;1.1.1.1&quot;, 80), (&quot;114.114.114.114&quot;, 80)]    for host, port in targets:        try:            with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:                s.settimeout(1)                s.connect((host, port))                return s.getsockname()[0]        except OSError:            continue    return &quot;?&quot;def _device_fp() -&gt; str:    &quot;&quot;&quot;设备指纹：Android 优先读 Android ID，回退到通用方案&quot;&quot;&quot;    if IS_ANDROID:        # 尝试读取 Android ID（需 READ_PHONE_STATE 或已知路径）        try:            import subprocess            aid = subprocess.check_output(                [&quot;settings&quot;, &quot;get&quot;, &quot;secure&quot;, &quot;android_id&quot;],                timeout=2, stderr=subprocess.DEVNULL            ).decode().strip()            if aid and aid != &quot;null&quot;:                return hashlib.sha256(aid.encode()).hexdigest()[:16]        except Exception:            pass    raw = f&quot;{platform.node()}-{PLATFORM}-{uuid.getnode()}&quot;    return hashlib.sha256(raw.encode()).hexdigest()[:16]def _make_ssl_ctx(url: str) -&gt; Optional[ssl.SSLContext]:    &quot;&quot;&quot;wss:// 创建 SSL context；Android 证书链有时需宽松验证&quot;&quot;&quot;    if not url.startswith(&quot;wss://&quot;):        return None    ctx = ssl.create_default_context()    if IS_ANDROID:        # Android 系统根证书路径不标准，允许加载系统证书        for ca_path in (            &quot;/system/etc/security/cacerts&quot;,            &quot;/data/misc/keychain/certs-added&quot;,        ):            if os.path.isdir(ca_path):                for f in os.listdir(ca_path):                    try:                        ctx.load_verify_locations(os.path.join(ca_path, f))                    except Exception:                        pass        # 如果仍有问题，可通过环境变量 NFD_SSL_NOVERIFY=1 跳过验证（不推荐生产）        if os.environ.get(&quot;NFD_SSL_NOVERIFY&quot;, &quot;0&quot;) == &quot;1&quot;:            ctx.check_hostname = False            ctx.verify_mode    = ssl.CERT_NONE            logger.warning(&quot;SSL 证书验证已禁用（NFD_SSL_NOVERIFY=1）&quot;)    return ctx# ══════════════════════════════════════════════════════════#  帧协议# ══════════════════════════════════════════════════════════TYPE_CONNECT_REQ  = 0x01TYPE_CONNECT_OK   = 0x02TYPE_CONNECT_FAIL = 0x03TYPE_DATA         = 0x04TYPE_CLOSE        = 0x05MAX_CONCURRENCY   = 50def pack_frame(tunnel_id: int, ftype: int, payload: bytes = b&quot;&quot;) -&gt; bytes:    return struct.pack(&quot;&gt;IB&quot;, tunnel_id, ftype) + payloaddef unpack_frame(data: bytes):    tunnel_id, ftype = struct.unpack(&quot;&gt;IB&quot;, data[:5])    return tunnel_id, ftype, data[5:]# ══════════════════════════════════════════════════════════#  单条隧道# ══════════════════════════════════════════════════════════class TunnelWorker:    def __init__(self, tid: int, host: str, port: int,                 ws_send_queue: asyncio.Queue, local_ip: str):        self.tid          = tid        self.host         = host        self.port         = port        self._ws_queue    = ws_send_queue        self._local_ip    = local_ip        self._tcp_writer: Optional[asyncio.StreamWriter] = None        self._data_queue: asyncio.Queue = asyncio.Queue()        self._closed      = False        self._t_start     = time.monotonic()        self._tx_bytes    = 0        self._rx_bytes    = 0    async def run(self):        flow_log.debug(f&quot;[node] tid={self.tid:08x} | {self._local_ip} → {self.host}:{self.port} | TCP_CONNECTING&quot;)        try:            reader, writer = await asyncio.wait_for(                asyncio.open_connection(self.host, self.port), timeout=10            )            self._tcp_writer = writer            local = writer.get_extra_info(&quot;sockname&quot;)            local_addr = f&quot;{local[0]}:{local[1]}&quot; if local else self._local_ip        except Exception as e:            flow_log.debug(f&quot;[node] tid={self.tid:08x} | TCP_FAIL {self.host}:{self.port} err={e}&quot;)            await self._ws_queue.put(pack_frame(self.tid, TYPE_CONNECT_FAIL, str(e).encode()))            return        conn_ms = f&quot;{(time.monotonic()-self._t_start)*1000:.0f}ms&quot;        await self._ws_queue.put(pack_frame(self.tid, TYPE_CONNECT_OK))        flow_log.debug(f&quot;[node] tid={self.tid:08x} | {local_addr} → {self.host}:{self.port} | TCP_CONNECTED conn={conn_ms}&quot;)        async def tcp_to_ws():            try:                while not self._closed:                    chunk = await reader.read(65536)                    if not chunk:                        break                    self._rx_bytes += len(chunk)                    flow_log.debug(                        f&quot;[node] tid={self.tid:08x} | &quot;                        f&quot;target→node chunk={_fmt_bytes(len(chunk))} ↓{_fmt_bytes(self._rx_bytes)}&quot;                    )                    await self._ws_queue.put(pack_frame(self.tid, TYPE_DATA, chunk))            except Exception as e:                flow_log.debug(f&quot;[node] tid={self.tid:08x} | tcp_to_ws err={e}&quot;)            finally:                await self._ws_queue.put(pack_frame(self.tid, TYPE_CLOSE))                self._closed = True        async def ws_to_tcp():            try:                while not self._closed:                    chunk = await self._data_queue.get()                    if chunk is None:                        break                    self._tx_bytes += len(chunk)                    flow_log.debug(                        f&quot;[node] tid={self.tid:08x} | &quot;                        f&quot;node→target chunk={_fmt_bytes(len(chunk))} ↑{_fmt_bytes(self._tx_bytes)}&quot;                    )                    writer.write(chunk)                    await writer.drain()            except Exception as e:                flow_log.debug(f&quot;[node] tid={self.tid:08x} | ws_to_tcp err={e}&quot;)            finally:                try:                    writer.close()                except Exception:                    pass                self._closed = True        await asyncio.gather(tcp_to_ws(), ws_to_tcp(), return_exceptions=True)        logger.info(            f&quot;[node] tid={self.tid:08x} | &quot;            f&quot;{self._local_ip} ⇄ {self.host}:{self.port} | &quot;            f&quot;CLOSED ↑{_fmt_bytes(self._tx_bytes)} ↓{_fmt_bytes(self._rx_bytes)} &quot;            f&quot;dur={time.monotonic()-self._t_start:.2f}s&quot;        )    def feed_data(self, data: bytes):        if not self._closed:            self._data_queue.put_nowait(data)    def close(self):        self._closed = True        self._data_queue.put_nowait(None)        if self._tcp_writer:            try:                self._tcp_writer.close()            except Exception:                pass# ══════════════════════════════════════════════════════════#  节点主体# ══════════════════════════════════════════════════════════class ProxyNode:    RECONNECT_DELAYS = [2, 4, 8, 16, 30, 60]    def __init__(self, server_url: str, node_id: str, secret: str = &quot;&quot;, is_default: bool = False):        self.server_url  = server_url        self.node_id     = node_id        self.secret      = secret        self.is_default  = is_default        self._local_ip   = _local_ip()        self._ssl_ctx    = _make_ssl_ctx(server_url)        self._tunnels:   Dict[int, TunnelWorker] = {}        self._ws_queue:  asyncio.Queue = asyncio.Queue()        self._sem        = asyncio.Semaphore(MAX_CONCURRENCY)        self._running    = False        self._total_tunnels = 0        self._total_tx      = 0        self._total_rx      = 0    async def run(self):        self._running = True        attempt = 0        while self._running:            try:                await self._connect_loop()                attempt = 0            except Exception as e:                delay = self.RECONNECT_DELAYS[min(attempt, len(self.RECONNECT_DELAYS)-1)]                logger.warning(                    f&quot;连接断开 ({type(e).__name__}: {e})，&quot;                    f&quot;{delay}s 后重连... (第{attempt+1}次)&quot;                )                await asyncio.sleep(delay)                attempt += 1    def stop(self):        self._running = False        for t in list(self._tunnels.values()):            t.close()    async def _connect_loop(self):        headers = {            &quot;X-Node-ID&quot;:      self.node_id,            &quot;X-Platform&quot;:     PLATFORM,            &quot;X-Version&quot;:      &quot;3.0&quot;,            &quot;X-Device-FP&quot;:    _device_fp(),            &quot;X-Local-IP&quot;:     self._local_ip,            &quot;X-Default-Node&quot;: &quot;true&quot; if self.is_default else &quot;false&quot;,        }        if self.secret:            headers[&quot;Authorization&quot;] = f&quot;Bearer {self.secret}&quot;        logger.info(            f&quot;连接服务端  url={self.server_url}  &quot;            f&quot;platform={PLATFORM}  local_ip={self._local_ip}  &quot;            f&quot;node_id={self.node_id[:8]}&quot;        )        # Android 上 aiohttp 需要明确传入 ssl context 或 False        ws_kwargs: dict = dict(            headers=headers,            heartbeat=30,            max_msg_size=0,        )        if self._ssl_ctx is not None:            ws_kwargs[&quot;ssl&quot;] = self._ssl_ctx        elif self.server_url.startswith(&quot;wss://&quot;):            ws_kwargs[&quot;ssl&quot;] = True   # fallback: 使用系统默认        async with aiohttp.ClientSession() as sess:            async with sess.ws_connect(self.server_url, **ws_kwargs) as ws:                logger.info(                    f&quot;✅ 已连接  url={self.server_url}  &quot;                    f&quot;local_ip={self._local_ip}  node_id={self.node_id[:8]}&quot;                )                send_task = asyncio.create_task(self._ws_sender(ws))                try:                    await self._ws_receiver(ws)                finally:                    send_task.cancel()                    for t in list(self._tunnels.values()):                        t.close()                    self._tunnels.clear()                    logger.info(                        f&quot;连接断开  tunnels={self._total_tunnels}  &quot;                        f&quot;↑{_fmt_bytes(self._total_tx)} ↓{_fmt_bytes(self._total_rx)}&quot;                    )    async def _ws_sender(self, ws):        while True:            frame = await self._ws_queue.get()            try:                await ws.send_bytes(frame)            except Exception as e:                logger.warning(f&quot;WS 发送失败: {e}&quot;)                break    async def _ws_receiver(self, ws):        async for msg in ws:            if msg.type == aiohttp.WSMsgType.BINARY:                await self._dispatch(msg.data)            elif msg.type == aiohttp.WSMsgType.TEXT:                try:                    d = json.loads(msg.data)                    if d.get(&quot;type&quot;) == &quot;pong&quot;:                        flow_log.debug(&quot;heartbeat pong&quot;)                except Exception:                    pass            elif msg.type in (aiohttp.WSMsgType.ERROR, aiohttp.WSMsgType.CLOSE):                break    async def _dispatch(self, raw: bytes):        if len(raw) &lt; 5:            return        tid, ftype, payload = unpack_frame(raw)        if ftype == TYPE_CONNECT_REQ:            host_len = payload[0]            host     = payload[1:1+host_len].decode()            port     = struct.unpack(&quot;&gt;H&quot;, payload[1+host_len:3+host_len])[0]            self._total_tunnels += 1            logger.info(                f&quot;[node] tid={tid:08x} | &quot;                f&quot;新隧道 → {host}:{port}  &quot;                f&quot;active={len(self._tunnels)+1}/{MAX_CONCURRENCY}&quot;            )            asyncio.create_task(self._run_tunnel(tid, host, port))        elif ftype == TYPE_DATA:            t = self._tunnels.get(tid)            if t:                t.feed_data(payload)            else:                flow_log.debug(f&quot;DATA tid={tid:08x} 无隧道&quot;)        elif ftype == TYPE_CLOSE:            t = self._tunnels.pop(tid, None)            if t:                t.close()    async def _run_tunnel(self, tid: int, host: str, port: int):        async with self._sem:            worker = TunnelWorker(tid, host, port, self._ws_queue, self._local_ip)            self._tunnels[tid] = worker            await worker.run()            self._tunnels.pop(tid, None)            self._total_tx += worker._tx_bytes            self._total_rx += worker._rx_bytes# ══════════════════════════════════════════════════════════#  配置加载 &amp; CLI# ══════════════════════════════════════════════════════════DEFAULT_SERVER = &quot;wss://dnode.qaiu.top/ws/node&quot;def load_file_config() -&gt; dict:    &quot;&quot;&quot;从配置文件读取（文件不存在则创建模板）&quot;&quot;&quot;    defaults = {&quot;server_url&quot;: DEFAULT_SERVER, &quot;node_id&quot;: &quot;&quot;, &quot;secret&quot;: &quot;&quot;}    if os.path.exists(CONFIG_FILE):        try:            with open(CONFIG_FILE, encoding=&quot;utf-8&quot;) as f:                return {**defaults, **json.load(f)}        except Exception as e:            logger.warning(f&quot;配置文件读取失败: {e}，使用默认值&quot;)            return defaults    # 首次运行：写入模板（含新生成 node_id）    defaults[&quot;node_id&quot;] = uuid.uuid4().hex    try:        os.makedirs(os.path.dirname(CONFIG_FILE), exist_ok=True)        with open(CONFIG_FILE, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:            json.dump(defaults, f, indent=2, ensure_ascii=False)        logger.info(f&quot;已生成配置文件: {CONFIG_FILE}&quot;)    except OSError as e:        logger.warning(f&quot;配置文件写入失败: {e}&quot;)    return defaultsdef save_node_id(node_id: str):    &quot;&quot;&quot;持久化自动生成的 node_id&quot;&quot;&quot;    try:        cfg = {}        if os.path.exists(CONFIG_FILE):            with open(CONFIG_FILE, encoding=&quot;utf-8&quot;) as f:                cfg = json.load(f)        cfg[&quot;node_id&quot;] = node_id        with open(CONFIG_FILE, &quot;w&quot;, encoding=&quot;utf-8&quot;) as f:            json.dump(cfg, f, indent=2, ensure_ascii=False)    except OSError:        passdef parse_args():    parser = argparse.ArgumentParser(        description=&quot;NFD 代理客户端节点&quot;,        formatter_class=argparse.RawDescriptionHelpFormatter,        epilog=&quot;&quot;&quot;示例:  python node_client.py wss://proxy.example.com:9000/ws/node  python node_client.py wss://proxy.example.com:9000/ws/node --secret mytoken  python node_client.py --debug  NFD_SERVER=wss://... python node_client.py        &quot;&quot;&quot;,    )    parser.add_argument(        &quot;server_url&quot;,        nargs=&quot;?&quot;,        default=None,        metavar=&quot;SERVER_URL&quot;,        help=&quot;服务端 ws:// 或 wss:// 地址（最高优先级）&quot;,    )    parser.add_argument(&quot;--secret&quot;, default=None, help=&quot;接入密钥&quot;)    parser.add_argument(&quot;--id&quot;,     default=None, help=&quot;指定 node_id（设备标识）&quot;)    parser.add_argument(&quot;--debug&quot;,  action=&quot;store_true&quot;, help=&quot;开启 DEBUG 日志&quot;)    parser.add_argument(        &quot;--default&quot;, action=&quot;store_true&quot;,        help=&quot;标记为默认节点（兜底分发，服务器本地部署时使用）&quot;    )    return parser.parse_args()# ══════════════════════════════════════════════════════════#  入口# ══════════════════════════════════════════════════════════async def amain():    args    = parse_args()    _setup_logging(args.debug)    file_cfg = load_file_config()    # 服务端地址优先级: CLI arg &gt; 环境变量 &gt; 配置文件 &gt; 默认    server_url = (        args.server_url        or os.environ.get(&quot;NFD_SERVER&quot;, &quot;&quot;)        or file_cfg.get(&quot;server_url&quot;, &quot;&quot;)        or DEFAULT_SERVER    ).strip()    # 密钥优先级: CLI &gt; 环境变量 &gt; 配置文件    secret = (        args.secret        or os.environ.get(&quot;NFD_SECRET&quot;, &quot;&quot;)        or file_cfg.get(&quot;secret&quot;, &quot;&quot;)    )    # node_id 优先级: CLI &gt; 配置文件 &gt; 自动生成    node_id = (        args.id        or file_cfg.get(&quot;node_id&quot;, &quot;&quot;)        or uuid.uuid4().hex    )    if not file_cfg.get(&quot;node_id&quot;):        save_node_id(node_id)    # 校验地址格式    if not server_url.startswith((&quot;ws://&quot;, &quot;wss://&quot;)):        logger.error(            f&quot;服务端地址格式错误: {server_url!r}\n&quot;            &quot;    应为 ws://host:port/ws/node 或 wss://host:port/ws/node&quot;        )        sys.exit(1)    logger.info(        f&quot;NFD 节点启动  platform={PLATFORM}  &quot;        f&quot;node_id={node_id[:8]}  server={server_url}  &quot;        f&quot;default={&#39;✓&#39; if args.default else &#39;✗&#39;}  &quot;        f&quot;config={CONFIG_FILE}&quot;    )    node = ProxyNode(server_url=server_url, node_id=node_id, secret=secret,                     is_default=args.default)    # 注册退出信号（Android SIGTERM / 桌面 SIGINT）    loop = asyncio.get_running_loop()    def _shutdown(sig_name: str):        logger.info(f&quot;收到 {sig_name}，正在退出...&quot;)        node.stop()        loop.stop()    for sig in (signal.SIGTERM, signal.SIGINT):        try:            loop.add_signal_handler(sig, _shutdown, sig.name)        except (NotImplementedError, OSError):            # Windows / 某些嵌入式 Python 不支持 add_signal_handler            pass    await node.run()if __name__ == &quot;__main__&quot;:    try:        asyncio.run(amain())    except (KeyboardInterrupt, SystemExit):        pass</code></pre>]]>
                    </description>
                    <pubDate>Sun, 08 Mar 2026 14:22:55 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[netdisk-fast-download后台配置版使用指南]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/nfdvipconfig</link>
                    <description>
                            <![CDATA[<h1 id="netdisk-fast-download-%E5%90%8E%E5%8F%B0%E9%85%8D%E7%BD%AE%E7%89%88%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97" tabindex="-1">netdisk-fast-download 后台配置版使用指南</h1><blockquote><p><strong>文档版本</strong>: v1.0<br /><strong>更新日期</strong>: 2026年1月31日<br /><strong>适用版本</strong>: nfd-vip2 v0.1.9+</p></blockquote><hr /><h2 id="%F0%9F%93%96-%E7%9B%AE%E5%BD%95" tabindex="-1">📖 目录</h2><ul><li><a href="#1-%E5%8A%9F%E8%83%BD%E7%AE%80%E4%BB%8B">1. 功能简介</a></li><li><a href="#2-%E8%BF%9B%E5%85%A5%E5%90%8E%E5%8F%B0%E7%BD%91%E7%9B%98%E9%85%8D%E7%BD%AE%E7%95%8C%E9%9D%A2">2. 进入后台网盘配置界面</a></li><li><a href="#3-%E5%90%84%E7%BD%91%E7%9B%98%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E">3. 各网盘认证信息配置说明</a></li><li><a href="#4-%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE%E6%AD%A5%E9%AA%A4">4. 详细配置步骤</a></li><li><a href="#5-%E5%8A%A0%E5%AF%86%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E">5. 加密机制说明</a></li><li><a href="#6-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%8E%92%E6%9F%A5">6. 常见问题与排查</a></li></ul><hr /><h2 id="1.-%E5%8A%9F%E8%83%BD%E7%AE%80%E4%BB%8B" tabindex="-1">1. 功能简介</h2><p>本系统支持 <strong>20+</strong> 主流网盘的后台统一管理与认证信息配置。通过后台&quot;<strong>网盘配置</strong>&quot;功能，可为各类网盘账号集中配置认证信息，实现：</p><ul><li>✅ 批量管理多个网盘账号</li><li>✅ 统一认证信息加密存储</li><li>✅ 支持一键启用/禁用配置</li><li>✅ 支持临时参数认证（可选）</li><li>✅ 快速解析与高速下载</li></ul><p><strong>支持的认证方式</strong>：</p><ul><li><code>accesstoken</code> - AccessToken认证（移动云盘、联通云盘、天翼云盘等）</li><li><code>cookie</code> - Cookie认证（夸克、UC、QQ微云等）</li><li><code>password</code> - 用户名密码认证（123网盘、小飞机、蓝奏优享等）</li><li><code>authorization</code> - Authorization认证（移动云盘、123网盘等）</li><li><code>custom</code> - 自定义认证（扩展使用）</li><li><code>none</code> - 无需认证（蓝奏云、QQ邮箱、奶牛快传等）</li></ul><hr /><h2 id="2.-%E8%BF%9B%E5%85%A5%E5%90%8E%E5%8F%B0%E7%BD%91%E7%9B%98%E9%85%8D%E7%BD%AE%E7%95%8C%E9%9D%A2" tabindex="-1">2. 进入后台网盘配置界面</h2><h3 id="2.1-%E8%AE%BF%E9%97%AE%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0" tabindex="-1">2.1 访问管理后台</h3><ol><li><p>打开浏览器，访问管理后台地址：</p><pre><code class="language-">http://你的ip:6432/nfdadmin/</code></pre><p>如果后台管理已经绑定了域名请使用</p><pre><code class="language-">http(s)://你的域名/nfdadmin/</code></pre><p>或根据实际部署的域名和端口访问。</p></li><li><p>输入管理员账号密码登录。<br /><strong>【后台登录界面】</strong></p></li></ol><blockquote><p><img src="https://bd2.qaiu.cn/blog/image-1769859098755.png" alt="image-1769859098755" /></p></blockquote><hr /><h3 id="2.2-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%9B%98%E9%85%8D%E7%BD%AE%E9%A1%B5%E9%9D%A2" tabindex="-1">2.2 进入网盘配置页面</h3><ol><li>登录成功后，在左侧菜单栏找到 <strong>“网盘配置”</strong> 菜单项。</li><li>点击进入网盘配置管理界面。</li><li>界面包含两个标签页：<ul><li><strong>配置管理</strong> - 管理网盘认证信息</li><li><strong>解析控制</strong> - 管理网盘解析权限、限流等</li></ul></li></ol><blockquote><p><strong>【网盘配置菜单和列表界面】</strong><br /><img src="https://bd2.qaiu.cn/blog/image-1769859207974.png" alt="image-1769859207974" /></p></blockquote><hr /><h3 id="2.3-%E7%95%8C%E9%9D%A2%E5%8A%9F%E8%83%BD%E8%AF%B4%E6%98%8E" tabindex="-1">2.3 界面功能说明</h3><p><strong>配置管理</strong>界面主要功能：</p><ul><li>📋 <strong>查看列表</strong> - 展示已配置的所有网盘账号</li><li>✏️ <strong>编辑配置</strong> - 修改现有配置的认证信息</li></ul><hr /><h2 id="3.-%E5%90%84%E7%BD%91%E7%9B%98%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E" tabindex="-1">3. 各网盘认证信息配置说明</h2><h2 id="3.-%E5%90%84%E7%BD%91%E7%9B%98%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E-1" tabindex="-1">3. 各网盘认证信息配置说明</h2><h3 id="3.1-%E8%81%94%E9%80%9A%E4%BA%91%E7%9B%98%EF%BC%88pwo%EF%BC%89" tabindex="-1">3.1 联通云盘（pwo）</h3><p><strong>网盘类型代码</strong>：<code>pwo</code><br /><strong>支持认证方式</strong>：AccessToken<br /><strong>配置难度</strong>：⭐⭐⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5" tabindex="-1">配置字段</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>accesstoken</code></td><td>访问令牌</td><td><code>2c967a63-bad7-434c-9ea6-993b49ad61ea</code></td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95" tabindex="-1">获取方法</h4><ol><li>使用浏览器访问联通云盘网页版：<a href="https://pan.wo.cn" target="_blank">https://pan.wo.cn</a></li><li>登录您的账号</li><li>按 <code>F12</code> 打开浏览器开发者工具</li><li>切换到 <strong>Application（应用程序）</strong> 标签</li><li>展开左侧  <strong>LocalStore</strong></li><li>在右侧列表中找到 <code>wocloudinfo</code> 字段，复制其值然后解码</li><li>进行在线base64解码 打开 <a href="https://www.toolhelper.cn/EncodeDecode/Base64" target="_blank">https://www.toolhelper.cn/EncodeDecode/Base64</a></li></ol><blockquote><p><strong>【截图预留位置3：联通云盘获取 accesstoken - 开发者工具截图】</strong><br /><img src="https://bd2.qaiu.cn/blog/11b4da46028570a82fc154044f0960a3.png" alt="11b4da46028570a82fc154044f0960a3" /></p></blockquote><hr /><blockquote><p>打开：<a href="https://www.toolhelper.cn/EncodeDecode/Base64" target="_blank">https://www.toolhelper.cn/EncodeDecode/Base64</a>   -&gt;  Base64解码 -&gt; 复制token后面的字符串<br /><img src="https://bd2.qaiu.cn/blog/image-1769861449178.png" alt="image-1769861449178" /><br /><img src="https://bd2.qaiu.cn/blog/image-1771389268564.png" alt="image-1771389268564" /></p></blockquote><h4 id="%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B" tabindex="-1">配置示例</h4><pre><code class="language-yaml">配置名称: 我的联通云盘账号网盘类型: pwo认证方式: accesstokenToken: 2c967a63-bad7-434c-9ea6-993b49ad61ea</code></pre><hr /><h3 id="3.2-%E7%A7%BB%E5%8A%A8%E4%BA%91%E7%9B%98-%2F-%E5%92%8C%E5%BD%A9%E4%BA%91%EF%BC%88p139%EF%BC%89" tabindex="-1">3.2 移动云盘 / 和彩云（p139）</h3><p><strong>网盘类型代码</strong>：<code>p139</code><br /><strong>支持认证方式</strong>：Authorization<br /><strong>配置难度</strong>：⭐⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5-1" tabindex="-1">配置字段</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>authorization</code></td><td>授权令牌</td><td>完整的 Authorization 头信息</td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-1" tabindex="-1">获取方法</h4><ol><li>访问移动云盘网页版：<a href="https://caiyun.139.com" target="_blank">https://caiyun.139.com</a></li><li>登录账号</li><li><code>F12</code> 打开开发者工具 → <strong>Network（网络）</strong> 标签</li><li>刷新页面或进行任意操作</li><li>选择任一请求，在 <strong>Headers（请求头）</strong> 中找到 <code>authorization</code> 字段</li><li>复制完整的 authorization 值</li></ol><blockquote><p><strong>【移动云盘获取 Authorization - Network 截图】</strong><br /><img src="https://bd2.qaiu.cn/blog/image-1771382900524.png" alt="image-1771382900524" /><br /><img src="https://bd2.qaiu.cn/blog/image-1771389316465.png" alt="image-1771389316465" /></p></blockquote><hr /><h3 id="3.3-%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98%EF%BC%88p189%EF%BC%89" tabindex="-1">3.3 天翼云盘（p189）</h3><p><strong>强烈推荐用户名密码方式一劳永逸</strong></p><p><strong>网盘类型代码</strong>：<code>p189</code><br /><strong>支持认证方式</strong>：</p><ul><li>AccessToken（大文件推荐）、</li><li>Cookie（长期有效推荐）、</li><li>用户名密码  （内测，可能会触发验证–需要关闭设备锁）</li></ul><p><strong>配置难度</strong>：⭐⭐⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5%EF%BC%88%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9Aaccesstoken---%E6%8E%A8%E8%8D%90%EF%BC%89" tabindex="-1">配置字段（方式一：AccessToken - 推荐）</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>accesstoken</code></td><td>访问令牌</td><td>从浏览器获取的 token</td></tr></tbody></table><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5%EF%BC%88%E6%96%B9%E5%BC%8F%E4%BA%8C%EF%BC%9Acookie%EF%BC%89" tabindex="-1">配置字段（方式二：Cookie）</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>cookie</code></td><td>完整Cookie</td><td>从浏览器复制的完整 Cookie 字符串</td></tr></tbody></table><h4 id="userpwd" tabindex="-1">userpwd</h4><p>配置字段（方式三：用户名密码，需要关闭安全认证）</p><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>username</code></td><td>天翼云盘手机号</td><td><code>13800138000</code></td></tr><tr><td><code>password</code></td><td>天翼云盘密码</td><td>您的登录密码</td></tr></tbody></table><p><strong>重要提示</strong>：使用用户名密码方式前，需要在天翼云盘账号设置中<strong>关闭安全认证</strong>（如短信验证、扫码登录等），否则登录会失败。<br />关闭方式：</p><ol><li>打开https://e.dlife.cn/portal/web/index.html 登录</li><li>关闭设备锁<img src="https://bd2.qaiu.cn/blog/image-1769860879086.png" alt="image-1769860879086" /></li></ol><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-2" tabindex="-1">获取方法</h4><ol><li>访问天翼云盘网页版：<a href="https://cloud.189.cn" target="_blank">https://cloud.189.cn</a></li><li>登录账号</li><li><code>F12</code> → <strong>Application</strong> → <strong>Local Storage</strong> → <code>https://cloud.189.cn</code></li><li>查找 <code>accesstoken</code> 字段并复制其值</li></ol><blockquote><p><strong>【天翼云盘获取 accesstoken - Local Storage 】请切换移动视图</strong><br /><img src="https://bd2.qaiu.cn/blog/image-1769862717382.png" alt="image-1769862717382" /></p></blockquote><hr /><blockquote><p><strong>【天翼云盘获取 cookie 】xhr过滤 <code>listFiles</code></strong><br /><img src="https://bd2.qaiu.cn/blog/image-1769860556304.png" alt="image-1769860556304" /></p></blockquote><hr /><p><img src="https://bd2.qaiu.cn/blog/image-1771389187482.png" alt="image-1771389187482" /></p><hr /><p><strong>注意事项</strong>：</p><ul><li>⚠️ 天翼云盘 Token 有效期约 30天， cookie有效期一年左右，过期需重新获取</li><li>🔗 手机端配置指南：<a href="https://blog.qaiu.top/archives/nfd-vip%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97" target="_blank">nfd-vip配置指南</a></li></ul><hr /><h3 id="3.4-123%E7%BD%91%E7%9B%98%E2%80%93%E6%9C%8D%E5%8A%A1%E5%99%A8ip%E8%A7%A3%E6%9E%90%E6%9C%89%E9%99%90%E5%88%B6-%E5%BD%93%E5%89%8D%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8-%E4%BB%85%E9%99%90%E4%BA%8E%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8A%A1%EF%BC%88ye%EF%BC%89" tabindex="-1">3.4 123网盘–服务器IP解析有限制 当前无法使用 仅限于本地部署服务（ye）</h3><p><strong>网盘类型代码</strong>：<code>ye</code><br /><strong>支持认证方式</strong>：用户名密码<br /><strong>配置难度</strong>：⭐⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5%EF%BC%88%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E7%94%A8%E6%88%B7%E5%90%8D%E5%AF%86%E7%A0%81%EF%BC%89" tabindex="-1">配置字段（方式一：用户名密码）</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>username</code></td><td>账号</td><td>您的123网盘账号</td></tr><tr><td><code>password</code></td><td>密码</td><td>您的123网盘密码</td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95%EF%BC%88%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%89" tabindex="-1">获取方法（方式一）</h4><p>直接填写您的123网盘账号和密码即可。</p><p><strong>注意事项</strong>：</p><ul><li>💡 推荐使用用户名密码方式，更稳定</li><li>⚠️ 123网盘可能存在区域限制</li></ul><hr /><h3 id="3.5-%E5%B0%8F%E9%A3%9E%E6%9C%BA%E7%BD%91%E7%9B%98%EF%BC%88fj%EF%BC%89" tabindex="-1">3.5 小飞机网盘（fj）</h3><p><strong>网盘类型代码</strong>：<code>fj</code><br /><strong>支持认证方式</strong>：用户名密码<br /><strong>配置难度</strong>：⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5-2" tabindex="-1">配置字段</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>username</code></td><td>账号</td><td>您的小飞机账号</td></tr><tr><td><code>password</code></td><td>密码</td><td>您的小飞机密码</td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-3" tabindex="-1">获取方法</h4><p>直接使用您在小飞机网盘注册的账号密码。</p><h4 id="%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B-1" tabindex="-1">配置示例</h4><pre><code class="language-yaml">配置名称: 我的小飞机账号网盘类型: fj认证方式: password用户名: your_username密码: your_password</code></pre><p><strong>注意事项</strong>：</p><ul><li>⚠️ 小飞机网盘需要代理访问，请确保已在 <code>app-dev.yml</code> 中配置代理</li><li>📌 详见 <a href="./%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98%E6%96%87%E6%A1%A3.md" target="_blank">doc/相关问题文档.md</a> 第1章</li></ul><blockquote><p><img src="https://bd2.qaiu.cn/blog/image-1771383183822.png" alt="image-1771383183822" /></p></blockquote><hr /><h3 id="3.6-%E8%93%9D%E5%A5%8F%E4%BA%91%E4%BC%98%E4%BA%AB%EF%BC%88iz%EF%BC%89" tabindex="-1">3.6 蓝奏云优享（iz）</h3><p><strong>网盘类型代码</strong>：<code>iz</code><br /><strong>支持认证方式</strong>：用户名密码<br /><strong>配置难度</strong>：⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5-3" tabindex="-1">配置字段</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>username</code></td><td>登录账号</td><td>您的蓝奏优享账号</td></tr><tr><td><code>password</code></td><td>登录密码</td><td>您的蓝奏优享密码</td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-4" tabindex="-1">获取方法</h4><p>直接使用您的蓝奏云优享版账号密码。</p><p><strong>注意事项</strong>：</p><ul><li>📌 蓝奏云优享（付费版）不同于免费版蓝奏云（lz）</li><li>⚠️ 同样需要代理访问</li></ul><blockquote><p><img src="https://bd2.qaiu.cn/blog/image-1771383340113.png" alt="image-1771383340113" /></p></blockquote><hr /><h3 id="3.7-%E5%A4%B8%E5%85%8B%E7%BD%91%E7%9B%98%EF%BC%88qk%EF%BC%89" tabindex="-1">3.7 夸克网盘（qk）</h3><p><strong>网盘类型代码</strong>：<code>qk</code><br /><strong>支持认证方式</strong>：Cookie<br /><strong>配置难度</strong>：⭐⭐</p><h4 id="%E9%85%8D%E7%BD%AE%E5%AD%97%E6%AE%B5-4" tabindex="-1">配置字段</h4><table><thead><tr><th>字段名</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td><code>cookie</code></td><td>完整Cookie</td><td>从浏览器复制的 Cookie 字符串</td></tr></tbody></table><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-5" tabindex="-1">获取方法</h4><ol><li>访问夸克网盘：<a href="https://pan.quark.cn" target="_blank">https://pan.quark.cn</a></li><li>登录账号</li><li><code>F12</code> → <strong>Application</strong> → <strong>Cookies</strong> → <code>https://pan.quark.cn</code></li><li>右键点击任一 Cookie → <strong>Show Cookies in Headers</strong> 或手动拼接所有 Cookie</li><li>复制完整的 Cookie 字符串（格式：<code>key1=value1; key2=value2; ...</code>）</li></ol><blockquote><p><strong>【夸克网盘获取 Cookie 】xhr过滤 <code>list</code></strong><br /><img src="https://bd2.qaiu.cn/blog/image-1769861811783.png" alt="image-1769861811783" /></p></blockquote><hr /><h3 id="3.8-uc%E7%BD%91%E7%9B%98%EF%BC%88uc%EF%BC%89" tabindex="-1">3.8 UC网盘（uc）</h3><p><strong>网盘类型代码</strong>：<code>uc</code><br /><strong>支持认证方式</strong>：Cookie<br /><strong>配置难度</strong>：⭐⭐</p><p>配置方法与夸克网盘（qk）相同，访问 <a href="https://drive.uc.cn" target="_blank">https://drive.uc.cn</a> 获取 Cookie。</p><hr /><h3 id="3.9-%E9%98%BF%E9%87%8C%E4%BA%91%E7%9B%98%EF%BC%88pali%EF%BC%89%E6%9A%82%E4%B8%8D%E6%94%AF%E6%8C%81" tabindex="-1">3.9 阿里云盘（pali）暂不支持</h3><hr /><h3 id="3.10-qq%E5%BE%AE%E4%BA%91%EF%BC%88qqwy%EF%BC%89" tabindex="-1">3.10 QQ微云（qqwy）</h3><p><strong>网盘类型代码</strong>：<code>qqwy</code><br /><strong>支持认证方式</strong>：Cookie<br /><strong>配置难度</strong>：⭐⭐</p><h4 id="%E8%8E%B7%E5%8F%96%E6%96%B9%E6%B3%95-6" tabindex="-1">获取方法</h4><ol><li>访问 QQ 微云：<a href="https://www.weiyun.com" target="_blank">https://www.weiyun.com</a></li><li>登录 QQ 账号</li><li>按前述方法获取 Cookie</li></ol><hr /><h3 id="3.11-%E5%85%8D%E8%AE%A4%E8%AF%81%E7%BD%91%E7%9B%98" tabindex="-1">3.11 免认证网盘</h3><p>以下网盘<strong>无需配置认证信息</strong>，系统默认支持：</p><table><thead><tr><th>网盘名称</th><th>类型代码</th><th>说明</th></tr></thead><tbody><tr><td>蓝奏云</td><td><code>lz</code></td><td>免费版无需认证</td></tr><tr><td>QQ邮箱中转站</td><td><code>qq</code></td><td>无需认证</td></tr><tr><td>QQ邮箱网盘</td><td><code>qqw</code></td><td>无需认证</td></tr><tr><td>奶牛快传</td><td><code>cow</code></td><td>无需认证</td></tr><tr><td>移动云空间</td><td><code>ec</code></td><td>无需认证</td></tr><tr><td>联想乐云</td><td><code>le</code></td><td>无需认证</td></tr><tr><td>微雨云</td><td><code>pvyy</code></td><td>无需认证</td></tr><tr><td>城通网盘</td><td><code>ct</code></td><td>无需认证</td></tr><tr><td>115网盘</td><td><code>p115</code></td><td>无需认证</td></tr><tr><td>118网盘</td><td><code>p118</code></td><td>无需认证</td></tr><tr><td>文叔叔</td><td><code>ws</code></td><td>无需认证</td></tr></tbody></table><p><strong>配置方式</strong>：</p><ul><li>在后台新增配置时，选择对应网盘类型</li><li>认证方式选择 <code>none</code></li><li>无需填写其他认证字段</li><li>直接保存即可</li></ul><hr /><h2 id="4.-%E8%AF%A6%E7%BB%86%E9%85%8D%E7%BD%AE%E6%AD%A5%E9%AA%A4" tabindex="-1">4. 详细配置步骤</h2><ol><li>点击“新增网盘配置”。</li><li>选择网盘类型（如天翼云盘 p189）。</li><li>按需填写认证信息（如 accesstoken、cookie、用户名/密码等）。</li><li>可填写备注，便于区分。</li><li>保存后即可生效。</li></ol><hr /><h2 id="5.-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%8E%92%E6%9F%A5" tabindex="-1">5. 常见问题与排查</h2><ul><li>Token 失效：请重新获取并更新认证信息。</li><li>解析失败：检查认证信息是否正确、是否需要代理等。</li><li>详细排查见“doc/相关问题文档.md”。</li></ul><hr /><p>如需详细配置示例或遇到特殊网盘类型，请参考官方文档或联系技术支持。</p><hr />]]>
                    </description>
                    <pubDate>Sat, 31 Jan 2026 19:45:34 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[nfd-proxy代理节点技术深度剖析]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/2026-03-18-02-12-02</link>
                    <description>
                            <![CDATA[<h1 id="nfd-proxy-%E2%80%94-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%A3%E7%90%86%E8%8A%82%E7%82%B9%E7%B3%BB%E7%BB%9F" tabindex="-1">NFD Proxy — 分布式代理节点系统</h1><blockquote><p>将用户设备注册为代理节点，通过 WebSocket 控制面实现 geo 感知分发的 SOCKS5 / HTTP 代理网络。</p></blockquote><h2 id="" tabindex="-1"><img src="https://bd2.qaiu.cn/blog/image-1775188614629.png" alt="image-1775188614629" /></h2><h2 id="%E6%9E%B6%E6%9E%84" tabindex="-1">架构</h2><pre><code class="language-">用户 / Vert.x 后端  │  HTTP CONNECT :8888  (Proxy-Authorization: Basic)  │  SOCKS5       :1080  (用户名/密码子协商)  ▼proxy_server.py          GeoIP 解析 → 同城→同省→默认→任意  │  WebSocket :9000/ws/node  ▼dnode_client.py          用户设备（真实出口 IP）  ▼目标服务器</code></pre><hr /><h2 id="%E7%BB%84%E4%BB%B6" tabindex="-1">组件</h2><table><thead><tr><th>文件</th><th>说明</th></tr></thead><tbody><tr><td><code>proxy_server.py</code></td><td>服务端：SOCKS5 + HTTP CONNECT 代理，WS 节点注册，Admin API，控制面板</td></tr><tr><td><code>dnode_client.py</code></td><td>节点客户端：全平台，单依赖 <code>websockets</code>，Android Chaquopy 支持</td></tr><tr><td><code>run.py</code></td><td>通用启动器：自动安装依赖，venv 管理，支持远程拉取执行</td></tr><tr><td><code>dashboard.html</code></td><td>实时监控大屏：节点地图、KPI、事件流</td></tr><tr><td><code>admin.html</code></td><td>管理面板：节点列表、踢除、URL 参数自动登录</td></tr><tr><td><code>api-docs.html</code></td><td>API 文档</td></tr><tr><td><code>start.sh</code></td><td>服务端启动脚本，支持完整参数透传</td></tr></tbody></table><hr /><h2 id="%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8" tabindex="-1">快速启动</h2><h3 id="%E6%9C%8D%E5%8A%A1%E7%AB%AF" tabindex="-1">服务端</h3><pre><code class="language-bash"># 基础启动PROXY_USER=admin PROXY_PASS=secret ADMIN_TOKEN=tok python3 proxy_server.py# 或使用启动脚本./start.sh -u admin -p secret -t tok --debug</code></pre><table><thead><tr><th>端口</th><th>协议</th><th>说明</th></tr></thead><tbody><tr><td>1080</td><td>SOCKS5</td><td>代理入口</td></tr><tr><td>8888</td><td>HTTP CONNECT</td><td>代理入口</td></tr><tr><td>9000</td><td>HTTP / WS</td><td>控制面板、API、节点注册</td></tr></tbody></table><h3 id="%E8%8A%82%E7%82%B9%E5%AE%A2%E6%88%B7%E7%AB%AF" tabindex="-1">节点客户端</h3><pre><code class="language-bash"># 直接运行python dnode_client.py wss://dnode.qaiu.top/ws/node# 通过启动器（自动安装依赖）python run.py wss://dnode.qaiu.top/ws/node# 从远程拉取执行（Pydroid 等嵌入式环境）python run.py --url https://qaiu.top/src/py/dnode_client.py</code></pre><hr /><h2 id="%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F" tabindex="-1">环境变量</h2><table><thead><tr><th>变量</th><th>默认</th><th>说明</th></tr></thead><tbody><tr><td><code>PROXY_USER</code></td><td>空</td><td>代理用户名，逗号分隔多账号，空则不鉴权</td></tr><tr><td><code>PROXY_PASS</code></td><td>空</td><td>代理密码，与 <code>PROXY_USER</code> 一一对应</td></tr><tr><td><code>ADMIN_TOKEN</code></td><td>空</td><td>Admin API 令牌，空则 Admin 全部拒绝</td></tr><tr><td><code>SOCKS5_PORT</code></td><td>1080</td><td>SOCKS5 端口</td></tr><tr><td><code>HTTP_PORT</code></td><td>8888</td><td>HTTP CONNECT 端口</td></tr><tr><td><code>CONTROL_PORT</code></td><td>9000</td><td>控制面板端口</td></tr><tr><td><code>LOG_LEVEL</code></td><td>INFO</td><td>日志级别，<code>DEBUG</code> 开启流量详情</td></tr><tr><td><code>SHOW_TARGET</code></td><td>true</td><td>事件流是否显示目标地址</td></tr></tbody></table><hr /><h2 id="%E4%BB%A3%E7%90%86%E8%AE%A4%E8%AF%81-%26-%E7%9C%9F%E5%AE%9E-ip" tabindex="-1">代理认证 &amp; 真实 IP</h2><p>支持在凭证中携带真实 IP，用于 geo 节点选择（<strong>优先级：凭证 IP &gt; XFF 头 &gt; TCP peer</strong>）：</p><pre><code class="language-bash"># 格式 A  标准curl -x http://admin:secret@host:8888 https://ipinfo.io# 格式 B  携带真实 IP（适用于 Vert.x ProxyOptions 无法加自定义头的场景）curl -x http://&#39;admin:1.2.3.4&#39;:secret@host:8888 https://ipinfo.io</code></pre><pre><code class="language-java">// Vert.x ProxyOptionsnew ProxyOptions()    .setType(ProxyType.HTTP)    .setHost(&quot;dnode.qaiu.top&quot;).setPort(8888)    .setUsername(&quot;admin:&quot; + userRealIp)   // &quot;admin:1.2.3.4&quot;    .setPassword(&quot;secret&quot;);</code></pre><hr /><h2 id="admin-api" tabindex="-1">Admin API</h2><p>所有 Admin 接口需要 <code>Authorization: Bearer &lt;ADMIN_TOKEN&gt;</code> 或 <code>?token=&lt;ADMIN_TOKEN&gt;</code>。</p><table><thead><tr><th>方法</th><th>路径</th><th>说明</th></tr></thead><tbody><tr><td>GET</td><td><code>/api/stats</code></td><td>全局统计 + 最近 100 条事件（无需鉴权）</td></tr><tr><td>GET</td><td><code>/api/admin/nodes</code></td><td>列出所有在线节点详情</td></tr><tr><td>POST</td><td><code>/api/admin/node/{conn_id}/kick</code></td><td>踢除单个节点，支持前 8 位前缀</td></tr><tr><td>POST</td><td><code>/api/admin/nodes/kick-all</code></td><td>踢除全部节点</td></tr></tbody></table><hr /><h2 id="%E8%8A%82%E7%82%B9%E5%88%86%E5%8F%91%E7%AD%96%E7%95%A5" tabindex="-1">节点分发策略</h2><pre><code class="language-">Tier 0  同城   (city 匹配)Tier 1  同省   (province 匹配)Tier 2  默认节点 (X-Default-Node: true)Tier 3  任意节点 (兜底)</code></pre><p>同 Tier 内取负载最低节点。节点存活由 WS 断开事件驱动，无时间窗口过滤。</p><hr /><h2 id="android-%E9%9B%86%E6%88%90" tabindex="-1">Android 集成</h2><pre><code class="language-kotlin">// Chaquopy — 启动thread {    Python.getInstance()        .getModule(&quot;dnode_client&quot;)        .callAttr(&quot;main_for_android&quot;,            &quot;wss://dnode.qaiu.top/ws/node&quot;,            filesDir.absolutePath,  // 配置目录            &quot;&quot;,                     // node_id，空则自动生成            &quot;&quot;,                     // secret            false,                  // is_default            false)                  // debug}// 停止（任意线程安全调用）Python.getInstance()    .getModule(&quot;dnode_client&quot;)    .callAttr(&quot;stop_from_android&quot;)</code></pre><p><strong>停止机制</strong>：<code>stop_from_android()</code> 通过 <code>loop.call_soon_threadsafe</code> 主动关闭 WS 连接，打断 <code>async for</code> 循环，event loop 立即退出，不依赖 flag 轮询。</p><hr /><h2 id="%E4%BE%9D%E8%B5%96" tabindex="-1">依赖</h2><h3 id="%E6%9C%8D%E5%8A%A1%E7%AB%AF-(proxy_server.py)" tabindex="-1">服务端 (<code>proxy_server.py</code>)</h3><pre><code class="language-">aiohttp &gt;= 3.9</code></pre><h3 id="%E8%8A%82%E7%82%B9%E5%AE%A2%E6%88%B7%E7%AB%AF-(dnode_client.py)" tabindex="-1">节点客户端 (<code>dnode_client.py</code>)</h3><pre><code class="language-">websockets &gt;= 10.0</code></pre><p>其余均为标准库（<code>asyncio</code> / <code>ssl</code> / <code>struct</code> / <code>json</code>）。</p><hr />]]>
                    </description>
                    <pubDate>Thu, 01 Jan 2026 02:12:02 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[nfd-vip配置指南]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/nfd-vip配置指南</link>
                    <description>
                            <![CDATA[<h1 id="nfd-vip%EF%BC%88netdisk-fast-download%E4%B8%93%E5%B1%9E%E7%89%88%EF%BC%89%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97" tabindex="-1">nfd-vip（netdisk-fast-download专属版）配置指南</h1><blockquote><p>支持电脑端和安卓手机端<br />安卓手机端需要via浏览器和插件</p></blockquote><h2 id="%E7%94%B5%E8%84%91%E7%AB%AF" tabindex="-1">电脑端</h2><h2 id="%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E5%92%8C%E9%A2%84%E8%A7%88url" tabindex="-1">配置域名和预览URL</h2><h2 id="%E9%85%8D%E7%BD%AE%E5%A4%A7%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90token" tabindex="-1">配置大文件解析Token</h2><p>当前大文件支持 蓝奏优享、123、小飞机、天翼云盘、移动云盘、联通云盘</p><h2 id="%E6%89%8B%E6%9C%BA%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97" tabindex="-1">手机端配置指南</h2><ol><li><p>下载via浏览器 <a href="https://viayoo.com/zh-cn/" target="_blank">https://viayoo.com/zh-cn/</a></p></li><li><p>安装vConsole插件 设置-脚本-添加脚本，复制下面脚本添加到via中，完成后打开任意网站如果出现vConsole绿色图标即配置成功</p></li></ol><pre><code class="language-">// ==UserScript==// @name         vConsolev// @namespace    https://viayoo.com/ldqu2n// @version      0.2// @description  via vConsole// @author       You// @run-at       document-start// @match        *://*/*// @grant        none// ==/UserScript==(function() {    &#39;use strict&#39;;    var s = document.createElement(&#39;script&#39;);    s.src = &#39;https://cdnjs.cloudflare.com/ajax/libs/vConsole/3.15.1/vconsole.min.js&#39;;    s.onload = function() {        new VConsole();        console.info(&#39;vConsole 3.15.1 ready&#39;);    };    document.head.appendChild(s);})();</code></pre><ol start="3"><li>登录相关网盘获取认证信息</li></ol><h3 id="%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98accesstoken%E8%8E%B7%E5%8F%96%E6%96%B9%E5%BC%8F%3A" tabindex="-1">天翼云盘AccessToken获取方式:</h3><p>登录天翼云盘:<br /><a href="https://h5.cloud.189.cn/home.html" target="_blank">https://h5.cloud.189.cn/home.html</a><br /><img src="https://bd2.qaiu.cn/blog/Screenshot_2025-09-14-22-46-39-745_mark.via-edit.jpg" alt="Screenshot_2025-09-14-22-46-39-745_mark.via-edit" /><br />打开via vConsole控制台 在storage里找到accessToken复制即可<br /><img src="https://bd2.qaiu.cn/blog/IMG_20250914_224741.jpg" alt="IMG_20250914_224741" /></p><h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2>]]>
                    </description>
                    <pubDate>Tue, 05 Aug 2025 12:09:43 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[NFD网盘直链解析已添加对目录解析支持]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/nfd-wang-pan-zhi-lian-jie-xi-yi-tian-jia-dui-mu-lu-jie-xi-zhi-chi</link>
                    <description>
                            <![CDATA[<h1 id="%F0%9F%9A%80-nfd-%E7%BD%91%E7%9B%98%E7%9B%B4%E9%93%BE%E8%A7%A3%E6%9E%90%E6%9B%B4%E6%96%B0%EF%BC%9A%E6%94%AF%E6%8C%81%E6%96%87%E4%BB%B6%E5%A4%B9%E8%A7%A3%E6%9E%90%E4%B8%8E%E6%96%87%E4%BB%B6%E9%A2%84%E8%A7%88%E5%95%A6%EF%BC%81" tabindex="-1">🚀 NFD 网盘直链解析更新：支持文件夹解析与文件预览啦！</h1><blockquote><p>📅 发布于：2025-07-13<br />📌 项目地址：<a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">GitHub - qaiu/netdisk-fast-download</a><br />🔗 在线演示：<a href="http://www.722shop.top:6401/" target="_blank">http://www.722shop.top:6401/</a></p></blockquote><hr /><p>最近更新了下我的开源项目 <strong>NFD 网盘直链解析</strong>，带来两个实用的新功能：</p><h3 id="%E2%9C%85-%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9B%AE%E5%BD%95%E8%A7%A3%E6%9E%90%EF%BC%88%E7%9B%AE%E5%89%8D%E4%BB%85%E6%94%AF%E6%8C%81%E9%83%A8%E5%88%86%E7%BD%91%E7%9B%98%EF%BC%89" tabindex="-1">✅ 文件夹目录解析（目前仅支持部分网盘）</h3><p>现在可以直接解析部分网盘的 <strong>文件夹分享链接</strong>，列出其中的所有文件，支持一键下载、复制链接等操作。</p><blockquote><p>当前支持文件夹解析的网盘包括：</p><ul><li>✅ 小飞机网盘</li><li>✅ 123 云盘</li><li>✅ 蓝奏云 / 蓝奏优享</li></ul></blockquote><hr /><h3 id="%E2%9C%85-%E6%96%87%E4%BB%B6%E9%A2%84%E8%A7%88%E5%8A%9F%E8%83%BD%E4%B8%8A%E7%BA%BF" tabindex="-1">✅ 文件预览功能上线</h3><p>除了直链下载，现在还能在线预览部分常见格式的文件，例如 PDF 和图片，打开即看，无需下载，体验更丝滑。</p><hr /><h2 id="%F0%9F%93%A6-%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%85%BC%E5%AE%B9%E7%BD%91%E7%9B%98%E5%B9%B3%E5%8F%B0%EF%BC%88%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%E4%B8%AD%EF%BC%89" tabindex="-1">📦 文件解析兼容网盘平台（持续更新中）</h2><p>当前项目对大部分主流网盘都已支持 <strong>文件解析</strong>（即单文件直链获取），包括但不限于：</p><ul><li>小飞机网盘</li><li>蓝奏云 / 蓝奏优享</li><li>123 云盘</li><li>奶牛快传</li><li>移动云空间</li><li>亿方云</li><li>文叔叔</li><li>QQ邮箱中转站</li><li>……</li></ul><hr /><h2 id="%E2%9D%97-%E5%A4%A7%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E8%AF%B4%E6%98%8E" tabindex="-1">❗ 大文件解析说明</h2><p>目前 <strong>开源版本暂不支持大文件（例如 1GB+ 的视频、压缩包）解析</strong>，</p><p>如有此类需求，可联系我进行 <strong>定制开发</strong>，或等待 <strong>专属版本</strong> 后续开放支持。</p><hr /><h2 id="%F0%9F%94%8D-%E6%BC%94%E7%A4%BA%E6%88%AA%E5%9B%BE" tabindex="-1">🔍 演示截图</h2><p>随便找了个小飞机网盘的资源链接，直接丢进系统解析了一下，效果如下图所示：<br /><img src="https://bd2.qaiu.cn/blog/Screenshot_2025-07-13-21-20-18-879_com.android.chrome-edit.jpg" alt="Screenshot_2025-07-13-21-20-18-879_com.android.chrome-edit" /></p><p>文件夹结构自动展开，文件详情一目了然，支持在线打开和下载，体验良好。</p><p>（顺带一提，<code>site:feijipan.com</code> 搜起来还挺香的 😎）</p><hr /><h2 id="%F0%9F%A7%AD-%E9%A1%B9%E7%9B%AE%E5%AF%BC%E8%88%AA" tabindex="-1">🧭 项目导航</h2><ul><li><p>🌐 GitHub：<br /><a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">https://github.com/qaiu/netdisk-fast-download</a></p></li><li><p>🔗 在线演示地址：<br /><a href="http://www.722shop.top:6401/" target="_blank">http://www.722shop.top:6401/</a></p></li></ul><hr /><p>欢迎大家使用、Star 支持，有建议/PR/定制需求也可以随时联系！</p><p>如需打包部署或本地使用，也可以参考 GitHub 上的说明文档，部署非常简单（一个 Docker 命令搞定）。</p><hr />]]>
                    </description>
                    <pubDate>Sun, 13 Jul 2025 21:32:02 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Pydroid3 8.0汉化版下载 已支持运行ollama大模型]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/pydroid3v801cn</link>
                    <description>
                            <![CDATA[<p><strong>各位脚本作者，不反对你们打包售卖各种脚本，但应该注明不要联系汉化作者QAIU，你们脚本遇到问题请不要找汉化作者</strong></p><blockquote><p>该版本来源于某国外网站pydroid mod版本，基于这个版本做了中文汉化<br /><img src="https://bd2.qaiu.cn/blog/Screenshot_2025-05-11-10-46-29-144_com.miui.securitycenter-edit.jpg" alt="Screenshot_2025-05-11-10-46-29-144_com.miui.securitycenter-edit" /></p></blockquote><h3 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">下载地址</h3><p><a href="https://lz.qaiu.top/ec/83c8ed2569006a4cea8887d296464004YcYt" target="_blank">pydroid3 8.01中文版</a><br /><a href="https://lz.qaiu.top/ec/63a1dd41458e41446212ef1bf60b62c7tw" target="_blank">预制库插件</a><br /><a href="https://lz.qaiu.top/ec/682590c860e3a2d5407bac5b728141d5d" target="_blank">权限插件</a></p><h3 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">备用下载地址</h3><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=83c8ed2569006a4cea8887d296464004YcYt&amp;isShare=1" target="_blank">pydroid3 8.01中文版</a><br /><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=63a1dd41458e41446212ef1bf60b62c7tw&amp;isShare=1" target="_blank">预编译库插件</a><br /><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=682590c860e3a2d5407bac5b728141d5d&amp;isShare=1" target="_blank">权限插件</a></p><h3 id="%E9%83%A8%E5%88%86%E6%89%8B%E6%9C%BA%E5%AE%89%E8%A3%85%E5%8F%AF%E8%83%BD%E6%9C%89%E9%A3%8E%E9%99%A9%E6%8F%90%E7%A4%BA%EF%BC%8C%E7%97%85%E6%AF%92%E8%AF%AF%E6%8A%A5%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%BB%8B%E6%84%8F%E7%9A%84%E8%AF%9D%E8%AF%B7%E4%B8%8B%E8%BD%BD%E7%BB%BF%E8%89%B2%E7%89%88%EF%BC%88%E5%8F%AF%E5%85%B1%E5%AD%98%EF%BC%8C%E4%BB%85%E6%94%AF%E6%8C%81pygame%2C-kivy%E7%AD%89%E5%9F%BA%E7%A1%80%E5%9B%BE%E5%BD%A2%E5%BA%93%EF%BC%8C-%E4%B8%8D%E6%94%AF%E6%8C%81pip%E5%AE%89%E8%A3%85%E9%A2%84%E7%BC%96%E8%AF%91%E5%BA%93%EF%BC%89" tabindex="-1">部分手机安装可能有风险提示，病毒误报，如果介意的话请下载绿色版（可共存，仅支持pygame, kivy等基础图形库， 不支持pip安装预编译库）</h3><p><a href="https://lz.qaiu.top/parser?url=https://wwp.lanzoup.com/iJJ7530vs8cd" target="_blank">下载链接</a><br /><a href="https://wwp.lanzoup.com/iJJ7530vs8cd" target="_blank">蓝奏备用链接</a></p><h3 id="ollama%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85" tabindex="-1">ollama插件安装</h3><blockquote><p>ollama插件提供终端下运行大模型的能力<br />使用ollama大模型框架可以轻松运行各类开源模型<br />使用下面安装脚本，复制到pydroid3下运行即可 兼容pydroid3历史版本</p></blockquote><pre><code class="language-python">#pylint:disable=W0122# Pydroid3 ollama安装脚本from urllib.request import urlopenexec(urlopen(&#39;https://qaiu.top/src/py/ollama_install.py&#39;).read())</code></pre><p>使用方式</p><ol><li>打开终端模拟器</li><li>执行deepseek-r1:1.5b示例</li></ol><pre><code class="language-bash">ollama start &gt; /dev/null  2&gt;&amp;1 &amp;ollama run deepseek-r1:1.5b</code></pre><p><img src="https://bd2.qaiu.cn/blog/7abddd434fab413d5e5162b8bb6c39d.jpg" alt="7abddd434fab413d5e5162b8bb6c39d" /></p><h3 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h3><h4 id="%E5%BA%94%E7%94%A8%E5%AE%89%E8%A3%85%E4%B8%8D%E4%B8%8A%EF%BC%9F%E7%AD%BE%E5%90%8D%E5%BC%82%E5%B8%B8%E5%8F%AF%E4%BB%A5%E5%8D%B8%E8%BD%BD%E4%B9%8B%E5%89%8D%E5%B7%B2%E7%BB%8F%E5%AE%89%E8%A3%85%E7%9A%84%E7%89%88%E6%9C%AC%EF%BC%8C%E6%8F%92%E4%BB%B6%E9%9C%80%E8%A6%81%E5%8E%BB%E5%BA%94%E7%94%A8%E7%AE%A1%E7%90%86%E9%87%8C%E5%8D%B8%E8%BD%BD%E3%80%82" tabindex="-1">应用安装不上？签名异常可以卸载之前已经安装的版本，插件需要去应用管理里卸载。</h4><h4 id="pip%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85%E6%85%A2%E6%88%96%E8%80%85%E5%8D%A1%E6%AD%BB%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91%E4%B8%8B%E8%BD%BD%2F%E9%85%8D%E7%BD%AE%E6%B8%85%E5%8D%8Epip%E9%95%9C%E5%83%8F%EF%BC%8C%E5%8F%82%E8%80%83%E6%B8%85%E5%8D%8Epip%E9%95%9C%E5%83%8F%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97" tabindex="-1">pip依赖安装慢或者卡死怎么办？科学上网下载/配置清华pip镜像，参考<a href="https://mirrors.tuna.tsinghua.edu.cn/help/pypi/?from=singlemessage" target="_blank">清华pip镜像配置指南</a></h4><h4 id="pip%E5%AE%89%E8%A3%85%E5%A4%B1%E8%B4%A5%EF%BC%8C%E5%A4%A7%E5%A4%9A%E6%95%B0%E5%8F%AF%E4%BB%A5%E5%8E%BBpypi%E6%89%BE%E5%8E%86%E5%8F%B2%E7%89%88%E6%9C%AC%EF%BC%8C%E6%9C%89%E4%BA%9B%E4%BE%9D%E8%B5%96%E4%B8%8D%E6%94%AF%E6%8C%81arm64%E6%9E%B6%E6%9E%84%E6%B2%A1%E5%8A%9E%E6%B3%95" tabindex="-1">pip安装失败，大多数可以去pypi找历史版本，有些依赖不支持arm64架构没办法</h4>]]>
                    </description>
                    <pubDate>Sun, 11 May 2025 10:21:13 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[在个人网站中使用NFD解析嵌入音视频]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/cccc</link>
                    <description>
                            <![CDATA[<h1 id="wordpress-%E5%A4%96%E9%93%BE%E5%AA%92%E4%BD%93%E5%B5%8C%E5%85%A5%E6%95%99%E7%A8%8B" tabindex="-1">WordPress 外链媒体嵌入教程</h1><blockquote><p>通过 NFD 解析站将网盘分享链接转换为可直接播放的智能直链，实现在 WordPress 中嵌入视频/音频。</p></blockquote><hr /><h2 id="%E5%8E%9F%E7%90%86%E8%AF%B4%E6%98%8E" tabindex="-1">原理说明</h2><pre><code class="language-">网盘分享链接 (source) → 解析站解析 → 智能直链 → WordPress 嵌入播放</code></pre><table><thead><tr><th>类型</th><th>网盘外链 (source)</th><th>解析直链</th></tr></thead><tbody><tr><td>视频</td><td><code>https://www.ilanzou.com/s/CDx6xKbT</code></td><td><code>https://lz.qaiu.top/parser?url=https://www.ilanzou.com/s/CDx6xKbT</code></td></tr><tr><td>音频</td><td><code>https://www.ilanzou.com/s/ZH26x70f</code></td><td><code>https://lz.qaiu.top/parser?url=https://www.ilanzou.com/s/ZH26x70f</code></td></tr></tbody></table><p>解析站地址格式：</p><pre><code class="language-">https://lz.qaiu.top/parser?url={网盘分享链接}</code></pre><p>将 <code>{网盘分享链接}</code> 替换为实际的蓝奏云分享地址即可生成可用于播放的智能直链。</p><hr /><h2 id="1.-%E5%B5%8C%E5%85%A5%E8%A7%86%E9%A2%91" tabindex="-1">1. 嵌入视频</h2><h3 id="1.1-html5-%E5%8E%9F%E7%94%9F-video-%E6%A0%87%E7%AD%BE" tabindex="-1">1.1 HTML5 原生 video 标签</h3><p>适用于所有 WordPress 主题，在文章中切换到「自定义 HTML」块或「代码编辑器」模式粘贴：</p><pre><code class="language-html">&lt;video controls preload=&quot;metadata&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1&quot; type=&quot;video/mp4&quot;&gt;  您的浏览器不支持 video 标签。&lt;/video&gt;</code></pre><p><strong>效果预览：</strong></p><video controls preload="metadata" style="width:100%;">  <source src="https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1#t=0.001" type="video/mp4"></video><h3 id="1.2-%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E" tabindex="-1">1.2 参数说明</h3><table><thead><tr><th>属性</th><th>说明</th></tr></thead><tbody><tr><td><code>controls</code></td><td>显示播放控件（播放/暂停、进度条、音量等）</td></tr><tr><td><code>preload=&quot;metadata&quot;</code></td><td>仅预加载元数据（时长、尺寸），节省带宽</td></tr><tr><td><code>style=&quot;width:100%;&quot;</code></td><td>视频宽度自适应容器，响应式布局</td></tr><tr><td><code>type=&quot;video/mp4&quot;</code></td><td>指定视频 MIME 类型</td></tr></tbody></table><h3 id="1.3-%E6%9B%B4%E5%A4%9A%E5%8F%AF%E9%80%89%E5%B1%9E%E6%80%A7" tabindex="-1">1.3 更多可选属性</h3><pre><code class="language-html">&lt;!-- 自动播放 + 静音 + 循环（适合背景视频） --&gt;&lt;video autoplay muted loop playsinline preload=&quot;metadata&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;&lt;!-- 指定封面图 --&gt;&lt;video controls preload=&quot;metadata&quot; poster=&quot;https://your-site.com/cover.jpg&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;</code></pre><h3 id="1.4-%E4%BD%BF%E7%94%A8%E8%A7%86%E9%A2%91%E5%B8%A7%E4%BD%9C%E4%B8%BA%E5%B0%81%E9%9D%A2%E5%9B%BE" tabindex="-1">1.4 使用视频帧作为封面图</h3><p>可直接使用 HTML5 video 标签展示视频首帧。为避免首帧出现黑屏，可在视频 URL 后追加 #t=0.001，指定从 0.001 秒处开始加载。</p><pre><code class="language-html">&lt;video  src=&quot;video.mp4#t=0.001&quot;  preload=&quot;metadata&quot;  muted  playsinline&gt;&lt;/video&gt;</code></pre><hr /><h2 id="2.-%E5%B5%8C%E5%85%A5%E9%9F%B3%E9%A2%91" tabindex="-1">2. 嵌入音频</h2><h3 id="2.1-joe-%E4%B8%BB%E9%A2%98-%E2%80%94%E2%80%94-dplayer-%E7%BB%84%E4%BB%B6" tabindex="-1">2.1 Joe 主题 —— DPlayer 组件</h3><p>如果你使用的是 <strong>Joe 主题</strong>，可以直接使用内置的 <code>joe-dplayer</code> 标签：</p><pre><code class="language-html">&lt;joe-dplayer src=&quot;https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1&quot;&gt;&lt;/joe-dplayer&gt;</code></pre><p><strong>效果预览：</strong></p><p><joe-dplayer src="https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1"></joe-dplayer></p><h3 id="2.2-html5-%E5%8E%9F%E7%94%9F-audio-%E6%A0%87%E7%AD%BE%EF%BC%88%E9%80%9A%E7%94%A8%EF%BC%89" tabindex="-1">2.2 HTML5 原生 audio 标签（通用）</h3><p>适用于任意主题：</p><pre><code class="language-html">&lt;audio controls preload=&quot;metadata&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1&quot; type=&quot;audio/mpeg&quot;&gt;  您的浏览器不支持 audio 标签。&lt;/audio&gt;</code></pre><p><strong>效果预览：</strong></p><audio controls preload="metadata" style="width:100%;">  <source src="https://lz.qaiu.top/parser?url=https%3A%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside%26data%3D2473b7a22250f2ecdfe372e534d127a106m8%26isShare%3D1" type="audio/mpeg"></audio><hr /><h2 id="3.-wordpress-%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4" tabindex="-1">3. WordPress 操作步骤</h2><h3 id="3.1-%E7%BB%8F%E5%85%B8%E7%BC%96%E8%BE%91%E5%99%A8" tabindex="-1">3.1 经典编辑器</h3><ol><li>打开文章编辑页面，切换到 <strong>「文本」</strong> 模式（非可视化模式）</li><li>在需要插入媒体的位置粘贴对应的 HTML 代码</li><li>切回「可视化」模式确认显示正常后发布</li></ol><h3 id="3.2-gutenberg-%E5%9D%97%E7%BC%96%E8%BE%91%E5%99%A8" tabindex="-1">3.2 Gutenberg 块编辑器</h3><ol><li>点击 <strong>「+」</strong> 添加新块 → 选择 <strong>「自定义 HTML」</strong></li><li>粘贴对应的 HTML 代码</li><li>点击 <strong>「预览」</strong> 确认效果后发布</li></ol><h3 id="3.3-joe-%E4%B8%BB%E9%A2%98%E7%9F%AD%E4%BB%A3%E7%A0%81" tabindex="-1">3.3 Joe 主题短代码</h3><p>Joe 主题用户在文章编辑器中直接写入 <code>joe-dplayer</code> 标签即可，主题会自动渲染播放器。</p><hr /><h2 id="4.-%E5%BF%AB%E9%80%9F%E5%8F%82%E8%80%83" tabindex="-1">4. 快速参考</h2><h3 id="%E8%A7%86%E9%A2%91%E6%A8%A1%E6%9D%BF" tabindex="-1">视频模板</h3><pre><code class="language-html">&lt;video controls preload=&quot;metadata&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=你的蓝奏云分享链接&quot; type=&quot;video/mp4&quot;&gt;&lt;/video&gt;</code></pre><h3 id="%E9%9F%B3%E9%A2%91%E6%A8%A1%E6%9D%BF%EF%BC%88%E9%80%9A%E7%94%A8%EF%BC%89" tabindex="-1">音频模板（通用）</h3><pre><code class="language-html">&lt;audio controls preload=&quot;metadata&quot; style=&quot;width:100%;&quot;&gt;  &lt;source src=&quot;https://lz.qaiu.top/parser?url=你的蓝奏云分享链接&quot; type=&quot;audio/mpeg&quot;&gt;&lt;/audio&gt;</code></pre><h3 id="%E9%9F%B3%E9%A2%91%E6%A8%A1%E6%9D%BF%EF%BC%88joe-%E4%B8%BB%E9%A2%98%EF%BC%89" tabindex="-1">音频模板（Joe 主题）</h3><pre><code class="language-html">&lt;joe-dplayer src=&quot;https://lz.qaiu.top/parser?url=你的蓝奏云分享链接&quot;&gt;&lt;/joe-dplayer&gt;</code></pre><hr /><h2 id="%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" tabindex="-1">注意事项</h2><ul><li><strong>直链有效性</strong>：解析生成的直链可能有时效性，建议使用解析站的智能跳转地址（<code>parser?url=</code>），解析站会自动处理链接刷新</li><li><strong>跨域限制</strong>：部分浏览器可能因 CORS 策略限制播放，确保解析站已正确配置跨域响应头</li><li><strong>HTTPS</strong>：WordPress 站点如果启用了 HTTPS，嵌入的媒体链接也必须是 HTTPS，否则会被浏览器拦截（混合内容）</li><li><strong>移动端兼容</strong>：iOS Safari 不支持 <code>autoplay</code> 非静音视频，如需自动播放请同时添加 <code>muted</code> 属性</li></ul>]]>
                    </description>
                    <pubDate>Sun, 05 Jan 2025 23:18:59 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[nfd网盘解析工具使用指南]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/nfd001</link>
                    <description>
                            <![CDATA[<h2 id="%E4%BD%93%E9%AA%8C%E5%9C%B0%E5%9D%80" tabindex="-1">体验地址</h2><p><a href="https://lz.qaiu.top" target="_blank">https://lz.qaiu.top</a><br /><a href="http://www.722shop.top:6401" target="_blank">http://www.722shop.top:6401</a><br />qq交流群1：1017480890</p><blockquote><p>20250422 添加云盘监控接口<br />20241024 添加QQ音乐, 酷我音乐, 酷狗音乐, 网易云音乐分享链接的支持</p></blockquote><p>网盘直链解析工具能把网盘分享下载链接转化为直链，已支持蓝奏云/蓝奏云优享/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘/Cloudreve/QQ音乐, 酷我音乐, 酷狗音乐, 网易云音乐等，支持加密分享。<br />开源地址: <a href="https://github.com/qaiu/netdisk-fast-download/" target="_blank">https://github.com/qaiu/netdisk-fast-download/</a> 使用Java技术栈, 和部署脚本, 本地化部署非常方便</p><p><img src="https://bd2.qaiu.cn/blog/5c2f4c6a8fd3e42538c7b5d5b03e999.jpg" alt="5c2f4c6a8fd3e42538c7b5d5b03e999" /></p><h2 id="1.-%E8%A7%A3%E6%9E%90%E7%9B%B4%E9%93%BE" tabindex="-1">1. 解析直链</h2><ul><li>操作步骤：输入分享链接和分享密码，点击“解析测试”。</li><li>界面演示<br /><img src="https://bd2.qaiu.cn/blog/image-1730273527154.png" alt="image-1730273527154" /></li></ul><h2 id="2.-%E7%94%9F%E6%88%90markdown%E9%93%BE%E6%8E%A5" tabindex="-1">2. 生成Markdown链接</h2><ul><li>操作步骤：输入分享链接和分享密码，点击“生成Markdown链接”。</li><li>功能说明：此功能旨在方便站长将下载链接嵌入到自己的网站中。</li><li>界面演示<br /><img src="https://bd2.qaiu.cn/blog/4c7f36280b6c7bd06c7bcf00ef62f91.jpg" alt="4c7f36280b6c7bd06c7bcf00ef62f91" /></li></ul><h2 id="3.-%E7%94%9F%E6%88%90%E4%BA%8C%E7%BB%B4%E7%A0%81" tabindex="-1">3. 生成二维码</h2><ul><li>操作步骤：输入分享链接和分享密码，点击“生成二维码”。</li><li>功能说明：此功能专为手机用户设计，通过生成二维码，用户可以使用手机浏览器扫描二维码直接下载文件，无需手动输入链接和密码，方便快捷。</li><li>界面演示<br /><img src="https://bd2.qaiu.cn/blog/67e86c7d9113a9e922ffa7e369d694d.jpg" alt="67e86c7d9113a9e922ffa7e369d694d" /></li></ul><h2 id="3.-%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E7%BB%9F%E8%AE%A1" tabindex="-1">3. 分享链接统计</h2><ul><li>操作步骤：输入分享链接和分享密码，点击“链接信息统计”。</li><li>功能说明: 通过点击提供的分享链接统计功能，您可以查看该分享文件的详细下载信息，包括但不限于下载次数。</li><li>链接有效性检查: 可以结合第三方状态检查服务进行邮件通知比如uptimerobot<br /><img src="https://bd2.qaiu.cn/blog/image-1745149549249.png" alt="image-1745149549249" /></li></ul><h2 id="%E5%85%B6%E4%BB%96%E8%AF%B4%E6%98%8E" tabindex="-1">其他说明</h2><p>暂无</p><h2 id="%E5%BC%80%E5%8F%91%E8%AE%A1%E5%88%92" tabindex="-1">开发计划</h2><p>未来可能会支持短链生成, docker容器部署, 大文件解析, 文件夹列表解析等等</p><p>该项目不考虑, 百度网盘/UC/夸克网盘/阿里网盘等需要登录的直链解析</p><blockquote><p>ps: 百度网盘业界毒瘤 大家应该抵制, 建议多用用蓝奏云/小飞机之类的</p></blockquote>]]>
                    </description>
                    <pubDate>Wed, 30 Oct 2024 15:53:53 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[netdisk-fast-download宝塔安装教程]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/netdisk-fast-download-bao-ta-an-zhuang-jiao-cheng</link>
                    <description>
                            <![CDATA[<blockquote><p>本文以宝塔9.0为例, 暂不支持旧版宝塔.<br />参考https://www.bt.cn/bbs/thread-132714-1-1.html<br />可以联系站长付费协助部署<br />QQ交流群：1017480890</p></blockquote><h2 id="java%E7%8E%AF%E5%A2%83%E5%88%9D%E5%A7%8B%E5%8C%96" tabindex="-1">Java环境初始化</h2><ol><li>进入宝塔后台–&gt;网站–&gt;Java项目–&gt;Java环境管理–&gt;在Java管理中下载jdk17.0.8版本(&gt;17的高版本理论上也可行, 但不建议, 因为未验证)<br /><img src="https://bd2.qaiu.cn/blog/image-1726982673976.png" alt="image-1726982673976" /></li><li>安装完成后再次打开Java环境管理, 如果安装成功会显示JDK路径<br /><img src="https://bd2.qaiu.cn/blog/image-1726983019691.png" alt="image-1726983019691" /></li></ol><h2 id="%E6%B7%BB%E5%8A%A0%E9%A1%B9%E7%9B%AE" tabindex="-1">添加项目</h2><ol><li><p>下载发行版本:<br /><a href="https://github.com/qaiu/netdisk-fast-download/releases" target="_blank">下载地址</a><br />体验版会不定期更新到群文件</p></li><li><p>进入宝塔后台–&gt;文件-&gt;/www/wwwroot/ 将下载后的zip包上传到该路径<br /><img src="https://bd2.qaiu.cn/blog/image-1726986418471.png" alt="image-1726986418471" /></p></li><li><p>解压压缩包并修改配置文件<br />配置文件位于/www/wwwroot/netdisk-fast-download/resources/app-dev.yml<br />只需要修改app-dev.yml里的domainName项 改为自己绑定的域名:<br /><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20241129122916.png" alt="微信截图_20241129122916" /></p></li><li><p>进入网站-&gt;Java项目-&gt;Jar路径-&gt;选择我们解压的路径下的jar文件: netdisk-fast-download.jar</p></li></ol><blockquote><p>这里项目类型选择SpringBoot;  选择完Jar文件后还需要修改下项目名, 不然会提示项目名称不允许超过20字(宝塔比较坑~~), 然后点击确定.</p><blockquote><p>注意: 发现新版宝塔要求端口必填, 然后会生成 --server.port=端口号 这个配置, 需要手动去掉<br />注意: 发现新版宝塔要求端口必填, 然后会生成 --server.port=端口号 这个配置, 需要手动去掉<br />注意: 发现新版宝塔要求端口必填, 然后会生成 --server.port=端口号 这个配置, 需要手动去掉</p></blockquote></blockquote><p><img src="https://bd2.qaiu.cn/blog/image-1726986550075.png" alt="image-1726986550075" /><br /><img src="https://bd2.qaiu.cn/blog/image-1726986641259.png" alt="image-1726986641259" /><br /><img src="https://bd2.qaiu.cn/blog/image-1726986876050.png" alt="image-1726986876050" /><br /><img src="https://bd2.qaiu.cn/blog/image-1745148757798.png" alt="image-1745148757798" /></p><h2 id="%E6%9F%A5%E7%9C%8B%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF%E5%92%8C%E6%94%BE%E8%A1%8C%E7%AB%AF%E5%8F%A36400%2C-6401" tabindex="-1">查看项目信息和放行端口6400, 6401</h2><p><img src="https://bd2.qaiu.cn/blog/image-1726987480046.png" alt="image-1726987480046" /><br />放行端口需要同时在宝塔后台和云服务商后台同时开通策略; 这里不在一一赘述<br />如果不需要解析域名, 到这里就部署完成了, 访问地址: <a href="http://xn--ip-0p3cm89l:6401" target="_blank">http://你的ip:6401</a><br />需要绑定域名的话请往下看:</p><h2 id="%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D(%E8%AF%B7%E4%BB%BB%E9%80%89%E4%B8%80%E7%A7%8D%2C-%E8%AE%BF%E9%97%AE%E9%87%8F%E5%A4%A7%E7%9A%84%E8%AF%9D%E5%BB%BA%E8%AE%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F2-nginx)" tabindex="-1">绑定域名(请任选一种, 访问量大的话建议使用方式2 nginx)</h2><h3 id="%E6%96%B9%E5%BC%8F1.-%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8java%E9%A1%B9%E7%9B%AE%E7%BB%91%E5%AE%9A" tabindex="-1">方式1. 直接使用java项目绑定</h3><blockquote><p>前置条件是域名已经正确解析到当前服务器IP</p></blockquote><ol><li>绑定域名: java项目管理–域名管理–添加您的域名<br /><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20241129112438-1732855624269.png" alt="微信截图_20241129112438-1732855624269" /></li><li>部署HTTPS:  java项目管理–SSL–Let’s Encrypt–申请证书<br /><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20241129114242-1732855275099.png" alt="微信截图_20241129114242-1732855275099" /><br /><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20241129114343.png" alt="微信截图_20241129114343" /></li><li>修改外网映射: java项目管理–外网访问–选择<code>6401</code>端口配置外网映射(注意选择6401端口别搞错了)<br />代理目录 输入<code>/</code> 其他不用动点确定保存<br /><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20241129114205.png" alt="微信截图_20241129114205" /></li><li>访问您的域名, 如果配置正确则正常打开网页<br /><img src="https://bd2.qaiu.cn/blog/image-1732694064992.png" alt="image-1732694064992" /></li></ol><h3 id="%E6%96%B9%E5%BC%8F2.-%E4%BD%BF%E7%94%A8nginx" tabindex="-1">方式2. 使用nginx</h3><ol><li><p>添加网站, 根目录: <code>/www/wwwroot/netdisk-fast-download-bin/netdisk-fast-download/webroot/nfd-front</code></p></li><li><p>修改配置添加</p></li></ol><pre><code class="language-nginx">    location ~ ^/(d|ye|lz|cow|ec|fj|fc|le|qq|ws|iz|ce|json|parser|v2)/ {         proxy_pass http://127.0.0.1:6400;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }        location ~ ^/parser {         proxy_pass http://127.0.0.1:6400;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }        location /n1/statisticsInfo {        proxy_pass http://127.0.0.1:6400/v2/statisticsInfo;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }</code></pre><p>完整配置参考</p><pre><code class="language-">server{    listen 80;    server_name lz.qaiu.top;    index index.php index.html index.htm default.php default.htm default.html;    root /www/wwwroot/netdisk-fast-download-bin/netdisk-fast-download/webroot/nfd-front;        location ~ ^/(d|ye|lz|cow|ec|fj|fc|le|qq|ws|iz|ce|json|parser|v2)/ {         proxy_pass http://127.0.0.1:6400;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }        location ~ ^/parser {         proxy_pass http://127.0.0.1:6400;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }        location /n1/statisticsInfo {        proxy_pass http://127.0.0.1:6400/v2/statisticsInfo;         proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }    access_log  /www/wwwlogs/lz.qaiu.top.log;    error_log  /www/wwwlogs/lz.qaiu.top.error.log;}</code></pre><h2 id="%E6%9F%A5%E7%9C%8B%E8%BF%90%E8%A1%8C%E6%97%A5%E5%BF%97" tabindex="-1">查看运行日志</h2><p>日志文件位于: <code>/www/wwwroot/netdisk-fast-download-bin/netdisk-fast-download/logs/</code></p><p><img src="https://bd2.qaiu.cn/blog/image-1726987670307.png" alt="image-1726987670307" /></p>]]>
                    </description>
                    <pubDate>Sun, 22 Sep 2024 14:52:06 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[C4droid8.0自动补全优化版]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/c4droid8bqyh</link>
                    <description>
                            <![CDATA[<blockquote><p>该本版基于C4droid8.0中文版对自动补全功能做了增强<br />无需手动点击补全而自动触发函数提示. 虽然依然很鸡肋, 但比原版稍微好一些. 建议大家入坑Cxxdroid除了不支持导出, 其他功能完爆C4droid<br />该版本为aarch64 (arm64位架构)不支持X86电脑和arm32的手机</p></blockquote><h2 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">下载地址</h2><h3 id="c4droid%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8%E4%BC%98%E5%8C%96%E7%89%88" tabindex="-1">C4droid自动补全优化版</h3><p><a href="https://lz.qaiu.top/parser?url=https://wwp.lanzouw.com/iH1aA241uj5c" target="_blank">直接下载</a><br /><a href="https://wwp.lanzouw.com/iH1aA241uj5c" target="_blank">蓝奏下载</a></p><h3 id="c4droid-sdl%E6%8F%92%E4%BB%B6" tabindex="-1">C4droid-SDL插件</h3><p><a href="https://lz.qaiu.top/parser?url=https://wwp.lanzouw.com/i6XuB241w1bc" target="_blank">直接下载</a><br /><a href="https://wwp.lanzouw.com/i6XuB241w1bc" target="_blank">蓝奏下载</a></p><h2 id="%E5%AE%89%E8%A3%85%E8%AF%B4%E6%98%8E" tabindex="-1">安装说明</h2><ol><li>之前未安装过任何版本的C4droid可直接安装</li><li>之前安装过原版(GooglePlay或其他渠道下载的英文版)需要卸载原版和插件.</li><li>之前安装过本站下载的汉化版或重新签名的原版可以直接升级安装.</li><li>安装时如果报签名冲突请卸载旧版和插件后重新安装, 插件需要去应用管理器里找SDL和GCC卸载.</li><li>安装时提示风险应用为正常现象(早期MT签名导致, 现只要识别到C4droid的包名就会报毒!), 有些银行APP可能受影响无法打开, 介意的话请酌情下载安装.</li><li>内置GCC10 无需额外安装GCC插件, 有图形化编程的需求可以下载SDL插件.</li></ol><h2 id="%E7%95%8C%E9%9D%A2%E5%B1%95%E7%A4%BA" tabindex="-1">界面展示</h2><p><img src="https://bd2.qaiu.cn/blog/Screenshot_2024-07-10-11-17-13-691_com.n0n3m4.droidc-edit.jpg" alt="Screenshot_2024-07-10-11-17-13-691_com.n0n3m4.droidc-edit" /></p><p>运行效果:<br /><img src="https://bd2.qaiu.cn/blog/Screenshot_2024-07-10-11-17-29-894_com.n0n3m4.droidsdl-edit.jpg" alt="Screenshot_2024-07-10-11-17-29-894_com.n0n3m4.droidsdl-edit" /></p>]]>
                    </description>
                    <pubDate>Wed, 10 Jul 2024 11:21:31 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Pydroid3 7.2中文整合版 (汉化+内置所有依赖)安装教程]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/pydroid3v72</link>
                    <description>
                            <![CDATA[<h2 id="%E5%A3%B0%E6%98%8E" tabindex="-1">声明</h2><p><strong>Pydroid7.2中文整合版基于Google play的pydroid7.2修改，解锁高级功能参考了<code>云中龙++</code>发布的pydroid3v7.0DIC</strong></p><p><strong>各位脚本作者，不反对你们打包售卖各种脚本，但应该注明不要联系汉化作者QAIU，你们脚本遇到问题请不要找汉化作者</strong></p><p>该版本仅供学习参考使用，禁止任何二次售卖行为（<strong>APP关于界面提供打赏入口，打赏支持，不胜感激！</strong>），如果条件允许，建议付费支持一下官方正版。<br />为什么要制作整合版本? 开箱即用，免去用户手动安装各类依赖的麻烦，避免了有些依赖安装失败导致的各类问题，使用jupyter仅需一行命令：<code>jupyter notebook</code>。</p><h2 id="%E6%95%99%E7%A8%8B%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97" tabindex="-1">教程更新日志</h2><blockquote><p>2024-03-31 发布7.2汉化整合版, 打包了插件提供的所有依赖, 直接安装即可，本次更新修复了pydroid3无法访问全部文件的问题。</p></blockquote><blockquote><p>2023-11-18 发布<a href="https://blog.qaiu.top/archives/pydroid3v70" target="_blank">7.0汉化整合版</a>, 打包了插件提供的所有依赖, 直接安装即可(为了表述方便，以后包含所有obb依赖的全量版统一称之为整合版)</p></blockquote><blockquote><p>2023-07-19 发布<a href="https://blog.qaiu.top/archives/pydroidall" target="_blank">6.2.1汉化整合版</a>, 打包了插件提供的所有依赖, 直接安装即可</p></blockquote><blockquote><p>2023-04-28 发布<a href="https://blog.qaiu.top/archives/pydroid" target="_blank">6.2汉化版</a>, 使用云安装脚本简化安装流程; <a href="https://blog.qaiu.top/archives/pydroid5" target="_blank">之前的版本</a>安装繁琐不建议使用</p></blockquote><blockquote><p>2023-04-22 <a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">网盘直链下载解析器</a>重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系</p></blockquote><p><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230719105021.jpg" alt="微信图片_20230719105021" /></p><h2 id="%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E%EF%BC%88v7.2%EF%BC%89" tabindex="-1">版本说明（v7.2）</h2><p><img src="https://bd2.qaiu.cn/blog/Screenshot_2024-03-31-01-04-36-467_com.miui.securitycenter-edit.jpg" alt="Screenshot_2024-03-31-01-04-36-467_com.miui.securitycenter-edit" /></p><ul><li><p>Pydroid3v7.2汉化整合版需要安装2个Apk分别是<code>Pydroid3v7.2中文整合版</code>Pydroid 3_7.2_arm64_q_cn.apk、<code>Pydroid3权限插件</code>Pydroid Permissions Plugin_2.2_sign.apk，都是在原版基础上重新签名如果存在签名冲突，需要卸载之前版本和插件重新安装。</p></li><li><p>该版本同时提供汉化版和英文版(只提供整合版)，由于精力有限，仅提供aarch64架构版本，其他x86或者arm等需求可付费定制。</p></li><li><p><code>整合版</code>内置了预制库插件提供Whl库因此APK体积膨胀到了300+M安装后2.3G左右，如人工智能机器学习相关领域开发的TensorFlow和PyTorch，图像识别相关的OpenCV，QT组件库等等，<strong>如果只是基于Console学习Python入门可以不必安装整合版, 安装精简版即可, 体积更小。</strong></p></li><li><p><code>更新版</code>去除300M大小左右的assets资源包，仅为之前安装过7.0的用户升级安装，新安装用户请勿使用。</p></li><li><p><code>精简版</code>仅提供基本的Python环境，不包含机器学习等高级算法库也没有Jupyter，比较适合小白。</p></li><li><p>中文版其他细节修改:</p><ul><li>默认主题改为黑色，默认字体改为12号，默认关闭信息收集，默认允许键盘建议（防止出现输入法为安全键盘问题），去除订阅管理。</li><li>整合版新安装后首次启动会解压资源包，耗时比较长(1-3分钟)。</li></ul></li></ul><h2 id="%E8%A7%86%E9%A2%91%E8%AE%B2%E8%A7%A3%3A" tabindex="-1">视频讲解:</h2><p><joe-bilibili bvid="BV14p42117fK"></joe-bilibili></p><h2 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80(%E4%BB%85%E6%94%AF%E6%8C%81aarch64%E6%9E%B6%E6%9E%84)" tabindex="-1">下载地址(仅支持aarch64架构)</h2><p><a href="https://lz.qaiu.top/ec/a2953816692ffcf47f9752dfced95b93KbU81gRfSx" target="_blank">Pydroid3v7.2中文整合版</a></p><p><a href="https://lz.qaiu.top/ec/8ae30071aa3cbc7dd83b9c9f7695afa9V5" target="_blank">Pydroid3v7.2英文整合版</a></p><p><a href="https://lz.qaiu.top/lz/iDPDC1tod2ni" target="_blank">Pydroid3v7.2中文更新包</a></p><p><a href="https://lz.qaiu.top/lz/idPct1tod35g" target="_blank">Pydroid3v7.2中文精简包</a></p><p><a href="https://lz.qaiu.top/ec/e7f868d1d5c5f6661de9f7a0e558c892efCU" target="_blank">Pydroid3权限插件</a></p><h3 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">备用下载地址</h3><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=a2953816692ffcf47f9752dfced95b93KbU81gRfSx&amp;isShare=1" target="_blank">Pydroid3v7.2中文整合版</a></p><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=8ae30071aa3cbc7dd83b9c9f7695afa9V5&amp;isShare=1" target="_blank">Pydroid3v7.2英文整合版</a></p><p><a href="https://www.lanzouw.com/iDPDC1tod2ni" target="_blank">Pydroid3v7.2中文更新包</a></p><p><a href="https://www.lanzouw.com/idPct1tod35g" target="_blank">Pydroid3v7.2中文精简包</a></p><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=e7f868d1d5c5f6661de9f7a0e558c892efCU&amp;isShare=1" target="_blank">Pydroid3权限插件</a></p><h2 id="%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" tabindex="-1">安装指南</h2><ol><li><p>根据需求下载安装一个中文版或者英文版和一个插件。</p><ul><li><strong>如果之前安装过7.0整合版，请下载7.2的更新包（12MB），不必重新安装，权限插件无需升级。</strong></li><li><strong>如果是第一次安装，根据需要选择精简版（65MB）和整合版（310MB）</strong></li></ul></li><li><p>初次打开Pydroid会进行Python初始安装, 因为是整合版所以安装会比较慢一般不会超过3分钟（视手机性能而定）。</p></li></ol><h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2><ol><li>安装失败:</li></ol><ul><li><p>签名冲突 卸载旧版本和插件, 插件没有图标需要在系统设置-应用管理卸载</p></li><li><p>不兼容: 当前只支持aarch64架构</p></li></ul><ol start="2"><li>pyzstd安装报错：终端下运行</li></ol><pre><code class="language-">pip install pyzstd==0.15.6</code></pre><ol start="3"><li>pip安装某些依赖库失败: 这个问题比较普遍, Pydroid能力有限, 如果指定旧版本安装依旧报错的话也没办法.</li><li>代码运行报错或者其他疑难杂症，Google/Bing/百度/一下，或者进去QQ群（50467100）讨论，或者留言评论，或者去问题反馈平台截图提问，由于博主精力有限加QQ视问题难度提供付费解答。</li><li>为了防止后台切换时软件重启导致丢失代码，建议关闭电量优化：MIUI-省电策略-无限制。</li><li>整合版不需要额外安装预编译库插件（Pydroid repository plugin），使用pip菜单安装库时需要取消勾选<code>使用Prebuilt库存储库</code>如图：<br /><img src="https://bd2.qaiu.cn/blog/IMG_20240331_220352.jpg" alt="IMG_20240331_220352" /></li></ol>]]>
                    </description>
                    <pubDate>Sun, 31 Mar 2024 03:44:42 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Pydroid3 v7.0整合版(汉化+内置所有依赖)安装教程]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/pydroid3v70</link>
                    <description>
                            <![CDATA[<h2 id="%E5%A3%B0%E6%98%8E" tabindex="-1">声明</h2><p><strong>当前版本基于云中龙++发布pydroid3v7.0DIC版本汉化修改而来</strong><br />该版本仅供学习参考使用，禁止任何二次售卖行为，如果条件允许，建议付费支持一下官方正版(DIC版可以在奇妙应用平台搜索下载，正版需要在GooglePlay下载然后内购)。</p><p><strong>pydroid3v7.2更新, 文件访问无限制, 可选择多个版本</strong><br /><a href="https://blog.qaiu.top/archives/pydroid3v72" target="_blank">https://blog.qaiu.top/archives/pydroid3v72</a></p><h2 id="%E6%95%99%E7%A8%8B%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97" tabindex="-1">教程更新日志</h2><blockquote><p>2023-11-18 发布7.0汉化整合版, 打包了插件提供的所有依赖, 直接安装即可(为了表述方便，以后包含所有obb依赖的全量版统一称之为整合版)<br />2023-07-19 发布<a href="https://blog.qaiu.top/archives/pydroidall" target="_blank">6.2.1汉化整合版</a>, 打包了插件提供的所有依赖, 直接安装即可<br />2023-04-28 发布<a href="https://blog.qaiu.top/archives/pydroid" target="_blank">6.2汉化版</a>, 使用云安装脚本简化安装流程; <a href="https://blog.qaiu.top/archives/pydroid5" target="_blank">之前的版本</a>安装繁琐不建议使用<br />2023-04-22 <a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">网盘直链下载解析器</a>重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系</p></blockquote><p><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230719105021.jpg" alt="微信图片_20230719105021" /></p><h2 id="%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E" tabindex="-1">版本说明</h2><p><img src="https://bd2.qaiu.cn/blog/Screenshot_2023-11-18-22-53-49-805_com.miui.securitycenter-edit.jpg" alt="Screenshot_2023-11-18-22-53-49-805_com.miui.securitycenter-edit" /></p><ul><li><p>Pydroid3 v7.0汉化整合版需要安装2个Apk分别是<code>Pydroid7.0主程序</code>、<code>Pydroid权限插件</code>，都是在原版基础上重新签名，安装时请保证原版包括插件已卸载干净。</p></li><li><p>该版本和原DIC版唯一区别是内置了预制库插件提供Whl库因此APK体积膨胀到了300+M安装后2.3g左右，如人工智能机器学习相关领域开发的TensorFlow和PyTorch，图像识别相关的OpenCV，QT组件库等等，<strong>如果只是基于Console学习Python入门可以不必安装全量版, 安装7.0DIC版即可, 安装体积更小(50M)。</strong></p></li><li><p>从6.2版可以升级安装7.0的完整版(包括插件)，不必重新安装，安装后第一次启动会解压资源包，且耗时比较长(1-5分钟)。</p></li><li><p>为什么要制作整合版本：虽然pydroid3一直在Google商店更新，但二进制2年多没啥变化了，其轮子(whl)插件内置的依赖越来越难自洽，出现了各种版本导致依赖安装失败问题，开始还能通过降低版本解决，但最近发现TensorFlow和jupyter都安装不了了，于是干脆将依赖全部打包</p></li></ul><h2 id="%E8%A7%86%E9%A2%91%E8%AE%B2%E8%A7%A3%3A" tabindex="-1">视频讲解:</h2><p><joe-bilibili bvid="BV1U94y1n7WJ"></joe-bilibili></p><h2 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">下载地址</h2><p><a href="https://lz.qaiu.top/ec/6e482b26b7355ce276ff53e58b77d03aE" target="_blank">Pydroid3v7.0汉化整合版主程序</a></p><p><a href="https://lz.qaiu.top/ec/e7f868d1d5c5f6661de9f7a0e558c892efCU" target="_blank">Pydroid3权限插件</a></p><h3 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">备用下载地址</h3><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=6e482b26b7355ce276ff53e58b77d03aE&amp;isShare=1" target="_blank">移动云空间网盘分享_Pydroid3v7.0汉化整合版主程序</a></p><p><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=e7f868d1d5c5f6661de9f7a0e558c892efCU&amp;isShare=1" target="_blank">移动云空间网盘分享_Pydroid3权限插件</a></p><h2 id="%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" tabindex="-1">安装指南</h2><ol><li><p>分别下载两个Apk安装包，</p></li><li><p>安装主程序一个插件</p></li><li><p>初次打开Pydroid会进行Python初始安装, 因为是全量包所以安装会比较慢, 一般进度条到100%后等个一两分钟就会安装完毕(视手机性能而定, RedmiK40一分钟左右)</p></li></ol><h2 id="%E6%80%BB%E7%BB%93%E4%B8%80%E4%B8%8B%EF%BC%9A" tabindex="-1">总结一下：</h2><p>下载并一个主程序和一个插件安装即可</p><h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2><ol><li>安装失败:</li></ol><ul><li><p>签名冲突 卸载旧版本和插件, 插件没有图标需要在系统设置-应用管理卸载</p></li><li><p>不兼容: 当前只支持aarch64架构</p></li></ul><ol start="3"><li>pyzstd安装报错：终端下运行</li></ol><pre><code class="language-">pip install pyzstd==0.15.6</code></pre><ol start="3"><li><p>pip安装某些依赖库失败: 这个问题比较普遍, Pydroid能力有限, 如果指定旧版本安装依旧报错的话也没办法.</p></li><li><p>代码运行报错: Google/Bing/百度一下吧</p></li></ol>]]>
                    </description>
                    <pubDate>Sat, 18 Nov 2023 23:04:09 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Pydroid3 v6.2.1全量版(汉化+内置所有依赖)安装教程]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/pydroidall</link>
                    <description>
                            <![CDATA[<!--  [TOC] --><p>教程更新日志</p><blockquote><p>2023-11-18 发布<a href="https://blog.qaiu.top/archives/pydroid3v70" target="_blank">7.0全量版-推荐安装</a>, 打包了插件提供的所有依赖, 直接安装即可<br />2023-07-19 发布6.2.1全量版, 打包了插件提供的所有依赖, 直接安装即可<br />2023-04-28 发布<a href="https://blog.qaiu.top/archives/pydroid" target="_blank">6.2汉化版</a>, 使用云安装脚本简化安装流程; <a href="https://blog.qaiu.top/archives/pydroid5" target="_blank">之前的版本</a>安装繁琐不建议使用<br />2023-04-22 <a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">网盘直链下载解析器</a>重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系</p></blockquote><p><img src="https://bd2.qaiu.cn/blog/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230719105021.jpg" alt="微信图片_20230719105021" /></p><h2 id="%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E" tabindex="-1">版本说明</h2><ul><li>Pydroid3 v6.2.1全量版需要安装2个Apk分别是<code>Pydroid6.2主程序</code>、<code>Pydroid权限插件</code></li><li>该版本和6.2唯一区别是内置了预制库插件提供Whl库因此APK体积膨胀到了200多M，如人工智能机器学习相关领域开发的TensorFlow，图像识别相关的OpenCV，QT组件库等等，<strong>如果只是基于Console学习Python入门可以不必安装全量版, 安装<a href="https://blog.qaiu.top/archives/pydroid" target="_blank">6.2汉化版</a>即可, 安装体积更小(50M)</strong></li><li><strong>Pydroid6.2汉化版基于MT默认签名可能在某些平台会报毒</strong>  当前已使用V1+V2+V3方案签名，正常不会报毒的，如有报毒请及时反馈，并提供手机型号，系统版本号等信息。</li><li>如果之前已经安装过本站提供的其他版本需要卸载主程序（不含插件）重新装，如果安装过官方原版需要卸载主程序和2个插件（否则可能签名不一致安装失败）。</li><li>为什么要制作全量包版本：虽然pydroid3一直在Google商店更新，但二进制2年多没啥变化了，其轮子(whl)插件内置的依赖越来越难自洽，出现了各种版本导致依赖安装失败问题，开始还能通过降低版本解决，但最近发现TensorFlow和jupyter都安装不了了，于是干脆将依赖全部打包</li></ul><h2 id="%E8%A7%86%E9%A2%91%E8%AE%B2%E8%A7%A3%3A" tabindex="-1">视频讲解:</h2><p><joe-bilibili bvid="BV13u411V7mE"></joe-bilibili></p><h2 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">下载地址</h2><p><a href="https://lz.qaiu.top/fj/mNUWFOan" target="_blank">Pydroid6.2.1全量版主程序</a><br /><a href="https://lz.qaiu.top/lz/izE6C0tvlsej" target="_blank">Pydroid3权限插件</a></p><h3 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80" tabindex="-1">备用下载地址</h3><p>Pydroid6.2.1全量版主程序</p><ul><li><a href="https://www.123pan.com/s/iaKtVv-XbECd" target="_blank">https://www.123pan.com/s/iaKtVv-XbECd</a>  密码：Fj60</li><li><a href="https://drive.uc.cn/s/5c904d7bcb054" target="_blank">https://drive.uc.cn/s/5c904d7bcb054</a> 密码：iskN</li><li><a href="https://share.feijipan.com/s/mNUWFOan" target="_blank">https://share.feijipan.com/s/mNUWFOan</a></li></ul><p>Pydroid3权限插件<br /><a href="https://lanzoui.com/izE6C0tvlsej" target="_blank">https://lanzoui.com/izE6C0tvlsej</a></p><h2 id="%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" tabindex="-1">安装指南</h2><blockquote><p>注意，一定要卸载旧版本重装，不要升级！<br />注意，一定要卸载旧版本重装，不要升级！<br />注意，一定要卸载旧版本重装，不要升级！</p></blockquote><ol><li>分别下载两个Apk安装包，</li><li>安装主程序一个插件</li><li>初次打开Pydroid会进行Python初始安装, 因为是全量包所以安装会比较慢, 一般进度条到100%后等个一两分钟就会安装完毕(视手机性能而定, RedmiK40一分钟左右)</li></ol><h2 id="%E6%80%BB%E7%BB%93%E4%B8%80%E4%B8%8B%EF%BC%9A" tabindex="-1">总结一下：</h2><p>下载并一个主程序和一个插件安装即可</p><h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2><ol><li>安装失败:</li></ol><ul><li>签名冲突 卸载旧版本和插件, 插件没有图标需要在系统设置-应用管理卸载</li><li>不兼容: 当前只支持aarch64架构</li></ul><ol start="3"><li>pyzstd安装报错：终端下运行</li></ol><pre><code class="language-">pip install pyzstd==0.15.6</code></pre><ol start="3"><li>pip安装某些依赖库失败: 这个问题比较普遍, Pydroid能力有限, 如果指定旧版本安装依旧报错的话也没办法.</li><li>代码运行报错: Google/Bing/百度一下吧</li><li>部分机型默认弹出安全键盘需要设置(设置-&gt;编辑)允许键盘建议才能使用输入法:<br /><img src="https://bd2.qaiu.cn/blog/f66c7e905adefac380915c407f1cef2.jpg" alt="f66c7e905adefac380915c407f1cef2" /></li></ol><blockquote><p>如果其他问题，请在评论区留言，需要截图的，请加QQ或者去兔小巢（文章置顶温馨提示链接）反馈</p></blockquote>]]>
                    </description>
                    <pubDate>Wed, 19 Jul 2023 11:01:44 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Pydroid6.2汉化版下载(arm64)--手机上最好用的Python IDE]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/pydroid</link>
                    <description>
                            <![CDATA[<!--  [TOC] --><p>教程更新日志</p><blockquote><p>2023-07-19 发布<a href="https://blog.qaiu.top/archives/pydroidall" target="_blank">Pydroid3 v6.2.1全量版</a><br />2023-04-28 发布6.0汉化版, 使用云安装脚本简化安装流程; <a href="https://blog.qaiu.top/archives/pydroid5" target="_blank">之前的版本</a>安装繁琐不建议使用<br />2023-04-22 直链下载解析器重构完成, 测试应该没啥问题, 如果遇到无法下载的问题, 请及时和我联系</p></blockquote><h2 id="%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" tabindex="-1">注意事项</h2><ul><li>完整安装Pydroid需要安装3个Apk分别是<code>Pydroid6.2主程序</code>、<code>Pydroid预制库插件</code>、<code>Pydroid权限插件</code></li><li>根据自身需要来决定是否完整安装<ol><li>预制库插件提供大量已适配安卓端的轮子（Whl）库，如人工智能机器学习相关领域开发的TensorFlow，图像识别相关的OpenCV，QT组件库等等，<strong>如果只是基于Console学习Python入门可以不必安装Pydroid预制库插件和Pydroid权限插件</strong></li><li>Pydroid权限插件在Pydroid调用额外权限（除基本的文件存取外的）如OpenCV调用摄像头，调用话筒来录音等等，如果不涉及这类操作可以不必安装Pydroid权限插件</li></ol></li><li><strong>Pydroid6.2汉化版基于MT默认签名可能在某些平台会报毒</strong> 未来会考虑重新签名</li><li>如果之前已经安装过5.0汉化版和本站提供的5.0英文版可以直接<code>升级主程序</code>即可（Python版本和插件并未更新），如果之前使用的是其他来源版本要卸载重装（一定要卸载掉主程序和插件不然签名冲突）</li><li><strong>如果始终无法安装TensorFlow和jupyter请安装<a href="https://blog.qaiu.top/archives/pydroidall" target="_blank">Pydroid3 v6.2.1全量版</a></strong></li></ul><h2 id="pydroid%E6%98%AF%E4%BB%80%E4%B9%88%3A" tabindex="-1">Pydroid是什么:</h2><p>Pydroid是安卓生态下的Python集成开发环境，基于Python3.9.x；内置GCC编译器可以自己构建whl(轮子)库；内置pip包管理器；以及一个预构建的whl常用框架集，包括tensorflow, opencv， pyQT5等等</p><h2 id="%E8%A7%86%E9%A2%91%E8%AE%B2%E8%A7%A3%3A" tabindex="-1">视频讲解:</h2><p><joe-bilibili bvid="BV1c14y1Z7jU"></joe-bilibili></p><h2 id="%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80(nfd%E6%8F%90%E4%BE%9B%E7%9B%B4%E9%93%BE%E8%A7%A3%E6%9E%90%E6%9C%8D%E5%8A%A1)" tabindex="-1">下载地址(<a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">nfd提供直链解析服务</a>)</h2><!--[Pydroid6.2主程序]https://lz.qaiu.top/fj/GzUTkPWE(https://lz.qaiu.top/lz/iaQi10u4j2md)--><p><a href="https://lz.qaiu.top/lz/iaQi10u4j2md" target="_blank">Pydroid6.2主程序</a></p><p><a href="https://lz.qaiu.top/lz/iKrRr0tvlsgb" target="_blank">Pydroid预制库插件</a></p><p><a href="https://lz.qaiu.top/lz/izE6C0tvlsej" target="_blank">Pydroid权限插件</a></p><h2 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80(%E8%93%9D%E5%A5%8F%E4%BA%91%E5%8E%9F%E5%A7%8B%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5)" tabindex="-1">备用下载地址(蓝奏云原始分享链接)</h2><p><a href="https://lanzoui.com/iaQi10u4j2md" target="_blank">Pydroid6.2主程序-备用地址</a><br /><a href="https://lanzoui.com/iKrRr0tvlsgb" target="_blank">Pydroid预制库插件-备用地址</a><br /><a href="https://lanzoui.com/izE6C0tvlsej" target="_blank">Pydroid权限插件-备用地址</a></p><h2 id="%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" tabindex="-1">安装指南</h2><ol><li>分别下载三个Apk安装包，</li><li>安装主程序两个插件；当然也可以只安装主程序用以简单学习，这时可以忽略后面步骤。</li><li>下载依赖：<ul><li>-&gt;打开Pydroid</li><li>-&gt;点击左上角菜单(或者屏幕从左往右划)</li><li>-&gt;Pip-&gt;找到最右侧快速安装</li><li>-&gt;随便安装一个库-&gt;这时会提示是否允许启动pydroid-xxx(允许)和是否允许访问文件系统(允许)</li><li>-&gt;这时候假如你能<strong>科学上网</strong>的话可以忽略以下步骤(插件会自动下载Obb预制库依赖)</li><li>-&gt;辅助安装：没有科学上网的话进度会一直卡在0% 这时候把Pydroid强制关掉，将如下辅助代码复制到Pydroid编辑器里运行(如果没啥报错基本上就OK了)：</li></ul></li></ol><pre><code class="language-python">#pylint:disable=W0122# Pydroid辅助安装脚本，需要先在pip的快速安装下安装任意库之后（因为不开VPN会卡0%，强制退出即可）重启pydroid执行本脚本from urllib.request import urlopenexec(urlopen(&#39;https://qaiu.top/src/py/install.py&#39;).read())</code></pre><blockquote><p>就算使用VPN安装上了obb依赖（pydroid预制库插件的数据包）建议也要执行一下辅助安装脚本，因为脚本里不光实现了下载obb文件，也升级了pip版本，配置了清华源镜像，最重要的是安装了keras==2.6这个依赖（不指定这个版本后面TensorFlow安装会出错）</p></blockquote><h2 id="%E6%80%BB%E7%BB%93%E4%B8%80%E4%B8%8B%EF%BC%9A" tabindex="-1">总结一下：</h2><ol><li>下载一个主程序和两个插件，主程序直接安装，插件结合自身需求看需不需要安装</li><li>如果要完整安装需要先下任意一个Pip库(这一步主要是引导插件创建Obb目录)</li><li>如果能科学上网可以直接安装，否则进度卡0%需要重新启动pydroid使用本站提供的脚本辅助安装</li></ol><h2 id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" tabindex="-1">常见问题</h2><ol><li>pip列表下没有opencv：opencv需要安卓7.0及以上，如果不满足条件，列表会自动隐藏这个库</li><li>pyzstd安装报错：终端下运行</li></ol><pre><code class="language-">pip install pyzstd==0.15.6</code></pre><ol start="3"><li>TensorFlow安装失败<ul><li>首先保证本地预制库插件和安装脚本都正确运行了</li><li>如果没有运行安装脚本但obb已经正确安装，那么需要指定下karas版本安装</li><li>参考第4条</li></ul></li></ol><pre><code class="language-">pip install keras==2.6 </code></pre><ol start="4"><li><strong>如果始终无法安装TensorFlow和jupyter请安装<a href="https://blog.qaiu.top/archives/pydroidall" target="_blank">Pydroid3 v6.2.1全量版</a></strong></li><li>如果其他问题，请在评论区留言，需要截图的，请加QQ或者去兔小巢（文章置顶温馨提示链接）反馈</li></ol>]]>
                    </description>
                    <pubDate>Sat, 01 Jul 2023 08:53:31 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[天翼云使用体验--对比阿里腾讯云: 上下行带宽都限速]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/cty-test</link>
                    <description>
                            <![CDATA[<p>测试命令</p><ol><li>网盘下载</li></ol><pre><code class="language-"># jdk-8u202-linux-x86.tar.gzcurl -L   https://lz.qaiu.top/cow/dab06dd8cf8b42 &gt; /dev/null</code></pre><ol start="2"><li>镜像源下载</li></ol><pre><code class="language-">curl https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso -o /dev/null</code></pre><h3 id="1.-%E5%A4%A9%E7%BF%BC%E4%BA%911mbps(%E5%8D%8E%E4%B8%9C1-%E6%89%AC%E5%B7%9E)" tabindex="-1">1. 天翼云1Mbps(华东1-扬州)</h3><pre><code class="language-">网盘下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  0  185M    0  958k    0     0   115k      0  0:27:20  0:00:08  0:27:12  118k镜像源下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0  545k    0     0   134k      0  9:30:04  0:00:04  9:30:00  134k^</code></pre><h3 id="2.-%E5%A4%A9%E7%BF%BC%E4%BA%915mbps-(%E5%8D%8E%E4%B8%9C1-%E6%89%AC%E5%B7%9E)" tabindex="-1">2. 天翼云5Mbps (华东1-扬州)</h3><pre><code class="language-">网盘下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0  1  185M    1 3125k    0     0   574k      0  0:05:29  0:00:05  0:05:24  563k^ 镜像源下载  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0 5938k    0     0   610k      0  2:05:37  0:00:09  2:05:28  564k</code></pre><h3 id="3-%E5%A4%A9%E7%BF%BC%E4%BA%915mbps-windows-(%E5%B1%B1%E4%B8%9C-%E9%9D%92%E5%B2%9B1)" tabindex="-1">3 天翼云5Mbps-windows (山东-青岛1)</h3><p><img src="https://bd2.qaiu.cn/blog/image-1687335895817.png" alt="image-1687335895817" /></p><h3 id="4.-%E8%85%BE%E8%AE%AF%E4%BA%916mbps(%E5%8C%97%E4%BA%AC)" tabindex="-1">4. 腾讯云6Mbps(北京)</h3><pre><code class="language-">[root@VM-0-3-centos ~]# curl -L  http://lz.qaiu.top/cow/dab06dd8cf8b42 &gt; /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed100   178  100   178    0     0   1327      0 --:--:-- --:--:-- --:--:--  1328  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0100  185M  100  185M    0     0  11.9M      0  0:00:15  0:00:15 --:--:-- 12.1M</code></pre><h3 id="5.-%E9%98%BF%E9%87%8C%E4%BA%911mbps(%E4%B9%8C%E5%85%B0%E5%AF%9F%E5%B8%83)" tabindex="-1">5. 阿里云1Mbps(乌兰察布)</h3><pre><code class="language-">#[root@iZ0jlc8zj9cfcvxa8e6lpcZ ~]# curl https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso -o /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0 4494M    0 3777k    0     0   314k      0  4:04:10  0:00:12  4:03:58  327k[root@iZ0jlc8zj9cfcvxa8e6lpcZ ~]# curl -L   https://lz.qaiu.top/cow/dab06dd8cf8b42 &gt; /dev/null  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0 14  185M   14 27.0M    0     0  3569k      0  0:00:53  0:00:07  0:00:46 4475k</code></pre><p>总结</p><ol><li>天翼华东1-扬州上下行均限速 带宽为实际分配公网带宽, 青岛区下行不限速</li><li>腾讯云,阿里云 仅上行(出口)限速 下行不限速</li></ol>]]>
                    </description>
                    <pubDate>Wed, 21 Jun 2023 16:31:44 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[网盘分享直链解析服务netdisk-fast-download开源]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/netdisk-fast-download</link>
                    <description>
                            <![CDATA[<h1 id="%E7%BD%91%E7%9B%98%E5%BF%AB%E9%80%9F%E4%B8%8B%E8%BD%BD%E5%99%A8(netdisk-fast-download)%E9%A1%B9%E7%9B%AE%E5%9C%B0%E5%9D%80" tabindex="-1">网盘快速下载器(netdisk-fast-download)项目地址</h1><p>GitHub: <a href="https://github.com/qaiu/netdisk-fast-download" target="_blank">https://github.com/qaiu/netdisk-fast-download</a><br /><a href="https://github.com/qaiu/netdisk-fast-download" target="_blank"><img src="https://github-readme-stats.vercel.app/api/pin/?username=qaiu&amp;repo=netdisk-fast-download" alt="Readme Card" /></a><br /><strong>如果觉得有用麻烦给个<code>star</code>谢谢</strong><br />本项目最初只为解析蓝奏云的分享链接, 但蓝奏云有最大100M的分享限制<br />后来加入了奶牛快传等一些主流网盘<br />已部署: <a href="https://lz.qaiu.top" target="_blank">https://lz.qaiu.top</a><br />本站所有下载服务都基于netdisk-fast-download<br /><joe-bilibili bvid="BV1C14y1S7AV"></joe-bilibili></p><h2 id="%E7%BD%91%E7%9B%98%E6%94%AF%E6%8C%81%E6%83%85%E5%86%B5%3A" tabindex="-1">网盘支持情况:</h2><p><code>网盘名称(网盘标识):</code></p><ul><li>蓝奏云 (lz)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>奶牛快传 (cow)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>移动云空间 (ec)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>UC网盘 (uc)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>小飞机网盘 (fj)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>亿方云 (fc)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>123云盘 (ye)<ul class="contains-task-list"><li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox">  登录, 上传, 下载, 分享</li><li class="task-list-item"><input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">  直链解析</li></ul></li><li>文叔叔 (ws)</li><li>夸克网盘 (qk)</li><li>TODO</li></ul><p>技术栈:<br />Jdk17+Vert.x4.4.1<br />Core模块集成Vert.x实现类spring的注解式路由API</p><p>API接口</p><pre><code class="language-">网盘标识参考上面网盘支持情况, 括号内是可选内容: 表示当带有分享密码时需要加上密码参数 parser接口可以直接解析分享链接: 加密分享需要加上参数pwd=密码; 其他接口在分享Key后面加上@密码;1. 解析并自动302跳转 :     http(s)://your_host/parser?url=分享链接(&amp;pwd=xxx)    http(s)://your_host/网盘标识/分享id(@分享密码)2. 获取解析后的直链--JSON格式    http(s)://your_host/json/网盘标识/分享id(@分享密码)3. 特别注意的地方:   - 有些网盘的加密分享的密码可以忽略: 如移动云空间,小飞机网盘  - 移动云空间(ec)使用parser?url= 解析时因为分享链接比较特殊(链接带有参数且含有#符号)所以要么对#进行转义%23要么直接去掉# 或者URL直接是主机名+&#39;/&#39;跟一个data参数  比如 http://your_host/parser?url=https://www.ecpan.cn/web//yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=81027a5c99af5b11ca004966c945cce6W9Bf2&amp;isShare=1      http://your_host/parser?url=https://www.ecpan.cn/web/%23/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=81027a5c99af5b11ca004966c945cce6W9Bf2&amp;isShare=1      http://your_host/parser?url=https://www.ecpan.cn/&amp;data=81027a5c99af5b11ca004966c945cce6W9Bf2&amp;isShare=1</code></pre><p>IDEA HttpClient示例:</p><pre><code class="language-"># 解析并重定向到直链### 蓝奏云普通分享# @no-redirectGET http://127.0.0.1:6400/parser?url=https://lanzoux.com/ia2cntg### 奶牛快传普通分享# @no-redirectGET http://127.0.0.1:6400/parser?url=https://cowtransfer.com/s/9a644fe3e3a748### 360亿方云加密分享# @no-redirectGET http://127.0.0.1:6400/parser?url=https://v2.fangcloud.com/sharing/e5079007dc31226096628870c7&amp;pwd=QAIU# Rest请求自动302跳转(只提供共享文件Id):### 蓝奏云普通分享# @no-redirectGET http://127.0.0.1:6400/lz/ia2cntg### 奶牛快传普通分享# @no-redirectGET http://127.0.0.1:6400/cow/9a644fe3e3a748### 360亿方云加密分享GET http://127.0.0.1:6400/json/fc/e5079007dc31226096628870c7@QAIU# 解析返回json直链### 蓝奏云普通分享GET http://127.0.0.1:6400/json/lz/ia2cntg### 奶牛快传普通分享GET http://127.0.0.1:6400/json/cow/9a644fe3e3a748### 360亿方云加密分享GET http://127.0.0.1:6400/json/fc/e5079007dc31226096628870c7@QAIU</code></pre><h1 id="%E7%BD%91%E7%9B%98%E5%AF%B9%E6%AF%94" tabindex="-1">网盘对比</h1><table><thead><tr><th>网盘名称</th><th>可直接下载分享</th><th>加密分享</th><th>初始网盘空间</th><th>单文件大小限制</th><th>登录接口</th></tr></thead><tbody><tr><td>蓝奏云</td><td>√</td><td>√</td><td>不限空间</td><td>100M</td><td>TODO</td></tr><tr><td>奶牛快传</td><td>√</td><td>X</td><td>10G</td><td>不限大小</td><td>TODO</td></tr><tr><td>移动云空间</td><td>√</td><td>√(密码可忽略)</td><td>5G(个人)</td><td>不限大小</td><td>TODO</td></tr><tr><td>UC网盘</td><td>√</td><td>√</td><td>10G</td><td>不限大小</td><td>TODO</td></tr><tr><td>小飞机网盘</td><td>√</td><td>√(密码可忽略)</td><td>10G</td><td>不限大小</td><td>TODO</td></tr><tr><td>360亿方云</td><td>√(注意有流量限制)</td><td>√(密码可忽略)</td><td>100G(须实名)</td><td>不限大小</td><td>TODO</td></tr><tr><td>123云盘</td><td>√</td><td>√</td><td>2T</td><td>不限大小</td><td>TODO</td></tr><tr><td>文叔叔(TODO)</td><td>√(注意有时间限制)</td><td>√</td><td>10G</td><td>不限大小</td><td>TODO</td></tr><tr><td>夸克网盘(TODO)</td><td>需要登录</td><td>√</td><td>10G</td><td>不限大小</td><td>TODO</td></tr></tbody></table><h1 id="%E6%89%93%E5%8C%85%E9%83%A8%E7%BD%B2" tabindex="-1">打包部署</h1><h2 id="%E5%BC%80%E5%8F%91%E5%92%8C%E6%89%93%E5%8C%85" tabindex="-1">开发和打包</h2><pre><code class="language-shell"># 环境要求: Jdk17 + maven; mvn clean mvn package</code></pre><p>打包好的文件位于 web-service/target/netdisk-fast-download-x.x.x-bin.zip</p><h2 id="linux%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2" tabindex="-1">Linux服务部署</h2><blockquote><p>注意: netdisk-fast-download.service中的ExecStart的路径改为实际路径</p></blockquote><pre><code class="language-shell">cd ~wget -O netdisk-fast-download-0.1.5-bin.zip  https://github.com/qaiu/netdisk-fast-download/releases/download/0.1.5-releases/netdisk-fast-download-0.1.5-bin.zipunzip netdisk-fast-download-*-bin.zip cd netdisk-fast-download-*-binbash service-install.sh</code></pre><p>服务相关命令:<br />1、查看服务状态<br />systemctl status netdisk-fast-download.service</p><p>2、控制服务<br />启动服务<br />systemctl start netdisk-fast-download.service</p><p>重启服务<br />systemctl restart netdisk-fast-download.service</p><p>停止服务<br />systemctl stop netdisk-fast-download.service</p><p>开机启动服务<br />systemctl enable netdisk-fast-download.servic</p><p>停止开机启动<br />systemctl disable netdisk-fast-download.servic</p><h2 id="windows%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2" tabindex="-1">Windows服务部署</h2><ol><li>下载并解压releases版本netdisk-fast-download-0.1.5-bin.zip</li><li>进入netdisk-fast-download-0.1.5-bin目录</li><li>使用管理员权限运行nfd-service-install.bat<br />如果不想使用服务运行可以直接运行run.bat</li></ol><h2 id="docker%E9%83%A8%E7%BD%B2" tabindex="-1">Docker部署</h2><p>TODO</p>]]>
                    </description>
                    <pubDate>Tue, 13 Jun 2023 15:05:04 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[ArduinoDroidv6.3.1汉化版--安卓arduino单片机开发环境]]>
                    </title>
                    <link>https://blog.qaiu.top/archives/arduinodroid</link>
                    <description>
                            <![CDATA[<h2 id="%E5%85%B3%E4%BA%8Earduinodroid6.3.1%E6%B1%89%E5%8C%96%E7%89%88" tabindex="-1">关于ArduinoDroid6.3.1汉化版</h2><p>该APP来自云中龙++<br /><img src="https://bd2.qaiu.cn/blog/Screenshot_2023-05-01-10-53-46-125_name.antonsmirnov.android.arduinodroid2-edit.jpg" alt="Screenshot_2023-05-01-10-53-46-125_name.antonsmirnov.android.arduinodroid2-edit" /><br />以下是官方描述：<br />ArduinoDroid - Arduino IDE<br />该应用程序大约需要210Mb，因为它包含IDE，编译器和上传器。确保内部存储空间有足够的可用空间，并且由于Android安全策略，无法在SD卡上安装。</p><p><em>打开/编辑Arduino草图</em><br /><em>包括示例草图和库</em><br /><em>代码语法突出显示主题支持</em><br /><em>代码完整</em><br /><em>实时诊断（错误和警告）和修复</em><br /><em>草图导航仪</em><br /><em>微小的内置软件键盘</em><br /><em>编译草图（不需要root）</em><br /><em>上传草图（支持Arduino Uno / Uno_r3，Duemilanove，Nano，Mega 2560，Leonardo，Micro / Pro Micro，Pro，Pro Mini，Yun，Esplora，机器人控制，机器人电机板，需要USB主机支持的Android设备）</em></p><h2 id="%E7%9B%B4%E9%93%BE%E4%B8%8B%E8%BD%BD" tabindex="-1">直链下载</h2><!--[下载路线一：可道云100M ](https://yangmkj.top:666/?explorer/share/file&hash=b6adhMo4Z0pAcjoP-vNCDpibMMZWWKWSKrTXAIAChlAzoyEV2K2l3rq99EMfGiVAzUg)[下载路线二：奶牛快传不限速](https://lz.qaiu.top/cow/d38b7ca090a741)--><p><a href="https://lz.qaiu.top/fj/JoUTkZYj" target="_blank">下载地址1(小飞机线路)</a><br /><a href="https://lz.qaiu.top/ec/b8e988e77c3437ce5efb3096513763fdc6jf2C" target="_blank">下载地址2(移动云空间线路)</a></p><h2 id="%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5%EF%BC%9A" tabindex="-1">备用下载链接：</h2><p><a href="https://www.feijix.com/s/JoUTkZYj" target="_blank">小飞机分享链接</a><br /><a href="https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&amp;data=b8e988e77c3437ce5efb3096513763fdc6jf2C&amp;isShare=1" target="_blank">移动云空间分享链接</a></p><h2 id="%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" tabindex="-1">安装指南</h2><p>下载后直接安装即可，支持aarch64架构和arm32架构</p><h2 id="%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E" tabindex="-1">使用说明</h2><p>第三方教程参考<br /><a href="http://t.csdn.cn/HLP1B" target="_blank">arduinodroid安卓手机版开发工具</a><br /><img src="https://bd2.qaiu.cn/blog/web_1682909031745.jpg" alt="web_1682909031745" /></p><h2 id="%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97" tabindex="-1">更新日志</h2><p>：TODO</p><h2 id="%E5%85%B6%E4%BB%96" tabindex="-1">其他</h2><blockquote><p>感谢C4droid群友<code>安</code>提供可道云存储服务</p></blockquote>]]>
                    </description>
                    <pubDate>Mon, 01 May 2023 10:45:28 CST</pubDate>
                </item>
    </channel>
</rss>