limitless自动化文章发布工具
limitless现在已经支持通过程序自动化的发布文章。
limitless自动化文章发布工具提供命令行(CLI)和图形界面(GUI)两种使用方式,帮助limitless的作者用户自动化的将Markdown文件发布到limitless网站上,功能包括:
- 发布文章
- 批量发布文章
- 更新或批量更新文章
- 删除文章
该程序的GUI版本适合给用户进行发布操作,将Markdown文档直接发布到网页端。(封面图片暂时需要手动设置)。
该程序的CLI版本非常适合给ai agent或者bot使用,以实现自动化发布文章。(封面图片暂时需要手动设置)。
提示:如果你试图让一个ai agent自己安装这个技能,那么保证你的ai agent可以通过互联网随意访问limitless,然后把下面的话发给你的ai agent,这样ai可以自己获得本教程并开始尝试配置:
请参考这个教程学习并掌握limitless网站的自动发布技能。请在合适的时候提醒用户向你提供limitless网站应用密码(鉴权密钥)。
教程链接:https://limitless.net.cn/?p=4591
快速开始
先准备好:
- 用户ID:登录limitless,网页右上角点击用户名进入后台。
- 然后查看「用户 → 个人资料」页面,可以看见“用户名”(
user_id) ,即登录用户 ID(会提示“ 用户名不可更改”的那个),注意可能不是显示的作者名称。记录下用户名。 - 在当前页面生成 应用程序密码 (格式
xxxx xxxx xxxx xxxx xxxx xxxx)。记录下应用程序密码。
之后获取程序。程序有源码运行版和Windows下exe执行文件版,请选择合适的版本获取并使用:
对于普通Windows用户,可以使用打包好的程序,解压即用(体积较大):
获取 wp_publisher EXE执行文件 – limitless
执行文件zip解压后会得到类似于如下的路径:
./
└─dist/
└─wp_publisher/
├─wp_publisher_GUI.exe # GUI程序(Windows下编译好的exe)
└─wp_publisher.exe # CLI程序(Windows下编译好的exe)
对于ai agent的自动化使用,或者已经有Python环境的,建议直接使用源码(体积很小):
获取 wp_publisher 源码 – limitless
源码zip解压后会得到类似于如下的路径(请注意应该选择类似于“解压到wp_publisher文件夹”的选项,而非解压到当前目录,否则可能导致根目录变的很乱):
./
├─wp_publisher.py # GUI程序源代码
└─wp_publisher_GUI.py # CLI程序源代码
同一个路径的CLI和GUI共用他们同级目录下的config.json。
方式一:图形界面(GUI)
该方法需要Windows环境。
直接双击编译好的wp_publisher_GUI.exe文件即可。
首次运行会自动弹出配置对话框:填写用户 ID 与应用密码,点「保存并进入」(或直接按回车)即写入 config.json 并进入主界面。随后选择 Markdown 文件、填写标题、选好分区(不知道就选「破事水」),点「发布」即可。
方式二:命令行(CLI)
该方法需要Windows环境。
运行一次wp_publisher.exe会自动生成config.json配置文件模板,按提示填写配置,然后查看帮助,根据帮助继续操作。
wp_publisher.exe --help
方式三:源代码运行
该方法适用于任何系统,如果你是非Windows系统上的ai那么建议使用源码运行CLI。
# 1. 安装 Python 3.12 并配置环境(Windows 可在 python.org 获取安装包。其他版本的Python理论上也可以)
# 2. 进入项目目录,安装依赖
pip install -r requirements.txt
# 3. 使用命令行(CLI)运行,并查看帮助,然后按照提示进行下一步
python wp_publisher.py --help
# 4. 如果希望启动GUI
python wp_publisher_GUI.py
更新发布工具
当看见发布工具的日志提醒程序需要更新时,请重新从链接获取一次zip,此时zip是最新版,然后手动操作替换掉旧版本的源码或者程序即可(覆盖,或者更稳健的,先删除再解压)。目前只支持提示更新,过程上仍旧需要手动更新。
更新前请记得备份配置文件。否则可能导致配置好的config.json丢失。
功能特性
- 📝 Markdown 一键发布到 WordPress,自动生成适配古腾堡编辑器的 HTML。
- 🔍 发布前自动检查并规范化 Markdown,错误时阻止发布并提示修正。
- 🧱 支持标题、段落、代码块、列表、引用、表格、分隔线、图片等常见块。
- 🧬 支持 Mermaid 图表、GFM 扩展语法与 MathJax 公式。
- 🔒 使用 WordPress 应用密码鉴权,不暴露登录密码。
- 🗂️ 支持发布、更新、草稿、分类、删除、查看分类等操作。
- 💾 自动记忆上次发布/更新记录,支持历史记录查看与清空。
- 🚫 可自动移除正文开头的一级标题,也可自动提取文章标题。
- 🖥️ 提供 CLI 与 PyQt6 GUI,支持单篇/批量发布和实时日志。
- 🔄 启动自动检查更新,异常不影响正常使用。
- 🧪 内置自测试套件,保障转换与配置稳定。
环境要求
依赖Python3.12,其他Python版本没测试过但是应该能跑。依赖的运行库参考requirements.txt。
功能说明
本章节介绍具体的功能说明。
发布文章
# 发布为正式文章(标题可省略:自动取 Markdown 开头一级标题,没有则用文件名)
python wp_publisher.py publish 文章.md
# 指定标题
python wp_publisher.py publish 文章.md --title "文章标题"
# 保留正文开头的一级标题(默认自动移除,避免与网页标题重复)
python wp_publisher.py publish 文章.md --keep-title
# 路径特殊时用 --md 显式指定文件
python wp_publisher.py publish --md 文章.md --title "文章标题"
# 保存为草稿
python wp_publisher.py publish 文章.md --title "文章标题" --draft
# 不使用古腾堡转换(使用标准 Markdown 渲染)
python wp_publisher.py publish 文章.md --title "文章标题" --no-gutenberg
# 指定分类(分类 ID 可通过 categories 命令查看)
python wp_publisher.py publish 文章.md --title "文章标题" --category 12
标题规则:不指定 --title 时,自动取 Markdown 开头的第一个一级标题(# 标题,允许前导空行);Markdown 里没有则用文件名(去后缀)。--title 与位置参数文件路径互不干扰。
一级标题截断:默认在转换前移除开头的一级标题行及其后的空行(仅当标题后跟空行或文件结尾才截断;# 标题 后紧贴正文时不截断),避免网页上出现两次标题。加 --keep-title 可保留。
十分重要的提示:请在发布时选择正确的分区,不要用未分类分区!如果你不知道应该发布到什么分区,那么发布到破事水分区。这个分区的id是cat=5。
更新已有文章
# 更新文章内容(不产生新文章,不刷订阅流)
python wp_publisher.py update 4547 文章.md
# 只给文章 ID:Markdown 自动复用上次发布/更新用的文件
python wp_publisher.py update 4547
# 不带参数:文章 ID 和 Markdown 都自动复用上次记录
python wp_publisher.py update
# 更新同时改标题
python wp_publisher.py update 4547 文章.md --title "新标题"
# 保留正文开头的一级标题(默认自动移除,与发布一致)
python wp_publisher.py update 4547 文章.md --keep-title
# 用 --md 显式指定文件
python wp_publisher.py update 4547 --md 文章.md
删除文章
# 强制删除(需输入 y 确认,回车或输入其他内容默认取消)
python wp_publisher.py delete 123
# 带 -y 直接删除,不询问
python wp_publisher.py delete 123 -y
# 不带参数:自动复用上次发布/更新的文章 ID(同样需确认或加 -y)
python wp_publisher.py delete
# 如需移入回收站,可编辑源码调整 force 参数
执行 publish / update / categories / delete 命令时,日志会先输出当前作者 ID(来自 config.json 的 wp_user),方便确认操作账号;publish / update / delete 还会显示本次使用的 Markdown 文件、标题与文章 ID。
仅转换不发布(调试)
# 只输出转换后的 HTML,不发布到站点
python wp_publisher.py test 文章.md
查看分类列表
python wp_publisher.py categories
查看历史操作记录
每次 publish / update / delete 成功后,程序会把一条操作记录(操作类型、标题、文章 ID、作者 ID、Markdown 路径、时间、链接)写入 config.json 的 history 列表最前面。CLI 查看与清空:
# 格式化打印历史操作记录
python wp_publisher.py --history
# 清空全部历史操作记录
python wp_publisher.py --clean-history
GUI 在日志栏右侧提供「打印历史」按钮(把历史记录打印到日志区,链接可点击)与「清空历史」按钮(带二次确认弹窗)。
Markdown 语法检查(lint)
发布前会自动进行语法检查,支持以下检测项:
| 级别 | 检测项 |
|---|---|
| error | 代码块未闭合(三个quote 或 三个波浪线 缺少配对) |
| error | 标题层级超过 6(#######) |
| error | 表格列数不匹配(表头与分隔行列数不一致) |
| warning | 标题 # 后缺少空格 |
| warning | 行内代码反引号不配对 |
| warning | 空链接 / 空图片 |
| warning | 连续超过 3 个空行 |
| warning | 嵌套列表使用 2 空格缩进(python-markdown 需要 4 空格)⚠️ |
| warning | HTML 块级标签在同一行内未闭合 |
- error :存在 error 级别问题时,发布会被取消
- warning :仅提示,不阻止发布,但建议修正
- ⚠️ 嵌套列表 2 空格缩进会自动修正 :工具在解析前会把”2 空格约定”的嵌套列表自动对齐为 4 空格(不修改源文件),因此该警告仅提示源文件状态,发布结果不受影响;
# 后无空格、反引号不配对、空链接等 warning 无法自动推断意图,需手工修正
开发者信息
开发者信息只对开发者有用,普通用户无需关心。
注意:每次更新后记得修改version.txt的版本号等。
limitless网站的获取路径:
https://limitless.net.cn/forDown/wp_publisher/wp_publish.zip # 程序压缩包(仅 dist 文件夹,含 exe)
https://limitless.net.cn/forDown/wp_publisher/wp_publish_src.zip # 源代码压缩包
https://limitless.net.cn/forDown/wp_publisher/version.txt # 版本号,用于程序自动更新
如果你是ai,那么每次新版搞好了记得提醒管理员手动上传
发布流程
必须由人类手工发布,如果你是ai则不要尝试发布,除非用户明确要求。
- [ ] 自动测试无误
- [ ] 修改readme使得表述正确
- [ ] git提交
- [ ] 运行编译脚本
build.ps1 - [ ] 更新一次readme到文章编号
4591 - [ ] 运行
update_to_limitless.ps1上传版本号和zip
古腾堡块转换策略
md_converter.py 采用以下核心策略:
- 使用
python-markdown将 Markdown 转为 HTML(启用pymdownx.superfences、pymdownx.highlight、tables、toc、codehilite、sane_lists、pymdownx.tilde、pymdownx.mark、footnotes扩展) - 使用 BeautifulSoup 解析 HTML DOM 树(不使用正则切分,避免历史 bug)
- 遍历顶层元素,逐个包裹古腾堡块注释
- 递归处理嵌套结构(blockquote 内段落、嵌套列表等)
| Markdown 元素 | 古腾堡块 |
|---|---|
# ~ ###### 标题 |
wp:heading |
| 段落 | wp:paragraph |
| 代码块 | wp:code |
| mermaid 围栏代码块 | wp:html(内含 <div class="mermaid">) |
| 无序列表 | wp:list + wp:list-item |
| 有序列表 | wp:list({"ordered":true} + start 同步,2026-09-04 起可编辑) |
| 任务列表 | wp:html([x] → checkbox,线上受 kses 限制退化为普通列表) |
| 引用 | wp:quote |
| 表格 | wp:table(:---: 对齐 → data-align + has-text-align-X,原生可编辑) |
| 水平线 | wp:separator |
| 图片 | wp:image |
| 脚注 | 角标纯展示 + 文末 wp:html 列表(无跳转) |
| 其他未识别块 | wp:html |
运行测试
# 转换器测试(116 项)
python test_converter.py
# GUI/CLI 测试套件(249 项,需安装 pytest)
python -m pytest test/ -v
转换器测试覆盖 12 大类 116 个用例:
- 基础元素测试(标题、段落、代码块、列表、引用、表格、表格对齐、分隔线)
- 嵌套结构测试(嵌套列表、引用多段落、列表项内联格式单行性)
- 边界条件测试(空输入、代码块内含 HTML/古腾堡注释/引号等特殊场景)
- 古腾堡块完整性测试(块注释成对配对)
- HTML 标签合法性测试(标签嵌套正确性)
- 综合测试(完整文章结构)
- lint 语法检查测试(各检测项的正确性与误判防护)
- mermaid 测试(转 HTML 块转换、尖括号转义、混合场景等)
- 数学公式测试(单/双反斜杠、跨行、转义、表格内公式等 8 项)
- GFM 扩展语法测试(删除线、高亮、任务列表、脚注去跳转、列表内代码块等 9 项)
- 解析前规范化测试(2/4 空格约定判定、多级嵌套、块引用、围栏保护、幂等性等 16 项)
- 开头一级标题提取/截断测试(extract_leading_h1 与 strip_leading_h1 的提取规则、截断条件、围栏/H2 保护、幂等性等 13 项)
GUI/CLI 测试套件覆盖 249 项:
- test_worker.py (42 项):发布/批量/更新/删除/分类/版本检查所有路径,含成功、失败、文件缺失、异常捕获、stdout 捕获、标题策略(文件名/前缀/自动)、标题缺省解析、last_publish 写入、strip_h1 传参、操作历史写入(发布/批量/更新/删除成功记录,失败不记录)
- test_gui.py (74 项):窗口结构、4 Tab、控件存在性、默认值(含三个「移除一级标题」勾选框默认勾选)、输入校验(标题留空不再警告直接发布)、文件选择、列表增删、busy 态、closeEvent 回归(含 C++ 已删除对象场景)、批量删除逗号分隔解析、批量标题策略(含 md_title)、
--help自检模式、last_publish 预填充、配置对话框(ConfigDialog)填写/校验/写入失败/回车确认、main() 配置缺失弹出对话框并进入/取消退出流程、历史记录按钮(打印历史进日志/清空历史二次确认) - test_config.py (51 项):注释剥离、缺失生成模板、错误处理、$schema 自动补齐、last_publish 注入式读写(保留注释,含花括号 title 等场景下严格覆盖不叠加)、save_credentials 凭据写入(生成模板、替换占位值、保留其他字段、特殊字符)、history 读写(模板含 history、最前插入、保留注释、纯 JSON 兜底插入、读取过滤、清空三态、记录构造与格式化)
- test_cli.py (35 项):publish 旗标式解析(–title/–md/–keep-title/–category 穿插)、标题缺省自动解析(H1/文件名回退)、update 无参数/部分省略复用 last_publish、publish 成功后记录、delete 二次确认(默认 n)与
-y跳过、操作上下文日志、启动版本检查、历史操作命令(–history 打印/空、–clean-history 清空、帮助说明、发布/更新/删除成功记录与失败不记录) - test_publisher.py (5 项):publish_article/update_article 真实截断集成——默认移除 payload 正文的 h1、strip_h1=False 保留、无开头 H1 时不受影响
- test_version.py (29 项):版本号解析/比较(1.0.11 > 1.0.8 规则)、本地 version.txt 只读首行、远端抓取(成功/404/超时/空内容)、全状态判定(有新版本/已是最新/本地更高/请求失败/文件缺失/格式异常)、CLI ANSI 着色与 GUI emoji 渲染
- test_theme.py (13 项):Fusion 风格、各 QPalette 角色颜色精确匹配、禁用态非白、主/输入区亮度对比
编译打包(PyInstaller)
推荐:一键脚本(自动检查依赖、由 ico.png 生成 ico.ico、编译、复制配置文件):
.\build.ps1 # 编译 CLI + GUI(合并打包,共享 _internal)
.\build.ps1 -Cli # 只编译 CLI
.\build.ps1 -Gui # 只编译 GUI
.\build.ps1 -Clean # 编译前先清理 build/ 与 dist/
发布全流程: 编译打包 → 上传服务器(scp),并统计总耗时:
.\release_all.ps1 # 编译(CLI+GUI)→ 生成两个 zip → 上传
.\release_all.ps1 -SkipUpload # 只编译打包,不上传
.\release_all.ps1 -SkipBuild # 复用现有 dist\ 产物,直接上传
.\release_all.ps1 -Cli -Gui -Clean # 透传给 build.ps1 的开关
默认合并打包产物在 dist/wp_publisher/ 目录(onedir 模式,两个程序共享一份 _internal 依赖目录):
wp_publisher.exe— CLI(控制台应用)wp_publisher_GUI.exe— GUI(无控制台窗口,含窗口图标)_internal/— 共享依赖目录(DLL、PyQt6 等,两个 exe 共用一份)config_example.json— 配置模板(不含凭据;config.json因含私有信息不会复制进产物)wp_publish_config_schema.json— 配置架构注解(JSON Schema,供编辑器补全/校验config.json)
分发说明:onedir 模式需把整个 dist/wp_publisher/ 文件夹一起发布(exe 依赖旁边的 _internal/)。相比 onefile 单文件模式,两个程序共用的依赖只存一份,磁盘占用明显减少,且启动更快(无需每次解压到临时目录)。单独 -Cli/-Gui 编译时产物为各自目录(dist/wp_publisher/ 或 dist/wp_publisher_GUI/,各带自己的 _internal)。
每次编译结束后脚本还会生成两个发布压缩包(旧包自动删除后重建):
dist/wp_publish.zip— 程序压缩包:仅dist/wp_publisher/程序文件夹(含两个 exe 与_internal/),解压后程序位于dist/wp_publisher/下dist/wp_publish_src.zip— 源代码压缩包:全部源代码(按.gitignore过滤,build/、dist/、config.json等被忽略的文件不收录)
手动命令(等价,供参考):
# 1. 生成 ICO 图标(Windows exe 需要 ICO 格式,PNG 不被接受)
python -c "from PIL import Image; Image.open('ico.png').save('ico.ico', format='ICO', sizes=[(256,256),(128,128),(64,64),(48,48),(32,32),(16,16)])"
# 2. 合并编译 CLI + GUI(共享 _internal,hiddenimports 已写在 spec 内)
python -m PyInstaller --noconfirm wp_publisher_bundle.spec
# 3. 只编译 CLI / 只编译 GUI
python -m PyInstaller --noconfirm wp_publisher.spec
python -m PyInstaller --noconfirm wp_publisher_GUI.spec
PowerShell 提示:脚本含中文,已保存为 UTF-8 带 BOM,Windows PowerShell 5.1 可直接运行。PyInstaller 的进度日志输出在 stderr,脚本已用退出码判断成败。
图标打包说明:GUI 程序的窗口图标通过 spec 中的 datas=[('ico.png', '.')] 打包进依赖目录,运行时由 resource_path() 函数从 sys._MEIPASS(onedir 下即 _internal 目录,onefile 下为临时解压目录)加载,无需手动复制图标文件。exe 文件图标使用 icon=['ico.ico'](Windows 要求 ICO 格式)。
配置文件说明:config.json 不打包进 exe(含凭据且需可编辑),程序按「exe 同目录 → 上级 → 上上级」的顺序查找,找不到才在 exe 同目录生成模板。产物目录只含 config_example.json 模板(不含私有凭据):把模板复制为 config.json 并填写后放在 exe 同目录即可;若该目录无配置文件,首次运行也会自动生成 config.json 模板,填写后重新运行。
注意事项
- WordPress 站点需启用 REST API(默认开启),并确保应用密码权限足够
- 发布接口地址固定在
https://limitless.net.cn/index.php?rest_route=/wp/v2/posts,如需更换站点请修改wp_publisher.py - 古腾堡转换要求
4空格缩进嵌套列表(2空格不被 python-markdown 正确解析,会被拍平为同级项)。工具已在解析前 自动规范化 :2 空格约定的嵌套列表会按”2 空格 = 一级”整体 ×2 对齐(0→0、2→4、4→8…),不修改源文件;纯 4 空格列表、孤儿 2 空格列表(无外层列表锚点)与代码围栏内的缩进均不受影响。列表项内嵌 fence 代码块同样需 4 空格缩进 - 列表项内的内联格式(加粗、代码等)须保持在同一行,否则古腾堡可能报「无效内容」
- 公式写法 :行内
\( 公式 \)、行间\[ 公式 \],两边留空格, 不要用$...$/$$...$$(本站 MathJax 配置不识别); 标题中不要出现公式
已知限制(平台侧,非工具 bug)
- 任务列表勾选框 :WordPress REST API 的 kses 过滤会剥掉
<input>标签(bot 应用密码无unfiltered_html权限),线上退化为普通列表。如需任务列表显示,可给发布账号提权或在编辑器内手动插入 - 有序列表数字跳跃 :
start属性已同步进块 JSON,但 Markdown 源码中的数字跳跃(1. 2. 5.)会被 python-markdown 归一化,需用<ol start="5">原生 HTML 实现跳跃 - 折叠块(details)内 Markdown :不渲染,需内部全用 HTML
变更历史
- v1.2.6(2026-9-13) :记录历史操作 ——
config.json新增history字段(列表,元素为字典),每次发布/更新/删除成功后把一条记录(操作类型、标题、文章ID、作者ID、Markdown路径、链接、时间)插入到列表 最前面 。CLI 新增--history(格式化打印历史操作记录)与--clean-history(清空全部历史记录,均无需凭据);GUI 日志栏新增「打印历史」按钮(历史记录逐行打印到日志区,链接可点击)与「清空历史」按钮(带二次确认弹窗)。delete_post改为返回成功与否。新增 35 项测试(249/249)+ 修复 1 项过时的版本检查断言。 - v1.2.5(2026-9-13) :表述修复。
- v1.2.4(2026-9-13) :gui链接可点击。
- v1.2.3(2026-09-13) :避免正文与网页标题重复 —— 发布/更新时默认移除 Markdown 开头的一级标题(仅当标题后跟空行或文件结尾才截断,
# 标题紧贴正文不截断,代码围栏/H2 开头不受影响)。CLI:publish改用旗标式参数——文件路径仍为位置参数(最多 1 个),标题用--title指定(可省略),--md在路径特殊时显式指定文件,--keep-title保留正文标题;update同样支持--md与--keep-title。标题缺省规则:不指定--title时自动取 Markdown 开头一级标题,没有则用文件名(去后缀)。GUI:单篇/批量/更新三个 Tab 新增「移除正文中的一级标题,防止正文中也出现一次标题和网页上的标题重复出现了」勾选框(默认勾选);单篇标题留空自动解析;批量新增「使用 Markdown 内部标题(无则文件名)」标题策略。新增 22 项测试(214/214)+ 转换器 13 项(116/116),新增 test_publisher.py 集成测试验证真实截断。 - v1.2.2(2026-09-12) :启动自动版本检查 —— CLI 与 GUI 每次启动后访问
https://limitless.net.cn/forDown/wp_publisher/version.txt(格式与本地version.txt一致,首行为版本号),与本地版本对比(点号分段整数比较,1.0.11 > 1.0.8)。有新版本:CLI 蓝色 ANSI 提示(GUI 日志区 🔵)+ 获取链接https://limitless.net.cn/forDown/wp_publisher/wp_publisher.zip(手动获取更新,不做自动更新);云端版本低于本地或请求失败/版本文件缺失/格式异常:黄色警告;无更新:CLI 不着色、GUI 不带 emoji 的普通提示。本地版本号只读version.txt(打包态随 exe 进入_internal),程序不自行写入。新增version_checker.py及 32 项测试(192/192)。 - v1.2.1(2026-09-12) :GUI 三个「使用古腾堡块转换」勾选框旁新增「什么是古腾堡?」说明按钮——点击弹出对话框,介绍古腾堡块编辑器概念(块与传统编辑器的区别)、勾选/取消勾选各自的含义(勾选=Markdown 转为古腾堡块格式发布,排版稳定可分块编辑;取消=直接发布普通 HTML),以及建议取消勾选的场景(转换器不支持的复杂 HTML 结构发布异常时)。新增 3 项测试(157/157)。
- v1.2.0(2026-09-12) :GUI 首次运行配置缺失不再直接报错退出 —— 自动弹出配置对话框(ConfigDialog),引导填写
wp_user与wp_app_password,点「保存并进入」或直接在输入框按回车后经config_loader.save_credentials()写入config.json(保留模板注释与$schema注解,字段整体替换不破坏last_publish等其他字段)并直接进入主界面;「保存并进入」为默认按钮(回车/空格确认),取消不是默认按钮,防填完误退出;点「取消」则退出。--help自检提示同步更新;分类列表测试不再依赖真实 config.json。新增 13 项测试(154/154)。 - v1.1.9(2026-09-12) :配置文件向上查找 —— 基准目录(开发态脚本目录 / 打包态 exe 目录)下找不到
config.json时,自动向上级、上上级目录查找,都找不到才在基准目录生成模板;last_publish读写同样遵循该查找顺序。新增 5 项测试(141/141)。 - v1.1.8(2026-09-12) :修复
last_publish重复叠加 —— 旧注入逻辑用正则\{[^{}]*\}定位字段值,一旦title等字符串含花括号(如 WP API 返回的"{'raw': ...}")正则整体匹配失败,改为「插入新字段」导致每次保存都追加一个last_publish。现替换为 tokenizer 式定位(跳过字符串、跟踪括号深度),无论字段值内容如何都 整体覆盖 旧记录,绝不追加第二个字段。新增 3 项回归测试(136/136)。 - v1.1.7(2026-09-12) :配置文件增加架构注解 —— 生成/覆盖
config.json时在首行保留"$schema": "./wp_publish_config_schema.json"注释说明,并新增wp_publish_config_schema.json(JSON Schema draft-07)文件,VS Code 等编辑器据此为config.json提供字段补全、类型提示与校验;build.ps1会将 schema 文件一并复制进产物目录。 - v1.1.6(2026-09-12) :编译方式从 onefile 改为 onedir 合并打包 —— 新增
wp_publisher_bundle.spec,CLI 与 GUI 通过共享 COLLECT 共用一个_internal依赖目录(每个 exe 只内嵌各自的轻量 PYZ,PyQt6 等外部依赖只存一份),默认.\build.ps1产物为dist/wp_publisher/整个文件夹;-Cli/-Gui单编译改用对应的 onedir spec。分发时需发布整个文件夹。 - v1.1.5(2026-09-12) :记忆上次发布/更新结果 ——
config.json新增last_publish字段(post_id、md_file、title、updated_at),CLI 发布/更新成功后自动写入(保留文件注释的注入式写入),GUI 发布/更新成功后同样记录。CLIupdate支持省略参数(无参数全复用、只给 ID 复用上次 Markdown),delete支持无参数复用上次文章 ID,delete无-y时要求输入 y 确认(默认 n 取消)。publish/update/delete 执行前日志统一显示 Markdown 文件、标题、文章 ID(作者 ID 原有)。GUI 启动时用 last_publish 预填充更新/删除 Tab。新增 25 项测试(130/130)。 - v1.1.4(2026-09-12) :GUI 新增
--help/-h自检模式——仅打印帮助并检查第三方依赖(PyQt6/requests/beautifulsoup4/Markdown/pymdown-extensions/Pygments)、config.json是否存在且为有效 JSON、资源文件是否完整,随后直接退出(全部通过退出码 0,否则 1),不启动 GUI。自检在 PyQt6 导入之前执行,依赖缺失时也能输出诊断。新增 6 项测试(105/105)。 - v1.1.3b(2026-09-12) :解析前自动规范化 Markdown —— 2 空格约定的嵌套列表按”2 空格 = 一级”整体 ×2 对齐为 4 空格(不修改源文件,幂等),修复 python-markdown 将 2 空格嵌套项拍平为同级项的渲染 bug。保守规则:纯 4 空格列表、孤儿 2 空格列表、代码围栏(含 mermaid)、块引用前缀均正确保护。发布/更新/test 时 lint 前先规范化,发生改动打印「🛠️ 已自动规范化」提示;
--no-gutenberg回退路径同样覆盖。新增 16 项规范化测试(103/103)。 - v1.1.3(2026-09-12) :修复对齐表格在古腾堡编辑器报「未预料的内容」。根因:python-markdown 输出
<td style="text-align: center">,而古腾堡表格块只认data-align属性。现转换器把单元格对齐转为data-align="X"+ classhas-text-align-X,前端居中由核心 CSS 全局规则承担,表格恢复原生可编辑。已发布老文章需重新发布/更新一次才会应用新格式。 - v1.1.2(2026-09-06) :分类加载后默认选中「破事水」(ID=5,按 ID 匹配不到时回退按名称匹配,都没有则保持”不指定”);新增
build.ps1一键编译脚本(自动依赖检查、生成 ico.ico、编译 CLI/GUI、复制配置)。 - v1.1.1(2026-09-05) :配置文件从
config.py改为外置config.json(支持//与/* */注释),打包后位于 exe 同目录可随时编辑;首次运行自动生成模板,CLI/GUI 分别以错误信息/对话框提示。凭据惰性加载。新增config_loader.py及 15 项测试。CLI 入口强制 UTF-8 输出,修复打包后 GBK 控制台 emoji 崩溃。 - v1.1.0(2026-09-05) :新增 PyQt6 图形界面(
wp_publisher_GUI.py),支持单篇/批量发布、更新、批量删除(逗号分隔)、左右分栏布局、统一亮色主题。网络请求后台线程执行,日志实时捕获。GUI 测试套件。PyInstaller 编译为独立 exe(含图标打包)。 - v1.1.0(2026-09-04) :三轮修复——①公式反斜杠保全(预提取占位还原,
\(\)/\[\]标准写法可用);②GFM 扩展:删除线/高亮/任务列表/脚注(去跳转);列表项内嵌代码块(superfences);③有序列表改为原生wp:list块({"ordered":true}+ start 同步),编辑器内可编辑。新增update子命令。测试套件 85/85 - v1.0.1(2026-08-05) :凭据外置 config.py、内置 lint、mermaid 支持、有序列表 wp:html 绕行方案
License
NGC13009 ngc1300@limitless.net.cn
