Skill: qujingyang28/wechat-publisher-pro (version 3.1.3)

# 微信公众号自动发布技能 一键发布文章到微信公众号草稿箱，支持 Markdown/HTML 格式，自动美化排版。 ## 功能特性 ✅ **核心功能** - 一键发布到草稿箱 - Markdown/HTML 自动转换 - 自动上传封面图 - 美化排版样式 - 中文编码修复（UTF-8） ✅ **技术优势** - 解决 Unicode 转义问题 - 支持长文章（50000 字以内） - 自动图片压缩 ## 配置 ### 1. 获取微信公众号配置 登录微信公众平台：https://mp.weixin.qq.com **路径:** 设置与开发 → 基本配置 **需要:** - `APPID` (公众号 ID) - `APPSECRET` (应用密钥) ### 2. 设置环境变量 ```bash WECHAT_APPID=你的 APPID WECHAT_APPSECRET=你的 APPSECRET ``` ## 使用方法 ### 方式 1: 命令行发布 ```bash python scripts/wechat_publish.py \ --article "article.md" \ --cover "cover.jpg" \ --title "文章标题" ``` ### 方式 2: Python 代码 ```python from wechat_publish import WeChatPublisher publisher = WeChatPublisher( appid="你的 APPID", appsecret="你的 APPSECRET" ) result = publisher.publish( article_path="article.md", cover_path="cover.jpg", title="文章标题" ) ``` ## 脚本说明 ### wechat_publish.py 主发布脚本，支持多种选项： ```bash # 基本用法 python wechat_publish.py --article article.md --cover cover.jpg --title "标题" # 指定摘要 python wechat_publish.py \ --article article.md \ --cover cover.jpg \ --title "标题" \ --digest "摘要" ``` ## 常见问题 ### Q1: Token 获取失败？ **原因:** IP 白名单未配置 **解决:** 1. 登录 mp.weixin.qq.com 2. 设置与开发 → 基本配置 → IP 白名单 3. 添加你的公网 IP ### Q2: 中文乱码？ **解决:** 脚本已自动处理 UTF-8 编码 ### Q3: 图片上传失败？ **原因:** 图片格式不支持或太大 **解决:** - 格式：JPG/PNG - 大小：<10MB - 尺寸：建议 1200x630px ## 最佳实践 ### 封面图选择 - **尺寸:** 1200x630px (2.35:1) - **格式:** JPG/PNG - **大小:** <10MB ### 发布时间 **最佳时间:** - 工作日：20:00-22:00 - 周末：10:00-12:00 ## 更新日志 ### v3.1.2 (2026-03-13) - ✅ 精简代码，减少 token 使用 - ✅ 优化文件结构 - ✅ 清理私人信息 ### v3.1.1 (2026-03-13) - ✅ 手机阅读优化 - ✅ 代码块优化 - ✅ 表格样式优化 ### v3.1.0 (2026-03-13) - ✅ 官网配图自动下载 - ✅ 智能过滤图片 --- *版本：v3.1.2* *最后更新：2026-03-13* *作者：Robotqu*

path: ACCURACY_POLICY.md
content: # 内容准确性政策 ⭐⭐⭐⭐⭐

**版本：** v1.0  
**创建日期：** 2026-03-13  
**重要性：** 最高优先级  
**适用范围：** 所有公众号文章、技术文档、教程

---

## 🎯 核心原则

**作为机器人技术社区，内容准确性是第一位的！**

我们发布的内容直接影响粉丝的学习和工作，任何错误都可能导致：
- ❌ 学习方向错误
- ❌ 项目失败
- ❌ 设备损坏
- ❌ 安全风险
- ❌ 信任丧失

**宁可延迟发布，也要保证准确性！**

---

## 📋 准确性标准

### 1️⃣ 技术信息 100% 准确

#### 机器人品牌列表
**必须与官方文档完全一致：**

**官方 22 个后处理器品牌：**
```
ABB | CLOOS | Comau | Denso | Doosan | FANUC
Hyundai Robotics | IGM | Kawasaki | KUKA | Mitsubishi MELFA
Nachi | OMRON | OTC Daihen | Panasonic | Reis Robotics
Siasun | Stäubli | Techman | Universal Robots | Yamaha | Yaskawa
```

