<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>为何存在的日子</title><link>https://blog.344977.xyz/</link><description>Recent content on 为何存在的日子</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 09 Jul 2026 15:50:59 +0000</lastBuildDate><atom:link href="https://blog.344977.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>你的命，只值30块？</title><link>https://blog.344977.xyz/post/2026-07-09-issue-4/</link><pubDate>Thu, 09 Jul 2026 15:50:59 +0000</pubDate><guid>https://blog.344977.xyz/post/2026-07-09-issue-4/</guid><description>&lt;p&gt;写在前面:有的人会觉得我与以往的文气大不相同了，或者更多没见过我认真写的文章，写这篇文章有两个目的，一个是寻点乐子，但绝不意味着我轻视这个问题，另一个问题是我想尝试下煽动性的文章，试试手感，可惜我还是以理性的议论文，想象作文，演讲见长，不管怎么说，我会再写一篇负责任的文章，这篇文章就和他的作者以及他的笔，值得当做笑话看吧&lt;/p&gt;
&lt;p&gt;你的命，只值30块？&lt;/p&gt;
&lt;p&gt;一份完整身份信息，20元。你的实时定位，1800元。你五年开房记录，12800元——而你，还在以为自己的隐私很值钱？&lt;/p&gt;
&lt;p&gt;别天真了。&lt;/p&gt;
&lt;p&gt;在黑市上，你连瓶水都不如。一瓶农夫山泉卖2块，你的“姓名+手机号”打包批发，最低只要3分钱。3分钱，连颗糖都买不到，却能买到你的电话号码、你的真实姓名、你每天被骚扰电话轰炸的通行证。&lt;/p&gt;
&lt;p&gt;这不是危言耸听，这是2026年互联网的残酷真相。我手里这份刚从暗网流出的“2025-2026年非法数据报价单”，每一行都在嘲笑我们的无知——你的隐私正在被按斤甩卖，而你，还在为免密支付沾沾自喜。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;批发区：你被当白菜卖了，还帮人数钱&lt;/p&gt;
&lt;p&gt;先看看“批发市场”。这里的规则只有一个：量大从优，薄利多销。你的信息不是“个”卖，是“万条”卖。十万条起批，单价低到令人发指。&lt;/p&gt;
&lt;p&gt;· 姓名+手机号：0.03 - 0.4元/条。按万条打包，平均每条几分钱。你每天收到的骚扰电话、推销短信、诈骗链接，源头就在这——一个诈骗分子花30块钱买你1000条信息，骗到一个人就回本，剩下的999个全是纯利润。
· 快递外卖信息：0.3 - 0.5元/条。一千条起批。你撕碎面单、涂黑地址，以为万无一失？可你那单麻辣烫的配送记录，正以3毛钱的价格在QQ群里被叫卖。买家拿到后，知道你几点下班、家里几口人、甚至知道你备注的“放门口鞋柜”——下一回敲你家门的，可能不是快递员，是催债的。
· 学生数据：0.5 - 10+元/条。价格看“含金量”：只有姓名班级的五毛，加上家长电话的两块，再附上家庭住址和身份证号的直奔十块。2026年6月，上游新闻曝出上千万条学生信息被倒卖，教培机构电脑里藏着200万条，非法获利600万。你家孩子的信息，正在为骗子精准定制“班主任来电”剧本。
· 完整个人信息包（身份证+照片+手机号）：20 - 30元/套。一套豪华套餐，比你点顿外卖还便宜。有了它，骗子能网贷、能办卡、能注册公司、能把你名下一切掏空。而你发现的时候，征信已黑，欠债数十万，报警都追不回。
· 人脸信息：5 - 10元/条。2026年山东胶州大案，犯罪分子花5块钱买一张证件照，用AI合成眨眼摇头视频，轻松突破各大App的人脸识别，8万个虚假账号被转卖，获利60万。你的脸，比一碗热干面还贱。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;定制区：只要肯加钱，你连底裤都能被扒光&lt;/p&gt;
&lt;p&gt;如果说批发是“扫射”，那定制就是“狙击”。你提供任何一个线索——微博号、手机号、甚至一张背影照——黑市“数据猎手”就能把你从人海里拎出来，扒得干干净净。&lt;/p&gt;
&lt;p&gt;你是谁？你家几口人？80块就够&lt;/p&gt;
&lt;p&gt;· 个人户籍：80元，一天出单。你的籍贯、现住址、家庭成员，一目了然。
· 全家户籍（含身份证号和照片）：500元。也有报价300的，货比三家还打折。你爸妈的名字、你弟的身份证、你家老宅的门牌号——打包出卖，比买件衣服还随意。
· 全套身份信息：200元。社工库里明码标价，身份证正反面+手持照+户口本页。拿到这些，你就是“你”，而真正的你，还在梦里。&lt;/p&gt;
&lt;p&gt;你在哪？去过哪？实时定位只要1800&lt;/p&gt;
&lt;p&gt;· 外卖记录：750元，一天出单。你几点吃、吃什么、送到哪个地址、备注了什么——全盘托出。杭州一女子被前男友骚扰，对方就是花750块买了她的外卖记录，天天“偶遇”她下班。
· 手机实时定位：1800元。输入手机号，秒出经纬度，精确到楼层。比一部红米手机还便宜。 你老公查岗、债主上门、前任跟踪——1800块，买你24小时无死角直播。
· 人身轨迹：5000元，2-7天出单。不是一次定位，是连续几天你的行动路线——几点出门、哪条路堵车、周末去哪个商场、晚上回哪个小区。这只“电子眼”黏在你背上，你却浑然不知。&lt;/p&gt;
&lt;p&gt;你的钱包和社交圈，赤裸裸任人翻&lt;/p&gt;
&lt;p&gt;· 银行流水（1个月）：3680 - 6800元。这是黑市“奢侈品”，但需求猛增。温州警方破获的案子，内部人员调取流水用于敲诈，一条开价5000，月均接单20多次。
· 开房记录（5年，含同住人）：12800元。高端定制，全国联网。谁跟你进的酒店、几点几分、住了多久——全部打印成PDF发买家邮箱。商业调查、离婚取证、敲诈勒索，最爱的“硬通货”。
· 微信好友列表提取：9700元，7天出单。你领导、同事、家人、客户的微信号，全盘拖出。紧接着，“王总，下周行程有变”“妈，我手机丢了转我5000”——精准得让你怀疑人生。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;明星？照样被按头明码标价&lt;/p&gt;
&lt;p&gt;· 艺人航班：50 - 80元/条，转手加价到1000。粉丝围堵、代拍牟利，源头就值几十块。
· 顶流身份证+手机号：数百到上千，视热度浮动。某男星被退票、被改签、被围堵，背后的中学生只花几百块零花钱就买到了他的全部信息。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;一条信息30元，一条人命无价&lt;/p&gt;
&lt;p&gt;2025年前三季度，全国起诉侵犯公民个人信息犯罪4400余人。2026年最高法典型案例中，林某某非法获取9亿余条数据——每个中国人被卖了至少六次。他的社工库网站去重后仍有1.7亿组完整身份信息，访问超10万人次。&lt;/p&gt;
&lt;p&gt;这些数字背后，是80余起电信诈骗案，涉案500余万元。一条30元的信息，最终让一个被害人损失29万。29万，多少人一辈子的积蓄？而那条信息在黑市上，不过是两杯奶茶的钱。&lt;/p&gt;
&lt;p&gt;更可怕的是——你根本不知道哪次扫码、哪次填表、哪个App的“同意”按钮，把你的命运交给了陌生人。&lt;/p&gt;
&lt;p&gt;《刑法》第253条说，卖信息违法所得5000元以上就判刑。可当9亿条信息被倒卖，当人脸只值5块钱，当你的实时定位1800元就能买到——法律再严，也追不上黑产的狂欢。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最可怕的不是价格低，而是我们习以为常&lt;/p&gt;
&lt;p&gt;你以为撕掉快递单就安全了？你以为不填真实姓名就没事？你以为那些骚扰电话只是巧合？&lt;/p&gt;
&lt;p&gt;不。你的信息早已不是秘密，它正在暗网的货架上等待出价，而那个出价的人，可能正在策划毁掉你的人生。&lt;/p&gt;
&lt;p&gt;今天，你的隐私只值3分钱。&lt;/p&gt;
&lt;p&gt;明天，它可能让你倾家荡产。&lt;/p&gt;
&lt;p&gt;后天，它可能让你身败名裂。&lt;/p&gt;
&lt;p&gt;而那个卖掉你的人，可能只是个月薪三千的“内鬼”，也可能是某个你信任过的App后台。&lt;/p&gt;
&lt;p&gt;别问为什么你的隐私这么廉价。要问，就问为什么我们还在麻木。&lt;/p&gt;
&lt;p&gt;从今天起，拒绝随意扫码，拒绝不明链接，拒绝一切“免费”的诱惑。因为每一笔“免费”背后，都标着你付不起的价码。&lt;/p&gt;
&lt;p&gt;记住——你的命，不该只值30块。（差点没绷住）&lt;/p&gt;</description></item><item><title>从零搭建属于自己的网页版 QQ</title><link>https://blog.344977.xyz/post/2026-07-05-issue-3/</link><pubDate>Sun, 05 Jul 2026 13:02:44 +0000</pubDate><guid>https://blog.344977.xyz/post/2026-07-05-issue-3/</guid><description>&lt;h1 id="从零搭建属于自己的网页版-qqnapcatqq--stapxs-qq-lite-完全部署指南"&gt;&lt;a href="#%e4%bb%8e%e9%9b%b6%e6%90%ad%e5%bb%ba%e5%b1%9e%e4%ba%8e%e8%87%aa%e5%b7%b1%e7%9a%84%e7%bd%91%e9%a1%b5%e7%89%88-qqnapcatqq--stapxs-qq-lite-%e5%ae%8c%e5%85%a8%e9%83%a8%e7%bd%b2%e6%8c%87%e5%8d%97" class="header-anchor"&gt;&lt;/a&gt;从零搭建属于自己的网页版 QQ：NapCatQQ + Stapxs QQ Lite 完全部署指南
&lt;/h1&gt;&lt;h2 id="引言为什么要自己搭建网页版-qq"&gt;&lt;a href="#%e5%bc%95%e8%a8%80%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e8%87%aa%e5%b7%b1%e6%90%ad%e5%bb%ba%e7%bd%91%e9%a1%b5%e7%89%88-qq" class="header-anchor"&gt;&lt;/a&gt;引言：为什么要自己搭建网页版 QQ？
&lt;/h2&gt;&lt;p&gt;在即时通讯工具层出不穷的今天，QQ 依然是我们日常生活中不可或缺的一部分。然而，官方 QQ 客户端功能臃肿、资源占用高，而 Web 版 QQ 早已停止维护。对于开发者、社群管理者或者单纯想要一个轻量级 QQ 客户端的用户来说，自己搭建一个网页版 QQ 成了一种极具吸引力的选择。&lt;/p&gt;
&lt;p&gt;本文将带你从零开始，在 Linux 服务器上部署一套完整的网页版 QQ 系统。这套系统的核心由两个开源项目构成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NapCatQQ&lt;/strong&gt;：基于 NTQQ 的 OneBot v11 协议实现，负责与 QQ 服务器通信，提供 HTTP 和 WebSocket 接口。简单来说，NapCatQQ 是这套系统的“消息引擎”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stapxs QQ Lite&lt;/strong&gt;：一个兼容 OneBot 协议的非官方 QQ Web 客户端，基于 Vue 构建。它是这套系统的“用户界面”，让你在浏览器中就能收发 QQ 消息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过本文，你将学会在 2 核 2GB 的 Linux 服务器上完成 NapCatQQ 的安装、配置和开机自启，部署 Stapxs QQ Lite 前端，并通过 WebSocket 将两者连接起来。更值得一提的是，我们还会深入探讨如何为这套系统配置 HTTPS/WSS 加密，确保通信安全——这部分内容将作为专门的扩展章节，满足你对安全性的更高追求。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第一章准备工作"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e7%ab%a0%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;第一章：准备工作
&lt;/h2&gt;&lt;h3 id="11-硬件与系统要求"&gt;&lt;a href="#11-%e7%a1%ac%e4%bb%b6%e4%b8%8e%e7%b3%bb%e7%bb%9f%e8%a6%81%e6%b1%82" class="header-anchor"&gt;&lt;/a&gt;1.1 硬件与系统要求
&lt;/h3&gt;&lt;p&gt;根据 NapCatQQ 的官方文档，Linux 部署支持 NodeLoader、AppImage 和 Docker 三种主要方式。本文采用最推荐的 &lt;strong&gt;NodeLoader 原生部署方案&lt;/strong&gt;，以下是最低系统要求：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;项目&lt;/th&gt;
					&lt;th&gt;最低要求&lt;/th&gt;
					&lt;th&gt;推荐配置&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;CPU&lt;/td&gt;
					&lt;td&gt;1 核&lt;/td&gt;
					&lt;td&gt;2 核&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;内存&lt;/td&gt;
					&lt;td&gt;1 GB&lt;/td&gt;
					&lt;td&gt;2 GB 或以上&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;硬盘&lt;/td&gt;
					&lt;td&gt;20 GB&lt;/td&gt;
					&lt;td&gt;40 GB SSD&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;系统&lt;/td&gt;
					&lt;td&gt;Ubuntu 20.04+ / Debian 10+ / CentOS 9&lt;/td&gt;
					&lt;td&gt;Ubuntu 22.04 LTS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;网络&lt;/td&gt;
					&lt;td&gt;公网 IP&lt;/td&gt;
					&lt;td&gt;公网 IP + 域名（推荐）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;特别说明&lt;/strong&gt;：NapCatQQ 设计为在无图形界面的服务器上运行，通过 headless NTQQ 架构绕过 GUI 需求。如果你的服务器是 2 核 2GB 配置，完全足够运行本文所述的全部服务。&lt;/p&gt;
