Xiaonangua-openclaw-skills xiaonangua-post-wechat
Xiaonangua fork of baoyu-post-to-wechat. Posts content to WeChat Official Account (微信公众号) via API or Chrome CDP. Supports article posting (文章) with HTML/Markdown and image-text posting (图文).
git clone https://github.com/jiyangnan/xiaonangua-openclaw-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/jiyangnan/xiaonangua-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/content-publish/xiaonangua-post-wechat" ~/.claude/skills/jiyangnan-xiaonangua-openclaw-skills-xiaonangua-post-wechat && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/jiyangnan/xiaonangua-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/content-publish/xiaonangua-post-wechat" ~/.openclaw/skills/jiyangnan-xiaonangua-openclaw-skills-xiaonangua-post-wechat && rm -rf "$T"
skills/content-publish/xiaonangua-post-wechat/SKILL.mdXiaonangua Post to WeChat Official Account
Language
Match user's language: Respond in the same language the user uses. If user writes in Chinese, respond in Chinese. If user writes in English, respond in English.
Origin
This skill is a verbatim copy of
baoyu-post-to-wechat at the time of cloning, with only naming/metadata adjusted.
Script Directory
Agent Execution: Determine this SKILL.md directory as
SKILL_DIR, then use ${SKILL_DIR}/scripts/<name>.ts.
| Script | Purpose |
|---|---|
| Image-text posts (图文) |
| Article posting via browser (文章) |
| Article posting via API (文章) |
Preferences (EXTEND.md)
Use Bash to check EXTEND.md existence (priority order):
# Check project-level first test -f .baoyu-skills/xiaonangua-post-wechat/EXTEND.md && echo "project" # Then user-level (cross-platform: $HOME works on macOS/Linux/WSL) test -f "$HOME/.baoyu-skills/xiaonangua-post-wechat/EXTEND.md" && echo "user"
┌────────────────────────────────────────────────────────┬───────────────────┐ │ Path │ Location │ ├────────────────────────────────────────────────────────┼───────────────────┤ │ .baoyu-skills/xiaonangua-post-wechat/EXTEND.md │ Project directory │ ├────────────────────────────────────────────────────────┼───────────────────┤ │ $HOME/.baoyu-skills/xiaonangua-post-wechat/EXTEND.md │ User home │ └────────────────────────────────────────────────────────┴───────────────────┘
┌───────────┬───────────────────────────────────────────────────────────────────────────┐ │ Result │ Action │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ Found │ Read, parse, apply settings │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ Not found │ Run first-time setup (references/config/first-time-setup.md) → Save → Continue │ └───────────┴───────────────────────────────────────────────────────────────────────────┘
EXTEND.md Supports: Default theme | Default publishing method (api/browser) | Default author | Default open-comment switch | Default fans-only-comment switch | Chrome profile path
First-time setup: references/config/first-time-setup.md
Minimum supported keys (case-insensitive, accept
1/0 or true/false):
| Key | Default | Mapping |
|---|---|---|
| empty | Fallback for when CLI/frontmatter not provided |
| | in request |
| | in request |
Recommended EXTEND.md example:
default_theme: default default_publish_method: api default_author: 宝玉 need_open_comment: 1 only_fans_can_comment: 0 chrome_profile_path: /path/to/chrome/profile
Value priority:
- CLI arguments
- Frontmatter
- EXTEND.md
- Skill defaults
Image-Text Posting (图文)
For short posts with multiple images (up to 9):
npx -y bun ${SKILL_DIR}/scripts/wechat-browser.ts --markdown article.md --images ./images/ npx -y bun ${SKILL_DIR}/scripts/wechat-browser.ts --title "标题" --content "内容" --image img.png --submit
See references/image-text-posting.md for details.
Article Posting Workflow (文章)
Copy this checklist and check off items as you complete them:
Publishing Progress: - [ ] Step 0: Load preferences (EXTEND.md) - [ ] Step 1: Determine input type - [ ] Step 2: Check markdown-to-html skill - [ ] Step 3: Convert to HTML - [ ] Step 4: Validate metadata (title, summary, cover) - [ ] Step 5: Select method and configure credentials - [ ] Step 6: Publish to WeChat - [ ] Step 7: Report completion
Step 0: Load Preferences
Check and load EXTEND.md settings (see Preferences section above).
CRITICAL: If not found, complete first-time setup BEFORE any other steps or questions.
Resolve and store these defaults for later steps:
default_author
(defaultneed_open_comment
)1
(defaultonly_fans_can_comment
)0
Step 1: Determine Input Type
| Input Type | Detection | Action |
|---|---|---|
| HTML file | Path ends with , file exists | Skip to Step 4 |
| Markdown file | Path ends with , file exists | Continue to Step 2 |
| Plain text | Not a file path, or file doesn't exist | Save to markdown, then Step 2 |
Plain Text Handling:
- Generate slug from content (first 2-4 meaningful words, kebab-case)
- Create directory and save file:
mkdir -p "$(pwd)/post-to-wechat/$(date +%Y-%m-%d)" # Save content to: post-to-wechat/yyyy-MM-dd/[slug].md
- Continue processing as markdown file
Slug Examples:
- "Understanding AI Models" →
understanding-ai-models - "人工智能的未来" →
(translate to English for slug)ai-future
Step 2: Check Markdown-to-HTML Skill
Skip if: Input is
.html file
Skill Discovery:
# Check if baoyu-markdown-to-html exists test -f skills/baoyu-markdown-to-html/SKILL.md && echo "found"
| Result | Action |
|---|---|
| Found | Read its SKILL.md, continue to Step 3 |
| Multiple skills | AskUserQuestion to choose |
| Not found | Show installation suggestion |
When Not Found:
No markdown-to-html skill found. Suggested installation: https://github.com/JimLiu/baoyu-skills/blob/main/skills/baoyu-markdown-to-html/SKILL.md Options: A) Cancel - install the skill first B) Continue - provide HTML file manually
Step 3: Convert Markdown to HTML
Skip if: Input is
.html file
- Ask theme preference (unless specified in EXTEND.md or CLI):
| Theme | Description |
|---|---|
| 经典主题 - 传统排版,标题居中带底边,二级标题白字彩底 |
| 优雅主题 - 文字阴影,圆角卡片,精致引用块 |
| 简洁主题 - 现代极简风,不对称圆角,清爽留白 |
- Execute conversion (using the discovered skill):
npx -y bun ${MD_TO_HTML_SKILL_DIR}/scripts/main.ts <markdown_file> --theme <theme>
- Parse JSON output to get:
,htmlPath
,title
,author
,summarycontentImages
Step 4: Validate Metadata
Check extracted metadata from Step 3 (or HTML meta tags if direct HTML input).
| Field | If Missing |
|---|---|
| Title | Prompt: "Enter title, or press Enter to auto-generate from content" |
| Summary | Prompt: "Enter summary, or press Enter to auto-generate (recommended for SEO)" |
| Author | Use fallback chain: CLI → frontmatter → EXTEND.md |
Auto-Generation Logic:
- Title: First H1/H2 heading, or first sentence
- Summary: First paragraph, truncated to 120 characters
Cover Image Check (required for
article_type=news):
- Use CLI
if provided.--cover - Else use frontmatter (
,featureImage
,coverImage
,cover
).image - Else check article directory default path:
.imgs/cover.png - Else fallback to first inline content image.
- If still missing, stop and request a cover image before publishing.
Step 5: Select Publishing Method and Configure
Ask publishing method (unless specified in EXTEND.md or CLI):
| Method | Speed | Requirements |
|---|---|---|
(Recommended) | Fast | API credentials |
| Slow | Chrome, login session |
If API Selected - Check Credentials:
# Check project-level test -f .baoyu-skills/.env && grep -q "WECHAT_APP_ID" .baoyu-skills/.env && echo "project" # Check user-level test -f "$HOME/.baoyu-skills/.env" && grep -q "WECHAT_APP_ID" "$HOME/.baoyu-skills/.env" && echo "user"
If Credentials Missing - Guide Setup:
WeChat API credentials not found. To obtain credentials: 1. Visit https://mp.weixin.qq.com 2. Go to: 开发 → 基本配置 3. Copy AppID and AppSecret Where to save? A) Project-level: .baoyu-skills/.env (this project only) B) User-level: ~/.baoyu-skills/.env (all projects)
After location choice, prompt for values and write to
.env:
WECHAT_APP_ID=<user_input> WECHAT_APP_SECRET=<user_input>
Step 6: Publish to WeChat
API method:
npx -y bun ${SKILL_DIR}/scripts/wechat-api.ts <html_file> [--title <title>] [--summary <summary>] [--author <author>] [--cover <cover_path>] [--no-tail]
payload rules:draft/add
- Use endpoint:
POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
:article_type
(default) ornewsnewspic- For
, includenews
(cover is required)thumb_media_id - Always resolve and send:
(defaultneed_open_comment
)1
(defaultonly_fans_can_comment
)0
resolution: CLIauthor
→ frontmatter--author
→ EXTEND.mdauthordefault_author
If script parameters do not expose the two comment fields, still ensure final API request body includes resolved values.
Browser method:
npx -y bun ${SKILL_DIR}/scripts/wechat-article.ts --html <html_file> [--no-tail]
Step 7: Completion Report
For API method, include draft management link:
WeChat Publishing Complete! Input: [type] - [path] Method: API Theme: [theme name] Article: • Title: [title] • Summary: [summary] • Images: [N] inline images • Comments: [open/closed], [fans-only/all users] Result: ✓ Draft saved to WeChat Official Account • media_id: [media_id] Next Steps: → Manage drafts: https://mp.weixin.qq.com (登录后进入「内容管理」→「草稿箱」) Files created: [• post-to-wechat/yyyy-MM-dd/slug.md (if plain text)] [• slug.html (converted)]
For Browser method:
WeChat Publishing Complete! Input: [type] - [path] Method: Browser Theme: [theme name] Article: • Title: [title] • Summary: [summary] • Images: [N] inline images Result: ✓ Draft saved to WeChat Official Account Files created: [• post-to-wechat/yyyy-MM-dd/slug.md (if plain text)] [• slug.html (converted)]
Detailed References
| Topic | Reference |
|---|---|
| Image-text parameters, auto-compression | references/image-text-posting.md |
| Article themes, image handling | references/article-posting.md |
Feature Comparison
| Feature | Image-Text | Article (API) | Article (Browser) |
|---|---|---|---|
| Plain text input | ✗ | ✓ | ✓ |
| HTML input | ✗ | ✓ | ✓ |
| Markdown input | Title/content | ✓ (via skill) | ✓ (via skill) |
| Multiple images | ✓ (up to 9) | ✓ (inline) | ✓ (inline) |
| Themes | ✗ | ✓ | ✓ |
| Auto-generate metadata | ✗ | ✓ | ✓ |
Default cover fallback () | ✗ | ✓ | ✗ |
Comment control (, ) | ✗ | ✓ | ✗ |
| Requires Chrome | ✓ | ✗ | ✓ |
| Requires API credentials | ✗ | ✓ | ✗ |
| Speed | Medium | Fast | Slow |
Prerequisites
For API method:
- WeChat Official Account API credentials
- Guided setup in Step 5, or manually set in
.baoyu-skills/.env
For Browser method:
- Google Chrome
- First run: log in to WeChat Official Account (session preserved)
For Markdown conversion:
- A markdown-to-html skill (e.g.,
)baoyu-markdown-to-html - If not installed, the workflow will suggest installation
Config File Locations (priority order):
- Environment variables
<cwd>/.baoyu-skills/.env~/.baoyu-skills/.env
Browser Method: Reliability Defaults (2026-02)
scripts/wechat-article.ts (browser method) includes a hardened pipeline for the WeChat editor’s HTML/CSS sanitization and flaky paste behavior:
-
Image placeholders that survive WeChat paste
- When loading HTML, the script injects a visible text marker
before each placeholderMDTOHTMLIMGPH_N
.<img src="MDTOHTMLIMGPH_N"> - After paste, the script finds the marker text → deletes it → pastes the real local image.
- When loading HTML, the script injects a visible text marker
-
Mac terminal dark code blocks (no global CSS)
- WeChat often strips
; the script forces inline styles for code blocks:<style>
→pre.hljs.code__pre
.background:#0b1020; color:#E5E7EB
- WeChat often strips
-
Image insertion is verifiable + retry
- After each image paste, the script waits for the editor
count to increase; if not, it retries paste (up to 3 times).<img>
- After each image paste, the script waits for the editor
-
Body paste fallback (avoid “textLength=8” false success)
- If Cmd+V paste results in a suspiciously short body, the script falls back to
.document.execCommand('insertHTML', ...)
- If Cmd+V paste results in a suspiciously short body, the script falls back to
-
Avoid
ENOTEMPTYnpx bun- For markdown conversion in this skill, prefer calling
directly when possible.bun
- For markdown conversion in this skill, prefer calling
Troubleshooting
| Issue | Solution |
|---|---|
| No markdown-to-html skill | Install from suggested URL |
| Missing API credentials | Follow guided setup in Step 5 |
| Access token error | Check if API credentials are valid and not expired |
| Not logged in (browser) | First run opens browser - scan QR to log in |
| Chrome not found | Set env var |
| Title/summary missing | Use auto-generation or provide manually |
| No cover image | Add frontmatter cover or place in article directory |
| Wrong comment defaults | Check keys and |
| Paste fails (Cmd+V silently) | macOS: enable Accessibility for the terminal running the script (System Settings → Privacy & Security → Accessibility). Also ensure Chrome is frontmost. |
Extension Support
Custom configurations via EXTEND.md. See Preferences section for paths and supported options.