From d6864fd7a7393e371ba8fc03138fc54262f8d042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=8A=E9=9F=AC?= <1075983130@qq.com> Date: Sat, 26 Sep 2026 15:47:38 +0800 Subject: [PATCH] Add WeChat writer and moments poster skills with ZIP bundle --- README.md | 14 ++ wechat-article-writer/SKILL.md | 62 +++++ wechat-moments-poster/SKILL.md | 54 +++++ wechat-moments-poster/evals/evals.json | 17 ++ .../scripts/wechat-moments.json | 216 ++++++++++++++++++ wechat-skills.zip | Bin 0 -> 4325 bytes 6 files changed, 363 insertions(+) create mode 100644 README.md create mode 100644 wechat-article-writer/SKILL.md create mode 100644 wechat-moments-poster/SKILL.md create mode 100644 wechat-moments-poster/evals/evals.json create mode 100644 wechat-moments-poster/scripts/wechat-moments.json create mode 100644 wechat-skills.zip diff --git a/README.md b/README.md new file mode 100644 index 0000000..ad31d25 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Wechat Friend Circle Writer + +包含两个微信相关 Skill,保留原始目录和文件内容。 + +- `wechat-article-writer/`:公众号文章写作流程。 +- `wechat-moments-poster/`:微信朋友圈自动发送操作说明、JSON 动作脚本及评估用例。 + +## 下载 + +可直接下载 [wechat-skills.zip](./wechat-skills.zip),解压后得到上述两个文件夹。 + +## 依赖说明 + +`wechat-moments-poster` 引用的外部项目 `scripts/launcher.py` 不在原始文件夹中,因此本仓库未包含该执行器;使用前请按对应 SKILL.md 配置外部依赖。 diff --git a/wechat-article-writer/SKILL.md b/wechat-article-writer/SKILL.md new file mode 100644 index 0000000..039dc47 --- /dev/null +++ b/wechat-article-writer/SKILL.md @@ -0,0 +1,62 @@ +--- +name: wechat-article-writer +description: 公众号文章自动化写作流程。支持资料搜索、文章撰写、爆款标题生成、排版优化。当用户提到写公众号、微信文章、自媒体写作、爆款文章、内容创作时使用此 skill。 +--- + +# 公众号文章写作流程 + +4 步完成高质量公众号文章:搜索资料 → 撰写文章 → 生成标题 → 排版优化 + +## Step 1: 搜索资料 + +使用 Search 工具搜索主题相关资料: + +``` +搜索要求: +1. 并行搜索多个来源(官方文档、X/Twitter、Reddit、技术论坛) +2. 优先获取最新资料(当月/当季) +3. 可启动多个并行 Task 加速搜索 +4. 深度总结搜索结果 +``` + +## Step 2: 撰写文章 + +**必须先读取用户的 AGENTS.md 获取写作风格** + +撰写要求: +- 1000-1500 字 +- 故事化开头,带情感色彩(兴奋/焦虑/好奇) +- 准备 2-3 个备选标题 +- 结构:效果展示 → 问题描述 → 步骤教学 → 升华总结 +- 遵循 AGENTS.md 中定义的写作风格和结尾语 + +## Step 3: 生成标题 + +生成 5 个爆款标题,特点: +- **痛点明确**:直击读者痛处("还在手动...") +- **数字吸引**:具体数字更有说服力("3分钟"、"5个技巧") +- **结果导向**:承诺具体收益("效率暴涨10倍") +- **情绪调动**:惊、神技、秘籍等词汇 +- **悬念设置**:引发好奇心 + +## Step 4: 排版优化 + +优化建议: +1. **段落结构**:每段 3-5 行,重要数据单独成段加粗 +2. **配图位置**:标题下方封面图、步骤后效果图、结尾总结图 +3. **代码块**:前后留白,语法高亮 +4. **金句**:单独成段,增强记忆点 + +## 示例 + +用户请求: +``` +帮我写一篇关于 OpenCode 使用技巧的公众号文章 +``` + +执行流程: +1. 搜索 OpenCode 最新功能和使用技巧 +2. 读取 AGENTS.md 获取写作风格 +3. 撰写 1200 字左右的教程文章 +4. 生成 5 个爆款标题供选择 +5. 提供排版和配图建议 diff --git a/wechat-moments-poster/SKILL.md b/wechat-moments-poster/SKILL.md new file mode 100644 index 0000000..010a2db --- /dev/null +++ b/wechat-moments-poster/SKILL.md @@ -0,0 +1,54 @@ +--- +name: wechat-moments-poster +description: > + 微信朋友圈自动发送 — 当用户想要自动发朋友圈、需要 Claude 帮忙操作电脑发朋友圈时使用此 skill。 + 触发关键词:"自动发朋友圈"、"发朋友圈"、"帮我发朋友圈"、"发一条朋友圈"、"朋友圈自动发送"。 + 此 skill 会读取 JSON 动作脚本,调用项目中的自动化启动器执行鼠标点击和文字输入操作, + 支持在运行时注入自定义文案(通过 --text 参数替换 text_input 节点的内容), + 完成后返回成功/失败信号。 +--- + +# 微信朋友圈自动发送 + +当用户需要自动发送朋友圈时,调用项目中的 `scripts/launcher.py` 脚本,读取 JSON 动作脚本并执行自动化操作。 + +## 绑定脚本 + +此 skill 内置了 JSON 动作脚本,路径相对于 skill 根目录: +- `scripts/wechat-moments.json` — 朋友圈单图发送动作脚本(包含激活微信→全屏→点击朋友圈→输入文案→发送等步骤) +- 项目 `scripts/launcher.py` — JSON 点击脚本启动器 + +## 前置条件 + +- 项目目录下存在 `scripts/launcher.py` +- 已安装依赖:`pip install pyautogui pyperclip` +- 系统设置 > 隐私与安全性 > 辅助功能 中已允许 Terminal 运行 + +## 工作流程 + +### Step 1: 确定朋友圈文案 + +如果用户已提供文案,直接使用。如果用户只说"发朋友圈"但未指定内容,先用 `moments-writer` skill(朋友圈生成器)生成一篇文案,或询问用户想发什么。 + +### Step 2: 执行自动化(带文案注入) + +```bash +python3 /scripts/launcher.py /scripts/wechat-moments.json --text "<朋友圈文案>" -i 1.0 +``` + +- `` 为定位小助手项目根目录 +- `` 为 skill 根目录 +- `--text` 参数会将 JSON 中所有 `text_input` 节点的 `buttonName` 替换为指定的文案 +- `-i 1.0` 每步间隔 1 秒 + +### Step 3: 返回执行结果 + +- 全部成功 → 告知用户"朋友圈发送完成" +- 有失败 → 告知用户失败步骤详情 + +## 注意事项 + +- 执行期间会接管鼠标和键盘,用户不应操作电脑 +- 按 Ctrl+C 可中断执行 +- 也可先用 `--dry` 预览:加上 `--dry` 参数,不实际点击 +- `--text` 参数是通用的——任何 JSON 中的 text_input 节点都会被替换,不限于朋友圈场景 diff --git a/wechat-moments-poster/evals/evals.json b/wechat-moments-poster/evals/evals.json new file mode 100644 index 0000000..9d9f84d --- /dev/null +++ b/wechat-moments-poster/evals/evals.json @@ -0,0 +1,17 @@ +{ + "skill_name": "wechat-moments-poster", + "evals": [ + { + "id": 1, + "prompt": "帮我发一条朋友圈,内容我已经准备好了,JSON 脚本在 scripts/wechat-moments.json", + "expected_output": "成功调用 launcher.py 执行脚本,返回成功信号", + "files": [] + }, + { + "id": 2, + "prompt": "自动发朋友圈,用 scripts/my-moments.json 这个脚本", + "expected_output": "成功调用 launcher.py 执行指定路径的 JSON 脚本,返回执行结果", + "files": [] + } + ] +} diff --git a/wechat-moments-poster/scripts/wechat-moments.json b/wechat-moments-poster/scripts/wechat-moments.json new file mode 100644 index 0000000..36f31fd --- /dev/null +++ b/wechat-moments-poster/scripts/wechat-moments.json @@ -0,0 +1,216 @@ +{ + "version": 2, + "exportTime": "2026-05-09T17:32:56.339Z", + "order": [ + { + "id": "1fa6b5e2-da2b-4605-a6a3-5b9690cea8f8", + "imageId": "window", + "filePath": "", + "fileName": "激活窗口", + "description": "请输入要激活的窗口名", + "buttonName": "微信", + "bbox": [ + 0, + 0, + 0, + 0 + ], + "type": "activate_window" + }, + { + "id": "702e4ec8-1bcc-4e84-b1ec-7848e5e8225f", + "imageId": "window", + "filePath": "", + "fileName": "窗口最大化", + "description": "最大化当前窗口", + "buttonName": "最大化窗口", + "bbox": [ + 0, + 0, + 0, + 0 + ], + "type": "maximize_window" + }, + { + "id": "901d078b-4e5c-4724-9a2a-8478e74abbc1", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #3", + "bbox": [ + 30, + 272, + 30, + 272 + ], + "type": "recording" + }, + { + "id": "33dc1b1a-9d5f-4ac7-b86e-6c7febbcf7d2", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #4", + "bbox": [ + 959, + 195, + 959, + 195 + ], + "type": "recording" + }, + { + "id": "ff38b555-3dae-46c4-b13a-6f7cb7797d63", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #5", + "bbox": [ + 421, + 333, + 421, + 333 + ], + "type": "recording" + }, + { + "id": "8c3c50ec-71ae-425d-a50b-6291e1ae5ebe", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #6", + "bbox": [ + 532, + 342, + 532, + 342 + ], + "type": "recording" + }, + { + "id": "04b84948-9c00-47e2-be68-597df52ea1a0", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #7", + "bbox": [ + 767, + 340, + 767, + 340 + ], + "type": "recording" + }, + { + "id": "2867a239-3b15-430b-994d-79d2c021b99e", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #8", + "bbox": [ + 1047, + 653, + 1047, + 653 + ], + "type": "recording" + }, + { + "id": "98de2565-8534-4fcb-b0d6-65bb61f9116b", + "imageId": "text_input", + "filePath": "", + "fileName": "文字输入", + "description": "模拟键盘输入文本", + "buttonName": "成功!", + "bbox": [ + 0, + 0, + 0, + 0 + ], + "type": "text_input" + }, + { + "id": "fa785144-a927-41b0-8e9d-d35c48a76f66", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #9", + "bbox": [ + 663, + 277, + 663, + 277 + ], + "type": "recording" + }, + { + "id": "c825cb40-5a20-42b8-b106-4a95fa6958a0", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #10", + "bbox": [ + 814, + 584, + 814, + 584 + ], + "type": "recording" + }, + { + "id": "3924a9aa-df29-41be-95fe-35662887fb37", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #11", + "bbox": [ + 585, + 396, + 585, + 396 + ], + "type": "recording" + }, + { + "id": "a453fbe6-0be9-419c-b294-5e329c4dcebe", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #12", + "bbox": [ + 759, + 620, + 759, + 620 + ], + "type": "recording" + }, + { + "id": "d8ff8521-abb2-4303-b0f1-d8f6499e82eb", + "imageId": "recording", + "filePath": "", + "fileName": "屏幕录制", + "description": "全局屏幕坐标", + "buttonName": "点击 #13", + "bbox": [ + 768, + 669, + 768, + 669 + ], + "type": "recording" + } + ] +} \ No newline at end of file diff --git a/wechat-skills.zip b/wechat-skills.zip new file mode 100644 index 0000000000000000000000000000000000000000..5b031881645d2fcc9ab0c7e29910872de2bfece5 GIT binary patch literal 4325 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