@lyhue1991/wxgzh 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +432 -0
  2. package/assets/backgrounds//345/217/214/347/214/253.jpg +0 -0
  3. package/assets/backgrounds//345/217/244/351/243/216.jpg +0 -0
  4. package/assets/backgrounds//345/217/244/351/243/2162.jpg +0 -0
  5. package/assets/backgrounds//345/260/221/345/245/263/346/230/237/347/251/272.jpg +0 -0
  6. package/assets/backgrounds//345/277/203/345/277/203/347/233/270/345/215/260.jpg +0 -0
  7. package/assets/backgrounds//346/230/237/347/251/272.jpg +0 -0
  8. package/assets/backgrounds//346/240/221/346/234/250.jpg +0 -0
  9. package/assets/backgrounds//346/260/264/345/275/251.jpg +0 -0
  10. package/assets/backgrounds//346/260/264/346/274/253.jpg +0 -0
  11. package/assets/backgrounds//346/265/267/346/230/237.jpg +0 -0
  12. package/assets/backgrounds//346/265/267/346/273/251.jpg +0 -0
  13. package/assets/backgrounds//346/265/267/350/261/232.jpg +0 -0
  14. package/assets/backgrounds//346/270/205/346/231/250.jpg +0 -0
  15. package/assets/backgrounds//347/203/255/346/260/224/347/220/203.jpg +0 -0
  16. package/assets/backgrounds//347/214/253/345/222/252/345/245/263/345/255/251.jpg +0 -0
  17. package/assets/backgrounds//347/223/246/345/212/233.jpg +0 -0
  18. package/assets/backgrounds//347/272/242/345/217/266/351/243/230/351/243/230.jpg +0 -0
  19. package/assets/backgrounds//350/212/261/346/234/265.jpg +0 -0
  20. package/assets/backgrounds//351/243/216/350/275/246.jpg +0 -0
  21. package/assets/backgrounds//351/273/204/346/230/217.jpg +0 -0
  22. package/bin/wxgzh.js +3 -0
  23. package/dist/cli/config.js +62 -0
  24. package/dist/cli/cover.js +39 -0
  25. package/dist/cli/fix.js +38 -0
  26. package/dist/cli/index.js +161 -0
  27. package/dist/cli/md2html.js +49 -0
  28. package/dist/cli/publish.js +56 -0
  29. package/dist/core/converter.js +656 -0
  30. package/dist/core/cover.js +164 -0
  31. package/dist/core/fixer.js +97 -0
  32. package/dist/core/parser.js +105 -0
  33. package/dist/core/themes.js +59 -0
  34. package/dist/core/wechat.js +162 -0
  35. package/dist/types.js +2 -0
  36. package/dist/utils/config.js +89 -0
  37. package/dist/utils/fs.js +20 -0
  38. package/dist/utils/logger.js +18 -0
  39. package/dist/utils/tls.js +46 -0
  40. package/package.json +47 -0
  41. package/spec.md +490 -0
  42. package/styles/black.css +600 -0
  43. package/styles/blue.css +616 -0
  44. package/styles/brown.css +620 -0
  45. package/styles/custom.css +8 -0
  46. package/styles/default.css +227 -0
  47. package/styles/green.css +617 -0
  48. package/styles/orange.css +617 -0
  49. package/styles/red.css +617 -0
  50. package/styles/yellow.css +202 -0