**常见错误（必须避免）：**
- ❌ JAKA 在后处理器列表中（实际在 eCatalog）
- ❌ Aubo 在后处理器列表中（实际在 eCatalog）
- ❌ Epson 在后处理器列表中（实际在 eCatalog）
- ❌ 后处理器 vs eCatalog 混淆

**正确说明：**
```
✅ 后处理器（22 个）：用于生成控制器代码
✅ eCatalog 组件（60+ 品牌）：用于仿真布局
✅ JAKA、Aubo 等：在 eCatalog 有模型，无官方后处理器
```

#### 软件版本信息
**必须核实：**
- VC 版本号：5.0
- Python 版本：3.12.2
- 发布日期：2026 年 3 月 12 日
- 系统要求

#### 功能特性
**必须与官方文档一致：**
- MBE 基于模型的工程
- 自动路径求解器
- Colliders 碰撞优化
- 新机器人连接器（Denso、Yamaha、Techman、Mitsubishi）
- Fronius 焊接集成
- MQTT 接口

---

### 2️⃣ 官方文档核实

#### 必须查阅的官方页面
1. **官方帮助文档首页**
   - https://help.visualcomponents.com/5.0/Premium/en/English/Help.htm

2. **新功能列表**
   - https://help.visualcomponents.com/5.0/Premium/en/English/WhatsNew.htm

3. **发布说明**
   - https://help.visualcomponents.com/5.0/Premium/en/English/Release_Notes/release_notes_5.0.htm

4. **Python 3 API 文档**
   - https://help.visualcomponents.com/5.0/Premium/en/Python_3_API/Overview.html

5. **机器人连接器文档**
   - https://help.visualcomponents.com/5.0/Premium/en/English/Connectivity/

6. **官网产品页面**
   - https://www.visualcomponents.com/products/

#### 核实要点
- [ ] 所有技术参数与官方一致
- [ ] 所有功能描述与官方一致
- [ ] 所有链接可正常访问
- [ ] 所有截图来自官方或自己测试

---

### 3️⃣ 代码示例验证

#### 测试流程
```python
# 1. 在 VC 中创建测试组件
# 2. 添加 Python Script 行为
# 3. 粘贴代码
# 4. 运行仿真
# 5. 检查输出面板
# 6. 确认无错误
```

#### 验证标准
- [ ] 代码可正常运行
- [ ] 输出结果正确
- [ ] 无语法错误
- [ ] 无运行时错误
- [ ] 异步函数正确使用 async/await

---

### 4️⃣ 品牌名称拼写

#### 必须正确的拼写
| 品牌 | 正确拼写 | 错误拼写 |
|------|----------|----------|
| ABB | ABB | ABB 集团 |
| FANUC | FANUC | Fanuc |
| KUKA | KUKA | Kuka |
| Yaskawa | Yaskawa | YASKAWA |
| Mitsubishi MELFA | Mitsubishi MELFA | Mitsubishi |
| Stäubli | Stäubli | Staubli |
| OMRON | OMRON | Omron |
| Denso | Denso | DENSO |
| Techman | Techman | TECHMAN |
| Yamaha | Yamaha | YAMAHA |

#### 技术术语
| 术语 | 正确 | 错误 |
|------|------|------|
| Python 版本 | Python 3 | Python3 |
| 通信协议 | OPC UA | OPCUA |
| 物联网协议 | MQTT | Mqtt |
| 计算机辅助设计 | CAD | Cad |
| 可编程逻辑控制器 | PLC | Plc |

---

## 🔍 核对流程

### 第一步：作者自查
**时间：** 文章完成后
**内容：**
- [ ] 完成所有核对项
- [ ] 标记不确定的内容
- [ ] 记录核对时间
- [ ] 填写核对记录

### 第二步：交叉核对
**时间：** 发布前
**人员：** 另一位团队成员
**内容：**
- [ ] 独立核对所有技术信息
- [ ] 重点核对机器人品牌列表
- [ ] 核实官方文档链接
- [ ] 记录核对结果

### 第三步：官方文档最终确认
**时间：** 发布前 1 小时
**内容：**
- [ ] 再次查阅官方帮助文档
- [ ] 确认所有技术参数
- [ ] 截图保存核对证据
- [ ] 确认无误

