commit d6864fd7a7393e371ba8fc03138fc54262f8d042 Author: 陈昊韬 <1075983130@qq.com> Date: Sat Sep 26 15:47:38 2026 +0800 Add WeChat writer and moments poster skills with ZIP bundle 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 0000000..5b03188 Binary files /dev/null and b/wechat-skills.zip differ