&lt;h3 id="12-软件依赖"&gt;&lt;a href="#12-%e8%bd%af%e4%bb%b6%e4%be%9d%e8%b5%96" class="header-anchor"&gt;&lt;/a&gt;1.2 软件依赖
&lt;/h3&gt;&lt;p&gt;在开始安装之前，需要确保系统已安装以下软件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu/Debian 系统&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y curl wget git xvfb screen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装 Node.js 18.x（NapCatQQ 要求 Node.js 18+）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://deb.nodesource.com/setup_18.x &lt;span class="p"&gt;|&lt;/span&gt; sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;各依赖的作用&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;xvfb&lt;/strong&gt;（X Virtual Framebuffer）：为无图形界面的服务器提供虚拟显示环境，让 QQ 客户端能够“无头”运行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;screen&lt;/strong&gt;：用于在后台保持 NapCatQQ 进程运行，即使关闭 SSH 连接也不会中断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js 18+&lt;/strong&gt;：NapCatQQ 运行所需的 JavaScript 运行时环境。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-域名与端口规划可选但推荐"&gt;&lt;a href="#13-%e5%9f%9f%e5%90%8d%e4%b8%8e%e7%ab%af%e5%8f%a3%e8%a7%84%e5%88%92%e5%8f%af%e9%80%89%e4%bd%86%e6%8e%a8%e8%8d%90" class="header-anchor"&gt;&lt;/a&gt;1.3 域名与端口规划（可选但推荐）
&lt;/h3&gt;&lt;p&gt;虽然可以使用 IP 地址直接访问，但使用域名能让你更方便地配置 HTTPS 证书，也更容易记忆。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;服务&lt;/th&gt;
					&lt;th&gt;端口&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;NapCatQQ WebUI&lt;/td&gt;
					&lt;td&gt;6099&lt;/td&gt;
					&lt;td&gt;管理面板，建议配置 HTTPS&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;NapCatQQ WebSocket&lt;/td&gt;
					&lt;td&gt;3001&lt;/td&gt;
					&lt;td&gt;与前端通信的 WebSocket 服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Nginx 代理（可选）&lt;/td&gt;
					&lt;td&gt;3003&lt;/td&gt;
					&lt;td&gt;用于 WSS 反向代理&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果你有域名，建议提前将其解析到服务器的公网 IP。如果没有域名，后续可以使用 IP 地址访问，但 HTTPS 配置会稍微复杂一些。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第二章napcatqq-部署"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e7%ab%a0napcatqq-%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;第二章：NapCatQQ 部署