### 第四步：手机预览
**时间：** 发布前 30 分钟
**内容：**
- [ ] 发送到手机预览
- [ ] 检查所有细节
- [ ] 确认排版美观
- [ ] 确认无误后发布

---

## ⚠️ 错误处理

### 发现错误后的处理流程

#### 发布前发现
1. 立即修正
2. 重新核对
3. 记录错误
4. 继续发布流程

#### 发布后发现
1. **立即删除文章**
2. 修正错误
3. 重新核对
4. 重新发布
5. **在公众号说明修正情况**
6. 记录错误到错误日志

### 错误日志模板
```markdown
## 错误记录

**日期：** 2026-03-XX
**文章：** [文章标题]
**错误类型：** 技术信息/拼写/链接/其他
**错误描述：** [详细描述]
**发现人：** [姓名]
**修正措施：** [修正方案]
**预防方案：** [如何避免再次发生]
```

---

## 📊 质量指标

### 准确性指标
- **目标：** 100% 准确
- **可接受：** 0 错误
- **不可接受：** 任何技术信息错误

### 核对完成率
- **目标：** 100% 完成核对流程
- **可接受：** 100%
- **不可接受：** 跳过任何核对步骤

### 发布时间
- **原则：** 准确性优先于时效性
- **宁可延迟发布，也要保证准确**

---

## 🎓 培训要求

### 新成员培训
- [ ] 学习本政策文档
- [ ] 学习核对清单
- [ ] 练习核对流程
- [ ] 通过准确性测试

### 持续学习
- [ ] 定期复习官方文档
- [ ] 关注官方更新
- [ ] 参加技术培训
- [ ] 分享学习心得

---

## 📝 承诺

**我承诺：**

1. 每次发布前完成所有核对流程
2. 保证所有技术信息 100% 准确
3. 发现错误立即修正并记录
4. 持续学习，提高专业水平
5. 对发布的内容负责

**签名：** _______________  
**日期：** 2026-03-13

---

*版本：v1.0*  
*创建：2026-03-13*  
*维护：Robotqu 机器人社区*


path: CHECKLIST.md
content: # 微信公众号发布前核对清单 ⭐⭐⭐⭐⭐

**版本：** v1.0  
**创建日期：** 2026-03-13  
**重要性：** ⭐⭐⭐⭐⭐（必须执行）

---

## 🎯 核对原则

**作为机器人技术社区，内容准确性是第一位的！**

每次发布前必须完成以下核对流程，确保：
- ✅ 所有技术信息准确无误
- ✅ 所有数据来自官方文档
- ✅ 所有链接可正常访问
- ✅ 所有代码可正常运行
- ✅ 无拼写错误和格式问题

---

## 📋 核对清单

### 1️⃣ 技术信息核对 ⭐⭐⭐⭐⭐

#### 机器人品牌列表
- [ ] 核对官方后处理器列表（22 个品牌）
- [ ] 区分后处理器 vs eCatalog 组件
- [ ] 核实新增品牌（VC 5.0 新增）
- [ ] 确认连接器名称和版本

**官方 22 个后处理器品牌（必须逐项核对）：**
```
□ ABB                  □ Mitsubishi MELFA
□ CLOOS                □ Nachi
□ Comau                □ OMRON
□ Denso                □ OTC Daihen
□ Doosan               □ Panasonic
□ FANUC                □ Reis Robotics
□ Hyundai Robotics     □ Siasun
□ IGM                  □ Stäubli
□ Kawasaki             □ Techman
□ KUKA                 □ Universal Robots
□ Yamaha               □ Yaskawa
```

**不在后处理器列表的品牌（需标注）：**
```
□ JAKA - eCatalog 有模型，无后处理器
□ Aubo - eCatalog 有模型，无后处理器
□ Epson - eCatalog 有模型，无后处理器
□ 其他协作机器人品牌
```

#### 软件版本信息
- [ ] 核实 VC 版本号（5.0）
- [ ] 核实 Python 版本（3.12.2）
- [ ] 核实发布日期（2026 年 3 月 12 日）
- [ ] 核实系统要求

