[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80209":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":16,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":27,"lastSyncTime":28,"discoverSource":29},80209,"MirrorKit","ZzaiQWQ\u002FMirrorKit","ZzaiQWQ","本工具只是模拟镜像站的本地研究工具",null,"JavaScript",81,30,67,0,1,7,13,51.27,"GNU Affero General Public License v3.0",false,"main",true,[],"2026-06-12 04:01:27","# MirrorKit 使用说明\n\n[中文](README.md) | [English](README_EN.md)\n\n## 开源协议\n\n本项目使用 GNU Affero General Public License v3.0 or later。\n\n```text\nSPDX-License-Identifier: AGPL-3.0-or-later\n```\n\n你可以复制、分发和修改本项目代码，但修改版也必须以相同协议开源。\n\n如果你把修改版部署成网络服务供他人使用，也必须向使用者提供对应源码。\n\n注意：本协议只覆盖本项目工具代码，不覆盖通过本工具下载到本地的第三方网站资源。\n\n## 免责声明\n\n完整中英文免责声明见 [DISCLAIMER.md](DISCLAIMER.md)。\n\n本项目仅供学习研究、技术交流和本地测试使用，请勿用于任何违法违规用途。\n\n本工具只是模拟镜像站的本地研究工具，并非目标网站的完整复制版本，也不代表目标网站官方内容。\n\n通过本工具下载到本地的所有资源，仅限个人学习研究和本地测试。未经授权，不得对下载资源进行二次上传、公开传播、分发、商用或用于搭建公开镜像站；此类行为可能构成侵权或违法。\n\n使用者应自行确认目标网站的版权、服务条款、访问限制和当地法律法规。禁止将本项目用于未授权复制、传播、商用、绕过访问控制、侵犯版权、侵犯隐私、攻击网站或其他不当行为。\n\n因使用本项目产生的任何风险、损失、法律责任或第三方纠纷，均由使用者自行承担，项目作者不承担任何责任。\n\n这是一个网页本地镜像框架。\n\n目标规则：\n\n```text\n所有资源先走本地\n本地没有，再去远程请求\n请求成功后，缓存到本地\n以后再访问，直接读本地\n```\n\n外层 `index.html` 只是启动页，不保存目标网站首页。目标网站内容都会放进一个独立文件夹里，例如：\n\n```text\n项目文件夹\u002F\n├─ index.html\n├─ server.js\n├─ tools\u002F\n└─ example-site.com\u002F\n   ├─ index.html\n   ├─ assets\u002F\n   └─ ...\n```\n\n项目外层文件夹叫什么都可以，不影响代码。\n\n## 零、运行依赖\n\n本项目需要安装：\n\n```text\nNode.js 18 或更高版本\n现代浏览器，例如 Chrome、Edge、Firefox\n```\n\n原因：\n\n```text\nserver.js 和 tools 里的脚本都用 Node.js 运行\n下载远程资源时使用 Node.js 内置 fetch\nfetch 从 Node.js 18 开始内置，低版本 Node 可能无法运行\n```\n\n检查 Node.js 版本：\n\n```bat\nnode -v\n```\n\n如果显示类似下面这样，就可以用：\n\n```text\nv18.x.x\nv20.x.x\nv22.x.x\n```\n\n本项目没有额外 npm 依赖，不需要运行：\n\n```bat\nnpm install\n```\n\n只要 Node.js 版本够，直接运行即可：\n\n```bat\nnode server.js\n```\n\n或者双击：\n\n```text\n一键启动服务器.bat\n```\n\n## 一、换网站要改哪里\n\n换网站有两种方式：\n\n```text\n方式 A：运行命令时用环境变量临时指定网站，不改代码\n方式 B：直接修改两个文件顶部配置\n```\n\n如果只是临时测试一个网站，推荐先用方式 A。\n\n### 方式 A：用环境变量临时换站\n\n这种方式不需要改 `server.js` 和 `tools\u002Fmirror-assets.js`，只在当前命令窗口生效。\n\nCMD 示例：\n\n```bat\nset TARGET_HOST=https:\u002F\u002Fexample.com\nset MIRROR_NAME=example.com\nset START_PATH=\u002F\nnode server.js\n```\n\n批量下载也可以这样：\n\n```bat\nset TARGET_HOST=https:\u002F\u002Fexample.com\nset MIRROR_NAME=example.com\nset START_PATH=\u002F\nnode tools\\mirror-assets.js\n```\n\n如果入口不是首页，而是某个路径，例如：\n\n```text\nhttps:\u002F\u002Fexample.com\u002Fexample-path\n```\n\n就把 `START_PATH` 写成：\n\n```bat\nset START_PATH=\u002Fexample-path\n```\n\n如果要运行隐藏媒体补充工具，并且目标站有单独的远程媒体桶，可以额外指定：\n\n```bat\nset CMS_MEDIA_HOST=https:\u002F\u002Fstorage.example.com\u002Fexample-bucket\nnode tools\\mirror-cms-media.js\n```\n\n这种方式适合反复测试不同网站，因为代码默认配置不用来回改。\n\n### 方式 B：修改文件顶部配置\n\n如果你想把某个网站固定成默认目标，再改两个文件顶部配置：\n\n```text\nserver.js\ntools\u002Fmirror-assets.js\n```\n\n这两个文件里的配置要保持一致。\n\n### 1. TARGET_HOST\n\n目标网站域名，只写协议 + 域名，不要带最后的 `\u002F`。\n\n```js\nconst TARGET_HOST = process.env.TARGET_HOST || 'https:\u002F\u002Fexample.com';\n```\n\n改成你要扒的网站：\n\n```js\nconst TARGET_HOST = process.env.TARGET_HOST || 'https:\u002F\u002Fwww.xxx.com';\n```\n\n### 2. MIRROR_NAME\n\n本地保存文件夹名。\n\n```js\nconst MIRROR_NAME = process.env.MIRROR_NAME || 'example.com';\n```\n\n例如：\n\n```js\nconst MIRROR_NAME = process.env.MIRROR_NAME || 'xxx.com';\n```\n\n下载内容会保存到：\n\n```text\n项目文件夹\u002Fxxx.com\u002F\n```\n\n### 3. START_PATH\n\n目标网站入口路径。\n\n如果网站首页就是：\n\n```text\nhttps:\u002F\u002Fwww.xxx.com\u002F\n```\n\n就写：\n\n```js\nconst START_PATH = process.env.START_PATH || '\u002F';\n```\n\n如果入口是：\n\n```text\nhttps:\u002F\u002Fwww.xxx.com\u002Fzh\n```\n\n就写：\n\n```js\nconst START_PATH = process.env.START_PATH || '\u002Fzh';\n```\n\n访问镜像时用：\n\n```text\nhttp:\u002F\u002Flocalhost:3000\u002F\u003CMIRROR_NAME>\u003CSTART_PATH>\n```\n\n例如：\n\n```text\nhttp:\u002F\u002Flocalhost:3000\u002Fxxx.com\u002F\nhttp:\u002F\u002Flocalhost:3000\u002Fxxx.com\u002Fzh\n```\n\n## 二、工具怎么用\n\n工具都在 `tools\u002F` 文件夹里。\n\n### 1. server.js\n\n用途：启动本地服务器。\n\n它负责：\n\n```text\n打开本地镜像\n优先读取本地文件\n本地没有时去远程下载\n下载成功后保存本地\n把页面里的外链改成本地镜像路径\n```\n\n运行：\n\n```bat\nnode server.js\n```\n\n或者双击：\n\n```text\n一键启动服务器.bat\n```\n\n打开：\n\n```text\nhttp:\u002F\u002Flocalhost:3000\u002F\n```\n\n外层启动页会自动显示当前配置的入口。\n\n### 2. tools\\mirror-assets.js\n\n用途：通用批量下载。\n\n适合下载普通网站资源：\n\n```text\nHTML\nCSS\nJS\nJSON\n图片\n字体\n普通视频文件\nwasm\n压缩纹理\n```\n\n运行：\n\n```bat\nnode tools\\mirror-assets.js\n```\n\n如果想重新检查坏缓存：\n\n```bat\nnode tools\\mirror-assets.js --retry-bad\n```\n\n一般换网站后，先跑这个。\n\n### 3. tools\\mirror-cms-media.js\n\n用途：补充下载隐藏媒体。\n\n有些网站的视频、图片不直接写在 HTML 里，而是藏在：\n\n```text\nCMS JSON\n远程存储桶\napp 缓存号文件\n运行时数据文件\n```\n\n这种情况下，普通 `mirror-assets.js` 可能扫不到，就跑这个补充脚本。\n\n运行：\n\n```bat\nnode tools\\mirror-cms-media.js\n```\n\n重新检查坏缓存：\n\n```bat\nnode tools\\mirror-cms-media.js --retry-bad\n```\n\n这个脚本也有顶部配置：\n\n```js\nconst TARGET_HOST = process.env.TARGET_HOST || 'https:\u002F\u002Fexample.com';\nconst MIRROR_NAME = process.env.MIRROR_NAME || 'example.com';\nconst CMS_HOST = process.env.CMS_MEDIA_HOST || 'https:\u002F\u002Fstorage.example.com\u002Fexample-bucket';\n```\n\n如果新网站没有 CMS \u002F 远程媒体桶，不用跑这个。\n\n如果新网站有类似的远程媒体桶，就把 `CMS_HOST` 改成对应地址。\n\n### 4. tools\\find-video-refs.js\n\n用途：查本地文本文件里有没有视频链接。\n\n运行：\n\n```bat\nnode tools\\find-video-refs.js\n```\n\n它只查引用，不下载。\n\n能帮你判断视频链接藏在哪个文件里。\n\n### 5. tools\\validate-assets.js\n\n用途：检查本地资源有没有坏缓存。\n\n运行：\n\n```bat\nnode tools\\validate-assets.js\n```\n\n它会检查有没有把 HTML 错误页误保存成图片、JSON、字体等资源。\n\n## 三、推荐流程\n\n### 普通网站\n\n```bat\nnode tools\\mirror-assets.js\nnode server.js\n```\n\n然后打开：\n\n```text\nhttp:\u002F\u002Flocalhost:3000\u002F\n```\n\n### 有隐藏视频 \u002F CMS 数据的网站\n\n```bat\nnode tools\\mirror-assets.js\nnode tools\\mirror-cms-media.js\nnode server.js\n```\n\n然后打开：\n\n```text\nhttp:\u002F\u002Flocalhost:3000\u002F\n```\n\n### 只想边打开边自动补资源\n\n直接启动服务器：\n\n```bat\nnode server.js\n```\n\n然后在网页里操作、滚动、进入详情页。\n\n服务器看到缺失资源，会自动下载。\n\n注意：如果网页里的地址是完整外链，例如：\n\n```text\nhttps:\u002F\u002Fcdn.xxx.com\u002Fa.mp4\n```\n\n服务器会把它改成本地镜像路径：\n\n```text\n\u002Fxxx.com\u002Fcdn.xxx.com\u002Fa.mp4\n```\n\n这样浏览器会先问本地服务器，本地没有时才去远程缓存。\n\n## 四、什么时候需要改更多规则\n\n一般只改：\n\n```text\nTARGET_HOST\nMIRROR_NAME\nSTART_PATH\n```\n\n只有下面情况才改别的。\n\n### 1. 缺少某种扩展名\n\n位置：\n\n```text\ntools\u002Fmirror-assets.js\ntools\u002Fmirror-cms-media.js\n```\n\n改：\n\n```js\nconst ASSET_EXTS = [\n    ...\n];\n```\n\n例如网站有：\n\n```text\n.glb\n.gltf\n.pdf\n.m3u8\n.ts\n.m4s\n```\n\n就加进去。\n\n### 2. 有特殊 CMS \u002F 远程媒体桶\n\n位置：\n\n```text\ntools\u002Fmirror-cms-media.js\n```\n\n改：\n\n```js\nconst CMS_HOST = process.env.CMS_MEDIA_HOST || 'https:\u002F\u002Fstorage.example.com\u002Fexample-bucket';\n```\n\n### 3. 有多个入口页\n\n位置：\n\n```text\ntools\u002Fmirror-assets.js\n```\n\n改：\n\n```js\nconst SEED_URLS = [\n    START_PATH,\n    '\u002Fabout',\n    '\u002Fwork',\n    '\u002Fcontact'\n];\n```\n\n### 4. 某些路径带点但不是域名\n\n位置：\n\n```text\nserver.js\n```\n\n改：\n\n```js\nconst SITE_PATH_PREFIXES = new Set([\n    'content',\n    'etc.clientlibs',\n    'experiment',\n    'webui',\n    'auth',\n    'graphql'\n]);\n```\n\n例如：\n\n```text\n\u002Fetc.clientlibs\u002Fxxx.js\n```\n\n虽然有点，但它是站内路径，不是远程域名。\n\n## 五、重新扒一个网站\n\n如果想清掉当前镜像重新下载：\n\n1. 关闭服务器窗口。\n2. 删除当前镜像文件夹，例如：\n\n```text\nxxx.com\u002F\n```\n\n3. 确认两个文件顶部配置一致：\n\n```text\nserver.js\ntools\u002Fmirror-assets.js\n```\n\n4. 重新运行：\n\n```bat\nnode tools\\mirror-assets.js\nnode server.js\n```\n\n如果需要隐藏媒体：\n\n```bat\nnode tools\\mirror-cms-media.js\n```\n\n\n## 六、常见问题\n\n### 1. 打开页面变成下载文件\n\n通常是无扩展名页面没有保存成 `index.html`。\n\n现在服务器会把这种路径：\n\n```text\n\u002Fabout\n```\n\n保存成：\n\n```text\n\u003CMIRROR_NAME>\u002Fabout\u002Findex.html\n```\n\n### 2. 视频已经下载，本地断网还是播不了\n\n通常是网页还在请求外网完整地址。\n\n现在服务器会把外链改成本地镜像路径。如果改完后仍然不行：\n\n```text\n重启服务器\nCtrl + F5 强制刷新页面\n确认视频文件确实在镜像文件夹里\n```\n\n### 3. 日志出现 Rejected unexpected content\n\n意思是远程返回的内容不像目标资源。\n\n例如请求的是：\n\n```text\n.jpg\n.js\n.json\n```\n\n但远程实际返回：\n\n```text\ntext\u002Fhtml\n```\n\n这通常是 404、跳转页、fallback 页面。脚本拒绝缓存是正常保护。\n\n### 4. 菜单、轮播、弹窗点不开\n\n先确认：\n\n```text\n改完 server.js 后重启服务器\n浏览器 Ctrl + F5 强制刷新\n打开控制台看 JS 报错\n```\n\n注意：不要粗暴重写整个 JS。现在服务器只做外链前缀替换，避免破坏压缩 JS。\n\n## 七、编码注意\n\n所有包含中文注释的文件都保持 UTF-8。\n\n不要用 PowerShell 重定向写中文文件，例如：\n\n```bat\necho 中文 > README.md\n```\n\n这种方式容易把中文写坏。\n","MirrorKit 是一个用于本地研究的网页镜像工具。它基于 JavaScript 构建，能够将远程网站的内容下载并缓存到本地，之后用户可以直接从本地访问这些内容，而无需再次请求远程服务器。该工具支持通过环境变量或修改配置文件来指定目标站点，并且对 Node.js 18 或更高版本有依赖要求。适用于需要进行离线浏览、网站结构分析或本地测试等场景。请注意，使用时必须遵守相关法律法规及版权协议。",2,"2026-06-11 03:59:39","CREATED_QUERY"]