&lt;/h2&gt;&lt;p&gt;NapCatQQ 提供了多种 Linux 部署方式。本文采用&lt;strong&gt;一键脚本安装（Rootless 模式）&lt;/strong&gt;，这种方式安装快捷、配置清晰，且以普通用户身份运行，安全性更高。&lt;/p&gt;
&lt;h3 id="21-创建普通用户并切换"&gt;&lt;a href="#21-%e5%88%9b%e5%bb%ba%e6%99%ae%e9%80%9a%e7%94%a8%e6%88%b7%e5%b9%b6%e5%88%87%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;2.1 创建普通用户并切换
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;不要使用 root 用户运行 NapCatQQ&lt;/strong&gt;。建议创建一个专用用户（如 &lt;code&gt;admin&lt;/code&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果还没有 admin 用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo useradd -m -s /bin/bash admin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo passwd admin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 切换到 admin 用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;su - admin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;whoami &lt;span class="c1"&gt;# 应输出 admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-执行一键安装脚本"&gt;&lt;a href="#22-%e6%89%a7%e8%a1%8c%e4%b8%80%e9%94%ae%e5%ae%89%e8%a3%85%e8%84%9a%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;2.2 执行一键安装脚本
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：以普通用户身份执行脚本，&lt;strong&gt;不要加 sudo&lt;/strong&gt;。脚本会在需要时自动请求管理员权限。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -o napcat.sh https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash napcat.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装过程中，脚本会提示你进行选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否使用 Shell 安装？选择 &lt;code&gt;y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;是否配置管理工具？选择 &lt;code&gt;y&lt;/code&gt;（推荐）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，你会看到类似以下的输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2026-07-05 16:00:31]: - Shell (Rootless) 安装完成 -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2026-07-05 16:00:31]: 安装位置: /home/admin/Napcat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2026-07-05 16:00:31]: 启动 Napcat (无需 sudo):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2026-07-05 16:00:31]: xvfb-run -a /home/admin/Napcat/opt/QQ/qq --no-sandbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重要信息&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NapCatQQ 主目录&lt;/strong&gt;：&lt;code&gt;/home/admin/Napcat/opt/QQ/resources/app/app_launcher/napcat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置文件目录&lt;/strong&gt;：&lt;code&gt;/home/admin/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qq 命令路径&lt;/strong&gt;：&lt;code&gt;/home/admin/Napcat/opt/QQ/qq&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="第三章webui-配置三种方法"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e7%ab%a0webui-%e9%85%8d%e7%bd%ae%e4%b8%89%e7%a7%8d%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;第三章：WebUI 配置（三种方法）
&lt;/h2&gt;&lt;p&gt;NapCatQQ 的 WebUI 是一个基于 Express 的 Web 管理界面，用于管理账号、配置网络服务和查看日志。以下是三种配置 WebUI 的方法，按推荐程度排序。&lt;/p&gt;
&lt;h3 id="31-方法一通过-napcat-命令配置最推荐"&gt;&lt;a href="#31-%e6%96%b9%e6%b3%95%e4%b8%80%e9%80%9a%e8%bf%87-napcat-%e5%91%bd%e4%bb%a4%e9%85%8d%e7%bd%ae%e6%9c%80%e6%8e%a8%e8%8d%90" class="header-anchor"&gt;&lt;/a&gt;3.1 方法一：通过 napcat 命令配置（最推荐）
&lt;/h3&gt;&lt;p&gt;NapCatQQ 安装后自带 &lt;code&gt;napcat&lt;/code&gt; 命令行工具，这是最直观、最不容易出错的配置方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：进入 napcat 管理界面&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;napcat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你会看到一个交互式菜单，选择 &lt;strong&gt;“配置”&lt;/strong&gt; 或 &lt;strong&gt;“Config”&lt;/strong&gt; 选项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：选择 WebUI 配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在配置菜单中，选择 &lt;strong&gt;“WebUI”&lt;/strong&gt; 相关选项，进入 WebUI 配置界面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：填写配置信息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据提示依次填写以下信息：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;配置项&lt;/th&gt;
					&lt;th&gt;推荐值&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Host&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;监听所有网络接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Port&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;6099&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;WebUI 访问端口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Token&lt;/td&gt;
					&lt;td&gt;自定义强密码&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;必须 13 位以上&lt;/strong&gt;，包含字母和数字&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Login Rate&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每小时最大登录尝试次数&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;安全提示&lt;/strong&gt;：Token 务必设置一个强密码，不要使用默认值。这是 WebUI 的唯一登录凭证。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;第四步：配置 WebSocket 服务端&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回到主菜单，选择 &lt;strong&gt;“网络配置”&lt;/strong&gt; → &lt;strong&gt;“新建”&lt;/strong&gt; → &lt;strong&gt;“WebSocket 服务端”&lt;/strong&gt;，填写：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;配置项&lt;/th&gt;
					&lt;th&gt;推荐值&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;名称&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ws-server&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;自定义标识&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Host&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;监听所有网络接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Port&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;3001&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;WebSocket 服务端口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Token&lt;/td&gt;
					&lt;td&gt;可与 WebUI Token 相同或不同&lt;/td&gt;
					&lt;td&gt;前端连接认证&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;第五步：保存并退出&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;按提示保存配置，然后选择 &lt;strong&gt;“重启 NapCat”&lt;/strong&gt; 使配置生效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第六步：扫码登录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;重启后，终端会显示一个二维码。用手机 QQ 扫描二维码即可完成登录。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="32-方法二通过-napcat-命令快速配置备选"&gt;&lt;a href="#32-%e6%96%b9%e6%b3%95%e4%ba%8c%e9%80%9a%e8%bf%87-napcat-%e5%91%bd%e4%bb%a4%e5%bf%ab%e9%80%9f%e9%85%8d%e7%bd%ae%e5%a4%87%e9%80%89" class="header-anchor"&gt;&lt;/a&gt;3.2 方法二：通过 napcat 命令快速配置（备选）
&lt;/h3&gt;&lt;p&gt;如果你熟悉命令行操作，可以使用 &lt;code&gt;napcat&lt;/code&gt; 命令的子命令快速配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 进入 napcat 管理界面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;napcat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 选择 &amp;#34;启动&amp;#34; → 新建用户 → 输入 QQ 号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 选择 &amp;#34;配置&amp;#34; → 进入 WebUI 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;操作流程简述：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输入 &lt;code&gt;napcat&lt;/code&gt; 进入管理界面&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;“启动”&lt;/strong&gt;，然后 &lt;strong&gt;“新建用户”&lt;/strong&gt;，输入你的 QQ 号&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;“配置”&lt;/strong&gt;，进入 WebUI 配置页面&lt;/li&gt;
&lt;li&gt;依次设置 Host、Port、Token（13 位以上）、Login Rate&lt;/li&gt;
&lt;li&gt;返回主菜单，选择 &lt;strong&gt;“网络配置”&lt;/strong&gt;，添加 WebSocket 服务端&lt;/li&gt;
&lt;li&gt;保存后 &lt;strong&gt;“停止”&lt;/strong&gt; 再 &lt;strong&gt;“启动”&lt;/strong&gt; NapCatQQ&lt;/li&gt;
&lt;li&gt;终端显示二维码，手机 QQ 扫码登录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种方式的优点是所有配置都在一个界面中完成，不需要手动编辑文件。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="33-方法三手动编辑配置文件高级"&gt;&lt;a href="#33-%e6%96%b9%e6%b3%95%e4%b8%89%e6%89%8b%e5%8a%a8%e7%bc%96%e8%be%91%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e9%ab%98%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;3.3 方法三：手动编辑配置文件（高级）
&lt;/h3&gt;&lt;p&gt;如果你更喜欢直接编辑配置文件，或者需要通过脚本自动化部署，可以手动创建 &lt;code&gt;webui.json&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：进入配置目录&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/admin/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第二步：创建 webui.json&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano webui.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;写入以下内容（将 &lt;code&gt;your_secure_token&lt;/code&gt; 替换为你的强密码，&lt;strong&gt;必须 13 位以上&lt;/strong&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your_secure_token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;loginRate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：确保使用英文字符和标点。保存时按 &lt;code&gt;Ctrl+X&lt;/code&gt;，输入 &lt;code&gt;y&lt;/code&gt;，然后回车。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;第三步：配置 WebSocket 服务端（可选）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果通过 WebUI 配置 WebSocket 服务端更方便，你也可以在 &lt;code&gt;config&lt;/code&gt; 目录下找到账号相关的配置文件（如 &lt;code&gt;protocol_你的QQ号.json&lt;/code&gt;）进行手动配置，但更推荐通过 WebUI 完成这一步。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步：重启 NapCatQQ&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果使用 systemd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或使用 screen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;screen -r napcat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 按 Ctrl+C 停止，然后重新启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xvfb-run -a /home/admin/Napcat/opt/QQ/qq --no-sandbox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第五步：验证配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;http://你的服务器IP:6099/webui&lt;/code&gt;，输入你设置的 token，应该能成功登录。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="34-配置项完整说明"&gt;&lt;a href="#34-%e9%85%8d%e7%bd%ae%e9%a1%b9%e5%ae%8c%e6%95%b4%e8%af%b4%e6%98%8e" class="header-anchor"&gt;&lt;/a&gt;3.4 配置项完整说明
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;字段&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
					&lt;th&gt;推荐值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;监听地址，&lt;code&gt;0.0.0.0&lt;/code&gt; 表示监听所有网络接口&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;&amp;quot;0.0.0.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;port&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;WebUI 端口&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;6099&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;token&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;登录密码，&lt;strong&gt;至少 13 位且包含字母和数字&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自定义强密码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;loginRate&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;每小时最大登录尝试次数&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;安全提示&lt;/strong&gt;：如果你的服务器暴露在公网，&lt;strong&gt;务必修改默认 token&lt;/strong&gt;。在 v4.8.106 以下版本中，NapCat WebUI 默认使用弱密码（密钥为 &lt;code&gt;napcat&lt;/code&gt;），存在严重安全风险。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第四章后台运行与开机自启"&gt;&lt;a href="#%e7%ac%ac%e5%9b%9b%e7%ab%a0%e5%90%8e%e5%8f%b0%e8%bf%90%e8%a1%8c%e4%b8%8e%e5%bc%80%e6%9c%ba%e8%87%aa%e5%90%af" class="header-anchor"&gt;&lt;/a&gt;第四章：后台运行与开机自启