#### 功能特性
- [ ] 核实新功能（MBE、自动路径求解器等）
- [ ] 核实支持的文件格式
- [ ] 核实支持的协议（OPC UA、MQTT 等）
- [ ] 核实性能数据（仿真速度提升等）

---

### 2️⃣ 官方文档核对 ⭐⭐⭐⭐⭐

#### 必须查阅的官方页面
- [ ] 官方帮助文档首页
  - https://help.visualcomponents.com/5.0/Premium/en/English/Help.htm
- [ ] 新功能列表
  - https://help.visualcomponents.com/5.0/Premium/en/English/WhatsNew.htm
- [ ] 发布说明
  - https://help.visualcomponents.com/5.0/Premium/en/English/Release_Notes/release_notes_5.0.htm
- [ ] Python 3 API 文档
  - https://help.visualcomponents.com/5.0/Premium/en/Python_3_API/Overview.html
- [ ] 机器人连接器文档
  - https://help.visualcomponents.com/5.0/Premium/en/English/Connectivity/
- [ ] 官网产品页面
  - https://www.visualcomponents.com/products/

#### 核对要点
- [ ] 所有技术参数与官方一致
- [ ] 所有功能描述与官方一致
- [ ] 所有链接可正常访问
- [ ] 所有截图来自官方或自己测试

---

### 3️⃣ 代码示例核对 ⭐⭐⭐⭐⭐

#### Python 代码
- [ ] 语法正确（Python 3）
- [ ] 可正常运行（在 VC 中测试）
- [ ] 导入语句正确（`import vcCore as vc`）
- [ ] 异步函数使用 `async/await`
- [ ] 变量命名规范
- [ ] 注释完整

#### 测试流程
```python
# 1. 在 VC 中创建测试组件
# 2. 添加 Python Script 行为
# 3. 粘贴代码
# 4. 运行仿真
# 5. 检查输出面板
# 6. 确认无错误
```

---

### 4️⃣ 链接核对 ⭐⭐⭐⭐

#### 官方链接
- [ ] 所有链接可正常访问
- [ ] 链接文本准确
- [ ] 无死链
- [ ] 使用官方域名

#### 链接格式
```markdown
✅ 正确：https://help.visualcomponents.com/5.0/...
❌ 错误：help.visualcomponents.com/5.0/...（缺少 https）
```

---

### 5️⃣ 文字核对 ⭐⭐⭐⭐

#### 拼写检查
- [ ] 品牌名称拼写正确
  - ABB（不是 ABB 集团）
  - FANUC（不是 Fanuc）
  - KUKA（不是 Kuka）
  - Yaskawa（不是 YASKAWA）
  - Mitsubishi MELFA（不是 Mitsubishi）
  - Stäubli（注意变音符号）
  - OMRON（不是 Omron）

- [ ] 技术术语正确
  - Python 3（不是 Python3）
  - OPC UA（不是 OPCUA）
  - MQTT（不是 Mqtt）
  - CAD（不是 Cad）
  - PLC（不是 Plc）

#### 格式统一
- [ ] 标题层级一致
- [ ] 代码块格式统一
- [ ] 表格格式统一
- [ ] 列表格式统一

---

### 6️⃣ 图片核对 ⭐⭐⭐

#### 封面图
- [ ] 图片来自官方
- [ ] 图片清晰（≥1200px 宽）
- [ ] 图片比例合适（1.8:1 或 16:9）
- [ ] 无版权问题

#### 文章配图
- [ ] 图片清晰
- [ ] 图片与内容相关
- [ ] 图片有说明文字
- [ ] 无版权风险

---

### 7️⃣ 排版核对 ⭐⭐⭐

#### 公众号排版
- [ ] 标题醒目（使用 HTML 样式）
- [ ] 段落间距合适
- [ ] 代码块清晰
- [ ] 表格在手机端显示正常
- [ ] 无 Markdown 语法残留

#### 手机阅读测试
- [ ] 发送到手机预览
- [ ] 检查代码块是否溢出
- [ ] 检查表格是否完整
- [ ] 检查图片是否清晰
- [ ] 检查排版是否美观

---

### 8️⃣ 作者信息核对 ⭐⭐

