HomeBrowseUpload
← Back to registry
// Skill profile

WeWrite — WeChat AI Publishing Skill

name: wewrite-wechat-ai-publishing

by adisinghstudent · published 2026-04-01

开发工具图像生成
Total installs
0
Stars
★ 0
Last updated
2026-04
// Install command
$ claw add gh:adisinghstudent/adisinghstudent-wewrite-wechat-ai-publishing
View on GitHub
// Full documentation

---

name: wewrite-wechat-ai-publishing

description: Full-pipeline AI skill for WeChat Official Account articles — hotspot fetching, topic selection, writing, SEO, image generation, formatting, and draft box publishing.

triggers:

- "写一篇公众号文章"

- "帮我写微信公众号"

- "抓取热点写文章"

- "发布文章到微信草稿箱"

- "生成公众号封面图"

- "分析SEO关键词"

- "排版微信文章"

- "用wewrite写文章"

---

# WeWrite — WeChat AI Publishing Skill

> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.

WeWrite is a full-pipeline AI skill for producing WeChat Official Account (公众号) articles end-to-end: hotspot fetching → topic selection → writing → SEO → AI image generation → formatting → draft box publishing. It runs as a Claude Code skill (via `SKILL.md`) but every component also works standalone.

---

Installation

As a Claude Code Skill

# Clone the repo
git clone https://github.com/oaker-io/wewrite.git ~/.claude/skills/wewrite

# Or copy into an existing project
cp -r wewrite ~/.claude/skills/wewrite

Python Dependencies

cd wewrite
pip install -r requirements.txt

Configuration

cp config.example.yaml config.yaml

Edit `config.yaml`:

wechat:
  appid: "${WECHAT_APPID}"         # WeChat Official Account App ID
  secret: "${WECHAT_SECRET}"       # WeChat Official Account Secret

image_gen:
  provider: "doubao"               # "doubao" or "openai"
  doubao_api_key: "${DOUBAO_API_KEY}"
  openai_api_key: "${OPENAI_API_KEY}"

output_dir: "./output"

Set environment variables instead of hardcoding secrets:

export WECHAT_APPID="wx1234567890abcdef"
export WECHAT_SECRET="your_secret_here"
export DOUBAO_API_KEY="your_doubao_key"
export OPENAI_API_KEY="sk-..."

---

Triggering the Full Pipeline

Once installed as a Claude Code skill, simply say:

用 demo 的配置写一篇公众号文章

Claude will execute all steps automatically using `clients/demo/style.yaml` as the client profile.

You can also specify a client:

用 clients/tech-blog 的风格,围绕今日热点写一篇公众号文章,发布到草稿箱

---

Pipeline Steps & Scripts

1. Fetch Hotspots

Scrapes real-time trending topics from Weibo, Toutiao, and Baidu.

python3 scripts/fetch_hotspots.py --limit 20
python3 scripts/fetch_hotspots.py --limit 10 --json   # JSON output

Output example:

[
  {"rank": 1, "title": "DeepSeek R2 发布", "source": "weibo", "heat": 98200},
  {"rank": 2, "title": "A股科技板块大涨", "source": "baidu", "heat": 75300}
]

2. SEO Keyword Analysis

Queries Baidu and 360 search suggestions to score keywords.

python3 scripts/seo_keywords.py "AI大模型" "科技股"
python3 scripts/seo_keywords.py --json "ChatGPT" "人工智能"

Python usage:

from scripts.seo_keywords import analyze_keywords

results = analyze_keywords(["AI大模型", "大语言模型", "GPT-5"])
for kw in results:
    print(f"{kw['keyword']}: score={kw['score']}, volume={kw['estimated_volume']}")

3. Topic Selection

