wechat-media-writer 2.2.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.
package/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # wechat-media-writer
2
+
3
+ 微信公众号书评、影评文章自动生成与发布
4
+
5
+ ## 安装
6
+
7
+ ### 方式一:Claude Code Skill(自然语言触发)
8
+
9
+ ```bash
10
+ git clone https://github.com/your-username/wechat-media-writer.git ~/.claude/skills/wechat-media-writer
11
+ ```
12
+
13
+ 安装后直接说:
14
+
15
+ ```
16
+ 帮我写一篇公众号文章,拆解《人类简史》
17
+ 发公众号:《肖申克的救赎》影评
18
+ 书评:《反脆弱》
19
+ 影评:《霸王别姬》
20
+ ```
21
+
22
+ 触发词:`写公众号文章`、`发公众号`、`发微信文章`、`公众号草稿`、`书评`、`影评`、`读书拆解`、`wechat publish`
23
+
24
+ ### 方式二:npx 命令行
25
+
26
+ ```bash
27
+ npx wechat-media-writer cover "人类简史" "尤瓦尔·赫拉利"
28
+ npx wechat-media-writer cover "肖申克的救赎" "弗兰克·德拉邦特"
29
+ npx wechat-media-writer publish --title "标题" --content-file content.html --cover-dir /tmp/output
30
+ ```
31
+
32
+ ### 方式三:全局安装
33
+
34
+ ```bash
35
+ npm install -g wechat-media-writer
36
+ wechat-media-writer cover "人类简史"
37
+ ```
38
+
39
+ ## 配置
40
+
41
+ 创建 `~/.wechat/config.json`:
42
+
43
+ ```json
44
+ {
45
+ "appid": "你的AppID",
46
+ "appsecret": "你的AppSecret"
47
+ }
48
+ ```
49
+
50
+ ## 命令
51
+
52
+ ### 获取封面
53
+
54
+ ```bash
55
+ npx wechat-media-writer cover <书名/电影名> [作者/导演]
56
+ ```
57
+
58
+ 自动从 Google Books、Open Library、豆瓣获取封面。
59
+
60
+ ### 下载主题插图
61
+
62
+ ```bash
63
+ npx wechat-media-writer download [主题] [数量]
64
+ ```
65
+
66
+ 主题:`nature`、`technology`、`abstract`、`books`、`movies`、`business`
67
+
68
+ ### 发布文章
69
+
70
+ ```bash
71
+ npx wechat-media-writer publish --title "标题" --content-file content.html --cover-dir /tmp/output
72
+ ```
73
+
74
+ ### 查看帮助
75
+
76
+ ```bash
77
+ npx wechat-media-writer help
78
+ ```
79
+
80
+ ## 项目结构
81
+
82
+ ```
83
+ wechat-media-writer/
84
+ ├── SKILL.md # Skill 规范说明
85
+ ├── README.md # 本文件
86
+ ├── package.json # npm 包配置
87
+ ├── bin/
88
+ │ └── cli.js # CLI 入口
89
+ ├── scripts/
90
+ │ ├── book_cover.py # 封面获取(书/影)
91
+ │ ├── image_downloader.py # 图片下载
92
+ │ ├── wechat_api.py # 微信API封装
93
+ │ ├── publish.py # 完整发布脚本
94
+ │ └── install.js # npm postinstall
95
+ └── references/
96
+ └── publish_template.py # 发布脚本模板
97
+ ```
98
+
99
+ ## 发布到 npm
100
+
101
+ ```bash
102
+ npm login
103
+ npm publish
104
+ ```
105
+
106
+ ## License
107
+
108
+ MIT
package/SKILL.md ADDED
@@ -0,0 +1,376 @@
1
+ ---
2
+ name: wechat-media-writer
3
+ version: 2.2.0
4
+ description: |
5
+ 微信公众号书评、影评文章自动生成与发布。7段式独立评论者视角,含作者背景、
6
+ 逻辑导图、核心论点、批判评析、收获与成长、落地方案、星级评分。
7
+ 自动下载主题插图、上传微信、生成HTML排版、发布到草稿箱。
8
+ v2.2.0: 重构结构,代码提取到独立模块,SKILL.md仅保留规范说明。
9
+ triggers:
10
+ - 写公众号文章
11
+ - 发公众号
12
+ - 发微信文章
13
+ - 公众号草稿
14
+ - 书评
15
+ - 影评
16
+ - 读书拆解
17
+ - wechat publish
18
+ allowed-tools:
19
+ - Bash
20
+ - Read
21
+ - Write
22
+ - Edit
23
+ - Glob
24
+ - Grep
25
+ - WebSearch
26
+ - WebFetch
27
+ - AskUserQuestion
28
+ ---
29
+
30
+ # 微信公众号书评、影评自动发布
31
+
32
+ ## 概述
33
+
34
+ 将书评、影评文章自动生成精美HTML排版并发布到微信公众号草稿箱。
35
+ 采用7段式独立评论者视角,每篇文章配独特主题色和贴合主题的插图。
36
+
37
+ ## 项目结构
38
+
39
+ ```
40
+ wechat-skill/
41
+ ├── SKILL.md # 本文件 - 规范说明
42
+ ├── scripts/
43
+ │ ├── book_cover.py # 书籍封面获取模块
44
+ │ ├── image_downloader.py # 图片下载模块
45
+ │ ├── wechat_api.py # 微信API封装
46
+ │ └── publish.py # 完整发布脚本
47
+ └── references/
48
+ └── publish_template.py # 发布脚本模板
49
+ ```
50
+
51
+ ## 凭证配置
52
+
53
+ 凭证存储在 `~/.wechat/config.json`:
54
+
55
+ ```json
56
+ {
57
+ "appid": "你的AppID",
58
+ "appsecret": "你的AppSecret"
59
+ }
60
+ ```
61
+
62
+ Token 缓存在 `~/.wechat/token_cache.json`(自动管理,2小时有效期)。
63
+
64
+ ## 7段式书评结构
65
+
66
+ 每篇读书拆解文章固定7个章节,**不使用数字编号**,直接以章节标题呈现:
67
+
68
+ | 序号 | 标题 | 内容要点 |
69
+ | ---- | -------------------- | ------------------------------------------- |
70
+ | 1 | 先搞懂写书的这个人 | 作者生平、学术/职业背景、成书时代、写作动机 |
71
+ | 2 | 全书脉络 | 逐章概括核心逻辑线,用框图提炼主线 |
72
+ | 3 | 三个颠覆认知的真相 | 选3个最有穿透力的论点,附书中案例 |
73
+ | 4 | 这本书的短板,不吐不快 | 根据书籍实际情况灵活呈现:有短板则评短板,无明显漏洞则评适用边界或争议点,不强制批判 |
74
+ | 5 | 读完真正留下的东西 | 读完能带走的三样东西,个人成长视角 |
75
+ | 6 | 四条拿来就用的行动项 | 3-4条可操作建议,具体到执行步骤 |
76
+ | 7 | 值不值得花时间读 | ★评分 + 适合/不适合人群清单 |
77
+
78
+
79
+ ## 主题色规范
80
+
81
+ 每篇文章随机生成主题色组合(主色+强调色),确保视觉多样性。
82
+
83
+ ### 生成规则
84
+
85
+ 1. **主色(T)**:HSL色彩空间,H随机(0-360),S 40-60%,L 30-45%(深色系)
86
+ 2. **强调色(T2)**:与主色H值相差120-180度(形成对比),S 50-70%,L 45-55%
87
+ 3. **禁止组合**:主色与强调色明度差 < 15%时重新生成
88
+
89
+ ## 标题规范
90
+
91
+ 标题必须**犀利、抓住洞察、引人入胜**,避免平铺直叙。
92
+
93
+ ### 标题结构
94
+
95
+ **[前半模板]:[犀利洞察/颠覆认知的结论]**
96
+
97
+ ### 前半模板库(随机选1个)
98
+
99
+ 《书名》全书深度拆解
100
+ 拆完《书名》,我有话说
101
+ 《书名》到底写了什么
102
+ 花X小时读完《书名》
103
+ 关于《书名》你该知道的一切
104
+ 《书名》这本书,拆透了
105
+ 《书名》的真相
106
+ 我为什么建议你读《书名》
107
+
108
+ ### 后半部分
109
+
110
+ 冒号后必须是**犀利洞察**——一句话点出这本书最颠覆/最核心的价值。
111
+
112
+ ### 标题要求
113
+
114
+ 1. **必须包含书名**,格式为《书名》
115
+ 2. **前半部分随机选择模板**——保持系列多样性,避免千篇一律
116
+ 3. **冒号后必须是犀利洞察**——一句话点出这本书最颠覆/最核心的价值
117
+ 4. **字数控制在25-40字**——太短没信息量,太长显示不全
118
+ 5. **避免形容词堆砌**——不要"震撼!深刻!必读!",要具体结论
119
+
120
+
121
+ ## HTML排版规范
122
+
123
+ ### 基本结构
124
+
125
+ ```html
126
+ <section
127
+ style="margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;color:#333;background:#FBF8FC;"
128
+ >
129
+ <!-- 头部 -->
130
+ <p style="font-size:12px;color:{T2};text-align:center;letter-spacing:4px;margin:24px 0 8px;line-height:3em;">
131
+ <span>📖 读书拆解</span>
132
+ </p>
133
+ <p style="font-size:22px;font-weight:bold;color:{T};text-align:center;margin:0 0 6px;line-height:1.5;">
134
+ <span>《书名》全书深度拆解</span>
135
+ </p>
136
+ <p style="font-size:14px;color:#999;text-align:center;margin:0 0 20px;line-height:3em;">
137
+ <span>副标题(一句话点睛)</span>
138
+ </p>
139
+
140
+ <!-- 书籍封面图(第一张图,使用书籍原封面) -->
141
+ <p style="margin:0 0 20px;text-align:center;">
142
+ <img src="{BOOK_COVER_URL}" style="width:100%;max-width:600px;display:block;margin:0 auto;border-radius:4px;" alt="《书名》封面" />
143
+ </p>
144
+
145
+ <!-- 章节(无数字编号,直接标题) -->
146
+ <p style="font-size:18px;font-weight:bold;color:{T};text-align:center;margin:0 0 16px;line-height:1em;">
147
+ <span>作者背景与创作时代</span>
148
+ </p>
149
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 16px;text-indent:2em;">
150
+ <span>正文段落。所有段落必须有 text-indent:2em。</span>
151
+ </p>
152
+
153
+ <!-- 引用块 -->
154
+ <p
155
+ style="font-size:17px;line-height:1.9;color:rgb(T_R,T_G,T_B);font-weight:bold;text-indent:2em;margin:0 0 20px;padding:14px 18px;background:rgb(CBG);border-radius:8px;"
156
+ >
157
+ <span>金句或核心观点引用。</span>
158
+ </p>
159
+
160
+ <!-- 分隔符(章节之间) -->
161
+ <p style="font-size:14px;color:#ccc;text-align:center;letter-spacing:8px;margin:20px 0;">· · · · · ·</p>
162
+ </section>
163
+ ```
164
+
165
+ ### 关键排版规则
166
+
167
+ 1. **所有正文段落必须有 `text-indent:2em`** — 首行缩进
168
+ 2. **图片URL必须用完整的 `mmbiz.qpic.cn` 硬编码URL** — 不用模板变量
169
+ 3. **`<img>` 必须包裹在 `<p>` 中**,且 `style="width:100%;display:block;border-radius:4px;"`
170
+ 4. **行高统一 `line-height:2`** — 阅读舒适
171
+ 5. **引用块用 `<p>` + `background` + `border-radius:8px`** — 不是 `<blockquote>`
172
+ 6. **章节标题不使用数字编号** — 直接用"作者背景与创作时代",不用"壹"
173
+ 7. **强调文字用 `<strong style="color:{T};">`** — 不是加粗或改色
174
+ 8. **星标用 `<span>★★★★☆</span>`** — `font-size:28px;color:{T2}`
175
+ 9. **每篇文章只在一个 `<section>` 内** — 不嵌套多个 section
176
+ 10. **第一张图必须是书籍封面** — 使用书籍原封面图,居中显示,max-width:600px
177
+
178
+ ## 图片工作流
179
+
180
+ ### 第一步:获取书籍封面图
181
+
182
+ **书评文章的第一张图必须是书籍原封面**
183
+
184
+ 使用 `scripts/book_cover.py` 模块自动获取:
185
+
186
+ ```python
187
+ from book_cover import fetch_book_cover, download_and_process_cover
188
+
189
+ # 自动获取封面URL(Google Books -> Open Library -> 豆瓣)
190
+ cover_url = fetch_book_cover("书名", "作者", "ISBN")
191
+
192
+ # 下载并处理(生成600px文章封面 + 900x500公众号封面)
193
+ if cover_url:
194
+ cover_path, cover_900_path = download_and_process_cover(cover_url, "/tmp/output")
195
+ ```
196
+
197
+ **封面尺寸要求**:
198
+ - 文章内封面:宽度 600px,高度按比例缩放
199
+ - 公众号封面:900x500px(用于文章列表展示)
200
+
201
+ ### 第二步:下载主题插图
202
+
203
+ 使用 `scripts/image_downloader.py` 下载:
204
+
205
+ ```python
206
+ from image_downloader import download_theme_images
207
+
208
+ # 根据主题下载5张插图
209
+ urls = download_theme_images("nature", "/tmp/images", count=5)
210
+ ```
211
+
212
+ 每篇文章需要 5-6 张内容图 + 1张书籍封面图 + 1张封面图(900x500用于公众号封面)。
213
+
214
+ ### 第三步:上传图片到微信
215
+
216
+ 使用 `scripts/wechat_api.py` 上传:
217
+
218
+ ```python
219
+ from wechat_api import upload_cover, upload_content_image
220
+
221
+ # 上传封面(永久素材)
222
+ cover_mid = upload_cover(token, "cover_900x500.jpg")
223
+
224
+ # 上传内容图(返回mmbiz URL)
225
+ img_url = upload_content_image(token, "image.jpg")
226
+ ```
227
+
228
+ ### 第四步:硬编码 URL
229
+
230
+ 将上传后的 media_id 和 mmbiz URL **硬编码到发布脚本中**,不用模板变量。
231
+ 这是因为微信图片URL有时效性,硬编码已验证的URL最可靠。
232
+
233
+ ## 微信 API 集成
234
+
235
+ ### API 列表
236
+
237
+ | API | 用途 | 方法 |
238
+ | ------------------------------- | -------------------- | -------------- |
239
+ | `cgi-bin/token` | 获取 access_token | GET |
240
+ | `cgi-bin/material/add_material` | 上传永久素材(封面) | POST multipart |
241
+ | `cgi-bin/media/uploadimg` | 上传文章内图片 | POST multipart |
242
+ | `cgi-bin/draft/add` | 创建草稿 | POST JSON |
243
+
244
+ ### 错误处理
245
+
246
+ | 错误码 | 含义 | 处理 |
247
+ | ------ | ------------------ | ------------------- |
248
+ | 40001 | token 无效 | 重新获取 token |
249
+ | 40007 | invalid media_id | 重新上传封面图 |
250
+ | 40164 | IP 不在白名单 | 提示用户添加 IP |
251
+ | 41005 | media data missing | 检查 multipart 格式 |
252
+ | 45009 | 频率限制 | 等待后重试 |
253
+
254
+ ## 完整发布流程
255
+
256
+ ### 1. 确认书籍信息
257
+
258
+ 向用户确认:书名、作者、是否需要特定主题色。
259
+
260
+ ### 2. 获取封面图
261
+
262
+ ```bash
263
+ python3 scripts/book_cover.py "书名" "作者" "ISBN"
264
+ ```
265
+
266
+ ### 3. 下载主题插图
267
+
268
+ ```bash
269
+ python3 -c "from scripts.image_downloader import download_theme_images; download_theme_images('theme', '/tmp/images')"
270
+ ```
271
+
272
+ ### 4. 上传图片到微信
273
+
274
+ ```bash
275
+ python3 scripts/publish.py --upload-dir /tmp/images
276
+ ```
277
+
278
+ ### 5. 撰写7段式内容
279
+
280
+ 以独立社科文学批评者视角,基于真实研究撰写原创内容。
281
+ 不抄袭参考文章,每个论点附书中案例。
282
+
283
+ ### 6. 生成发布脚本
284
+
285
+ 参考 `references/publish_template.py`,将:
286
+
287
+ - 主题色变量(T, T2, BODY, CBG)
288
+ - 硬编码图片 URL
289
+ - 7段式 HTML 内容
290
+ - 标题、摘要
291
+
292
+ 写入完整 Python 脚本。
293
+
294
+ ### 7. 执行发布
295
+
296
+ ```bash
297
+ python3 scripts/publish.py --title "标题" --content-file content.html --cover-dir /tmp/images
298
+ ```
299
+
300
+ 成功后输出草稿 ID,提示用户去 https://mp.weixin.qq.com 预览。
301
+
302
+ ## 内容写作指南
303
+
304
+ ### 角色:独立社科文学批评者
305
+ - 不吹捧、不带货、不写软文
306
+ - 有观点、有温度
307
+ - 每个论点必须有书中案例支撑
308
+ - 批判章节:根据书籍实际情况灵活处理,有明显短板则评短板,无明显问题则评适用边界、争议点或时代局限,不强制批判
309
+ - 星级评分诚实(3-4星是常态,5星极少)
310
+
311
+ ### 内容来源
312
+
313
+ - Wikipedia / 豆瓣:作者背景、书籍基本信息
314
+ - 书评 / 学术论文:交叉验证核心论点
315
+ - 原书引用:逻辑导图和论点章节必须引用原书
316
+ - **不抄袭参考文章**:所有内容原创,基于研究重新组织
317
+
318
+ ### 字数参考
319
+
320
+ | 章节 | 字数 |
321
+ | ---------- | ------------- |
322
+ | 作者背景 | 400-600 |
323
+ | 逻辑导图 | 600-800 |
324
+ | 三大论点 | 1200-1800 |
325
+ | 批判评析 | 600-800 |
326
+ | 收获与成长 | 600-800 |
327
+ | 落地方案 | 600-800 |
328
+ | 星级评分 | 400-500 |
329
+ | **总计** | **4000-6000** |
330
+
331
+ ## 星级评分与适配人群排版规范
332
+
333
+ 星级评分部分必须按照以下格式排版,**不使用壹贰叁编号**:
334
+
335
+ ```html
336
+ <p style="font-size:14px;color:#ccc;text-align:center;letter-spacing:8px;margin:20px 0;">· · · · · ·</p>
337
+
338
+ <p style="font-size:18px;font-weight:bold;color:{T};text-align:center;margin:0 0 16px;line-height:1em;">
339
+ <span>星级评分与适配人群</span>
340
+ </p>
341
+
342
+ <p style="font-size:28px;text-align:center;margin:0 0 8px;">
343
+ <span style="color:{T2};">★★★★☆</span>
344
+ </p>
345
+
346
+ <p style="font-size:16px;color:{BODY};text-align:center;margin:0 0 16px;">
347
+ <span>4 / 5 星</span>
348
+ </p>
349
+
350
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 16px;text-indent:2em;">
351
+ <span>为什么给X星?简要说明评分理由,诚实评价,3-4星是常态,5星极少。</span>
352
+ </p>
353
+
354
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 8px;text-indent:2em;">
355
+ <strong style="color:{T};">适合人群:</strong>
356
+ </p>
357
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 16px;padding-left:2em;">
358
+ <span>✓ 创业者/管理者——具体理由<br />✓ 陷入职业倦怠期的人——具体理由<br />✓ 对某领域感兴趣的读者——具体理由</span>
359
+ </p>
360
+
361
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 8px;text-indent:2em;">
362
+ <strong style="color:{T};">不适合人群:</strong>
363
+ </p>
364
+ <p style="font-size:16px;line-height:2;color:{BODY};margin:0 0 16px;padding-left:2em;">
365
+ <span>✗ 已读过类似书籍的人——内容高度重复<br />✗ 讨厌某种风格的人——具体理由<br />✗ 寻找其他类型内容的人——具体理由</span>
366
+ </p>
367
+ ```
368
+
369
+ ### 评分格式要求
370
+
371
+ 1. **星级显示**:`font-size:28px;color:{T2}`,居中
372
+ 2. **分数显示**:`4 / 5 星`,在星标下方
373
+ 3. **评分理由**:1-2句话解释为什么给这个分数
374
+ 4. **适合人群**:用 ✓ 标记,每条用——连接理由
375
+ 5. **不适合人群**:用 ✗ 标记,每条用——连接理由
376
+ 6. **不要直接放链接**——所有内容用文案表达
package/bin/cli.js ADDED
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { execSync } = require('child_process');
4
+ const path = require('path');
5
+ const fs = require('fs');
6
+
7
+ const SKILL_DIR = path.join(__dirname, '..');
8
+ const SCRIPTS_DIR = path.join(SKILL_DIR, 'scripts');
9
+
10
+ // 检查Python环境
11
+ function checkPython() {
12
+ try {
13
+ execSync('python3 --version', { stdio: 'pipe' });
14
+ return 'python3';
15
+ } catch {
16
+ try {
17
+ execSync('python --version', { stdio: 'pipe' });
18
+ return 'python';
19
+ } catch {
20
+ console.error('错误: 需要安装 Python 3');
21
+ console.error('请访问 https://www.python.org/downloads/ 安装');
22
+ process.exit(1);
23
+ }
24
+ }
25
+ }
26
+
27
+ // 检查依赖
28
+ function checkDependencies() {
29
+ try {
30
+ execSync('python3 -c "from PIL import Image"', { stdio: 'pipe' });
31
+ } catch {
32
+ console.log('正在安装 Python 依赖...');
33
+ execSync('pip3 install Pillow', { stdio: 'inherit' });
34
+ }
35
+ }
36
+
37
+ // 显示帮助信息
38
+ function showHelp() {
39
+ console.log(`
40
+ 微信公众号书评、影评自动发布工具
41
+
42
+ 用法:
43
+ npx wechat-media-writer <command> [options]
44
+
45
+ 命令:
46
+ cover <书名/电影名> [作者/导演] 获取封面
47
+ download <主题> [数量] 下载主题插图
48
+ publish 发布文章到微信
49
+ help 显示帮助信息
50
+
51
+ 示例:
52
+ npx wechat-media-writer cover "人类简史" "尤瓦尔·赫拉利"
53
+ npx wechat-media-writer cover "肖申克的救赎" "弗兰克·德拉邦特"
54
+ npx wechat-media-writer download books 5
55
+ npx wechat-media-writer publish --title "标题" --content-file content.html
56
+
57
+ 配置:
58
+ 创建 ~/.wechat/config.json:
59
+ {
60
+ "appid": "你的AppID",
61
+ "appsecret": "你的AppSecret"
62
+ }
63
+ `);
64
+ }
65
+
66
+ // 主函数
67
+ function main() {
68
+ const args = process.argv.slice(2);
69
+ const command = args[0];
70
+
71
+ if (!command || command === 'help' || command === '--help') {
72
+ showHelp();
73
+ return;
74
+ }
75
+
76
+ const python = checkPython();
77
+ checkDependencies();
78
+
79
+ switch (command) {
80
+ case 'cover':
81
+ if (args.length < 2) {
82
+ console.error('用法: npx wechat-media-writer cover <书名/电影名> [作者/导演]');
83
+ process.exit(1);
84
+ }
85
+ execSync(`${python} ${path.join(SCRIPTS_DIR, 'book_cover.py')} "${args[1]}" "${args[2] || ''}" "${args[3] || ''}"`, { stdio: 'inherit' });
86
+ break;
87
+
88
+ case 'download':
89
+ const theme = args[1] || 'abstract';
90
+ const count = args[2] || '5';
91
+ execSync(`${python} -c "from scripts.image_downloader import download_theme_images; download_theme_images('${theme}', '/tmp/images', ${count})"`, {
92
+ stdio: 'inherit',
93
+ cwd: SKILL_DIR
94
+ });
95
+ break;
96
+
97
+ case 'publish':
98
+ // 传递所有参数给Python脚本
99
+ const publishArgs = args.slice(1).join(' ');
100
+ execSync(`${python} ${path.join(SCRIPTS_DIR, 'publish.py')} ${publishArgs}`, { stdio: 'inherit' });
101
+ break;
102
+
103
+ default:
104
+ console.error(`未知命令: ${command}`);
105
+ showHelp();
106
+ process.exit(1);
107
+ }
108
+ }
109
+
110
+ main();
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "wechat-media-writer",
3
+ "version": "2.2.0",
4
+ "description": "微信公众号书评、影评文章自动生成与发布 - Skill",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "wechat-media-writer": "./bin/cli.js"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "scripts/",
12
+ "references/",
13
+ "SKILL.md",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "postinstall": "node scripts/install.js"
18
+ },
19
+ "keywords": [
20
+ "wechat",
21
+ "weixin",
22
+ "book",
23
+ "movie",
24
+ "review",
25
+ "publish",
26
+ "skill",
27
+ "公众号",
28
+ "书评",
29
+ "影评"
30
+ ],
31
+ "author": "",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/your-username/wechat-skill.git"
36
+ },
37
+ "engines": {
38
+ "node": ">=14.0.0"
39
+ }
40
+ }