- [ ] 作者署名正确（Robotqu）
- [ ] 网站链接正确（https://robotqu.com）
- [ ] B 站链接正确（https://space.bilibili.com/505110287）
- [ ] 公众号名称正确（Robotqu 机器人社区）

---

## ✅ 核对流程

### 第一步：自查（作者）
- [ ] 完成所有核对项
- [ ] 标记不确定的内容
- [ ] 记录核对时间

### 第二步：交叉核对（团队成员）
- [ ] 另一位成员独立核对
- [ ] 重点核对技术信息
- [ ] 记录核对结果

### 第三步：官方文档最终确认
- [ ] 再次查阅官方文档
- [ ] 确认所有技术参数
- [ ] 截图保存核对证据

### 第四步：发布前预览
- [ ] 发送到手机预览
- [ ] 检查所有细节
- [ ] 确认无误后发布

---

## 📝 核对记录模板

```markdown
## 核对记录

**文章标题：** [填写]
**核对日期：** 2026-03-XX
**核对人：** [填写]

### 核对结果
- 技术信息：✅ / ❌
- 官方文档：✅ / ❌
- 代码示例：✅ / ❌
- 链接：✅ / ❌
- 文字：✅ / ❌
- 图片：✅ / ❌
- 排版：✅ / ❌
- 作者信息：✅ / ❌

### 问题记录
1. [问题描述] - [已修正/待确认]
2. [问题描述] - [已修正/待确认]

### 最终确认
- [ ] 所有问题已解决
- [ ] 可以发布
- [ ] 核对时间：[填写]
```

---

## ⚠️ 重要提醒

**每次发布前必须完成核对！**

**宁可延迟发布，也要保证准确性！**

**发现错误立即修正并记录！**

---

*版本：v1.0*  
*创建：2026-03-13*  
*维护：Robotqu 机器人社区*


path: README.md
content: # 寰俊鍏紬鍙疯嚜鍔ㄥ彂甯冩妧鑳?
馃摑 **涓€閿彂甯?Markdown/HTML 鏂囩珷鍒板井淇″叕浼楀彿鑽夌绠?*

---

## 蹇€熷紑濮?
### 1. 瀹夎鎶€鑳?
鎶€鑳藉凡瀹夎鍒帮細
```
C:\Users\JMO\.openclaw\workspace\skills\wechat-publisher-pro/
```

### 2. 閰嶇疆鍏紬鍙?
**鑾峰彇 APPID 鍜?APPSECRET:**
```
1. 鐧诲綍 https://mp.weixin.qq.com
2. 璁剧疆涓庡紑鍙?鈫?鍩烘湰閰嶇疆
3. 澶嶅埗 APPID 鍜?APPSECRET
```

**閰嶇疆 IP 鐧藉悕鍗?**
```
1. 璁剧疆涓庡紑鍙?鈫?鍩烘湰閰嶇疆 鈫?IP 鐧藉悕鍗?2. 娣诲姞浣犵殑鍏綉 IP
3. 绛夊緟 5 鍒嗛挓鐢熸晥
```

### 3. 璁剧疆鐜鍙橀噺

```bash
cd C:\Users\JMO\.openclaw\workspace\skills\wechat-publisher-pro
copy .env.example .env
```

缂栬緫 `.env` 鏂囦欢锛屽～鍏ヤ綘鐨勯厤缃細
```
WECHAT_APPID=浣犵殑 APPID
WECHAT_APPSECRET=浣犵殑 APPSECRET
```

---

## 浣跨敤鏂规硶

### 鏂瑰紡 1: 鍛戒护琛?
```bash
cd C:\Users\JMO\.openclaw\workspace\skills\wechat-publisher-pro

# 鍙戝竷鏂囩珷
python scripts/wechat_publish.py \
  --article "C:/path/to/article.md" \
  --cover "C:/path/to/cover.jpg" \
  --title "鏂囩珷鏍囬" \
  --beautify
```

### 鏂瑰紡 2: 鍦?OpenClaw 涓?
```
甯垜鍙戝竷杩欑瘒鏂囩珷鍒板井淇″叕浼楀彿锛?鏂囩珷锛歮emory/content/articles/openclaw-ecosystem-review.md
灏侀潰锛欴ownloads/wechat-cover-ai-AI 浠ｇ爜.jpg
鏍囬锛歄penClaw 鐢熸€侊細14 涓?AI 椤圭洰妯瘎
```

