quark-mswnlz-publisher
版本: v2.4.0
夸克网盘 / 百度网盘 / 阿里云盘 → mswnlz GitHub 资源仓库 → 站点自动更新,一条龙发布。
支持三网盘混合输入、多账号轮换、多群组通知。
更新日志
v2.4.0 (2026-07-27)
- 🎨 彻底修复站点渲染换行问题:
mswnlz_publish.py的append_items()和新增normalize_legacy_lines()三重保障:- ① 自动把旧格式行(
标题-超过100T资料总站网站-doc.869hr.uk | URL)转换为标准[标题](URL) - ② 自动检测相邻链接行缺空行的情况并插入空行(VitePress 会把相邻文本行合并为一个段落)
- ③ 新增条目追加时自动确保前文有空行隔开
- ① 自动把旧格式行(
- 📐 Markdown 规范固化:每个资源条目独立一行
[标题](URL),条目之间空行隔开 - 🧪 新增单元测试:验证旧格式转换、缺空行修复、已规范不动等场景
v2.3.0 (2026-07-27)
- 🔑 cleanup 多账号自动遍历:
cleanup_junk_files.pyv2.0 自动扫描config/cookies*.txt全部 cookie 文件,每个账号独立登录清理,不再遗漏非当前账号的垃圾文件 - 🔁 cleanup 递归扫描:从只扫一级子文件夹升级为递归 6 层深度(
--max-depth可调),彻底清理嵌套在深层子文件夹中的垃圾 - 📁 junk_files.json 新增:
更多资源收藏不迷路(转存来源常见的推广文件夹) - 📝 经验沉淀:新增「踩坑记录」章节,记录多账号场景下的典型问题
v2.2.1 (2026-07-26)
- 🐛 修复 mswnlz_publish.py 路径错误:v2.2.0-rc1 误将默认路径改为
/Users/m/document/QNSZ/project/mswnlz-github(少.且目录不存在),修正回/Users/m./Documents/QNSZ/project/mswnlz - MSWNLZ_ROOT 优先级调整:
mswnlz>mswnlz-github(与实际目录结构一致) - 🧹 垃圾清理支持删除文件夹:
cleanup_junk_files.py升级,匹配到垃圾名单的子文件夹也会整个删除(此前只删文件)- 夸克端:子文件夹匹配名单 → 整个文件夹删除
- 百度端:批次根目录下的垃圾子文件夹直接
rm,子文件夹内正常扫描
- 🗑️ junk_files.json 新增条目:
🍎关注公众号,免费进资源群🍎.JPG关注公众号,免费进资源群.JPG00❤️必看~网盘用户福利❤️(文件夹)
- 🔁 转存失败自动跳过:
quark_batch_run.py捕获 EOFError 后跳过当前条目继续下一条,不再整个批次中断
v2.2.0 (2026-07-24)
- 同步
doc.869hr.ukSEO 重构后的站点合同:发布端只追加资源源文件,不再生成或修改分类页结构 - 新增资源写入标准 Markdown 链接格式
[标题](URL),兼容站点构建期 catalog 和服务端可索引目录 - 站点重建前执行
npm run build+npm run validate,验证 catalog、sitemap 和/public/重复页规则 - ⚠️ 当时误改默认路径为
/Users/m/document/QNSZ/project/mswnlz-github(少.且目录不存在)→ v2.2.0 已修复
v2.1.1 (2026-07-19)
- 🔧 copy_promo 动态发现推广文件夹:不再硬编码账号1的 fid,改为先试硬编码 → 失败则在
temp/下按名称查找,自动适配多账号场景
v2.1.0 (2026-07-19)
- 🆕 多账号轮换:支持多个夸克账号按批次自动轮换,分摊转存压力
- 新增
scripts/quark_account_rotator.py独立轮换器 quark_batch_run.py集成轮换逻辑,支持--force-account和--no-rotate参数- 采用方案B(按批次轮换)+ 做法甲(cookie 文件复制),对现有代码零侵入
- 状态记录在
config/account_state.json,支持任意数量的账号 - 输出 JSON 新增
quark_account字段,标记本批次使用的账号
- 新增
v2.0.0 (2026-07-15)
- 🆕 垃圾文件清理模块:转存后自动删除原分享者植入的推广/广告文件
- 新增
scripts/cleanup_junk_files.py独立清理脚本,支持夸克/百度/阿里云三端 - 新增
config/junk_files.json垃圾文件名配置文件(子串匹配,可随时追加) pipeline_orchestrator.py在 A 段与 B 段之间插入 cleanup 步骤- QuarkPanTool
quark.py新增delete_files(fid_list)API - QuarkPanTool
aliyun_client.py新增delete_file_by_name()方法
- 新增
v1.9.0 (2026-07-11)
- 🆕 新增 @tgmkno 群组:配置文件 quark-publisher.env 新增
TG_GROUP_3_ID=@tgmkno,通知同步推送到 tgmkno 群组 - 🔧 默认支持 4 个 TG 群组推送(v1.8.0),完全通过环境变量控制
v1.8.0 (2026-07-04)
- 🆕 第4个 TG 群组推送:
mswnlz_publish.py新增TG_GROUP_4_ID/TG_GROUP_4_THREAD环境变量支持 - 🔧 默认支持 4 个群组推送,完全通过环境变量控制,无需改代码
v1.7.0 (2026-07-03)
- 🆕 quark_batch_run.py v2.0.0: Save-Share 锁步模式,不再依赖目录列表顺序
- 每个 item 保存后立即生成分享链接,捕获 title→URL 的显式映射
- 规则: 有 title+url → 用提供的 title;只有 url → 从 Quark 实际文件夹名取名字
- 一个 title 下有多个 url 时,所有分享链接自动归到同一 title 下
- 🔧 pipeline_orchestrator.py:
_load_urls适配新版 title 字段,不再按 index 对位 - 🔧 内容校验: 名称与 URL 一一对应,防止跨资源串位
- 🧹 清理了过时的中间文件
v1.6.0 (2026-07-03)
- 🆕 阿里云盘完整支持:新增
aliyun_client.py/aliyun_batch_run.py,基于 aligo SDK 实现阿里云盘转存+加密永久分享+推广文件复制 - 🆕 三链发布:
pipeline_orchestrator.py支持夸克+百度+阿里云盘三网盘混合分流、合并、统一发布 - 🆕 三链 TG 通知:群组通知和频道通知同时显示三个网盘的链接
- 🔀 url_router.py 新增 aliyundrive.com 识别路由
- 🆕 自动上传推广文件:阿里云盘首次自动扫码登录后,自动上传本地推广文件到网盘
- 🧩 依赖:项目 .venv 需安装
aligo>=6.2.8(pip install aligo)
v1.5.0 (2026-07-01)
- 🆕 百度网盘完整支持:新增
baidu_client.py/baidu_batch_run.py,支持百度网盘转存+加密永久分享+推广文件复制 - 🆕 统一编排器
pipeline_orchestrator.py:自动识别 Quark / Baidu 链接,分流处理、按名称合并结果后统一发布 - 🆕 多链接支持:items.json 支持
urls数组,一个资源名可以同时有夸克和百度链接 - 🔗 双链接发布:TG 通知和群组消息同时显示夸克+百度两个链接
- 🛡️ 容错设计:一个网盘异常不影响另一个,至少有一个链接成功即可发布
- 🔀 统一路由
url_router.py:自动检测链接来源(quark.cn / pan.baidu.com) - ♻️ 百度A段已支持文件重复时自动分享已有文件夹
- 🧪 dry-run 模式:编排器和发布脚本均支持
--dry-run,测试时可跳过 TG 通知、GitHub 推送和站点重建 - 📝 原始标题辅助判断:同时检查用户输入的原始标题(如"北宋帝陵 (2023) 4K 全7集"),弥补 Quark 文件夹名简写问题
- 🔧 修复"合集"误归:取消"合集"自动归 book 规则,防止影视合集错归书籍仓库
- ➕ 新增第三个群组到通知列表,非论坛群无 topic
- 🐛 修复:thread_id 为 None 时不传 message_thread_id 参数,避免非论坛群发送报错
- 🐛 修复:thread_id 为 None 时不传 message_thread_id 参数,避免非论坛群发送报错
- 📄 readme 文档更新: 分类策略新增三层文档
v1.4.3 (2026-05-29)
- 🎨 统一群组通知格式:与频道通知风格对齐,包含资源名称、夸克链接、更新仓库、查看详情链接、资料总站、资料频道
- 🔗 群组通知新增夸克转存链接行(🔗 夸克链接:xxx)
- 📦 频道通知(notify.yml)新增资料频道链接,10个仓库统一更新
v1.4.2 (2026-03-15)
- 🐛 修复:脚本启动时自动加载
secrets.env环境变量,无需手动 export - 📝 影响脚本:
quark_batch_run.py、mswnlz_publish.py
v1.4.1
- 初始稳定版本
📺 视频教程
【资源运营神器Skills】完全开源,夸克网盘+GitHub一条龙全自动发布工具!转存、归类、TG通知、站点更新一键搞定!
📝 文字教程
触发条件
当用户提供夸克分享链接并需要执行以下任一操作时:
- 批量转存夸克资源
- 生成永久加密分享链接
- 发布到 mswnlz GitHub 仓库
- 更新站点内容
工作区约定
| 路径 | 用途 |
|---|---|
/Users/m/document/QNSZ/project |
项目根目录 |
/Users/m/document/QNSZ/project/QuarkPanTool |
夸克自动化工具 |
/Users/m/document/QNSZ/project/mswnlz-github |
mswnlz 组织内容仓库 + 站点仓库 |
/Users/m/document/QNSZ/project/skills |
Skills 仓库 |
安全要求
- 不要在聊天中粘贴或回显 Token
- 优先使用 GitHub SSH 方式(
git@github.com:...) - 如需 GitHub API,通过环境变量
GITHUB_TOKEN传入,不要写入文件 - Telegram Token 必须通过环境变量配置(见下方)
环境变量配置
在运行脚本前,需要设置以下环境变量:
# Telegram Bot Token(必须)
export TELEGRAM_BOT_TOKEN="你的Bot Token"
# Telegram 群组配置(可选,用于发送通知)
export TG_GROUP_1_ID="-100XXXXXXXXXX" # 群组 1 ID
export TG_GROUP_1_THREAD="5" # 群组 1 话题 ID
export TG_GROUP_2_ID="-100YYYYYYYYYY" # 群组 2 ID
export TG_GROUP_2_THREAD="2" # 群组 2 话题 ID
export TG_GROUP_4_ID="" # 群组 4 ID
export TG_GROUP_4_THREAD="" # 群组 4 话题 ID
# Telegram 频道 ID(可选)
export TELEGRAM_CHANNEL_ID="@your_channel"
# GitHub Token(可选,用于 API 调用)
export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
⚠️ 安全提示:
- 永远不要将 Token 硬编码在脚本中
- 永远不要将 Token 提交到 Git 仓库
完整工作流
0) 输入收集
需要用户提供:
- 夸克分享 URL 列表(每条可包含标题)
- 目标月份
YYYYMM(默认:当前月份) - 批次标签(默认:
短裤哥批次)
1) 确保各网盘登录状态
夸克网盘:
- 检查
QuarkPanTool/config/cookies.txt - 如果不存在或为空:运行
python quark_login.py - 登录流程:自动打开 Chrome → 用户扫码 → Cookie 自动保存
阿里云盘(首次使用需扫码):
- 首次运行
aliyun_batch_run.py时,终端会打印二维码图片链接 - 用阿里云盘 App 扫码登录后,refresh_token 自动保存到
~/.aligo/quark-mswnlz.json - 后续运行自动复用 token,无需再扫码
- 首次运行还会自动上传本地推广文件到阿里云盘的
/推广文件目录
2) 批量转存 + 生成分享链接(支持夸克/百度/阿里云盘)
┌─ 夸克 ─→ quark_batch_run.py
items.json ── 百度 ─→ baidu_batch_run.py ──→ batch_share_results.json ──→ 合并 ──→ B段
└─ 阿里云盘 → aliyun_batch_run.py
使用 scripts/quark_batch_run.py:
- 在夸克根目录创建批次文件夹(格式:
YYYY-MM-DD_HHMM_<label>) - 批量转存所有分享 URL 到该文件夹
- 列出文件夹内所有项目
- 为每个顶层项目生成分享链接:
url_type=2(加密)expired_type=1(永久)- 随机提取码
- 输出 JSON:
batch_share_results.json
3) 复制推广文件到每个资源文件夹内部 🆕
使用 scripts/copy_promo_to_folders.py:
- 从夸克网盘的
temp/要共享的文件文件夹读取推广文件 - 复制到每个转存的资源文件夹内部(不是批次文件夹)
重要:推广文件会被复制到每个资源文件夹里面,这样分享出去的每个文件夹都包含推广文件。
前提条件:
- 需要提前在夸克网盘创建
temp/要共享的文件文件夹 - 上传推广文件到该文件夹
推广文件清单:
必看免责声明_及加入资源分享群_及_副业_0_成本赚钱教程_资源网站doc_869hr_uk.txt1_解压密码869hr_uk_移动端双击这里.html0_双击获取解压密码_Mac系统双击这里.webloc0_双击获取解压密码_windows系统双击这里.url
4) 自动归类到 mswnlz 仓库
使用 scripts/mswnlz_publish.py:
- 调用 GitHub API 获取 mswnlz 组织仓库列表
- 根据标题关键词分层归类(v1.4.4):
- 第一关 视频/影视类:命中分辨率(4K/超清/蓝光/1080P)、影视短语(电影/纪录片/电视剧)、集数标识(全X集/第X集)、视频后缀 →
movies - 第二关 书籍类:书/书单/新书/电子书/杂志、X册/X本 →
book(不再用"合集"归书) - 第三关 回退匹配:前两关未命中时,根据仓库 description 关键词模糊评分
- 第一关 视频/影视类:命中分辨率(4K/超清/蓝光/1080P)、影视短语(电影/纪录片/电视剧)、集数标识(全X集/第X集)、视频后缀 →
- 克隆/更新本地仓库(SSH 方式)
- 追加到
<YYYYMM>.md,只写资源源数据,不生成网站页面结构:[{标题}]({分享链接}) - 更新
README.md月份索引(保持倒序) - Git commit + push
- 发送统一的 Telegram 群组通知(多仓库更新只发一条汇总消息)
4.5) 站点设计与 SEO 合同
资源站点已按 taste-skill:design-taste-frontend 重构为“信任优先、检索优先、归档保留”的中文资源目录:
- 分类首页由 VitePress 构建期 catalog 生成目录,支持搜索、月份、平台和排序筛选
- 月份页仍是
/category/YYYYMM归档 URL,不删除旧路径 - 发布脚本不得写入
docs/public/{category}/*.md - 发布脚本不得生成
<ResourceTabs :months>、分类首页、广告容器或页面布局代码 - 新资源只提交到对应内容仓库的
YYYYMM.md,站点 CI 会复制内容仓库并重新生成 catalog
5) 触发站点重建
使用 scripts/trigger_site_rebuild.sh:
- 定位
mswnlz.github.io仓库(可用MSWNLZ_SITE_REPO覆盖) - 拉取 main 最新代码
- 执行
npm run build和npm run validate - 不提交本地 dist/catalog 构建噪音
- 创建空提交并 push 到 main,触发 GitHub Actions 构建
6) 返回结果
返回给用户:
- 批次文件夹名称
- 所有分享链接(含提取码)
- 每个项目的目标仓库 + 文件路径
- Actions 运行 URL
- 站点 URL(https://doc.869hr.uk)
7) 生成夸克群组消息 🆕
在 mswnlz_publish.py 执行后:
- 自动生成格式化的消息
- 保存到
quark_group_message.txt - 控制台输出,方便复制
消息格式:
📦 资源更新通知
📚 书籍资料
------------------------------
• 2026.3.3小说合集推荐
🔗 https://pan.quark.cn/s/xxx?pwd=xxx
========================================
🌐 资料总站:https://doc.869hr.uk
📂 批次文件夹:2026-03-14_1700_短裤哥批次
📊 共 1 项资源
使用方式:
- 脚本运行完成后,复制消息内容
- 打开夸克 APP → 群组(2122364648、2026346189)
- 粘贴发送
Telegram 通知机制
频道通知(@dabaziyuan)
- 每条资源单独发送
- 包含:资源名称 + GitHub 链接
- 由 GitHub Workflow 自动触发
群组通知(tgmShare 话题5、tgmShareAI 话题2、群组4)
- 批量更新只发一条汇总消息
- 格式与频道风格对齐:📦 新增资源推送 + 资源名称 + 夸克链接 + 更新仓库 + 查看详情 + 资料总站 + 资料频道
- 由 Skills 脚本统一发送,避免刷屏
夸克群组消息 🆕
- 手动复制发送(夸克无公开 API)
- 群号:2122364648、2026346189
- 格式:资源名称 + 链接 + 资料总站
- 自动生成并保存到
quark_group_message.txt
脚本说明
scripts/quark_batch_run.py
夸克批量转存 + 生成分享链接。
python scripts/quark_batch_run.py \
--label "短裤哥批次" \
--month 202603 \
--items-json items.json \
--out-json batch_share_results.json
依赖:
- QuarkPanTool 环境(
.venv) - 夸克 Cookie(
config/cookies.txt)
scripts/copy_promo_to_folders.py 🆕
复制推广文件到每个资源文件夹内部。
python scripts/copy_promo_to_folders.py \
--batch-json batch_share_results.json
工作原理:
- 读取
batch_share_results.json中的share_results - 对于每个分享结果,检查其
fid是否是文件夹 - 如果是文件夹,复制推广文件到文件夹内部
注意:推广文件会被复制到每个资源文件夹里面,这样每个分享的文件夹都包含推广文件。
scripts/quark_copy.py (已废弃)
此脚本已被 copy_promo_to_folders.py 替代。
scripts/cleanup_junk_files.py 🆕 v2.0.0
垃圾文件清理脚本:扫描批次文件夹下所有子文件夹,删除原分享者植入的推广/广告文件。
python scripts/cleanup_junk_files.py \
--batch-json batch_share_results.json \
--junk-config config/junk_files.json \
--baidu-batch-path /短裤哥批次/2026-07-15_0816_短裤哥批次
参数:
--batch-json: batch_share_results.json 路径--junk-config: junk_files.json 配置路径--quark-parent-fid: 夸克批次文件夹的父目录 FID(默认 0=根目录)--baidu-batch-path: 百度批次文件夹路径
工作原理:
- 加载垃圾文件名列表(支持子串匹配)
- 连接夸克/百度/阿里云客户端
- 遍历批次文件夹下所有子文件夹
- 删除匹配名单的垃圾文件
- 不重新生成分享链接(夸克分享链接动态反映文件夹内容)
配置文件 config/junk_files.json:
{
"files": [
"🌹更多资源共享群🌹.jpg",
"影视ju风小程序剪辑课截图.jpg",
...
]
}
随时可追加新的垃圾文件名,pipeline 运行时自动读取最新配置。
scripts/mswnlz_publish.py
发布到 GitHub 仓库 + 发送 Telegram 群组通知。
python scripts/mswnlz_publish.py \
--month 202603 \
--batch-json batch_share_results.json
支持 --dry-run 参数(测试时跳过推送):
python scripts/mswnlz_publish.py \
--month 202603 \
--batch-json batch_share_results.json \
--dry-run
依赖:
- Git SSH 配置
- 可选:
GITHUB_TOKEN环境变量
scripts/pipeline_orchestrator.py 🆕
统一编排器:自动识别 Quark/Baidu 链接,分流处理、合并结果后统一发布。
# 完整发布
python scripts/pipeline_orchestrator.py \
--items-json items.json \
--label "短裤哥批次"
# 测试(只跑转存+分享+合并,不发布)
python scripts/pipeline_orchestrator.py \
--items-json items.json \
--label "短裤哥批次" \
--dry-run
items.json 新增格式(支持多链接):
{
"title": "樊登讲书2026年合集【全网最新】",
"urls": [
"https://pan.quark.cn/s/7f6be305d850",
"https://pan.baidu.com/s/1YHBDynfOKAkxpEjQzDq0Gg?pwd=L6kA"
]
}
旧格式 url 仍兼容:
{
"title": "泰坦尼克号",
"url": "https://pan.quark.cn/s/c2bf2c29b114"
}
依赖:
- 所有 Quark A段 依赖
- 所有 Baidu A段 依赖
url_router.py(本仓库)- QuarkPanTool 需放在与
skills/同级的目录下
scripts/url_router.py 🆕
自动检测链接来源(quark.cn / pan.baidu.com)。
scripts/baidu_batch_run.py 🆕(位于 QuarkPanTool 仓库)
百度网盘 A段:批量转存 + 加密永久分享 + 推广文件复制。详见 QuarkPanTool 下的 Baidu 模块。
新机器安装指南
1. 克隆仓库
# skills 仓库(发布脚本)
git clone git@github.com:wlzh/skills.git
# QuarkPanTool(转存脚本,用 gxjda 的 fork,含百度支持)
git clone git@github.com:gxjda/QuarkPanTool.git
cd QuarkPanTool
git checkout feat/baidu-support
两个仓库需放在同一父目录下:
/你的工作目录/
├── QuarkPanTool/ # 转存脚本(含百度支持)
└── skills/ # 发布脚本
└── quark-mswnlz-publisher/
└── scripts/
2. 安装依赖
百度网盘(BaiduPCS-Go):
# 下载 BaiduPCS-Go v4.0.1+
# https://github.com/qjfoidnh/BaiduPCS-Go/releases
# macOS ARM64 版本:
wget https://github.com/qjfoidnh/BaiduPCS-Go/releases/download/v4.0.1/BaiduPCS-Go-v4.0.1-darwin-arm64.zip
unzip BaiduPCS-Go-v4.0.1-darwin-arm64.zip
# 放到 PATH 下
chmod +x /path/to/BaiduPCS-Go
# 登录
BaiduPCS-Go login -bduss=你的BDUSS -stoken=你的STOKEN
夸克网盘(QuarkPanTool 虚拟环境):
cd QuarkPanTool
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
3. 配置凭证
| 文件 | 用途 | 位置 |
|---|---|---|
config/baidu_auth.json |
BDUSS/STOKEN(百度盘) | QuarkPanTool/config/ |
config/cookies.txt |
Quark Cookie(夸克盘) | QuarkPanTool/config/ |
~/.mp-publisher/config.json |
TG Bot Token / 群组配置 | (来自 mp-article-publisher) |
4. 上传推广文件
夸克盘:上传到 temp/要共享的文件 目录(QuarkPanTool 默认创建)。
百度盘:上传到 /推广文件/ 目录,文件清单同夸克。
脚本说明
⚠️ 多账号踩坑记录
多账号轮换机制下,每个夸克账号是完全独立的网盘空间。以下是实际踩过的坑:
坑1:cleanup 只清理当前账号(v2.3.0 已修复)
现象:转存时轮换到账号2,但 cleanup 只用 QuarkPanFileManager() 默认构造(读 cookies.txt),账号2里的垃圾文件永远不会被清理。
根因:cleanup_junk_files.py 没有遍历多个 cookie 文件。
修复:v2.3.0 开始自动扫描 config/cookies*.txt 全部 cookie 文件,每个账号独立登录+递归清理。
坑2:cleanup 不递归(v2.3.0 已修复)
现象:转存的资源文件夹里嵌套了子文件夹(如 资源文件夹/更多资源收藏不迷路/),cleanup 只扫了第一级,深层垃圾没删到。
修复:v2.3.0 默认递归 6 层(--max-depth 可调)。
坑3:同一批资源被转存两遍
现象:因为两个 cookie 各自创建了批次文件夹(时间戳不同),同一批 items.json 被两个账号各转存了一份。
说明:这本身是多账号轮换的设计预期(分摊转存压力),但如果同一批 items 被完整跑了两遍,说明 pipeline_orchestrator 被重复调用了。务必确保同一批 items.json 只跑一次 pipeline。如果确实重复了,已发出的链接不删除(避免链接失效),后续注意不要重复执行。
多账号最佳实践
- 同一批 items.json 只跑一次
pipeline_orchestrator.py - 运行完检查
batch_share_results.json中的quark_account字段,确认使用的是哪个账号 - cleanup 会自动遍历所有账号,无需手动指定
- 如需手动清理某个账号:直接修改
config/cookies.txt为目标账号的 cookie,然后运行 cleanup - 新增 cookie 文件时(如
cookies_3.txt),cleanup 会自动发现并遍历