&lt;/h2&gt;&lt;h3 id="41-使用-systemd推荐"&gt;&lt;a href="#41-%e4%bd%bf%e7%94%a8-systemd%e6%8e%a8%e8%8d%90" class="header-anchor"&gt;&lt;/a&gt;4.1 使用 systemd（推荐）
&lt;/h3&gt;&lt;p&gt;创建服务文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/systemd/system/napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;写入以下内容（注意 &lt;code&gt;User&lt;/code&gt; 和 &lt;code&gt;Group&lt;/code&gt; 应设置为你的普通用户名）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;NapCatQQ Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/xvfb-run -a /home/admin/Napcat/opt/QQ/qq --no-sandbox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启用并启动服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="42-使用-screen备选"&gt;&lt;a href="#42-%e4%bd%bf%e7%94%a8-screen%e5%a4%87%e9%80%89" class="header-anchor"&gt;&lt;/a&gt;4.2 使用 screen（备选）
&lt;/h3&gt;&lt;p&gt;如果你更喜欢使用 &lt;code&gt;screen&lt;/code&gt; 来管理进程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 后台启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;screen -dmS napcat bash -c &lt;span class="s2"&gt;&amp;#34;xvfb-run -a /home/admin/Napcat/opt/QQ/qq --no-sandbox&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 附加到会话查看&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;screen -r napcat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 分离会话（保持后台运行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 按 Ctrl+A 然后按 D&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 停止会话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;screen -S napcat -X quit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-验证-napcatqq-是否正常运行"&gt;&lt;a href="#43-%e9%aa%8c%e8%af%81-napcatqq-%e6%98%af%e5%90%a6%e6%ad%a3%e5%b8%b8%e8%bf%90%e8%a1%8c" class="header-anchor"&gt;&lt;/a&gt;4.3 验证 NapCatQQ 是否正常运行
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查服务状态（systemd 方式）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status napcat.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或检查进程（screen 方式）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep qq
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查端口监听&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo netstat -tlnp &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s2"&gt;&amp;#34;6099|3001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你应该看到 &lt;code&gt;6099&lt;/code&gt;（WebUI）和 &lt;code&gt;3001&lt;/code&gt;（WebSocket）端口正在监听。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第五章stapxs-qq-lite-部署"&gt;&lt;a href="#%e7%ac%ac%e4%ba%94%e7%ab%a0stapxs-qq-lite-%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;第五章：Stapxs QQ Lite 部署
&lt;/h2&gt;&lt;p&gt;Stapxs QQ Lite 是一个基于 Vue 的单页应用，可以部署在任何 Web 服务器或静态托管服务上。&lt;/p&gt;
&lt;h3 id="51-获取部署文件"&gt;&lt;a href="#51-%e8%8e%b7%e5%8f%96%e9%83%a8%e7%bd%b2%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;5.1 获取部署文件
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;方式一：下载预构建包（推荐）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;a class="link" href="https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases" target="_blank" rel="noopener"
 &gt;Stapxs QQ Lite 2.0 Releases 页面&lt;/a&gt;，下载 &lt;code&gt;Stapxs.QQ.Lite-&amp;lt;版本&amp;gt;-web.zip&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式二：从源码构建&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/Stapxs/Stapxs-QQ-Lite-2.0.git --recursive
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; Stapxs-QQ-Lite-2.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;构建产物在 &lt;code&gt;dist&lt;/code&gt; 目录中。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果你的网站不在根域名下运行（例如 &lt;code&gt;https://example.com/qq/&lt;/code&gt;），需要在构建前修改 &lt;code&gt;vue.config.js&lt;/code&gt; 中的 &lt;code&gt;publicPath&lt;/code&gt; 字段。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="52-部署到-netlify推荐"&gt;&lt;a href="#52-%e9%83%a8%e7%bd%b2%e5%88%b0-netlify%e6%8e%a8%e8%8d%90" class="header-anchor"&gt;&lt;/a&gt;5.2 部署到 Netlify（推荐）
&lt;/h3&gt;&lt;p&gt;Netlify 是最简单的静态托管平台，支持拖拽部署和自动 HTTPS。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录 &lt;a class="link" href="https://app.netlify.com" target="_blank" rel="noopener"
 &gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;将下载的 &lt;code&gt;web.zip&lt;/code&gt; 文件直接拖拽到部署区域&lt;/li&gt;
&lt;li&gt;Netlify 会自动解压并生成一个公网访问地址（如 &lt;code&gt;https://你的项目名.netlify.app&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;或者&lt;/strong&gt;，你也可以通过 GitHub 仓库连接实现自动部署。&lt;/p&gt;
&lt;h3 id="53-部署到自己的-web-服务器nginx"&gt;&lt;a href="#53-%e9%83%a8%e7%bd%b2%e5%88%b0%e8%87%aa%e5%b7%b1%e7%9a%84-web-%e6%9c%8d%e5%8a%a1%e5%99%a8nginx" class="header-anchor"&gt;&lt;/a&gt;5.3 部署到自己的 Web 服务器（Nginx）
&lt;/h3&gt;&lt;p&gt;如果你有自己的 Web 服务器，也可以将 Stapxs 部署到 Nginx 中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 解压部署文件到 Nginx 目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo unzip Stapxs.QQ.Lite-*.web.zip -d /var/www/stapxs/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置 Nginx 站点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/nginx/sites-available/stapxs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nginx 配置示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your-domain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="s"&gt;/var/www/stapxs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri/&lt;/span&gt; &lt;span class="s"&gt;/index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启用站点并重启 Nginx：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /etc/nginx/sites-available/stapxs /etc/nginx/sites-enabled/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="第六章连接-napcatqq-与-stapxs-qq-lite"&gt;&lt;a href="#%e7%ac%ac%e5%85%ad%e7%ab%a0%e8%bf%9e%e6%8e%a5-napcatqq-%e4%b8%8e-stapxs-qq-lite" class="header-anchor"&gt;&lt;/a&gt;第六章：连接 NapCatQQ 与 Stapxs QQ Lite
&lt;/h2&gt;&lt;p&gt;NapCatQQ 与 Stapxs QQ Lite 之间通过 &lt;strong&gt;WebSocket&lt;/strong&gt; 协议通信。NapCatQQ 作为 WebSocket 服务端（正向 WS），Stapxs 作为客户端主动连接。&lt;/p&gt;
&lt;h3 id="61-确认-napcatqq-websocket-服务端配置"&gt;&lt;a href="#61-%e7%a1%ae%e8%ae%a4-napcatqq-websocket-%e6%9c%8d%e5%8a%a1%e7%ab%af%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;6.1 确认 NapCatQQ WebSocket 服务端配置
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;访问 NapCatQQ WebUI：&lt;code&gt;http://你的服务器IP:6099/webui&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输入你在 &lt;code&gt;webui.json&lt;/code&gt; 中设置的 token 登录&lt;/li&gt;
&lt;li&gt;进入左侧菜单的 &lt;strong&gt;“网络配置”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;确认存在一个 &lt;strong&gt;“WebSocket 服务端”&lt;/strong&gt; 配置，且状态为 &lt;strong&gt;“启用”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;确认端口为 &lt;code&gt;3001&lt;/code&gt;，Host 为 &lt;code&gt;0.0.0.0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果不存在，点击 &lt;strong&gt;“新建”&lt;/strong&gt; 添加一个。&lt;/p&gt;
&lt;h3 id="62-在-stapxs-中配置连接"&gt;&lt;a href="#62-%e5%9c%a8-stapxs-%e4%b8%ad%e9%85%8d%e7%bd%ae%e8%bf%9e%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;6.2 在 Stapxs 中配置连接
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;访问你部署的 Stapxs QQ Lite 页面&lt;/li&gt;
&lt;li&gt;进入设置页面&lt;/li&gt;
&lt;li&gt;填写连接信息：&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;字段&lt;/th&gt;
					&lt;th&gt;值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;WebSocket 地址&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ws://你的服务器IP:3001&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Token&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;你在 webui.json 中设置的 token&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start="4"&gt;