### 鏂瑰紡 3: Python 浠ｇ爜

```python
from scripts.wechat_publish import WeChatPublisher

publisher = WeChatPublisher(
    appid="你的 APPID",
    appsecret="你的 APPSECRET"
)

result = publisher.publish(
    article_path="article.md",
    cover_path="cover.jpg",
    title="鏂囩珷鏍囬",
    beautify=True
)

print(f"鑽夌 ID: {result}")
```

---

## 鍔熻兘鐗规€?
鉁?**鏍稿績鍔熻兘**
- 涓€閿彂甯冨埌鑽夌绠?- Markdown/HTML 鑷姩杞崲
- 涓枃缂栫爜淇锛圲TF-8锛?- 鑷姩涓婁紶灏侀潰鍥?- 缇庡寲鎺掔増鏍峰紡

鉁?**缇庡寲鐗规€?*
- 娓愬彉瀵艰妗?- 鏍囬鏍峰紡浼樺寲
- 鍒楄〃鏍煎紡缇庡寲
- 娈佃惤闂磋窛浼樺寲
- 搴曢儴淇℃伅鏍?
鉁?**鎶€鏈紭鍔?*
- 瑙ｅ喅 Unicode 杞箟闂
- 瑙ｅ喅涓枃涔辩爜闂
- 鏀寔闀挎枃绔狅紙50000 瀛椾互鍐咃級
- 鑷姩鍥剧墖鍘嬬缉

---

## 鍙傛暟璇存槑

```bash
python scripts/wechat_publish.py \
  --article "鏂囩珷璺緞" \          # 蹇呴渶锛?md 鎴?.html 鏂囦欢
  --cover "灏侀潰鍥捐矾寰? \          # 蹇呴渶锛欽PG/PNG 鍥剧墖
  --title "鏂囩珷鏍囬" \            # 蹇呴渶锛氭枃绔犳爣棰?  --digest "鎽樿" \               # 鍙€夛細鏂囩珷鎽樿
  --appid "APPID" \               # 鍙€夛細榛樿浠庣幆澧冨彉閲忚鍙?  --appsecret "APPSECRET" \       # 鍙€夛細榛樿浠庣幆澧冨彉閲忚鍙?  --beautify                      # 鍙€夛細鍚敤缇庡寲鎺掔増
  --dry-run                       # 鍙€夛細娴嬭瘯妯″紡锛屼笉瀹為檯鍙戝竷
```

---

## 绀轰緥

### 绀轰緥 1: 鍙戝竷鎶€鏈枃绔?
```bash
python scripts/wechat_publish.py \
  --article "memory/content/articles/openclaw-ecosystem-review.md" \
  --cover "Downloads/wechat-cover-ai-AI 浠ｇ爜.jpg" \
  --title "OpenClaw 鐢熸€侊細14 涓?AI 椤圭洰妯瘎" \
  --digest "浠?56 涓囪浠ｇ爜浼樺寲鍒?888KB锛孫penClaw 濡備綍寮曠垎 AI Agent 鐢熸€侊紵" \
  --beautify
```

### 绀轰緥 2: 娴嬭瘯妯″紡

```bash
python scripts/wechat_publish.py \
  --article "article.md" \
  --cover "cover.jpg" \
  --title "娴嬭瘯鏂囩珷" \
  --dry-run
```

### 绀轰緥 3: 涓嶅惎鐢ㄧ編鍖?
```bash
python scripts/wechat_publish.py \
  --article "article.md" \
  --cover "cover.jpg" \
  --title "绠€鍗曟枃绔?
```

---

## 鏂囦欢缁撴瀯