Claude reads `references/topic-selection.md` and generates 10 candidate topics scored on:

  • **热度** (trending heat)
  • **契合度** (client fit)
  • **差异化** (differentiation)
  • 4. Framework & Writing

    Claude reads `references/frameworks.md` (5 frameworks) and `references/writing-guide.md` (de-AI style rules), then writes the article adapted to the client's tone.

    5. AI Image Generation

    # Cover image (recommended 900×383)
    python3 toolkit/image_gen.py \
      --prompt "科技感封面,蓝色光线,未来感" \
      --output output/cover.png \
      --size cover
    
    # Inline content image
    python3 toolkit/image_gen.py \
      --prompt "程序员在办公室工作,现代风格插画" \
      --output output/img1.png \
      --provider openai

    Python usage:

    from toolkit.image_gen import generate_image
    
    path = generate_image(
        prompt="AI机器人与人类握手,科技感插画",
        output_path="output/cover.png",
        size="cover",          # "cover" (900x383) or "content" (800x600)
        provider="doubao"      # "doubao" or "openai"
    )
    print(f"Generated: {path}")

    6. Formatting — Markdown → WeChat HTML

    WeChat requires inline styles. The converter handles this automatically.

    # Preview in browser
    python3 toolkit/cli.py preview article.md --theme professional-clean
    
    # Available themes
    python3 toolkit/cli.py themes

    Python usage:

    from toolkit.converter import MarkdownConverter
    from toolkit.theme import load_theme
    
    theme = load_theme("tech-modern")
    converter = MarkdownConverter(theme=theme)
    
    with open("article.md") as f:
        markdown_content = f.read()
    
    html = converter.convert(markdown_content)
    # html is WeChat-ready with all inline styles

    7. Publish to WeChat Draft Box

    python3 toolkit/cli.py publish article.md \
      --cover output/cover.png \
      --title "2026年AI大模型最新进展" \
      --author "科技观察"

    Python usage:

    from toolkit.publisher import WeChatPublisher
    from toolkit.wechat_api import WeChatAPI
    
    api = WeChatAPI(appid=os.environ["WECHAT_APPID"], secret=os.environ["WECHAT_SECRET"])
    publisher = WeChatPublisher(api=api)
    
    # Upload cover image first
    media_id = api.upload_image("output/cover.png")
    
    # Push to draft box
    draft_id = publisher.create_draft(
        title="2026年AI大模型最新进展",
        content=html_content,          # inline-styled HTML from converter
        cover_media_id=media_id,
        author="科技观察",
        digest="本文盘点2026年大模型最新进展..."   # summary/excerpt
    )
    print(f"Draft created: {draft_id}")

    8. Fetch Article Stats (回填数据)

    python3 scripts/fetch_stats.py --article-id "your_article_id"

    9. Learn from Manual Edits

    python3 scripts/learn_edits.py \
      --original output/draft.md \
      --edited output/final.md \
      --client demo

    Extracts style rules from diffs and appends them to the client's playbook.

    ---

    Client Configuration

    Each client lives in `clients/{name}/style.yaml`:

    # clients/my-tech-blog/style.yaml
    name: "我的科技博客"
    industry: "科技/AI"
    topics:
      - "人工智能"
      - "大模型应用"
      - "编程技术"
    tone: "专业严谨,偶尔幽默,面向中级开发者"
    theme: "tech-modern"
    avoid:
      - "过度营销语言"
      - "绝对化表述"
    wechat:
      appid: "${WECHAT_APPID}"
      secret: "${WECHAT_SECRET}"

    Create a new client:

    mkdir clients/my-client
    cp clients/demo/style.yaml clients/my-client/style.yaml
    # Edit style.yaml for your client

    ---

    Themes

    | Theme | Style |

    |---|---|

    | `professional-clean` | Clean professional (default) |

    | `tech-modern` | Tech-forward blue/purple gradient |

    | `warm-editorial` | Warm editorial tones |

    | `minimal` | Minimal black/white |

    python3 toolkit/cli.py themes          # list all themes with previews
    python3 toolkit/cli.py preview article.md --theme warm-editorial

    Custom theme (YAML):

    # toolkit/themes/my-theme.yaml
    name: my-theme
    body:
      font-family: "'PingFang SC', sans-serif"
      font-size: "16px"
      color: "#333"
      line-height: "1.8"
    h2:
      color: "#1a73e8"
      font-weight: "bold"
      border-left: "4px solid #1a73e8"
      padding-left: "10px"
    blockquote:
      background: "#f0f4ff"
      border-left: "3px solid #4285f4"
      padding: "12px 16px"
      color: "#555"

    ---

    Full Pipeline — Python Orchestration

    import subprocess
    import json
    import os
    from toolkit.converter import MarkdownConverter
    from toolkit.theme import load_theme
    from toolkit.publisher import WeChatPublisher
    from toolkit.wechat_api import WeChatAPI
    from toolkit.image_gen import generate_image
    
    # 1. Fetch hotspots
    result = subprocess.run(
        ["python3", "scripts/fetch_hotspots.py", "--limit", "20", "--json"],
        capture_output=True, text=True
    )
    hotspots = json.loads(result.stdout)
    
    # 2. SEO analysis on top topics
    from scripts.seo_keywords import analyze_keywords
    top_titles = [h["title"] for h in hotspots[:5]]
    seo_scores = analyze_keywords(top_titles)
    
    # 3. (Claude selects topic, writes article — handled by SKILL.md)
    # After Claude produces article.md:
    
    # 4. Generate cover
    cover_path = generate_image(
        prompt="科技感封面图,蓝色渐变,数字化未来",
        output_path="output/cover.png",
        size="cover",
        provider=os.environ.get("IMAGE_PROVIDER", "doubao")
    )
    
    # 5. Convert Markdown → WeChat HTML
    theme = load_theme("tech-modern")
    converter = MarkdownConverter(theme=theme)
    with open("output/article.md") as f:
        html = converter.convert(f.read())
    
    # 6. Publish to draft box
    api = WeChatAPI(
        appid=os.environ["WECHAT_APPID"],
        secret=os.environ["WECHAT_SECRET"]
    )
    publisher = WeChatPublisher(api=api)
    media_id = api.upload_image(cover_path)
    draft_id = publisher.create_draft(
        title="选定标题",
        content=html,
        cover_media_id=media_id,
        author="作者名"
    )
    print(f"✅ Published draft: {draft_id}")

    ---

    References Claude Uses During Pipeline

    These files are read automatically by Claude when executing the skill:

    | File | Purpose |

    |---|---|

    | `references/topic-selection.md` | 10-topic scoring rules (heat × fit × differentiation) |

    | `references/frameworks.md` | 5 article structure templates |

    | `references/writing-guide.md` | Style rules, de-AI-ification techniques |

    | `references/seo-rules.md` | WeChat SEO: title length, keyword density, tags |

    | `references/visual-prompts.md` | Image generation prompt templates |

    | `references/wechat-constraints.md` | WeChat HTML/CSS technical limits |

    | `references/style-template.md` | Client style.yaml schema documentation |

    ---

    Troubleshooting

    **WeChat API 40001 / invalid credential**

    # Access token expires every 2 hours — the API wrapper auto-refreshes,
    # but verify your appid/secret are correct:
    python3 -c "
    from toolkit.wechat_api import WeChatAPI
    import os
    api = WeChatAPI(os.environ['WECHAT_APPID'], os.environ['WECHAT_SECRET'])
    print(api.get_access_token())
    "

    **Image generation fails**

    # Test provider connectivity
    python3 toolkit/image_gen.py \
      --prompt "测试图片" \
      --output /tmp/test.png \
      --provider doubao
    # If doubao fails, switch to openai in config.yaml

    **Markdown conversion missing styles**

    # Verify theme loads correctly
    python3 -c "from toolkit.theme import load_theme; print(load_theme('tech-modern'))"
    
    # Preview output before publishing
    python3 toolkit/cli.py preview article.md --theme tech-modern
    # Opens browser with rendered HTML

    **Hotspot fetch returns empty**

    # Platforms occasionally change their APIs — run with verbose:
    python3 scripts/fetch_hotspots.py --limit 5 --verbose
    # Check which sources are failing; the script supports weibo/baidu/toutiao independently

    **Article not appearing in draft box**

  • Ensure the WeChat account has **服务号** or **订阅号** API access enabled
  • Check that your IP is whitelisted in the WeChat MP platform settings
  • Draft box (`草稿箱`) requires `draft.add` API permission
  • ---

    Quick Reference

    # Full standalone workflow
    python3 scripts/fetch_hotspots.py --limit 20 --json > hotspots.json
    python3 scripts/seo_keywords.py --json "关键词1" "关键词2"
    python3 toolkit/image_gen.py --prompt "封面描述" --output cover.png --size cover
    python3 toolkit/cli.py preview article.md --theme tech-modern
    python3 toolkit/cli.py publish article.md --cover cover.png --title "标题"
    
    # Build playbook from historical articles
    python3 scripts/build_playbook.py --client demo
    
    # Learn from edits
    python3 scripts/learn_edits.py --original draft.md --edited final.md --client demo
    
    # Fetch article performance data
    python3 scripts/fetch_stats.py --article-id "msgid_here"
    // Comments
    Sign in with GitHub to leave a comment.
    // Related skills

    More tools from the same signal band