package/README.md ADDED
@@ -0,0 +1,432 @@
1
+ # wxgzh
2
+
3
+ 一个面向微信公众号的 Node.js CLI 工具:把 Markdown 文章处理成适合公众号发布的 HTML,修复图片,并提交到公众号草稿箱。
4
+
5
+ ## 一、功能概述
6
+
7
+ `wxgzh` 的目标很直接:
8
+
9
+ - 一条命令把 Markdown 文档发送到微信公众号文章草稿箱。
10
+ - 支持常见 Markdown 内容,包括图片、代码块、表格、引用、数学公式等。
11
+ - 自动完成从 Markdown -> HTML -> 图片修复上传 -> 封面生成 -> 草稿创建 的整套流程。
12
+ - 支持主题样式、自定义 CSS、自动摘要、封面图生成。
13
+ - 也支持分步执行,便于你单独检查 HTML、封面或发布结果。
14
+
15
+ 默认一键流程:
16
+
17
+ ```bash
18
+ wxgzh article.md
19
+ ```
20
+
21
+ 这条命令会自动执行:
22
+
23
+ 1. 读取 `article.md`
24
+ 2. 转换成公众号可用 HTML
25
+ 3. 上传正文中的本地图片到微信
26
+ 4. 自动生成封面图(如果你没有提供)
27
+ 5. 提交到微信公众号草稿箱
28
+
29
+ ## 安装
30
+
31
+ 要求:Node.js >= 18
32
+
33
+ ```bash
34
+ npm install
35
+ npm run build
36
+ ```
37
+
38
+ 如果你希望全局使用命令,也可以在发布或本地链接后通过 `wxgzh` 调用。
39
+
40
+ ## 二、基本配置
41
+
42
+ ### 1. 如何获取公众号 `appid` 和 `appsecret`
43
+
44
+ 前往微信公众号公众平台,使用已认证的公众号管理员账号登录:
45
+
46
+ 1. 打开公众号后台
47
+ 2. 进入“设置与开发”
48
+ 3. 找到“开发接口管理”
49
+ 4. 查看并复制 `AppID` 和 `AppSecret`
50
+
51
+ 拿到后,执行:
52
+
53
+ ```bash
54
+ wxgzh config --appid 你的AppID --appsecret 你的AppSecret
55
+ ```
56
+
57
+ 也可以同时设置默认作者、默认主题:
58
+
59
+ ```bash
60
+ wxgzh config --appid 你的AppID --appsecret 你的AppSecret --author "wxgzh" --default-theme blue
61
+ ```
62
+
63
+
64
+ ### 2. 如何把本机IP加入公众号 IP 白名单
65
+
66
+ > [!IMPORTANT]
67
+ > 调用微信公众号接口前,除了配置 `appid` 和 `appsecret`,还要把当前机器的公网 IP 加到公众号后台的 IP 白名单。
68
+ > 否则即使密钥正确,也可能在获取 token、上传图片、创建草稿时被微信拒绝。
69
+
70
+ 操作步骤:
71
+
72
+ 1. 登录微信公众号后台
73
+ 2. 进入“设置与开发” -> “开发接口管理” -> “基本配置”
74
+ 3. 找到 IP 白名单
75
+ 4. 把当前机器的公网 IP 添加进去并保存
76
+
77
+ 查看本机公网 IP 的方法:浏览器访问 https://ip.sb/ 查看 Address
78
+
79
+
80
+ ### 3. 如何查看当前配置
81
+
82
+ ```bash
83
+ wxgzh config --list
84
+ ```
85
+
86
+ 会输出当前生效配置,并显示用户配置文件位置。
87
+
88
+ 默认用户配置文件路径:
89
+
90
+ ```text
91
+ ~/.config/wxgzh/wxgzh.json
92
+ ```
93
+
94
+ 你也可以查看全部可用主题:
95
+
96
+ ```bash
97
+ wxgzh config --list-themes
98
+ ```
99
+
100
+ 当前内置主题来自 `styles/` 目录,例如:`default`、`blue`、`green`、`red`、`yellow`、`brown`、`black`、`orange`。
101
+
102
+
103
+
104
+
105
+ ## 三、快速流程
106
+
107
+ 最常见用法:
108
+
109
+ ```bash
110
+ wxgzh article.md
111
+ ```
112
+
113
+ 适合“写完 Markdown 后直接进草稿箱”的场景。
114
+
115
+ ### 常见范例
116
+
117
+ 指定主题:
118
+
119
+ ```bash
120
+ wxgzh article.md --theme blue
121
+ ```
122
+
123
+ 指定作者与摘要:
124
+
125
+ ```bash
126
+ wxgzh article.md --author "wxgzh" --digest "这是一篇摘要"
127
+ ```
128
+
129
+ 指定现成封面图:
130
+
131
+ ```bash
132
+ wxgzh article.md --cover ./cover.jpg
133
+ ```
134
+
135
+ 指定中间产物输出目录:
136
+
137
+ ```bash
138
+ wxgzh article.md --output-dir ./.wxgzh
139
+ ```
140
+
141
+ 开启评论:
142
+
143
+ ```bash
144
+ wxgzh article.md --enable-comment
145
+ ```
146
+
147
+ ### 常见参数说明
148
+
149
+ - `--theme <theme>`:指定文章主题。
150
+ - `--author <author>`:覆盖作者名。
151
+ - `--cover <cover.jpg>`:使用你已有的封面图,不再自动生成。
152
+ - `--no-cover`:关闭自动封面生成;如果同时也没有提供封面,会报错。
153
+ - `--digest <digest>`:覆盖文章摘要。
154
+ - `--output-dir <dir>`:指定中间文件输出目录,默认是文章同级目录下的 `.wxgzh/`。
155
+ - `--enable-comment`:为本次草稿开启评论。
156
+
157
+ ### 输出结果
158
+
159
+ 默认流程执行后,通常会在同级 `.wxgzh/` 目录中看到:
160
+
161
+ - `article.html`:转换后的 HTML
162
+ - `article.cover.jpg`:自动生成的封面图
163
+
164
+ 最后命令会输出草稿创建结果 JSON。
165
+
166
+ ## 四、分步流程
167
+
168
+ 如果你想更可控地处理文章,可以分步骤执行。
169
+
170
+ ### 第 1 步:将 Markdown 转成 HTML
171
+
172
+ ```bash
173
+ wxgzh md2html --from article.md --to .wxgzh/article.html
174
+ ```
175
+
176
+ 指定主题:
177
+
178
+ ```bash
179
+ wxgzh md2html --from article.md --to .wxgzh/article.html --theme blue
180
+ ```
181
+
182
+ 这个步骤会:
183
+
184
+ - 解析 Markdown
185
+ - 提取标题、作者、摘要等元信息
186
+ - 渲染代码高亮
187
+ - 渲染数学公式
188
+ - 内联主题 CSS,生成适合公众号场景的 HTML
189
+
190
+ ### 第 2 步:修复 HTML,并上传正文图片
191
+
192
+ ```bash
193
+ wxgzh fix .wxgzh/article.html
194
+ ```
195
+
196
+ 这个步骤会:
197
+
198
+ - 移除不适合公众号的结构(如 `script`、`iframe`)
199
+ - 处理图片样式
200
+ - 将本地图片上传到微信,替换为微信返回的图片地址
201
+
202
+ 如果你只想修结构,不上传图片:
203
+
204
+ ```bash
205
+ wxgzh fix .wxgzh/article.html --no-upload
206
+ ```
207
+
208
+ 如果你希望把本地图片路径替换成 CDN:
209
+
210
+ ```bash
211
+ wxgzh fix .wxgzh/article.html --cdn https://cdn.example.com
212
+ ```
213
+
214
+ ### 第 3 步:制作封面图
215
+
216
+ 自动随机使用内置背景:
217
+
218
+ ```bash
219
+ wxgzh cover --title "我的文章" --to .wxgzh/cover.jpg
220
+ ```
221
+
222
+ 指定作者名:
223
+
224
+ ```bash
225
+ wxgzh cover --title "我的文章" --author "wxgzh" --to .wxgzh/cover.jpg
226
+ ```
227
+
228
+ 指定自定义背景图:
229
+
230
+ ```bash
231
+ wxgzh cover --title "我的文章" --background ./bg.jpg --to .wxgzh/cover.jpg
232
+ ```
233
+
234
+ 查看内置背景名称:
235
+
236
+ ```bash
237
+ wxgzh cover --list
238
+ ```
239
+
240
+ 内置背景图片位于 `assets/backgrounds/`。
241
+
242
+ ### 第 4 步:发布到公众号草稿箱
243
+
244
+ ```bash
245
+ wxgzh publish --article .wxgzh/article.html --cover .wxgzh/cover.jpg
246
+ ```
247
+
248
+ 也可以覆盖标题、作者、摘要:
249
+
250
+ ```bash
251
+ wxgzh publish --article .wxgzh/article.html --cover .wxgzh/cover.jpg --title "新的标题" --author "wxgzh" --digest "新的摘要"
252
+ ```
253
+
254
+ 开启评论:
255
+
256
+ ```bash
257
+ wxgzh publish --article .wxgzh/article.html --cover .wxgzh/cover.jpg --enable-comment
258
+ ```
259
+
260
+ ### 一键流程与分步流程如何选择
261
+
262
+ - 想快速发布:直接用 `wxgzh article.md`
263
+ - 想检查 HTML 效果:先用 `md2html`
264
+ - 想自行处理图片:再单独执行 `fix`
265
+ - 想手动挑选封面:单独执行 `cover`
266
+ - 想复用现有 HTML 和封面:最后执行 `publish`
267
+
268
+ ## 五、样式控制
269
+
270
+ ### 1. 修改文章主题
271
+
272
+ 项目的主题 CSS 位于 `styles/` 目录,每个主题一个 CSS 文件,例如:
273
+
274
+ - `styles/default.css`
275
+ - `styles/blue.css`
276
+ - `styles/green.css`
277
+ - `styles/red.css`
278
+
279
+ 使用方法:
280
+
281
+ ```bash
282
+ wxgzh article.md --theme blue
283
+ ```
284
+
285
+ 或者设置为默认主题:
286
+
287
+ ```bash
288
+ wxgzh config --default-theme blue
289
+ ```
290
+
291
+ ### 2. 修改 CSS 样式
292
+
293
+ 如果你想在现有主题基础上做少量覆盖,直接编辑:
294
+
295
+ ```text
296
+ styles/custom.css
297
+ ```
298
+
299
+ 这个文件会在主题 CSS 之后加载,适合做局部覆盖。
300
+
301
+ 例如:
302
+
303
+ ```css
304
+ h3 {
305
+ text-align: center !important;
306
+ }
307
+
308
+ blockquote {
309
+ color: #666666 !important;
310
+ }
311
+ ```
312
+
313
+ 如果你想做完整主题,也可以直接修改或新增 `styles/*.css` 文件。
314
+
315
+ ### 3. 修改封面背景
316
+
317
+ 封面支持两种背景来源:
318
+
319
+ - 使用内置背景图
320
+ - 使用你自己的背景图
321
+
322
+ 使用你自己的背景图:
323
+
324
+ ```bash
325
+ wxgzh cover --title "文章标题" --background ./my-bg.jpg --to .wxgzh/cover.jpg
326
+ ```
327
+
328
+ 如果走一键发布流程,但你不想用自动封面,可以直接指定已有封面:
329
+
330
+ ```bash
331
+ wxgzh article.md --cover ./cover.jpg
332
+ ```
333
+
334
+ ### 4. 自定义封面
335
+
336
+ 如果你已经在设计工具里做好了封面,最简单的方式就是直接传入:
337
+
338
+ ```bash
339
+ wxgzh article.md --cover ./cover.jpg
340
+ ```
341
+
342
+ 或者分步发布时使用:
343
+
344
+ ```bash
345
+ wxgzh publish --article .wxgzh/article.html --cover ./cover.jpg
346
+ ```
347
+
348
+ ### 5. 使用 Front Matter 控制元信息
349
+
350
+ Markdown 文件支持 Front Matter,例如:
351
+
352
+ ```yaml
353
+ ---
354
+ title: 这是文章标题
355
+ author: wxgzh
356
+ digest: 这是文章摘要
357
+ theme: blue
358
+ cover: ./cover.jpg
359
+ enableComment: true
360
+ ---
361
+
362
+ # 这是文章标题
363
+
364
+ 正文内容
365
+ ```
366
+
367
+ 支持的常用字段:
368
+
369
+ - `title`:标题
370
+ - `author`:作者
371
+ - `digest`:摘要
372
+ - `theme`:主题名
373
+ - `cover`:封面图路径
374
+ - `enableComment`:是否开启评论
375
+
376
+ 命令行参数优先级高于 Front Matter,Front Matter 又高于默认配置。
377
+
378
+ ## 支持的 Markdown 内容
379
+
380
+ 本项目当前重点支持这些常见内容:
381
+
382
+ - 标题、段落、粗体、斜体、链接
383
+ - 有序列表、无序列表
384
+ - 引用块
385
+ - 代码块与语法高亮
386
+ - 图片
387
+ - 表格
388
+ - 数学公式(行内与块级)
389
+
390
+ ## 常用命令速查
391
+
392
+ ```bash
393
+ wxgzh article.md
394
+ wxgzh config --list
395
+ wxgzh config --list-themes
396
+ wxgzh md2html --from article.md --to .wxgzh/article.html
397
+ wxgzh fix .wxgzh/article.html --no-upload
398
+ wxgzh cover --title "我的文章" --to .wxgzh/cover.jpg
399
+ wxgzh publish --article .wxgzh/article.html --cover .wxgzh/cover.jpg
400
+ ```
401
+
402
+ ## 开发与构建
403
+
404
+ 安装依赖:
405
+
406
+ ```bash
407
+ npm install
408
+ ```
409
+
410
+ 类型检查:
411
+
412
+ ```bash
413
+ npm run typecheck
414
+ ```
415
+
416
+ 构建:
417
+
418
+ ```bash
419
+ npm run build
420
+ ```
421
+
422
+ 查看帮助:
423
+
424
+ ```bash
425
+ node dist/cli/index.js --help
426
+ ```
427
+
428
+ ## 说明
429
+
430
+ - 配置文件保存在用户目录下,不会写进项目源码目录。
431
+ - `dist/` 是编译输出目录,日常修改应以 `src/` 为准。
432
+ - 如果一键发布失败,建议改用“分步流程”逐步检查 `HTML`、图片上传和封面图。
package/bin/wxgzh.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../dist/cli/index.js');
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerConfigCommand = registerConfigCommand;
4
+ const themes_1 = require("../core/themes");
5
+ const config_1 = require("../utils/config");
6
+ const logger_1 = require("../utils/logger");
7
+ function listConfig(config) {
8
+ const payload = {
9
+ ...config,
10
+ appsecret: (0, config_1.maskSecret)(config.appsecret)
11
+ };
12
+ console.log(JSON.stringify(payload, null, 2));
13
+ (0, logger_1.info)(`用户级配置路径: ${(0, config_1.getUserConfigPath)()}`);
14
+ }
15
+ function registerConfigCommand(program) {
16
+ program
17
+ .command('config')
18
+ .description('查看或更新 wxgzh 的用户级默认配置')
19
+ .usage('[options]')
20
+ .helpOption('-h, --help', '查看帮助')
21
+ .option('--appid <appid>', '设置微信公众号 appid')
22
+ .option('--appsecret <appsecret>', '设置微信公众号 appsecret')
23
+ .option('--author <author>', '设置默认作者名')
24
+ .option('--default-theme <theme>', `设置默认主题,可用值:${(0, themes_1.listAvailableThemes)().join(', ')}`)
25
+ .option('--enable-comment', '把默认评论开关设为开启')
26
+ .option('--disable-comment', '把默认评论开关设为关闭')
27
+ .option('--list', '查看当前生效配置')
28
+ .option('--list-themes', '查看全部可用主题名')
29
+ .option('--clear', '清空用户级配置文件')
30
+ .addHelpText('after', '\n示例:\n $ wxgzh config --list\n $ wxgzh config --list-themes\n $ wxgzh config --author "wxgzh" --default-theme blue\n $ wxgzh config --enable-comment\n')
31
+ .action(async (options, command) => {
32
+ const mergedOptions = command.optsWithGlobals();
33
+ if (mergedOptions.clear) {
34
+ await (0, config_1.clearUserConfig)();
35
+ (0, logger_1.success)('已清空用户级配置');
36
+ return;
37
+ }
38
+ if (mergedOptions.list) {
39
+ listConfig(await (0, config_1.loadConfig)());
40
+ return;
41
+ }
42
+ if (mergedOptions.listThemes) {
43
+ console.log((0, themes_1.listAvailableThemes)().join('\n'));
44
+ return;
45
+ }
46
+ const patch = {
47
+ ...(mergedOptions.appid ? { appid: mergedOptions.appid } : {}),
48
+ ...(mergedOptions.appsecret ? { appsecret: mergedOptions.appsecret } : {}),
49
+ ...(mergedOptions.author ? { author: mergedOptions.author } : {}),
50
+ ...(mergedOptions.defaultTheme ? { defaultTheme: (0, themes_1.assertThemeExists)(mergedOptions.defaultTheme) } : {}),
51
+ ...(mergedOptions.enableComment ? { enableComment: true } : {}),
52
+ ...(mergedOptions.disableComment ? { enableComment: false } : {})
53
+ };
54
+ if (Object.keys(patch).length === 0) {
55
+ listConfig(await (0, config_1.loadConfig)());
56
+ return;
57
+ }
58
+ const next = await (0, config_1.saveUserConfig)(patch);
59
+ (0, logger_1.success)('用户级配置已更新');
60
+ console.log(JSON.stringify({ ...next, appsecret: (0, config_1.maskSecret)(next.appsecret) }, null, 2));
61
+ });
62
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerCoverCommand = registerCoverCommand;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const cover_1 = require("../core/cover");
9
+ const logger_1 = require("../utils/logger");
10
+ function registerCoverCommand(program) {
11
+ program
12
+ .command('cover')
13
+ .description('生成公众号封面图,支持自定义背景或随机使用内置背景')
14
+ .usage('[options]')
15
+ .helpOption('-h, --help', '查看帮助')
16
+ .option('--background <pic.jpg>', '指定自定义背景图路径;未传时自动随机使用内置背景图')
17
+ .option('--title <title>', '封面标题')
18
+ .option('--author <author>', '作者名')
19
+ .option('--to <cover.jpg>', '输出文件路径')
20
+ .option('--list', '列出全部内置背景图名称')
21
+ .addHelpText('after', '\n示例:\n $ wxgzh cover --list\n $ wxgzh cover --title "我的文章" --to .wxgzh/cover.jpg\n $ wxgzh cover --title "我的文章" --background ./bg.jpg --to .wxgzh/cover.jpg\n')
22
+ .action(async (options, command) => {
23
+ const mergedOptions = command.optsWithGlobals();
24
+ if (options.list) {
25
+ console.log((0, cover_1.listCoverPresets)().join('\n'));
26
+ return;
27
+ }
28
+ if (!mergedOptions.title || !options.to) {
29
+ throw new Error('请提供 --title 和 --to');
30
+ }
31
+ const output = await (0, cover_1.createCover)({
32
+ title: mergedOptions.title,
33
+ author: mergedOptions.author,
34
+ outputPath: node_path_1.default.resolve(options.to),
35
+ backgroundPath: options.background
36
+ });
37
+ (0, logger_1.success)(`已生成封面图: ${output}`);
38
+ });
39
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerFixCommand = registerFixCommand;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const fixer_1 = require("../core/fixer");
9
+ const wechat_1 = require("../core/wechat");
10
+ const config_1 = require("../utils/config");
11
+ const logger_1 = require("../utils/logger");
12
+ function registerFixCommand(program) {
13
+ program
14
+ .command('fix')
15
+ .description('修复 HTML 中的图片与不兼容结构,并按需上传正文图片')
16
+ .usage('<article.html> [options]')
17
+ .helpOption('-h, --help', '查看帮助')
18
+ .argument('<article.html>', '要修复的 HTML 文件路径')
19
+ .option('--no-upload', '只修复 HTML 结构,不上传图片到微信')
20
+ .option('--cdn <url>', '把本地图片路径替换为指定 CDN 地址')
21
+ .addHelpText('after', '\n示例:\n $ wxgzh fix .wxgzh/article.html\n $ wxgzh fix .wxgzh/article.html --no-upload\n $ wxgzh fix .wxgzh/article.html --cdn https://cdn.example.com\n')
22
+ .action(async (articlePath, options) => {
23
+ let wechat;
24
+ if (options.upload !== false) {
25
+ const config = await (0, config_1.loadConfig)();
26
+ if (!config.appid || !config.appsecret) {
27
+ (0, logger_1.error)('未配置微信认证信息,请先运行: wxgzh config --appid xxx --appsecret yyy');
28
+ }
29
+ wechat = new wechat_1.WechatClient({ appid: config.appid, appsecret: config.appsecret });
30
+ }
31
+ const result = await (0, fixer_1.fixHtmlFile)(node_path_1.default.resolve(articlePath), {
32
+ upload: options.upload !== false,
33
+ cdn: options.cdn,
34
+ wechat
35
+ });
36
+ (0, logger_1.success)(`HTML 修复完成,共处理 ${result.imageCount} 张图片`);
37
+ });
38
+ }