```
wechat-publisher-pro/
鈹溾攢鈹€ SKILL.md                 # 鎶€鑳借鏄?鈹溾攢鈹€ README.md                # 鏈枃妗?鈹溾攢鈹€ .env.example             # 鐜鍙橀噺绀轰緥
鈹溾攢鈹€ scripts/
鈹?  鈹溾攢鈹€ wechat_publish.py    # 涓诲彂甯冭剼鏈?鈹?  鈹溾攢鈹€ beautify_html.py     # 缇庡寲鑴氭湰
鈹?  鈹斺攢鈹€ test_api.py          # API 娴嬭瘯鑴氭湰
鈹溾攢鈹€ templates/
鈹?  鈹斺攢鈹€ article_template.html # 鏂囩珷妯℃澘
鈹斺攢鈹€ examples/
    鈹溾攢鈹€ article.md           # 绀轰緥鏂囩珷
    鈹斺攢鈹€ cover.jpg            # 绀轰緥灏侀潰
```

---

## 甯歌闂

### Q1: Token 鑾峰彇澶辫触

**閿欒淇℃伅:**
```
{'errcode': 40164, 'errmsg': 'invalid ip ...'}
```

**瑙ｅ喅鏂规硶:**
```
1. 鐧诲綍 mp.weixin.qq.com
2. 璁剧疆涓庡紑鍙?鈫?鍩烘湰閰嶇疆 鈫?IP 鐧藉悕鍗?3. 娣诲姞浣犵殑鍏綉 IP锛堣繍琛?curl https://ifconfig.me/ip 鏌ョ湅锛?4. 绛夊緟 5-10 鍒嗛挓鐢熸晥
5. 閲嶈瘯
```

### Q2: 涓枃涔辩爜

**鐜拌薄:** 鑽夌绠辨樉绀?`\u751f\u6001` 鑰屼笉鏄?`鐢熸€乣

**鍘熷洜:** JSON 缂栫爜闂

**瑙ｅ喅:** 鑴氭湰宸茶嚜鍔ㄤ慨澶嶏紝纭繚浣跨敤 `ensure_ascii=False`

### Q3: 鍥剧墖涓婁紶澶辫触

**閿欒淇℃伅:**
```
{'errcode': 45001, 'errmsg': 'file size exceed'}
```

**瑙ｅ喅:**
```
- 鍥剧墖澶у皬锛?10MB
- 鏍煎紡锛欽PG/PNG
- 灏哄锛氬缓璁?1200x630px
```

### Q4: 鎵句笉鍒拌崏绋?
**瑙ｅ喅:**
```
1. 纭鍏紬鍙锋槸鍚︽纭?2. 鏌ョ湅鑽夌绠憋紙涓嶆槸宸插彂琛級
3. 鍒锋柊椤甸潰
4. 妫€鏌?API 杩斿洖鐨?media_id
```

---

## 鏈€浣冲疄璺?
### 1. 鏂囩珷鏍煎紡

```markdown
# 鏍囬

> 瀵艰锛堜細鏄剧ず鍦ㄦ憳瑕佷腑锛?
## 灏忔爣棰?1

鍐呭...

- 鍒楄〃椤?1
- 鍒楄〃椤?2

## 灏忔爣棰?2