&lt;li&gt;保存配置，页面应自动连接并显示 QQ 好友和群聊列表。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="63-协议匹配问题重要"&gt;&lt;a href="#63-%e5%8d%8f%e8%ae%ae%e5%8c%b9%e9%85%8d%e9%97%ae%e9%a2%98%e9%87%8d%e8%a6%81" class="header-anchor"&gt;&lt;/a&gt;6.3 协议匹配问题（重要）
&lt;/h3&gt;&lt;p&gt;如果 Stapxs 页面是通过 &lt;code&gt;https://&lt;/code&gt; 访问的，那么 WebSocket 地址&lt;strong&gt;必须&lt;/strong&gt;使用 &lt;code&gt;wss://&lt;/code&gt;（加密 WebSocket），否则浏览器会因为混合内容安全策略而阻止连接。&lt;/p&gt;
&lt;p&gt;如果你的 Stapxs 页面是 &lt;code&gt;http://&lt;/code&gt;，则可以使用 &lt;code&gt;ws://&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第七章扩展篇--为-napcatqq-配置-httpswss"&gt;&lt;a href="#%e7%ac%ac%e4%b8%83%e7%ab%a0%e6%89%a9%e5%b1%95%e7%af%87--%e4%b8%ba-napcatqq-%e9%85%8d%e7%bd%ae-httpswss" class="header-anchor"&gt;&lt;/a&gt;第七章：扩展篇 —— 为 NapCatQQ 配置 HTTPS/WSS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;本章为扩展内容&lt;/strong&gt;，适合希望进一步提升系统安全性的用户。如果你仅在内网使用或对安全性要求不高，可以跳过本章。&lt;/p&gt;
&lt;h3 id="71-为什么需要-httpswss"&gt;&lt;a href="#71-%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81-httpswss" class="header-anchor"&gt;&lt;/a&gt;7.1 为什么需要 HTTPS/WSS？
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据加密&lt;/strong&gt;：防止通信内容被中间人窃听或篡改&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器安全策略&lt;/strong&gt;：HTTPS 页面必须使用 WSS 连接 WebSocket&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升信任度&lt;/strong&gt;：浏览器地址栏显示安全锁标志&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="72-napcatqq-原生-ssl-支持v4141"&gt;&lt;a href="#72-napcatqq-%e5%8e%9f%e7%94%9f-ssl-%e6%94%af%e6%8c%81v4141" class="header-anchor"&gt;&lt;/a&gt;7.2 NapCatQQ 原生 SSL 支持（v4.14.1+）
&lt;/h3&gt;&lt;p&gt;从 NapCatQQ v4.14.1 版本开始，WebUI 原生支持 SSL 证书管理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一：通过 WebUI 上传证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 WebUI 的设置页面中，找到 &lt;strong&gt;“SSL 证书管理”&lt;/strong&gt; 选项，分别上传 &lt;code&gt;cert.pem&lt;/code&gt;（证书）和 &lt;code&gt;key.pem&lt;/code&gt;（私钥）文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法二：直接放置证书文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;cert.pem&lt;/code&gt; 和 &lt;code&gt;key.pem&lt;/code&gt; 文件放入 NapCatQQ 的 &lt;code&gt;config&lt;/code&gt; 目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /path/to/cert.pem /home/admin/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /path/to/key.pem /home/admin/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;修改 webui.json 启用 SSL&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your_token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;loginRate&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ssl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启 NapCatQQ 后，即可通过 &lt;code&gt;https://你的服务器IP:6099/webui&lt;/code&gt; 访问 WebUI。&lt;/p&gt;
&lt;h3 id="73-使用-nginx-反向代理实现-wss推荐方案"&gt;&lt;a href="#73-%e4%bd%bf%e7%94%a8-nginx-%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e5%ae%9e%e7%8e%b0-wss%e6%8e%a8%e8%8d%90%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;7.3 使用 Nginx 反向代理实现 WSS（推荐方案）
&lt;/h3&gt;&lt;p&gt;如果 NapCatQQ 原生 SSL 配置遇到困难，使用 Nginx 反向代理是更灵活、更稳定的选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;整体架构&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;浏览器 (wss://) → Nginx (端口 3003, SSL) → NapCatQQ (ws://127.0.0.1:3001)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="731-安装-nginx"&gt;&lt;a href="#731-%e5%ae%89%e8%a3%85-nginx" class="header-anchor"&gt;&lt;/a&gt;7.3.1 安装 Nginx
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install nginx -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="732-准备-ssl-证书"&gt;&lt;a href="#732-%e5%87%86%e5%a4%87-ssl-%e8%af%81%e4%b9%a6" class="header-anchor"&gt;&lt;/a&gt;7.3.2 准备 SSL 证书
&lt;/h4&gt;&lt;p&gt;你可以使用 Let&amp;rsquo;s Encrypt 免费申请证书，或使用已有的证书文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将证书复制到 Nginx 目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /etc/nginx/ssl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /path/to/cert.pem /etc/nginx/ssl/server.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp /path/to/key.pem /etc/nginx/ssl/server.key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;644&lt;/span&gt; /etc/nginx/ssl/server.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;600&lt;/span&gt; /etc/nginx/ssl/server.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="733-配置-nginx"&gt;&lt;a href="#733-%e9%85%8d%e7%bd%ae-nginx" class="header-anchor"&gt;&lt;/a&gt;7.3.3 配置 Nginx
&lt;/h4&gt;&lt;p&gt;创建 Nginx 配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/nginx/sites-available/napcat-wss
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;写入以下配置（将 &lt;code&gt;server.344977.xyz&lt;/code&gt; 替换为你的实际域名或 IP）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;3003&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;server.344977.xyz&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/server.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/server.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_session_cache&lt;/span&gt; &lt;span class="s"&gt;shared:SSL:1m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_session_timeout&lt;/span&gt; &lt;span class="mi"&gt;5m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/ws/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3001/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Upgrade&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 跨域配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Access-Control-Allow-Origin&lt;/span&gt; &lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Access-Control-Allow-Methods&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;GET,&lt;/span&gt; &lt;span class="s"&gt;POST,&lt;/span&gt; &lt;span class="s"&gt;OPTIONS&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;add_header&lt;/span&gt; &lt;span class="s"&gt;Access-Control-Allow-Headers&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Origin,&lt;/span&gt; &lt;span class="s"&gt;X-Requested-With,&lt;/span&gt; &lt;span class="s"&gt;Content-Type,&lt;/span&gt; &lt;span class="s"&gt;Accept&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键配置说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proxy_http_version 1.1;&lt;/code&gt; 和 &lt;code&gt;Upgrade&lt;/code&gt; / &lt;code&gt;Connection&lt;/code&gt; 头是 WebSocket 代理的必备条件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_read_timeout 86400;&lt;/code&gt; 防止 WebSocket 长连接因超时被断开&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Access-Control-Allow-Origin *&lt;/code&gt; 解决浏览器的跨域问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="734-启用配置并重启-nginx"&gt;&lt;a href="#734-%e5%90%af%e7%94%a8%e9%85%8d%e7%bd%ae%e5%b9%b6%e9%87%8d%e5%90%af-nginx" class="header-anchor"&gt;&lt;/a&gt;7.3.4 启用配置并重启 Nginx
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 禁用可能冲突的默认站点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm /etc/nginx/sites-enabled/default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启用 napcat-wss 站点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /etc/nginx/sites-available/napcat-wss /etc/nginx/sites-enabled/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 测试配置并重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="735-放行防火墙端口"&gt;&lt;a href="#735-%e6%94%be%e8%a1%8c%e9%98%b2%e7%81%ab%e5%a2%99%e7%ab%af%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;7.3.5 放行防火墙端口
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;阿里云安全组&lt;/strong&gt;：添加入方向规则，放行 TCP 端口 &lt;code&gt;3003&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;服务器内部防火墙&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu (ufw)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw allow 3003/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ufw reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="736-测试-wss-连接"&gt;&lt;a href="#736-%e6%b5%8b%e8%af%95-wss-%e8%bf%9e%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;7.3.6 测试 WSS 连接
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -v -k -H &lt;span class="s2"&gt;&amp;#34;Upgrade: websocket&amp;#34;&lt;/span&gt; https://你的域名:3003/ws/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果返回 &lt;code&gt;101 Switching Protocols&lt;/code&gt;，说明 WSS 代理配置成功。&lt;/p&gt;
&lt;h4 id="737-更新-stapxs-连接地址"&gt;&lt;a href="#737-%e6%9b%b4%e6%96%b0-stapxs-%e8%bf%9e%e6%8e%a5%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;7.3.7 更新 Stapxs 连接地址
&lt;/h4&gt;&lt;p&gt;在 Stapxs QQ Lite 设置中，将 WebSocket 地址改为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wss://你的域名:3003/ws/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Token 保持不变。&lt;/p&gt;
&lt;h3 id="74-常见-httpswss-问题排查"&gt;&lt;a href="#74-%e5%b8%b8%e8%a7%81-httpswss-%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;7.4 常见 HTTPS/WSS 问题排查
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;问题现象&lt;/th&gt;
					&lt;th&gt;可能原因&lt;/th&gt;
					&lt;th&gt;解决方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ERR_SSL_PROTOCOL_ERROR&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;用 HTTPS 访问了只支持 HTTP 的服务&lt;/td&gt;
					&lt;td&gt;检查是否正确配置了 SSL 证书&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;wscat: unable to verify the first certificate&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;自签名证书或证书链不完整&lt;/td&gt;
					&lt;td&gt;使用 &lt;code&gt;NODE_TLS_REJECT_UNAUTHORIZED=0&lt;/code&gt; 绕过验证（仅测试用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;400 Bad Request&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;WebSocket 握手缺少必要头或 Token 认证失败&lt;/td&gt;
					&lt;td&gt;检查 Nginx 是否正确传递了 &lt;code&gt;Upgrade&lt;/code&gt; 和 &lt;code&gt;Authorization&lt;/code&gt; 头&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连接成功但无法收发消息&lt;/td&gt;
					&lt;td&gt;WebSocket 连接建立但 NapCatQQ 未正确响应&lt;/td&gt;
					&lt;td&gt;检查 NapCatQQ 日志，确认 WebSocket 服务端已启用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="第八章常见问题与故障排除"&gt;&lt;a href="#%e7%ac%ac%e5%85%ab%e7%ab%a0%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e4%b8%8e%e6%95%85%e9%9a%9c%e6%8e%92%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;第八章：常见问题与故障排除
&lt;/h2&gt;&lt;h3 id="81-napcatqq-启动失败"&gt;&lt;a href="#81-napcatqq-%e5%90%af%e5%8a%a8%e5%a4%b1%e8%b4%a5" class="header-anchor"&gt;&lt;/a&gt;8.1 NapCatQQ 启动失败
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：执行 &lt;code&gt;xvfb-run -a ...&lt;/code&gt; 后进程立即退出&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;检查是否安装了 &lt;code&gt;xvfb&lt;/code&gt;：&lt;code&gt;which xvfb-run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;查看错误日志：&lt;code&gt;journalctl -u napcat.service -e --no-pager&lt;/code&gt;（systemd 方式）&lt;/li&gt;
&lt;li&gt;检查配置文件语法是否正确&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="82-webui-无法访问"&gt;&lt;a href="#82-webui-%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae" class="header-anchor"&gt;&lt;/a&gt;8.2 WebUI 无法访问
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：浏览器无法打开 &lt;code&gt;http://服务器IP:6099/webui&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;检查 NapCatQQ 是否正在运行：&lt;code&gt;ps aux | grep qq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查端口是否监听：&lt;code&gt;sudo netstat -tlnp | grep 6099&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查阿里云安全组是否放行了 &lt;code&gt;6099&lt;/code&gt; 端口&lt;/li&gt;
&lt;li&gt;检查服务器防火墙：&lt;code&gt;sudo ufw status&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="83-stapxs-无法连接-napcatqq"&gt;&lt;a href="#83-stapxs-%e6%97%a0%e6%b3%95%e8%bf%9e%e6%8e%a5-napcatqq" class="header-anchor"&gt;&lt;/a&gt;8.3 Stapxs 无法连接 NapCatQQ
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Stapxs 显示“连接失败”或“WebSocket 错误”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;排查步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确认 NapCatQQ 的 WebSocket 服务端已启用（WebUI → 网络配置）&lt;/li&gt;
&lt;li&gt;确认 WebSocket 端口（默认 3001）已放行&lt;/li&gt;
&lt;li&gt;检查协议是否匹配：HTTPS 页面必须用 WSS，HTTP 页面可用 WS&lt;/li&gt;
&lt;li&gt;检查 Token 是否正确&lt;/li&gt;
&lt;li&gt;查看浏览器控制台（F12）的具体错误信息&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="84-端口被占用"&gt;&lt;a href="#84-%e7%ab%af%e5%8f%a3%e8%a2%ab%e5%8d%a0%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;8.4 端口被占用
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Nginx 启动失败，错误日志显示 &lt;code&gt;bind() to 0.0.0.0:80 failed (98: Address already in use)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;检查占用端口的进程：&lt;code&gt;sudo netstat -tlnp | grep :80&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;停止冲突的服务，或修改 Nginx 的监听端口&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="结语"&gt;&lt;a href="#%e7%bb%93%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;结语
&lt;/h2&gt;&lt;p&gt;通过本文的完整指南，你已经学会了如何在 Linux 服务器上从零搭建一套完整的网页版 QQ 系统。从 NapCatQQ 的安装配置，到 Stapxs QQ Lite 的前端部署，再到 WebSocket 连接的建立，每一步都经过了详细的讲解。&lt;/p&gt;
&lt;p&gt;更重要的是，我们在扩展章节中深入探讨了 HTTPS/WSS 的配置方案——无论是 NapCatQQ 原生的 SSL 支持，还是通过 Nginx 反向代理实现加密通信，都能让你的系统在安全性上更上一层楼。&lt;/p&gt;
&lt;p&gt;这套系统的优势在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;轻量级&lt;/strong&gt;：2 核 2GB 的服务器即可流畅运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：只要有浏览器，随时随地访问你的 QQ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt;：NapCatQQ 提供了完整的 OneBot API，你可以在此基础上开发机器人、自动化工具等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，也需要提醒几点注意事项：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;账号安全&lt;/strong&gt;：建议使用小号测试，避免主号因异常登录被限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合规使用&lt;/strong&gt;：本文方案仅供学习交流，请勿用于商业或非法用途&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续维护&lt;/strong&gt;：NapCatQQ 和 Stapxs 都在持续更新，建议定期关注项目动态&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;希望这篇指南能帮助你顺利搭建属于自己的网页版 QQ。如果在部署过程中遇到任何问题，欢迎查阅项目的官方文档或在社区中寻求帮助。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资源"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;参考资源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NapNeko/NapCatQQ" target="_blank" rel="noopener"
 &gt;NapCatQQ GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://deepwiki.com/NapNeko/NapCatQQ" target="_blank" rel="noopener"
 &gt;NapCatQQ 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Stapxs/Stapxs-QQ-Lite-2.0" target="_blank" rel="noopener"
 &gt;Stapxs QQ Lite 2.0 GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://onebot.dev/" target="_blank" rel="noopener"
 &gt;OneBot 协议规范&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>从零到一：在 Android 4.4 手表上构建电子书阅读器的完整开发纪实</title><link>https://blog.344977.xyz/post/2026-07-01-issue-2/</link><pubDate>Wed, 01 Jul 2026 09:17:46 +0000</pubDate><guid>https://blog.344977.xyz/post/2026-07-01-issue-2/</guid><description>&lt;h1 id="从零到一在-android-44-手表上构建电子书阅读器的完整开发纪实"&gt;&lt;a href="#%e4%bb%8e%e9%9b%b6%e5%88%b0%e4%b8%80%e5%9c%a8-android-44-%e6%89%8b%e8%a1%a8%e4%b8%8a%e6%9e%84%e5%bb%ba%e7%94%b5%e5%ad%90%e4%b9%a6%e9%98%85%e8%af%bb%e5%99%a8%e7%9a%84%e5%ae%8c%e6%95%b4%e5%bc%80%e5%8f%91%e7%ba%aa%e5%ae%9e" class="header-anchor"&gt;&lt;/a&gt;从零到一：在 Android 4.4 手表上构建电子书阅读器的完整开发纪实
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;作者&lt;/strong&gt;：开发团队&lt;br&gt;
&lt;strong&gt;发布时间&lt;/strong&gt;：2026 年 7 月 1 日&lt;br&gt;
&lt;strong&gt;标签&lt;/strong&gt;：#Android 4.4 #Java 7 #TLS 1.2 #低内存优化 #电子书阅读器&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一项目缘起与目标"&gt;&lt;a href="#%e4%b8%80%e9%a1%b9%e7%9b%ae%e7%bc%98%e8%b5%b7%e4%b8%8e%e7%9b%ae%e6%a0%87" class="header-anchor"&gt;&lt;/a&gt;一、项目缘起与目标
&lt;/h2&gt;&lt;p&gt;我们的目标是为一款配备 240x240 像素屏幕、可用内存仅约 60MB 的 Android 4.4 手表开发一款电子书阅读器。它需要能够从番茄小说 API 获取书籍内容，支持离线缓存、进度记忆、章节切换，并且所有逻辑必须在一个 Activity 内完成，不使用任何第三方 UI 库，仅依赖 Java 7 和 OkHttp 3.12.13。&lt;/p&gt;
&lt;p&gt;这是一项挑战——Android 4.4 发布于 2013 年，其默认的 SSL/TLS 实现仅支持 TLS 1.0/1.1，而现代 API 服务（包括我们使用的 &lt;code&gt;v3.rain.ink&lt;/code&gt;）已强制要求 TLS 1.2。此外，低内存环境要求极简的 UI 渲染和高效的缓存管理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二开发历程与方案演进"&gt;&lt;a href="#%e4%ba%8c%e5%bc%80%e5%8f%91%e5%8e%86%e7%a8%8b%e4%b8%8e%e6%96%b9%e6%a1%88%e6%bc%94%e8%bf%9b" class="header-anchor"&gt;&lt;/a&gt;二、开发历程与方案演进
&lt;/h2&gt;&lt;p&gt;本节按时间顺序详细记录了我们尝试过的所有方案、遇到的错误以及最终采用的解决路径。&lt;/p&gt;
&lt;h3 id="第一阶段初始实现与首次部署"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e9%98%b6%e6%ae%b5%e5%88%9d%e5%a7%8b%e5%ae%9e%e7%8e%b0%e4%b8%8e%e9%a6%96%e6%ac%a1%e9%83%a8%e7%bd%b2" class="header-anchor"&gt;&lt;/a&gt;第一阶段：初始实现与首次部署
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：项目启动初期&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;初始方案&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;HttpURLConnection&lt;/code&gt; 直接请求 &lt;code&gt;http://v3.rain.ink/fanqie/&lt;/code&gt;（HTTP 明文）。&lt;/li&gt;
&lt;li&gt;配置文件从 Gitee 拉取，书籍列表和 API Key 存储在 &lt;code&gt;config.ob&lt;/code&gt; 中。&lt;/li&gt;
&lt;li&gt;UI 为 6×6 字符网格，每字符 40 像素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;遇到的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求 &lt;code&gt;http://v3.rain.ink&lt;/code&gt; 时，服务器返回 301/302 重定向到 HTTPS，OkHttp 默认自动跟随重定向，导致实际请求变为 HTTPS。&lt;/li&gt;
&lt;li&gt;Android 4.4 默认 SSL 实现不支持 TLS 1.2，抛出 &lt;code&gt;SSLHandshakeException: SSL protocol error&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;尝试的修复&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;HttpURLConnection&lt;/code&gt; 中设置 &lt;code&gt;setInstanceFollowRedirects(false)&lt;/code&gt;，试图阻止重定向。&lt;/li&gt;
&lt;li&gt;结果：请求返回 302 状态码，但无法获取实际内容，因为服务器仅支持 HTTPS。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：必须解决 TLS 1.2 兼容性问题，无法绕过。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第二阶段尝试通过代理服务器中转"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e9%98%b6%e6%ae%b5%e5%b0%9d%e8%af%95%e9%80%9a%e8%bf%87%e4%bb%a3%e7%90%86%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%ad%e8%bd%ac" class="header-anchor"&gt;&lt;/a&gt;第二阶段：尝试通过代理服务器中转
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：第一阶段受阻后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案描述&lt;/strong&gt;：
自建 CORS 代理服务器（&lt;code&gt;cors.344977.xyz&lt;/code&gt;），将请求转发至 &lt;code&gt;v3.rain.ink&lt;/code&gt;，应用通过代理访问，期望代理服务器处理 TLS 握手。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;遇到的问题&lt;/strong&gt;：
代理服务器本身使用 HTTPS，Android 4.4 与代理服务器握手时仍然失败，抛出相同的 &lt;code&gt;SSLHandshakeException: SSL protocol error&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日志输出&lt;/strong&gt;：
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x4c0ab308: Failure in SSL library, usually a protocol error&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：代理未能解决问题，因为问题根源在于客户端本身不支持 TLS 1.2，而非目标服务器或代理的配置。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第三阶段尝试使用-okhttp-配置-tls-12首次尝试"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e9%98%b6%e6%ae%b5%e5%b0%9d%e8%af%95%e4%bd%bf%e7%94%a8-okhttp-%e9%85%8d%e7%bd%ae-tls-12%e9%a6%96%e6%ac%a1%e5%b0%9d%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;第三阶段：尝试使用 OkHttp 配置 TLS 1.2（首次尝试）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：代理方案失败后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案描述&lt;/strong&gt;：
切换到 OkHttp 3.12.13，并尝试通过 &lt;code&gt;ConnectionSpec&lt;/code&gt; 强制指定 TLS 1.2：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
 .tlsVersions(TlsVersion.TLS_1_2)
 .build();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;遇到的问题&lt;/strong&gt;：
Android 4.4 的 &lt;code&gt;SSLContext.getInstance(&amp;quot;TLSv1.2&amp;quot;)&lt;/code&gt; 抛出 &lt;code&gt;NoSuchAlgorithmException&lt;/code&gt;，因为系统本身不支持该协议名。&lt;code&gt;catch&lt;/code&gt; 块捕获异常后降级为默认客户端（无 TLS 1.2），实际仍然失败。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日志输出&lt;/strong&gt;：
W/OpenBook: 请求异常: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：&lt;code&gt;ConnectionSpec&lt;/code&gt; 只能约束 OkHttp 的行为，但不能让系统凭空增加对 TLS 1.2 的支持。需要更换安全提供者。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第四阶段尝试-providerinstallergoogle-play-服务方案"&gt;&lt;a href="#%e7%ac%ac%e5%9b%9b%e9%98%b6%e6%ae%b5%e5%b0%9d%e8%af%95-providerinstallergoogle-play-%e6%9c%8d%e5%8a%a1%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;第四阶段：尝试 ProviderInstaller（Google Play 服务方案）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：OkHttp 配置失败后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案描述&lt;/strong&gt;：
使用 Google Play 服务的 &lt;code&gt;ProviderInstaller.installIfNeeded()&lt;/code&gt; 更新系统的安全提供者，期望使 Android 4.4 原生支持 TLS 1.2。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;遇到的问题&lt;/strong&gt;：
目标设备为手表，未安装 Google Play 服务，调用 &lt;code&gt;ProviderInstaller.installIfNeeded()&lt;/code&gt; 会抛出 &lt;code&gt;GooglePlayServicesNotAvailableException&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：该方案依赖外部 Google 服务，在嵌入式设备上不可行，必须寻找不依赖 Play 服务的方案。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第五阶段引入-conscrypt-安全提供者最终可行方案"&gt;&lt;a href="#%e7%ac%ac%e4%ba%94%e9%98%b6%e6%ae%b5%e5%bc%95%e5%85%a5-conscrypt-%e5%ae%89%e5%85%a8%e6%8f%90%e4%be%9b%e8%80%85%e6%9c%80%e7%bb%88%e5%8f%af%e8%a1%8c%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;第五阶段：引入 Conscrypt 安全提供者（最终可行方案）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：ProviderInstaller 失败后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案描述&lt;/strong&gt;：
引入 &lt;code&gt;org.conscrypt:conscrypt-android:2.5.2&lt;/code&gt; 作为独立的安全提供者，在静态初始化块中注册：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static {
 try {
 Security.insertProviderAt(Conscrypt.newProvider(), 1);
 } catch (Throwable t) {
 Log.e(&amp;quot;OpenBook&amp;quot;, &amp;quot;Conscrypt 注册失败: &amp;quot; + t.toString());
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后使用 &lt;code&gt;SSLContext.getInstance(&amp;quot;TLSv1.2&amp;quot;, &amp;quot;Conscrypt&amp;quot;)&lt;/code&gt; 创建上下文，并配合 &lt;code&gt;ConnectionSpec&lt;/code&gt; 强制 TLS 1.2。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证日志&lt;/strong&gt;：
D/OpenBook: Supported protocols: [TLSv1, TLSv1.1, TLSv1.2, TLSv1.3]
I/OpenBook: TLSv1.2 支持: true&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;遇到的问题&lt;/strong&gt;：
TLS 1.2 握手成功，但出现新错误：
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Android 4.4 的系统证书库过于陈旧，无法验证现代根证书（如 Let&amp;rsquo;s Encrypt 的 ISRG Root X1）。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第六阶段绕过证书验证测试环境方案"&gt;&lt;a href="#%e7%ac%ac%e5%85%ad%e9%98%b6%e6%ae%b5%e7%bb%95%e8%bf%87%e8%af%81%e4%b9%a6%e9%aa%8c%e8%af%81%e6%b5%8b%e8%af%95%e7%8e%af%e5%a2%83%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;第六阶段：绕过证书验证（测试环境方案）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：Conscrypt 启用后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案描述&lt;/strong&gt;：
实现一个空的 &lt;code&gt;X509TrustManager&lt;/code&gt;，信任所有证书，并允许所有主机名：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;final X509TrustManager trustAllManager = new X509TrustManager() {
 @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {}
 @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {}
 @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
};

HostnameVerifier allowAll = new HostnameVerifier() {
 @Override public boolean verify(String hostname, SSLSession session) { return true; }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;验证日志&lt;/strong&gt;：
I/OpenBook: 配置下载成功，内容长度: 171
I/OpenBook: 选择书籍: 我不是戏神 (ID: 7276384138653862966)
I/OpenBook: 章节加载完成: 1, 页: 0/351&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结果&lt;/strong&gt;：网络请求成功，章节内容正常获取。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;风险说明&lt;/strong&gt;：
此方案完全跳过证书验证和主机名验证，存在中间人攻击风险，仅适用于开发和测试环境。正式发布前应替换为证书锁定（Certificate Pinning）。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第七阶段ui-与交互优化"&gt;&lt;a href="#%e7%ac%ac%e4%b8%83%e9%98%b6%e6%ae%b5ui-%e4%b8%8e%e4%ba%a4%e4%ba%92%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;第七阶段：UI 与交互优化
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：网络层解决后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原始 UI 问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;6×6 网格，每屏仅 36 字符，阅读效率低。&lt;/li&gt;
&lt;li&gt;顶部状态栏和底部提示栏占据约 70 像素，进一步压缩内容区域。&lt;/li&gt;
&lt;li&gt;无章节选择功能，翻页只能逐章顺序进行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;逐步优化&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;网格从 6×6 调整为 8×8，再调整为 11×11，字体从 40px 降至 20px，每屏字符从 36 提升至 121。&lt;/li&gt;
&lt;li&gt;移除状态栏和底部提示栏，内容区域扩展至全屏。&lt;/li&gt;
&lt;li&gt;实现长按分区：上半屏长按进入章节选择列表，下半屏长按退出阅读。&lt;/li&gt;
&lt;li&gt;章节选择列表字体 14px，行高 18px，自动定位当前章节，高亮显示。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="第八阶段内容解码优化"&gt;&lt;a href="#%e7%ac%ac%e5%85%ab%e9%98%b6%e6%ae%b5%e5%86%85%e5%ae%b9%e8%a7%a3%e7%a0%81%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;第八阶段：内容解码优化
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：UI 调整后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：
API 返回的 JSON 中包含 HTML 实体（如 &lt;code&gt;&amp;amp;#34;&lt;/code&gt; 表示双引号），直接显示为 &lt;code&gt;&amp;amp;#34;&lt;/code&gt;，影响阅读体验。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案演进&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最初使用手动字符串替换，将 &lt;code&gt;&amp;amp;#34;&lt;/code&gt; 替换为 &lt;code&gt;&amp;quot;&lt;/code&gt;，但无法覆盖所有实体。&lt;/li&gt;
&lt;li&gt;改用 &lt;code&gt;Html.fromHtml(raw).toString()&lt;/code&gt; 解码所有 HTML 实体和标签，一次性解决所有转义问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;代码示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private String cleanContent(String raw) {
 String decoded = Html.fromHtml(raw).toString();
 String warning = &amp;quot;为保证服务质量，免费用户请不要下书！或前往网站赞助后刷新隐藏该提示(赞助用户一天可下载一万章)&amp;quot;;
 decoded = decoded.replace(warning, &amp;quot;&amp;quot;);
 decoded = decoded.replaceAll(&amp;quot;\n{3,}&amp;quot;, &amp;quot;\n\n&amp;quot;);
 decoded = decoded.trim();
 decoded = decoded.replace(&amp;quot;\r\n&amp;quot;, &amp;quot;\n&amp;quot;).replace(&amp;quot;\r&amp;quot;, &amp;quot;\n&amp;quot;);
 return decoded;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id="第九阶段缓存策略增强"&gt;&lt;a href="#%e7%ac%ac%e4%b9%9d%e9%98%b6%e6%ae%b5%e7%bc%93%e5%ad%98%e7%ad%96%e7%95%a5%e5%a2%9e%e5%bc%ba" class="header-anchor"&gt;&lt;/a&gt;第九阶段：缓存策略增强
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：内容解码完成后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：
每次加载章节都需要请求完整的目录列表（可能包含上千条记录），导致网络请求冗余。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：
在 &lt;code&gt;ChapterCache&lt;/code&gt; 中新增目录缓存，存储于 &lt;code&gt;content.ob&lt;/code&gt;，格式为 &lt;code&gt;itemId@title&lt;/code&gt;，每行一个。优先读取缓存，若无则请求网络并缓存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目录缓存格式示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;7276663560427471412@第1章 戏鬼回家
7276826981654921789@第2章 我们在看着你
7277563721739108875@第3章 灾厄
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：
章节列表加载速度从数秒降至毫秒级，且降低网络流量消耗。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第十阶段日志自动清理"&gt;&lt;a href="#%e7%ac%ac%e5%8d%81%e9%98%b6%e6%ae%b5%e6%97%a5%e5%bf%97%e8%87%aa%e5%8a%a8%e6%b8%85%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;第十阶段：日志自动清理
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;时间节点&lt;/strong&gt;：功能稳定后&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：
日志文件随时间累积，可能占满有限的存储空间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：
每次启动时扫描 &lt;code&gt;/openbook/logs/&lt;/code&gt; 目录，仅保留当天日期（&lt;code&gt;yyyy-MM-dd&lt;/code&gt;）开头的目录，其余全部递归删除。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码实现&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;private void cleanOldLogs() {
 String today = new SimpleDateFormat(&amp;quot;yyyy-MM-dd&amp;quot;, Locale.US).format(new Date());
 File logsDir = new File(LOG_DIR);
 if (!logsDir.exists() || !logsDir.isDirectory()) return;
 File[] children = logsDir.listFiles();
 if (children == null) return;
 for (File child : children) {
 if (child.isDirectory()) {
 String name = child.getName();
 if (!name.startsWith(today)) {
 deleteRecursive(child);
 }
 }
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id="三关键技术细节与经验总结"&gt;&lt;a href="#%e4%b8%89%e5%85%b3%e9%94%ae%e6%8a%80%e6%9c%af%e7%bb%86%e8%8a%82%e4%b8%8e%e7%bb%8f%e9%aa%8c%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;三、关键技术细节与经验总结
&lt;/h2&gt;&lt;h3 id="31-tls-12-兼容性的完整处理链路"&gt;&lt;a href="#31-tls-12-%e5%85%bc%e5%ae%b9%e6%80%a7%e7%9a%84%e5%ae%8c%e6%95%b4%e5%a4%84%e7%90%86%e9%93%be%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;3.1 TLS 1.2 兼容性的完整处理链路
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提供者注册&lt;/strong&gt;：在 &lt;code&gt;static&lt;/code&gt; 块中注册 Conscrypt，确保在任何网络请求前完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSLContext 创建&lt;/strong&gt;：使用 &lt;code&gt;SSLContext.getInstance(&amp;quot;TLSv1.2&amp;quot;, &amp;quot;Conscrypt&amp;quot;)&lt;/code&gt;，明确指定协议和提供者。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TrustManager 配置&lt;/strong&gt;：测试环境使用空实现绕过证书验证；生产环境应实现证书锁定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ConnectionSpec 强制&lt;/strong&gt;：通过 &lt;code&gt;ConnectionSpec.Builder&lt;/code&gt; 限定 &lt;code&gt;TlsVersion.TLS_1_2&lt;/code&gt;，避免协商降级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OkHttpClient 构建&lt;/strong&gt;：将上述组件注入 &lt;code&gt;OkHttpClient.Builder&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="32-证书锁定的替代方案"&gt;&lt;a href="#32-%e8%af%81%e4%b9%a6%e9%94%81%e5%ae%9a%e7%9a%84%e6%9b%bf%e4%bb%a3%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;3.2 证书锁定的替代方案
&lt;/h3&gt;&lt;p&gt;若要在正式环境替换绕过验证，可采用证书锁定：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CertificatePinner certificatePinner = new CertificatePinner.Builder()
 .add(&amp;quot;v3.rain.ink&amp;quot;, &amp;quot;sha256/你的证书指纹&amp;quot;)
 .build();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;trustAllManager&lt;/code&gt; 替换为系统默认 TrustManager，并添加 &lt;code&gt;certificatePinner&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="33-android-44-开发注意事项"&gt;&lt;a href="#33-android-44-%e5%bc%80%e5%8f%91%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9" class="header-anchor"&gt;&lt;/a&gt;3.3 Android 4.4 开发注意事项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Java 7 语法&lt;/strong&gt;：所有匿名内部类中访问的局部变量必须声明 &lt;code&gt;final&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无运行时权限&lt;/strong&gt;：Android 4.4 安装时授予权限，禁止调用 &lt;code&gt;checkSelfPermission&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无 AndroidX&lt;/strong&gt;：使用传统 support 库或纯原生 API。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部存储路径&lt;/strong&gt;：&lt;code&gt;Environment.getExternalStorageDirectory()&lt;/code&gt; 返回 &lt;code&gt;/storage/emulated/0/&lt;/code&gt;，确保 SD 卡已挂载。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="34-常见编译错误速查表"&gt;&lt;a href="#34-%e5%b8%b8%e8%a7%81%e7%bc%96%e8%af%91%e9%94%99%e8%af%af%e9%80%9f%e6%9f%a5%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;3.4 常见编译错误速查表
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;错误信息&lt;/th&gt;
					&lt;th&gt;原因&lt;/th&gt;
					&lt;th&gt;解决方法&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NoSuchAlgorithmException: TLSv1.2&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;系统不支持 TLS 1.2&lt;/td&gt;
					&lt;td&gt;引入 Conscrypt，使用 &lt;code&gt;&amp;quot;TLSv1.2&amp;quot;, &amp;quot;Conscrypt&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Trust anchor for certification path not found&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;证书库过旧&lt;/td&gt;
					&lt;td&gt;测试环境使用空 TrustManager；生产环境使用证书锁定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;local variable xxx is accessed from within inner class; needs to be declared final&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;内部类访问非 final 局部变量&lt;/td&gt;
					&lt;td&gt;添加 &lt;code&gt;final&lt;/code&gt; 修饰符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;Have not classes.dex in package&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ADB 安装路径含空格&lt;/td&gt;
					&lt;td&gt;用双引号包裹完整路径&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;UnsupportedEncodingException&lt;/code&gt;（编译时）&lt;/td&gt;
					&lt;td&gt;未捕获 &lt;code&gt;URLEncoder.encode&lt;/code&gt; 异常&lt;/td&gt;
					&lt;td&gt;添加 &lt;code&gt;catch (UnsupportedEncodingException e)&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;NoClassDefFoundError: org.conscrypt.Conscrypt&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;ProGuard 混淆移除了 Conscrypt 类&lt;/td&gt;
					&lt;td&gt;在 &lt;code&gt;proguard-rules.pro&lt;/code&gt; 中添加 &lt;code&gt;-keep class org.conscrypt.** { *; }&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四最终成果"&gt;&lt;a href="#%e5%9b%9b%e6%9c%80%e7%bb%88%e6%88%90%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;四、最终成果
&lt;/h2&gt;&lt;p&gt;经过上述十个阶段的迭代，最终实现了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网络层&lt;/strong&gt;：TLS 1.2 支持 + 证书绕过（测试），API 请求成功率 100%。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 层&lt;/strong&gt;：11×11 全屏阅读，长按分区操作，章节选择列表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存层&lt;/strong&gt;：章节内容滑动窗口（3 章） + 目录独立缓存，响应速度 &amp;lt; 200ms。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志层&lt;/strong&gt;：自动清理，仅保留当日日志，存储占用可控。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建层&lt;/strong&gt;：GitHub Actions 自动化构建，JDK 8 + Gradle 4.10.1。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="五未来改进方向"&gt;&lt;a href="#%e4%ba%94%e6%9c%aa%e6%9d%a5%e6%94%b9%e8%bf%9b%e6%96%b9%e5%90%91" class="header-anchor"&gt;&lt;/a&gt;五、未来改进方向
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;证书锁定&lt;/strong&gt;：替换空 TrustManager，实现正式环境的安全通信。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预加载机制&lt;/strong&gt;：后台预加载后续章节，提升翻章体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字体自定义&lt;/strong&gt;：允许用户调整网格大小和字体。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;书籍搜索&lt;/strong&gt;：调用 &lt;code&gt;type=1&lt;/code&gt; 接口实现在线搜索。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;夜间模式&lt;/strong&gt;：根据环境光自动切换黑白配色。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;该文章由 AI 总结生成，基于真实开发过程中的代码提交、构建日志和问题追踪记录。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>About</title><link>https://blog.344977.xyz/post/2026-06-30-issue-1/</link><pubDate>Tue, 30 Jun 2026 12:15:33 +0000</pubDate><guid>https://blog.344977.xyz/post/2026-06-30-issue-1/</guid><description>&lt;h1 id="我是yingo-server"&gt;&lt;a href="#%e6%88%91%e6%98%afyingo-server" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;我&lt;/strong&gt;是yingo-server
&lt;/h1&gt;&lt;h2 id="你好"&gt;&lt;a href="#%e4%bd%a0%e5%a5%bd" class="header-anchor"&gt;&lt;/a&gt;你好
&lt;/h2&gt;&lt;p&gt;我来自中国 湖北 孝感&lt;/p&gt;
&lt;h3 id="在这里你可以划水学习或者讨论"&gt;&lt;a href="#%e5%9c%a8%e8%bf%99%e9%87%8c%e4%bd%a0%e5%8f%af%e4%bb%a5%e5%88%92%e6%b0%b4%e5%ad%a6%e4%b9%a0%e6%88%96%e8%80%85%e8%ae%a8%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;在这里，你可以划水，学习，或者讨论
&lt;/h3&gt;&lt;h3 id="我们开放我们包容我们自由"&gt;&lt;a href="#%e6%88%91%e4%bb%ac%e5%bc%80%e6%94%be%e6%88%91%e4%bb%ac%e5%8c%85%e5%ae%b9%e6%88%91%e4%bb%ac%e8%87%aa%e7%94%b1" class="header-anchor"&gt;&lt;/a&gt;我们开放，我们包容，我们自由
&lt;/h3&gt;&lt;h3 id="在互联网下留存净土在现实中保护理想"&gt;&lt;a href="#%e5%9c%a8%e4%ba%92%e8%81%94%e7%bd%91%e4%b8%8b%e7%95%99%e5%ad%98%e5%87%80%e5%9c%9f%e5%9c%a8%e7%8e%b0%e5%ae%9e%e4%b8%ad%e4%bf%9d%e6%8a%a4%e7%90%86%e6%83%b3" class="header-anchor"&gt;&lt;/a&gt;在互联网下留存净土，在现实中保护理想
&lt;/h3&gt;&lt;h1 id="我们就在这里位于不能共存的日子"&gt;&lt;a href="#%e6%88%91%e4%bb%ac%e5%b0%b1%e5%9c%a8%e8%bf%99%e9%87%8c%e4%bd%8d%e4%ba%8e%e4%b8%8d%e8%83%bd%e5%85%b1%e5%ad%98%e7%9a%84%e6%97%a5%e5%ad%90" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;我们就在这里，位于不能共存的日子&lt;/strong&gt;
&lt;/h1&gt;</description></item></channel></rss>