鍐呭...
```

### 2. 灏侀潰鍥捐鏍?
- **灏哄:** 1200x630px (2.35:1)
- **鏍煎紡:** JPG/PNG
- **澶у皬:** <10MB
- **鍐呭:** 涓庢枃绔犱富棰樼浉鍏?
### 3. 鍙戝竷鏃堕棿

**鏈€浣虫椂闂?**
- 宸ヤ綔鏃ワ細20:00-22:00
- 鍛ㄦ湯锛?0:00-12:00

### 4. 鍙戝竷娴佺▼

```
1. 鍑嗗鏂囩珷 (.md 鎴?.html)
2. 鍑嗗灏侀潰鍥?3. 杩愯鍙戝竷鑴氭湰
4. 妫€鏌ヨ崏绋跨
5. 鎵嬫満棰勮
6. 纭鍙戝竷
```

---

## 鏇存柊鏃ュ織

### v1.0.0 (2026-03-11)
- 鉁?鍩虹鍙戝竷鍔熻兘
- 鉁?Markdown 杞?HTML
- 鉁?涓枃缂栫爜淇
- 鉁?鑷姩涓婁紶鍥剧墖
- 鉁?缇庡寲鎺掔増

### v1.1.0 (璁″垝)
- 馃搮 鎵归噺鍙戝竷
- 馃搮 瀹氭椂鍙戝竷
- 馃搮 鏁版嵁鍒嗘瀽
- 馃搮 澶氳处鍙锋敮鎸?
---

## 鎶€鏈敮鎸?
**鏂囨。:** 鏌ョ湅鏈洰褰?README.md

**绀轰緥:** `examples/` 鐩綍

**闂鍙嶉:** 鑱旂郴鎶€鑳戒綔鑰?
---

*鏈€鍚庢洿鏂帮細2026-03-11*  
*鐗堟湰锛歷1.0.0*  
*浣滆€咃細Robotqu*



path: wechat_publish.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
微信公众号自动发布工具（精简版）
一键发布 Markdown/HTML 文章到微信公众号草稿箱
支持自动配图、美化排版、UTF-8 编码
"""

import requests
import json
import argparse
from pathlib import Path
from datetime import datetime

class WeChatPublisher:
    """微信公众号发布器"""
    
    def __init__(self, appid, appsecret):
        self.appid = appid
        self.appsecret = appsecret
        self.token = None
    
    def get_token(self):
        """获取 access_token"""
        url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={self.appid}&[REDACTED_SECRET]"
        resp = requests.get(url, timeout=10)
        result = resp.json()
        if "access_token" in result:
            self.[REDACTED_SECRET]"access_token"]
            return self.token
        return None
    
    def upload_image(self, image_path):
        """上传图片获取 media_id"""
        if not self.[REDACTED_SECRET])
        
        url = f"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={self.token}&type=image"
        with open(image_path, 'rb') as f:
            resp = requests.post(url, files={'media': f}, timeout=30)
        result = resp.json()
        return result.get("media_id")
    
    def markdown_to_html(self, content, beautify=True):
        """Markdown 转 HTML（简化版）"""
        html = []
        for line in content.split('\n'):
            line = line.strip()
            if not line:
                continue
            if line.startswith('# '):
                html.append(f'<h2>{line[2:]}</h2>')
            elif line.startswith('## '):
                html.append(f'<h3>{line[3:]}</h3>')
            elif line.startswith('### '):
                html.append(f'<h4>{line[4:]}</h4>')
            else:
                html.append(f'<p>{line}</p>')
        return ''.join(html)
    
    def create_draft(self, title, content, thumb_media_id, digest="", author="RobotQu"):
        """创建草稿"""
        if not self.[REDACTED_SECRET])
        
        html_content = self.markdown_to_html(content)
        draft_data = {
            "articles": [{
                "title": title,
                "content": html_content,
                "author": author,
                "digest": digest,
                "thumb_media_id": thumb_media_id,
                "show_cover_pic": 1
            }]
        }
        
        url = f"https://api.weixin.qq.com/cgi-bin/draft/add?access_token={self.token}"
        json_data = json.dumps(draft_data, ensure_ascii=False).encode('utf-8')
        resp = requests.post(url, data=json_data, timeout=30)
        return resp.json()
    
    def publish(self, article_path, cover_path, title, digest=""):
        """发布文章"""
        print(f"发布文章：{title}")
        
        # 上传封面
        media_id = self.upload_image(cover_path)
        if not media_id:
            print("封面上传失败")
            return None
        
        # 读取文章
        content = Path(article_path).read_text(encoding='utf-8')
        
        # 创建草稿
        result = self.create_draft(title, content, media_id, digest)
        if result.get("media_id"):
            print(f"发布成功！草稿 ID: {result['media_id']}")
            return result["media_id"]
        else:
            print(f"发布失败：{result}")
            return None

def main():
    parser = argparse.ArgumentParser(description='微信公众号自动发布工具')
    parser.add_argument('--article', required=True, help='文章路径')
    parser.add_argument('--cover', required=True, help='封面图路径')
    parser.add_argument('--title', required=True, help='文章标题')
    parser.add_argument('--appid', default='', help='微信公众号 APPID')
    parser.add_argument('--appsecret', default='', help='微信公众号 APPSECRET')
    
    args = parser.parse_args()
    
    # 从环境变量或参数获取配置
    appid = args.appid or "你的 APPID"
    appsecret = args.appsecret or "你的 APPSECRET"
    
    publisher = WeChatPublisher(appid, appsecret)
    publisher.publish(args.article, args.cover, args.title)

if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)