wechat-article-maker
npx skills add https://github.com/alpha-hecoding/awesome-skills --skill wechat-article-maker
Agent 安装分布
Skill 文档
å¾®ä¿¡å ¬ä¼å·æç« åä½ä¸åå¸
è¯è¨
å¹é ç¨æ·è¯è¨ï¼ä½¿ç¨ç¨æ·æç¨çè¯è¨è¿è¡ååºãç¨æ·ç¨ä¸æåç¨ä¸æååºï¼ç¨è±æåç¨è±æååºã
ç®å½ç»æ
wechat-article-maker/
âââ scripts/ # TypeScript æºæä»¶
â âââ wechat-api.ts # API åå¸é»è¾
â âââ wechat-article.ts # æµè§å¨åå¸é»è¾
â âââ wechat-browser.ts # 徿åå¸é»è¾
â âââ image-utils.ts # å¾çå¤çå·¥å
·ï¼sharp éæï¼
â âââ generate-cover.ts # å°é¢çæé»è¾
â âââ md-to-wechat.ts # Markdown 转æ¢é»è¾
â âââ ensure-deps.ts # ä¾èµèªå¨å®è£
â âââ md/ # Markdown 渲æå¼æ
â âââ render.ts
â âââ themes/ # 䏻颿 ·å¼
â âââ extensions/ # æ©å±æä»¶
âââ references/ # åèææ¡£
âââ SKILL.md # æè½ææ¡£
âââ README.md # 项ç®è¯´æ
Agent æ§è¡ï¼ç¡®å®æ¤ SKILL.md ç®å½ä¸º SKILL_DIRï¼ææå½ä»¤éè¿ npx -y bun è¿è¡ï¼
è¿è¡æ¹å¼
# 设置æè½ç®å½
SKILL_DIR="${SKILL_DIR}"
# ææèæ¬éè¿ npx -y bun è¿è¡ï¼è·¨å¹³å°ç»ä¸ï¼
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" article.md --inline-css
npx -y bun "${SKILL_DIR}/scripts/md-to-wechat.ts" article.md --theme grace
npx -y bun "${SKILL_DIR}/scripts/generate-cover.ts" --title "æ é¢" --output cover.jpg
ä¾èµèªå¨å®è£ ï¼èæ¬é¦æ¬¡è¿è¡æ¶ä¼èªå¨æ£æµå¹¶å®è£ æéä¾èµï¼æ éæå¨æä½ã
ä¾èµå®è£
èªå¨å®è£ ï¼ææä¾èµä¼å¨èæ¬é¦æ¬¡è¿è¡æ¶èªå¨å®è£ ï¼æ éæå¨æä½ã
è¿è¡æ¶è¦æ±ï¼
- â
Bunï¼æ¨èï¼éè¿
npx -y bun使ç¨ï¼
ä¾èµè¯´æï¼èªå¨å®è£ ï¼ï¼
front-matter– Frontmatter è§£æhighlight.js– 代ç é«äº®marked– Markdown 渲æå¼æreading-time– é 读æ¶é´è®¡ç®juice– CSS å è转æ¢@napi-rs/canvas– 髿§è½å¾ççæï¼å¯éï¼ç¨äºå°é¢ï¼sharp– å¾çå¤çåºï¼å ç½®ï¼ç¨äºå¾çæ¸ çåå°é¢çæï¼
ä¾èµè¯´æï¼
sharpä¼å¨é¦æ¬¡è¿è¡æ¶éè¿scripts/ensure-deps.tsèªå¨å®è£- 妿å¯éä¾èµæªå®è£
ï¼
generate-coverä¼èªå¨çæ SVG æ ¼å¼çå°é¢å¾ï¼å¾®ä¿¡ä¹æ¯æï¼
åè½æ¦è¿°
æ¬æè½æä¾å®æ´çå¾®ä¿¡å ¬ä¼å·æç« 工使µï¼
- å 容å使¨¡å¼ï¼è¾å ¥ææ¬å å®¹ï¼æºè½çè§£ãçææç«
- 龿¥å叿¨¡å¼ï¼è¾å ¥æç« 龿¥ï¼ä¸è½½ãå¤çå¹¶åå¸
- Markdown 转æ¢ï¼å ç½® Markdown å° HTML 转æ¢ï¼æ¯æå¤ä¸»é¢
- å¾çå¤çï¼èªå¨ä¸è½½ãæ¸ æ´å æ°æ®ã符å微信è§è
- æ ·å¼è½¬æ¢ï¼èªå¨å° CSS 转为å èæ ·å¼
- ä¸é®åå¸ï¼æ¯æ APIï¼å¿«éï¼åæµè§å¨ï¼å¯è§åï¼ä¸¤ç§æ¹å¼
å好设置ï¼EXTEND.mdï¼
ä½¿ç¨ Bash æ£æ¥ EXTEND.md å卿§ï¼ä¼å 级顺åºï¼ï¼
# æ£æ¥é¡¹ç®çº§å«
test -f .awesome-skills/wechat-article-maker/EXTEND.md && echo "project"
# æ£æ¥ç¨æ·çº§å«ï¼è·¨å¹³å°ï¼$HOME å¨ macOS/Linux/WSL ä¸é½å¯ç¨ï¼
test -f "$HOME/.awesome-skills/wechat-article-maker/EXTEND.md" && echo "user"
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¬ââââââââââââââââââââ â è·¯å¾ â ä½ç½® â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââââââââââââ⤠â .awesome-skills/wechat-article-maker/EXTEND.md â 项ç®ç®å½ â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââââââââââââ⤠â $HOME/.awesome-skills/wechat-article-maker/EXTEND.md â ç¨æ·ä¸»ç®å½ â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââââââââââââââ
âââââââââââââ¬ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â ç»æ â æä½ â âââââââââââââ¼ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤ â æ¾å° â 读åãè§£æãåºç¨è®¾ç½® â âââââââââââââ¼ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¤ â æªæ¾å° â 使ç¨é»è®¤å¼ â âââââââââââââ´ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
EXTEND.md æ¯æï¼é»è®¤ä¸»é¢ | é»è®¤å叿¹æ³ï¼api/browserï¼| é»è®¤ä½è | Chrome é ç½®æä»¶è·¯å¾
工使µç¨éæ©
æ ¹æ®ç¨æ·è¾å ¥èªå¨éæ©å·¥ä½æµç¨ï¼
| è¾å ¥ç±»å | è¯å«æ¹å¼ | 工使µç¨ |
|---|---|---|
| çº¯ææ¬å 容 | ä¸å å«é¾æ¥ | å 容å使µç¨ |
| ææ¬ + åè龿¥ | å å«é¾æ¥ï¼ä½ä¸»ä½æ¯ææ¬æè¿° | å 容å使µç¨ï¼å«é¾æ¥åæï¼ |
| å个æç« 龿¥ | ä» å å« URLï¼ææç¡®è¯´”åå¸è¿ç¯æç« “ | 龿¥å叿µç¨ |
| Markdown æä»¶è·¯å¾ | 以 .md ç»å°¾çæä»¶è·¯å¾ |
Markdown 转æ¢å叿µç¨ |
| HTML æä»¶è·¯å¾ | 以 .html ç»å°¾çæä»¶è·¯å¾ |
ç´æ¥å叿µç¨ |
æµç¨ 1: å 容åä½ä¸åå¸
å½ç¨æ·è¾å ¥ææ¬å 容ï¼å¯éå å«åè龿¥ï¼æ¶ä½¿ç¨æ¤æµç¨ã
åä½è¿åº¦æ¸ å
å¤å¶æ¤æ¸ åå¹¶å¨å®ææ¶å¾éï¼
å
容åä½è¿åº¦ï¼
- [ ] æ¥éª¤ 0: å è½½å好设置
- [ ] æ¥éª¤ 1: å
容åæä¸é¾æ¥æå
- [ ] æ¥éª¤ 2: 龿¥å
容è·åä¸çè§£
- [ ] æ¥éª¤ 3: 询é®åä½å好
- [ ] æ¥éª¤ 4: çæ Markdown æç«
- [ ] æ¥éª¤ 5: ç¨æ·ç¡®è®¤ä¸ä¼å
- [ ] æ¥éª¤ 6: 转æ¢ä¸º HTML
- [ ] æ¥éª¤ 7: åå¤å°é¢å¾
- [ ] æ¥éª¤ 8: åå¸å°å¾®ä¿¡
- [ ] æ¥éª¤ 9: 宿æ¥å
æ¥éª¤ 0: å è½½å好设置
æ£æ¥å¹¶å è½½ EXTEND.md 设置ï¼è§ä¸æ¹å好设置é¨åï¼ã
æ¥éª¤ 1: å 容åæä¸é¾æ¥æå
åæç¨æ·è¾å ¥ï¼
- æåææé¾æ¥ï¼
# æå HTTP/HTTPS 龿¥
echo "$user_input" | grep -oE 'https?://[^\s]+' > /tmp/links.txt
- 夿å
容类åï¼
- å¦æä» æåä¸ªé¾æ¥ä¸æ å ¶ä»ææ¬ â è½¬å°æµç¨ 2: 龿¥å叿µç¨
- å¦ææææ¬å 容ï¼å¯é龿¥ï¼â ç»§ç»å 容å使µç¨
æ¥éª¤ 2: 龿¥å 容è·åä¸çè§£
妿å 容ä¸å å«åè龿¥ï¼
- è·åæ¯ä¸ªé¾æ¥çå 容ï¼
// ä½¿ç¨ WebFetch è·åå¹¶åæ
for (const url of links) {
const content = await WebFetch(url, `
请æåå¹¶æ»ç»ä»¥ä¸ä¿¡æ¯ï¼
1. æç« æ é¢
2. ä½è
ï¼å¦æï¼
3. æ ¸å¿è§ç¹ï¼3-5个è¦ç¹ï¼
4. å
³é®æ°æ®ææ¡ä¾
5. å¯å¼ç¨çéå¥
ä»¥ç»æåæ ¼å¼è¿åï¼ä¾¿äºåç»å¼ç¨ã
`);
}
- æ´çåèèµæï¼
- 为æ¯ä¸ªé¾æ¥å建æè¦å¡ç
- æ æ³¨å ³é®å¼ç¨ç¹
- è®°å½å¯ç¨å¾çææ°æ®
æ¥éª¤ 3: 询é®åä½å好
ä½¿ç¨ AskUserQuestion 询é®ç¨æ·å好ï¼
æç« åä½é
ç½®
é®é¢1ï¼æç« é£æ ¼
header: "飿 ¼"
é项ï¼
- ä¸ä¸åæ - 深度解读ï¼éåææ¯æè¡ä¸åæï¼æ¨èï¼
- è½»æ¾ç§æ® - éä¿ææï¼éå大ä¼è¯»è
- æç¨æå - æ¥éª¤æ¸
æ°ï¼éå宿æ§å
容
- è§ç¹è¯è®º - è¡¨è¾¾çæ³ï¼éåçç¹è¯è®º
é®é¢2ï¼æç« é¿åº¦
header: "é¿åº¦"
é项ï¼
- çæï¼800-1200åï¼- å¿«éé
读
- ä¸çï¼1500-2500åï¼- 平衡深度ä¸å¯è¯»æ§ï¼æ¨èï¼
- é¿æï¼3000å+ï¼- æ·±åº¦é¿æ
é®é¢3ï¼åèèµæå¤çï¼å¦æé¾æ¥ï¼
header: "å¼ç¨æ¹å¼"
é项ï¼
- 深度å¼ç¨ååæ - 详ç»è§£è¯»åæè§ç¹ï¼æ¨èï¼
- ç®è¦æåå龿¥ - ç¹å°ä¸ºæ¢
- ä»
ä½èæ¯åè - ä¸æç¡®å¼ç¨
æ¥éª¤ 4: çæ Markdown æç«
åºäºç¨æ·è¾å ¥ãåèèµæååå¥½çææç« ï¼
- æ é¢çæè¦æ±ï¼
æç« æ é¢å¿ é¡»å å«ä»¥ä¸ 5 个ç¹ç¹ä¸çè³å° 3 个ï¼
| ç¹ç¹ | 说æ | ç¤ºä¾ |
|---|---|---|
| çç¹æç¡® | ç´å»ç®æ 读è çå ·ä½å°æ° | ãè¿å¨æå¨æ¹ä»£ç ï¼è¿ä¸ªå·¥å ·è®©ä½ å¼åæçæå 300%ã |
| æ°åå¸å¼ | ç¨å ·ä½æ°åå¢å å¯ä¿¡åº¦ | ãæè±äº 3 个æï¼æ´çäº 1000 个 Python æå·§ã |
| ç»æå¯¼å | æ¿è¯ºå¯éåçæ¶çææ¹å | ãå¦ä¼è¿æï¼ä½ ç代ç 审æ¥éè¿çæå 90%ã |
| æ 绪è°å¨ | æ¿å好å¥å¿ãç´§è¿«ææå ±é¸£ | ãåä¸å«åè¿æ ·å代ç äºï¼åæå¾ä¸¥éã |
| æ¬å¿µè®¾ç½® | å¶é æ¬å¿µå¼åç¹å»æ¬²æ | ã99% çç¨åºåé½ä¸ç¥éçè°è¯æå·§ã |
æ é¢å ¬å¼åèï¼
- çç¹ + æ°å + ç»æï¼ãè±äº 100 å°æ¶æéï¼è¿ 3 个æå·§è®©ä½ ç§å®ä½ Bugã
- æ°å + æ¬å¿µï¼ã7 个éç§ç VS Code åè½ï¼ç¬¬ 5 个太ç»äºã
- æ 绪 + çç¹ï¼ãå«åç¯è¿ä¸ªä½çº§éè¯¯ï¼æ°æç¨åºåæå¸¸è¸©ç 5 个åã
- æçè§èï¼
段è½ç»æï¼
- æ¯æ®µæ§å¶å¨ 3-5 è¡ï¼é¿å 大段æå
- éè¦æ°æ®åç¬ææ®µå¹¶å ç²
- å ³é®ç»è®ºåç½®ï¼ç»èåç½®
é å¾ä½ç½®ï¼
- æ é¢ä¸æ¹æ¾ç½®å°é¢å¾
- æ¯ä¸ªæ¥éª¤/ç« èåæ¾ç½®ææç¤ºæå¾
- ç»å°¾æ¾ç½®æ»ç»å¾æè¡å¨å·å¬å¾
代ç åï¼
- 代ç åååçç½ï¼ç©ºè¡åéï¼
- å¿ é¡»ä½¿ç¨è¯æ³é«äº®æ 注è¯è¨ç±»å
- å ³é®è¡æ·»å 注é说æ
éå¥è®¾è®¡ï¼
- æ ¸å¿è§ç¹åç¬ææ®µ
- 使ç¨å ç²æå¼ç¨æ ¼å¼çªåº
- æ§å¶å¨ 20 å以å ï¼ä¾¿äºè®°å¿åä¼ æ
- æç« ç»æï¼
---
title: æç« æ é¢ï¼éµå¾ª 5 大æ é¢ååï¼
author: ä½è
åï¼ä» EXTEND.md æé»è®¤å¼ï¼
summary: æç« æè¦ï¼120å以å
ï¼çªåºæ ¸å¿ä»·å¼ï¼
featureImage: å°é¢å¾è·¯å¾ï¼å¯éï¼
date: YYYY-MM-DD
---
# æç« æ é¢ï¼çç¹æç¡® + æ°åå¸å¼ + ç»æå¯¼åï¼

å¼è¨æ®µè½ï¼2-3è¡å³å¯ï¼
ç´æ¥ç¹æè¯»è
è½è·å¾ä»ä¹ä»·å¼ã
## 第ä¸é¨åï¼æ ¸å¿é®é¢
ï¼3-5è¡ï¼èç¦çç¹ï¼
**å
³é®æ°æ®åç¬ææ®µå ç²**
é
å说ææåï¼3-4è¡å³å¯ã

## 第äºé¨åï¼è§£å³æ¹æ¡
åæ®µè®²è§£ï¼æ¯æ®µ 3-5 è¡ã
```python
# 代ç åååçç½
# æ æ³¨è¯è¨ç±»åå®ç°è¯æ³é«äº®
def solution():
return "success"
éå¥ï¼æ ¸å¿è§ç¹åç¬ææ®µï¼å¢å¼ºè®°å¿ç¹

第ä¸é¨åï¼å®ææ¡ä¾
å ·ä½æ¥éª¤ + ææå¾ï¼ è®©è¯»è æä»£å ¥æã
æ»ç»
ç®æ´æåçç»è®ºï¼2-3 è¡ã

åèèµæï¼
2. **ä¿åæä»¶**ï¼
```bash
# çæ slugï¼æä»¶åï¼
title="æç« æ é¢"
slug=$(echo "$title" | \
iconv -t ascii//TRANSLIT 2>/dev/null | \
tr '[:upper:]' '[:lower:]' | \
tr ' ' '-' | \
tr -cd '[:alnum:]-' | \
cut -c1-50)
# å建ç®å½å¹¶ä¿å
output_dir="wechat-articles/$(date +%Y-%m-%d)"
mkdir -p "$output_dir"
echo "$article_content" > "$output_dir/$slug.md"
- å±ç¤ºç»ç¨æ·ï¼
â æç« å·²çæ
ð æ é¢ï¼$title
ð é¿åº¦ï¼çº¦ $word_count å
ð ä¿åä½ç½®ï¼$output_dir/$slug.md
[æç« é¢è§å
容...]
è¯·éæ©ä¸ä¸æ¥æä½...
æ¥éª¤ 5: ç¨æ·ç¡®è®¤ä¸ä¼å
ä½¿ç¨ AskUserQuestion 询é®ï¼
æç« å·²çæï¼è¯·éæ©æä½
header: "ä¸ä¸æ¥"
é项ï¼
- ç´æ¥åå¸ - 转æ¢ä¸º HTML å¹¶åå¸å°å¾®ä¿¡ï¼æ¨èï¼
- ä¿®æ¹å
容 - 说æéè¦è°æ´çé¨å
- éæ°çæ - 使ç¨ä¸å飿 ¼æè§åº¦
- ä»
ä¿åæä»¶ - ä¸åå¸ï¼ç¨åæå¨å¤ç
å¦æç¨æ·éæ©ä¿®æ¹ï¼
- æ¶éä¿®æ¹æè§
- æ´æ°æç« å 容
- éæ°ä¿åå¹¶å±ç¤º
- 忬¡è¯¢é®ä¸ä¸æ¥
å¦æç¨æ·éæ©éæ°çæï¼
- è¿åæ¥éª¤ 3ï¼éæ°è¯¢é®å好
- 使ç¨ä¸åçåä½è§åº¦
æ¥éª¤ 6: 转æ¢ä¸º HTML
使ç¨å ç½®ç Markdown 渲æå¼æè½¬æ¢ï¼
- 询é®ä¸»é¢ï¼å¦æªå¨ EXTEND.md 䏿å®ï¼ï¼
| ä¸»é¢ | æè¿° |
|---|---|
default |
ç»å ¸ä¸»é¢ – ä¼ ç»æçï¼æ é¢å± ä¸å¸¦åºè¾¹ï¼äºçº§æ é¢ç½åå½©åº |
grace |
ä¼é ä¸»é¢ – æåé´å½±ï¼åè§å¡çï¼ç²¾è´å¼ç¨åï¼æ¨èï¼ |
simple |
ç®æ´ä¸»é¢ – ç°ä»£æç®é£ï¼ä¸å¯¹ç§°åè§ï¼æ¸ ç½çç½ |
- æ§è¡è½¬æ¢ï¼
npx -y bun "${SKILL_DIR}/scripts/md-to-wechat.ts" \
"$output_dir/$slug.md" \
--theme grace \
--output "$output_dir"
- è§£æè¾åº JSONï¼
{
"title": "æç« æ é¢",
"author": "ä½è
",
"summary": "æè¦",
"htmlPath": "è·¯å¾/to/article.html",
"contentImages": [
{
"placeholder": "WECHATIMGPH_1",
"localPath": "/path/to/image1.jpg",
"originalPath": "åå§è·¯å¾"
}
]
}
æ¥éª¤ 7: åå¤å°é¢å¾
å°é¢å¾å¼ºå¶è§åï¼ä¼å 级顺åºï¼ï¼
- æ¾å¼æå®ï¼æ£æ¥ Frontmatter åæ®µï¼
featureImage,coverImage,cover,imageï¼ã - èªå¨é¦å¾åéï¼è¥æªæ¾å¼æå®å°é¢ï¼ä¸æç« ä¸å å«å¾çï¼å¿ é¡»èªå¨æåå¹¶ä½¿ç¨æç« ä¸ç第ä¸å¼ å¾çä½ä¸ºå°é¢ã
- èªå¨çæï¼åªæå¨æç« ä¸å®å ¨æ²¡æå¾çæ¶ï¼æè§¦åå°é¢å¾çæé»è¾ã
å¦ææ²¡ææå®ä¸æç« å æ å¾çï¼è¯¢é®ç¨æ·ï¼
å°é¢å¾è®¾ç½®ï¼æç« 䏿ªåç°å¾çï¼
header: "å°é¢æ¥æº"
é项ï¼
- èªå¨çæ - åºäºæç« æ é¢çææ¸åèæ¯å°é¢ï¼æ¨èï¼
- æä¾è·¯å¾ - æå®æ¬å°æä»¶æ URL
- æä¸è®¾ç½® - ç¨åæå¨æ·»å
妿鿩èªå¨çæï¼
-
ä¼å å°è¯å¤æ¨¡æå¤§æ¨¡åçæï¼å¦æ Agent æ¯æï¼ï¼
- 妿å½å Agent ç¯å¢å ·å¤æçå¾è½åï¼Text-to-Imageï¼ï¼è¯·æ ¹æ®æç« æ é¢åæè¦çæä¸å¼ é«è´¨éçå°é¢å¾ã
- è¦æ±ï¼2:1 æ¯ä¾ï¼å¦ 1024×512ï¼ï¼é£æ ¼ç°ä»£ãç®æ´ï¼éåä½ä¸ºå ¬ä¼å·å°é¢ã
- ä¿å为ï¼
$output_dir/$slug-cover.jpg - 注æï¼å¦æ Agent æ æ³çæå¾çï¼ä¾å¦æ å·¥å ·æ¯æï¼ï¼åç´æ¥ä½¿ç¨ä¸æ¹éçº§æ¹æ¡ã
-
éçº§æ¹æ¡ï¼ä½¿ç¨èæ¬çæï¼ï¼
å¦ææ æ³ä½¿ç¨å¤§æ¨¡åçæå¾çï¼åè¿è¡ä»¥ä¸å½ä»¤çææ¸åèæ¯æåå°é¢ï¼
# ä½¿ç¨ Node.js èæ¬çæï¼æ ç³»ç»ä¾èµï¼
npx -y bun "${SKILL_DIR}/scripts/generate-cover.ts" \
--title "$title" \
--output "$output_dir/$slug-cover.jpg" \
--gradient-start "#667eea" \
--gradient-end "#764ba2"
å°é¢è¦æ±ï¼
- æ ¼å¼ï¼JPEG, PNG, GIF æ WebP
- æ¨è尺寸ï¼900x500pxï¼2:1 æ¯ä¾ï¼
- æä»¶å¤§å°ï¼< 2MB
æ¥éª¤ 8: åå¸å°å¾®ä¿¡
询é®å叿¹å¼ï¼
å叿¹å¼éæ©
header: "å叿¹æ³"
é项ï¼
- API æ¹å¼ - å¿«éåå¸ï¼éè¦ API åè¯ï¼æ¨èï¼
- æµè§å¨æ¹å¼ - å¯è§åæä½ï¼éè¦ Chrome
- ä»
è¾åº HTML - ä¿åæä»¶ï¼ç¨åæå¨åå¸
é项 A: API æ¹å¼åå¸
- æ£æ¥ API åè¯ï¼
# æ£æ¥é¡¹ç®çº§å«
test -f .awesome-skills/.env && grep -q "WECHAT_APP_ID" .awesome-skills/.env && echo "project"
# æ£æ¥ç¨æ·çº§å«
test -f "$HOME/.awesome-skills/.env" && grep -q "WECHAT_APP_ID" "$HOME/.awesome-skills/.env" && echo "user"
- 妿åè¯ç¼ºå¤±ï¼å¼å¯¼è®¾ç½®ï¼
微信 API åè¯æªæ¾å°
è·ååè¯æ¥éª¤ï¼
1. è®¿é® https://mp.weixin.qq.com
2. è¿å
¥ï¼å¼å â åºæ¬é
ç½®
3. å¤å¶ AppID å AppSecret
ä¿åä½ç½®ï¼
A) 项ç®çº§å«ï¼.awesome-skills/.envï¼ä»
æ¤é¡¹ç®ï¼
B) ç¨æ·çº§å«ï¼~/.awesome-skills/.envï¼ææé¡¹ç®ï¼
å建 .env æä»¶ï¼
WECHAT_APP_ID=<ç¨æ·è¾å
¥>
WECHAT_APP_SECRET=<ç¨æ·è¾å
¥>
- æ§è¡åå¸ï¼
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \
"$output_dir/$slug.html" \
--title "$title" \
--summary "$summary" \
--cover "$cover_image" \
--inline-css
éè¦ï¼--inline-css åæ°å° CSS 转为å
èæ ·å¼ï¼å¾®ä¿¡å
¬ä¼å·ä¸æ¯æ <style> æ ç¾ã
é项 B: æµè§å¨æ¹å¼åå¸
npx -y bun "${SKILL_DIR}/scripts/wechat-article.ts" \
--html "$output_dir/$slug.html" \
--title "$title" \
--summary "$summary"
馿¬¡è¿è¡ï¼ä¼æå¼ Chrome æµè§å¨ï¼éè¦æ«ç ç»å½å¾®ä¿¡å ¬ä¼å·ã
é项 C: ä» è¾åº HTML
echo "â HTML æä»¶å·²ä¿åè³ï¼$output_dir/$slug.html"
echo ""
echo "æä»¶å
å«ï¼"
echo "⢠å
èæ ·å¼ï¼ç¬¦å微信è§èï¼"
echo "â¢ å®æ´çæç« å
容"
echo "⢠æ¬å°å¾çè·¯å¾"
æ¥éª¤ 9: 宿æ¥å
å叿ååï¼æ¾ç¤ºæè¦ï¼
â 微信å
¬ä¼å·æç« åä½ä¸åå¸å®æï¼
åä½ä¿¡æ¯ï¼
⢠è¾å
¥ï¼ç¨æ·ææ¬å
容
⢠åè龿¥ï¼$link_count 个
⢠æç« 飿 ¼ï¼$style
⢠æç« é¿åº¦ï¼$word_count å
åå¸ä¿¡æ¯ï¼
⢠æ é¢ï¼$title
⢠ä½è
ï¼$author
⢠æè¦ï¼$summary
⢠主é¢ï¼$theme
⢠å¾çï¼$image_count å¼
⢠å°é¢ï¼$cover_source
å叿¹å¼ï¼API / æµè§å¨
ç»æï¼
â è稿已ä¿åå°å¾®ä¿¡å
¬ä¼å·
⢠media_id: $media_id
ä¸ä¸æ¥ï¼
â 管çè稿ï¼https://mp.weixin.qq.comï¼ç»å½åè¿å
¥ãå
容管çãâãè稿箱ãï¼
çæçæä»¶ï¼
⢠$output_dir/$slug.mdï¼Markdown æºæä»¶ï¼
⢠$output_dir/$slug.htmlï¼HTML æä»¶ï¼
⢠$output_dir/$slug-cover.jpgï¼å°é¢å¾ï¼
æµç¨ 2: 龿¥æç« åå¸
å½ç¨æ·è¾å ¥å个æç« 龿¥æ¶ä½¿ç¨æ¤æµç¨ã
åå¸è¿åº¦æ¸ å
å¤å¶æ¤æ¸ åå¹¶å¨å®ææ¶å¾éï¼
龿¥åå¸è¿åº¦ï¼
- [ ] æ¥éª¤ 0: å è½½å好设置
- [ ] æ¥éª¤ 1: 龿¥éªè¯
- [ ] æ¥éª¤ 2: æç« ä¸è½½ä¸è§£æ
- [ ] æ¥éª¤ 3: å¾çä¸è½½ä¸æ¸
æ´
- [ ] æ¥éª¤ 4: æ ·å¼è½¬æ¢ï¼CSS å
èï¼
- [ ] æ¥éª¤ 5: ç¨æ·ç¡®è®¤
- [ ] æ¥éª¤ 6: åå¤å°é¢å¾
- [ ] æ¥éª¤ 7: æ§è¡åå¸
- [ ] æ¥éª¤ 8: 宿æ¥å
æ¥éª¤ 0: å è½½å好设置
æ£æ¥å¹¶å è½½ EXTEND.md 设置ã
æ¥éª¤ 1: 龿¥éªè¯
éªè¯é¾æ¥å¯è®¿é®æ§ï¼
# æ£æ¥é¾æ¥ç¶æ
status_code=$(curl -sI -w "%{http_code}" -o /dev/null "$url")
if [ "$status_code" = "200" ]; then
echo "龿¥ææ"
else
echo "龿¥æ æ³è®¿é®ï¼ç¶æç : $status_code"
fi
æ¥éª¤ 2: æç« ä¸è½½ä¸è§£æ
ä½¿ç¨ WebFetch è·åæç« å 容ï¼
const article = await WebFetch(url, `
请æå以ä¸ä¿¡æ¯å¹¶ä»¥ JSON æ ¼å¼è¿åï¼
{
"title": "æç« æ é¢",
"author": "ä½è
ï¼å¦ææï¼",
"summary": "æç« æè¦æç®ä»ï¼120å以å
ï¼",
"content": "HTML æ ¼å¼çæ£æå
容ï¼ä¿çåå§æ ·å¼åç»æ",
"images": ["å¾çURLæ°ç»"],
"featureImage": "å°é¢å¾URLï¼å¦ææï¼",
"publishDate": "å叿¥æï¼å¦ææï¼"
}
注æï¼
- content éè¦å
å«å®æ´ç HTML æ ç¾åæ ·å¼
- images å
å«æç« ä¸ææçå¾çURL
- ä¿çåæç段è½ãæ é¢ãå表çç»æ
`);
æ¥éª¤ 3: å¾çä¸è½½ä¸æ¸ æ´
- å建临æ¶ç®å½ï¼
temp_dir="wechat-temp/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$temp_dir/images"
- ä¸è½½ææå¾çï¼
# è§£æå¾çURLæ°ç»å¹¶ä¸è½½
image_index=1
for img_url in "${images[@]}"; do
# è·åæä»¶æ©å±å
ext="${img_url##*.}"
ext="${ext%%\?*}" # ç§»é¤URLåæ°
# ä¸è½½å¾ç
output_file="$temp_dir/images/image_${image_index}.${ext}"
curl -L -o "$output_file" "$img_url" 2>/dev/null
image_index=$((image_index + 1))
done
- å¾çå æ°æ®æ¸ æ´ï¼
èæ¬ wechat-api.ts ä¼èªå¨æ§è¡ä»¥ä¸æ¸
æ´ï¼
- æ£æµ JPEG å¾çä¸çéæ åå æ°æ®
- æ¸ é¤ AIGC/Coze æ è®°ï¼å¾®ä¿¡ä¸æ¯æï¼
- ä¿çææç EXIF æ°æ®åå¾åå 容
- èªå¨éè¯ï¼å¦æä¸ä¼ 失败ï¼é误ç 40113ï¼ï¼å¼ºå¶æ¸ æ´åéè¯
ç®æ³ï¼åè scripts/wechat-api.ts:105-180ï¼ï¼
function cleanImageMetadata(buffer: Buffer): Buffer {
// æ£æ¥ JPEG ç¾å
if (buffer[0] !== 0xff || buffer[1] !== 0xd8) return buffer;
// æ£æµ AIGC æ è®°
const headerStr = buffer.slice(0, 2048).toString('binary');
const hasAigcMarker = headerStr.includes('AIGC{') || headerStr.includes('Coze');
if (!hasAigcMarker) return buffer;
// è·³è¿éæ å APP 段ï¼0xeb, 0xec çï¼
// ä¿çæ åæ®µï¼APP0-APP9, DQT, SOF çï¼
// è¿åæ¸
æ´åç buffer
}
æ¥éª¤ 4: æ ·å¼è½¬æ¢ï¼CSS å èï¼
å
³é®æ¥éª¤ï¼å¾®ä¿¡å
¬ä¼å·ä¸æ¯æ <style> æ ç¾ï¼å¿
é¡»å° CSS 转为å
èæ ·å¼ã
- ä¿ååå§ HTMLï¼
echo "$html_content" > "$temp_dir/original.html"
- æ§è¡ CSS å è转æ¢ï¼
# ä½¿ç¨ wechat-api.ts çå
è转æ¢åè½
# 注æï¼è¿éå
çæå¤çåç HTMLï¼ä¸ç«å³åå¸
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \
"$temp_dir/original.html" \
--inline-css \
--output "$temp_dir/processed.html" \
--dry-run
- æ¿æ¢å¾çè·¯å¾ï¼
# å°è¿ç¨å¾çURLæ¿æ¢ä¸ºæ¬å°è·¯å¾
for i in {1..${#images[@]}}; do
sed -i "s|${images[$i-1]}|$temp_dir/images/image_$i.jpg|g" "$temp_dir/processed.html"
done
æ¥éª¤ 5: ç¨æ·ç¡®è®¤
å±ç¤ºå¤çç»æå¹¶è¯¢é®ï¼
æç« å¤ç宿
ð æ é¢ï¼$title
âï¸ ä½è
ï¼$author
ð æè¦ï¼$summary
ð åæï¼$original_url
ð¼ï¸ å¾çï¼å
± $image_count å¼ ï¼å·²ä¸è½½å¹¶æ¸
æ´å
æ°æ®ï¼
ð¨ æ ·å¼ï¼å·²è½¬æ¢ä¸ºå
èæ ·å¼ï¼ç¬¦å微信è§èï¼
HTML å·²ä¿åè³ï¼$temp_dir/processed.html
è¯·éæ©æä½
ä½¿ç¨ AskUserQuestionï¼
header: "åå¸é项"
é项ï¼
- ç´æ¥åå¸ï¼APIï¼- å¿«éåå¸å°èç¨¿ç®±ï¼æ¨èï¼
- æµè§å¨åå¸ - æå¼æµè§å¨å¯è§åæä½
- ä»
è¾åº HTML - ä¿åæä»¶ï¼ç¨åæå¨å¤ç
- åæ¶ - ä¸ä¿å
æ¥éª¤ 6: åå¤å°é¢å¾
䏿µç¨ 1 çæ¥éª¤ 7 ç¸åï¼éµå¾ªå°é¢å¾å¼ºå¶è§åï¼
- ä¼å
使ç¨åææåç
featureImageã - è¥æ æ¾å¼å°é¢ï¼èªå¨ä½¿ç¨ä¸è½½å¾çä¸ç第ä¸å¼ ä½ä¸ºå°é¢ã
- ä» å¨åæå®å ¨æ²¡æå¾çæ¶ï¼æè¯¢é®çæå°é¢ã
æ¥éª¤ 7: æ§è¡åå¸
æ ¹æ®ç¨æ·éæ©æ§è¡ï¼
é项 A: ç´æ¥åå¸ï¼APIï¼
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \
"$temp_dir/processed.html" \
--title "$title" \
--summary "$summary" \
--cover "$cover_image" \
--inline-css
API æ¹å¼ç¹æ§ï¼
- â èªå¨ä¸è½½è¿ç¨å¾ç
- â èªå¨æ¸ æ´å¾çå æ°æ®ï¼AIGC/Coze æ è®°ï¼
- â 妿ä¸ä¼ 失败ï¼40113ï¼ï¼å¼ºå¶æ¸ æ´åéè¯
- â æ¯ææ ¼å¼ï¼JPEG, PNG, GIF, WebP
é项 B: æµè§å¨åå¸
npx -y bun "${SKILL_DIR}/scripts/wechat-article.ts" \
--html "$temp_dir/processed.html" \
--title "$title" \
--summary "$summary"
é项 C: ä» è¾åº HTML
# å¤å¶å°æ°¸ä¹
ä½ç½®
output_path="wechat-articles/$(date +%Y-%m-%d)/$slug.html"
mkdir -p "$(dirname "$output_path")"
cp "$temp_dir/processed.html" "$output_path"
cp -r "$temp_dir/images" "$(dirname "$output_path")/"
echo "â HTML å·²ä¿åè³ï¼$output_path"
echo "â å¾çå·²ä¿åè³ï¼$(dirname "$output_path")/images/"
æ¥éª¤ 8: 宿æ¥å
â 龿¥æç« åå¸å®æï¼
åæä¿¡æ¯ï¼
â¢ é¾æ¥ï¼$original_url
⢠æ é¢ï¼$title
⢠ä½è
ï¼$author
å¤çä¿¡æ¯ï¼
⢠ä¸è½½å¹¶è½¬æ¢ HTML
⢠æ¸
æ´ $image_count å¼ å¾çå
æ°æ®
â¢ è½¬æ¢æ ·å¼ä¸ºå
èæ ¼å¼
⢠çæå°é¢å¾ï¼$cover_source
åå¸ä¿¡æ¯ï¼
⢠æ¹å¼ï¼API / æµè§å¨
⢠主é¢ï¼ä¿çåæ ·å¼
â¢ ç¶æï¼â è稿已ä¿å
ç»æï¼
⢠media_id: $media_id
ä¸ä¸æ¥ï¼
â 管çè稿ï¼https://mp.weixin.qq.comï¼ç»å½åè¿å
¥ãå
容管çãâãè稿箱ãï¼
çæçæä»¶ï¼
⢠$output_pathï¼å¤çåç HTMLï¼
⢠$(dirname "$output_path")/images/ï¼æ¸
æ´åçå¾çï¼
æµç¨ 3: Markdown æä»¶åå¸
å½ç¨æ·æä¾ .md æä»¶è·¯å¾æ¶ä½¿ç¨æ¤æµç¨ã
å¿«éåå¸
# ä¸é®è½¬æ¢å¹¶åå¸
npx -y bun "${SKILL_DIR}/scripts/md-to-wechat.ts" \
"$markdown_file" \
--theme grace \
--output ./output
# ç¶åä½¿ç¨ API åå¸
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \
"$html_output" \
--inline-css \
--cover "$cover_image"
æ¥éª¤è¯´æ
- è§£æ Markdownï¼æå frontmatterï¼title, author, summary çï¼
- 转æ¢ä¸º HTMLï¼åºç¨ä¸»é¢æ ·å¼
- å¤çå¾çï¼ä¸è½½è¿ç¨å¾çï¼æ¿æ¢ä¸ºæ¬å°è·¯å¾
- åå¸ï¼åæµç¨ 1 çæ¥éª¤ 8
æµç¨ 4: HTML æä»¶ç´æ¥åå¸
å½ç¨æ·æä¾ .html æä»¶è·¯å¾æ¶ä½¿ç¨æ¤æµç¨ã
å¿«éåå¸
# ç´æ¥åå¸ï¼èªå¨å
è CSSï¼
npx -y bun "${SKILL_DIR}/scripts/wechat-api.ts" \
"$html_file" \
--title "æç« æ é¢" \
--summary "æè¦" \
--cover "$cover_image" \
--inline-css
注æï¼å¿
é¡»ä½¿ç¨ --inline-css åæ°ï¼å¦åæ ·å¼ä¼ä¸¢å¤±ã
徿åå¸ï¼å¾ææ¶æ¯ï¼
ç¨äºåå¸çå 容 + å¤å¼ å¾çï¼æå¤ 9 å¼ ï¼ã
ä½¿ç¨æ¹æ³
# ä» Markdown æä»¶åå¸
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 img1.png \
--image img2.png \
--submit
åæ°è¯´æ
| åæ° | æè¿° |
|---|---|
--markdown <path> |
Markdown æä»¶ |
--title <text> |
æ é¢ |
--content <text> |
å 容æå |
--image <path> |
å¾çè·¯å¾ï¼å¯å¤æ¬¡ä½¿ç¨ï¼ |
--images <dir> |
å¾çç®å½ |
--submit |
èªå¨æäº¤ |
详è§ï¼references/image-text-posting.md
䏻颿 ·å¼
å
ç½®ä¸ç§ä¸»é¢ï¼ä½äº scripts/md/themes/ï¼ï¼
default – ç»å ¸ä¸»é¢
- ä¼ ç»æç飿 ¼
- æ é¢å± ä¸ï¼å¸¦åºè¾¹è£ 饰
- äºçº§æ é¢ï¼ç½å彩åº
- éåï¼æ£å¼æç« ãè¡ä¸æ¥å
grace – ä¼é 主é¢ï¼æ¨èï¼
- æå带æåé´å½±
- åè§å¡çå¼å¼ç¨å
- ç²¾è´çåè¡¨æ ·å¼
- éåï¼ç§æ®æç« ã个人å客
simple – ç®æ´ä¸»é¢
- ç°ä»£æç®é£æ ¼
- ä¸å¯¹ç§°åè§è®¾è®¡
- æ¸ ç½çç½
- éåï¼æç¨ãçæ
èªå®ä¹ä¸»é¢
- å¨
scripts/md/themes/å建æ°ç CSS æä»¶ - åºäº
base.cssæ©å±æ ·å¼ - 使ç¨
--theme <name>åæ°åºç¨
é ç½®ä¸ç¯å¢
ç¯å¢åé
ä»ä»¥ä¸ä½ç½®å è½½é ç½®ï¼ä¼å 级ä»é«å°ä½ï¼ï¼
- ç¯å¢åé
<cwd>/.awesome-skills/.env~/.awesome-skills/.env
å¿ éçç¯å¢åéï¼API å叿¹å¼ï¼ï¼
WECHAT_APP_ID=your_app_id
WECHAT_APP_SECRET=your_app_secret
å¯éçç¯å¢åéï¼
WECHAT_BROWSER_CHROME_PATH=/path/to/chrome # èªå®ä¹ Chrome è·¯å¾
EXTEND.md é 置示ä¾
# wechat-article-maker é
ç½®
## é»è®¤è®¾ç½®
- 主é¢ï¼grace
- å叿¹å¼ï¼api
- ä½è
ï¼å®ç
- Chrome é
ç½®æä»¶ï¼~/.chrome-wechat
## èªå¨æä½
- èªå¨çæå°é¢ï¼true
- èªå¨æ¸
æ´å¾çï¼true
- èªå¨å
èæ ·å¼ï¼true
## åä½å好
- é»è®¤æç« 飿 ¼ï¼ä¸ä¸åæ
- é»è®¤æç« é¿åº¦ï¼ä¸çï¼1500-2500åï¼
- é»è®¤å¼ç¨æ¹å¼ï¼æ·±åº¦å¼ç¨ååæ
ææ¯ç»è
Markdown 渲æå¼æ
ä½¿ç¨ markdown-it åæ©å±ï¼ä½äº scripts/md/ï¼ï¼
- åºç¡æ¸²æï¼
render.ts - æ©å±æä»¶ï¼
alert.ts– GitHub 飿 ¼æç¤ºåfootnotes.ts– èæ³¨æ¯ækatex.ts– æ°å¦å ¬å¼toc.ts– ç®å½çæinfographic.ts– ä¿¡æ¯å¾ruby.ts– 注é³slider.ts– æ»åplantuml.ts– UML å¾è¡¨
å¾çå¤çç®æ³
å
æ°æ®æ¸
æ´ï¼scripts/image-utils.tsï¼ï¼
å ç½® sharp åºæä¾å¯é çå¾çå¤çè½åï¼
- æºè½æ£æµï¼æ«æå¾çå 2KBï¼æ£æµ AIGC/Coze/Adobe çéæ åå æ°æ®æ è®°
- æ·±åº¦æ¸ çï¼ä½¿ç¨ sharp éæ°ç¼ç JPEGï¼å½»åºç§»é¤ææå æ°æ®
- èªå¨é级ï¼sharp ä¸å¯ç¨æ¶ï¼ä½¿ç¨æå¨è§£æä½ä¸ºå夿¹æ¡
- 尺寸ä¼åï¼èªå¨è°æ´è¶ 大å¾çï¼éå¶ 1920×1080ï¼ä»¥ç¬¦å微信è§è
// å¾çå¤çæµç¨
const result = await cleanImage(buffer, forceClean);
// è¿å: { buffer, wasCleaned, method: "sharp"|"manual"|"none", originalSize, cleanedSize }
åå¼ææ¸ ççç¥ï¼
| æ¹æ³ | ä¼å 级 | 说æ |
|---|---|---|
| Sharp éæ°ç¼ç | é¦é | å®å ¨éæ°ç¼ç å¾çï¼100% ç§»é¤å æ°æ® |
| æå¨è§£æ | åå¤ | è§£æ JPEG æ®µç»æï¼è·³è¿éæ åæ è®° |
èªå¨éè¯é»è¾ï¼
try {
await uploadImage(imageBuffer);
} catch (error) {
if (error.code === 40113) {
// 强å¶ä½¿ç¨ sharp 深度æ¸
çåéè¯
const cleanedBuffer = await cleanImage(imageBuffer, true);
await uploadImage(cleanedBuffer);
}
}
CSS å è转æ¢
ä½¿ç¨ juice æç±»ä¼¼åºå° CSS è§å转æ¢ä¸ºå
èæ ·å¼ï¼
ä¹åï¼
<style>
h1 { color: blue; font-size: 24px; }
</style>
<h1>æ é¢</h1>
ä¹åï¼
<h1 style="color: blue; font-size: 24px;">æ é¢</h1>
为ä»ä¹éè¦ï¼å¾®ä¿¡å
¬ä¼å·ç¼è¾å¨ä¸æ¯æ <style> æ ç¾ï¼åªæ¥åå
èæ ·å¼ã
å°é¢å¾çæ
æ¹å¼ 1: 夿¨¡æå¤§æ¨¡åçæï¼æ¨èï¼
妿 Agent å ·å¤æçå¾è½åï¼ä¼å æ ¹æ®æç« å 容çæå®å¶åå°é¢å¾ãè¿è½æä¾æ´å ·å¸å¼ååç¸å ³æ§çè§è§ææã
æ¹å¼ 2: 纯 Node.jsï¼æ ç³»ç»ä¾èµï¼
èæ¬ï¼scripts/generate-cover.ts
npx -y bun "${SKILL_DIR}/scripts/generate-cover.ts" \
--title "æç« æ é¢" \
--output cover.jpg \
--gradient-start "#667eea" \
--gradient-end "#764ba2" \
--width 900 \
--height 500
ç¹æ§ï¼
- â æ é ImageMagick
- â æ¯æå¤ç§å¾çåºï¼@napi-rs/canvasãsharpãSVGï¼
- â èªå¨æ¢è¡é¿æ é¢
- â å¯èªå®ä¹é¢è²å尺寸
- â 跨平å°ï¼Node.js/Bunï¼
æ¹å¼ 2: ImageMagickï¼å¦å·²å®è£ ï¼
convert -size 900x500 \
-define gradient:angle=135 \
gradient:'#667eea'-'#764ba2' \
-gravity center \
-font "DejaVu-Sans-Bold" \
-pointsize 48 \
-fill white \
-annotate +0-30 "æ é¢ç¬¬ä¸è¡" \
-pointsize 36 \
-annotate +0+30 "æ é¢ç¬¬äºè¡" \
cover.jpg
æ éææ¥
| é®é¢ | è§£å³æ¹æ¡ |
|---|---|
| ä¾èµæªå®è£ | ä¾èµä¼å¨é¦æ¬¡è¿è¡æ¶èªå¨å®è£ |
| Cannot find module | å°è¯éæ°è¿è¡å½ä»¤ï¼ä¼èªå¨å®è£ 缺失ä¾èµ |
| å°é¢å¾çæ SVG èé PNG/JPEG | å¯éä¾èµæªå®è£
ï¼è¿è¡ cd ${SKILL_DIR}/scripts && npm install @napi-rs/canvas ææ¥å SVG æ ¼å¼ |
| 龿¥æ æ³è®¿é® | æ£æ¥ç½ç»è¿æ¥ï¼å°è¯ä½¿ç¨ä»£çæ VPN |
| å¾çä¸ä¼ 失败 (40113) | sharp èªå¨æ·±åº¦æ¸ çå æ°æ®åéè¯ï¼æ éæå¨å¤ç |
| æ ·å¼ä¸¢å¤± | ç¡®ä¿ä½¿ç¨äº --inline-css åæ° |
| API é误 40001 | access_token æ ææè¿æï¼æ£æ¥ API åè¯ |
| API é误 40164 (invalid ip) | å¨å¾®ä¿¡å ¬ä¼å·åå°æ·»å æå¡å¨ IP å°ç½ååï¼mp.weixin.qq.com â å¼å â åºæ¬é ç½® â IPç½åå |
| Chrome æªæ¾å° | 设置ç¯å¢åé WECHAT_BROWSER_CHROME_PATH |
| æ é¢/æè¦ç¼ºå¤± | æå¨æå® --title å --summary åæ° |
| ç²è´´å¤±è´¥ï¼æµè§å¨æ¹å¼ï¼ | æ£æ¥ç³»ç»åªè´´æ¿æé |
| Markdown 转æ¢é误 | æ£æ¥ Markdown è¯æ³ï¼ç¡®ä¿ frontmatter æ ¼å¼æ£ç¡® |
æä½³å®è·µ
1. å 容åä½
- â æä¾æ¸ æ°çå使å¾åç®æ 读è
- â å¼ç¨é¾æ¥æ¶è¯´æå¦ä½ä½¿ç¨ï¼æ·±åº¦åæ vs ç®è¦æåï¼
- â é¢è§åååå¸ï¼é¿å è¿å·¥
- â ä¿å Markdown æºæä»¶ï¼ä¾¿äºåç»ä¿®æ¹
- â æ é¢å¿ é¡»å å«è³å° 3 个ç¹ç¹ï¼çç¹æç¡®ãæ°åå¸å¼ãç»æå¯¼åãæ ç»ªè°å¨ãæ¬å¿µè®¾ç½®
- â æ®µè½æ§å¶ 3-5 è¡ï¼éè¦æ°æ®åç¬ææ®µå ç²
- â éå¥åç¬ææ®µï¼æ§å¶å¨ 20 å以å ï¼ä¾¿äºä¼ æ
2. 龿¥åå¸
- â ç¡®è®¤é¾æ¥å¯è®¿é®ï¼é¿å éè¦ç»å½ç页é¢ï¼
- â æ£æ¥åæå¾çè´¨éï¼æ¨¡ç³å¾çå»ºè®®æ¿æ¢ï¼
- â ä¼å ä½¿ç¨ API æ¹å¼ï¼å¿«éå¯é ï¼
- â åå¸åé¢è§å¤çåç HTML
3. æ ·å¼ä¸æç
- â ä¸ä¸æç« ç¨
defaultä¸»é¢ - â 大ä¼å
容ç¨
grace主é¢ï¼æ¨èï¼ - â æç¨ç±»ç¨
simpleä¸»é¢ - â ç¡®ä¿å¾çæ¸ æ°åº¦ï¼æ¨è 2x å辨çï¼
- â å°é¢å¾ä½¿ç¨ 2:1 æ¯ä¾ï¼900x500pxï¼
4. å叿µç¨
- â 馿¬¡ä½¿ç¨å é ç½® API åè¯
- â åå¸åå¨è稿箱é¢è§
- â ä¿çæºæä»¶ï¼markdown/htmlï¼ä»¥ä¾¿åç»ä¿®æ¹
- â 宿å¤ä»½å·²åå¸çæç«
5. å¾çå¤ç
- â 使ç¨é«è´¨éåå¾ï¼é¿å äºæ¬¡å缩ï¼
- â å¾ç尺寸éä¸ï¼å®½åº¦ 800-1200pxï¼
- â æä»¶å¤§å°æ§å¶å¨ 1MB 以å
- â 妿 AIGC å¾çï¼è®©èæ¬èªå¨æ¸ æ´
6. æçä¸å¯è¯»æ§
段è½ç»æï¼
- â æ¯æ®µ 3-5 è¡ï¼é¿å è§è§ç²å³
- â éè¦æ°æ®/ç»è®ºåç¬ææ®µå¹¶å ç²
- â 夿å 容åç¹è¯´æï¼ä¸è¦å ç
é å¾çç¥ï¼
- â æ é¢ä¸æ¹å¿ æ¾å°é¢å¾
- â å ³é®æ¥éª¤åæ¾ç½®ææå¾/示æå¾
- â æç« ç»å°¾æ¾ç½®æ»ç»å¾æ CTA å¾
代ç å±ç¤ºï¼
- â 代ç åååç空è¡
- â å¿ é¡»æ æ³¨ç¼ç¨è¯è¨å®ç°è¯æ³é«äº®
- â å ³é®è¡æ·»å 注éï¼è¾ å©çè§£
éå¥è®¾è®¡ï¼
- â æ ¸å¿è§ç¹æç¼æéå¥ï¼åç¬ææ®µ
- â 使ç¨
**å ç²**æ> å¼ç¨çªåº - â é¿åº¦æ§å¶å¨ 20 åå ï¼ææä¸å£
åè½å¯¹æ¯
| åè½ | å 容åä½ | 龿¥åå¸ | Markdown åå¸ | HTML åå¸ | 徿åå¸ |
|---|---|---|---|---|---|
| è¾å ¥ç±»å | ææ¬ + 龿¥ | åä¸ªé¾æ¥ | .md æä»¶ | .html æä»¶ | çæ + å¾ç |
| å 容çè§£ | â | â | â | â | â |
| æç« çæ | â | â | â | â | â |
| Markdown è½¬æ¢ | â | â | â | â | â |
| 䏻颿 ·å¼ | â | ä¿çåæ · | â | ä¿çåæ · | â |
| å¾çæ¸ æ´ | â | â | â | â | â |
| CSS å è | â | â | â | â | â |
| å°é¢çæ | â | â | â | â | â |
| API åå¸ | â | â | â | â | â |
| æµè§å¨åå¸ | â | â | â | â | â |
| éç¨åºæ¯ | ååå 容 | 转载/å享 | æ¬å°æç« | ç°æ HTML | å¾çå±ç¤º |
使ç¨ç¤ºä¾
ç¤ºä¾ 1: å使°æç« ï¼çº¯ææ¬ï¼
ç¨æ·ï¼åä½ä¸ç¯å
³äº AI ç¼ç¨å©æåå±è¶å¿çæç«
Agentï¼
â åæå
容类å â çº¯ææ¬å使¨¡å¼
â è¯¢é®æç« é£æ ¼ãé¿åº¦ â ç¨æ·éæ©"ä¸ä¸åæ"ã"ä¸ç"
â çææç« å¹¶å±ç¤º
â ç¨æ·ç¡®è®¤å转æ¢ä¸º HTMLï¼grace 主é¢ï¼
â èªå¨çæå°é¢å¾
â ä½¿ç¨ API åå¸å°è稿箱
ç»æï¼
⢠æç« ä¿åè³ wechat-articles/2026-02-09/ai-coding-assistant-trends.md
⢠HTML è¾åºè³ wechat-articles/2026-02-09/ai-coding-assistant-trends.html
⢠å°é¢å¾ï¼wechat-articles/2026-02-09/ai-coding-assistant-trends-cover.jpg
⢠微信è稿箱 media_id: abc123...
ç¤ºä¾ 2: åºäºé¾æ¥åä½
ç¨æ·ï¼åºäºè¿ç¯æç« åä½ä¸ç¯å
¬ä¼å·æç« ï¼æ·±åº¦åæå
¶ä¸çè§ç¹ï¼
https://example.com/ai-future
Agentï¼
â æå龿¥å¹¶è·åå
容
â æ´çå
³é®è§ç¹åæ°æ®
â 询é®å使¹å â ç¨æ·éæ©"ä¸ä¸åæ"ã"深度å¼ç¨"
â çææç« ï¼å¼ç¨åæ 3 ä¸ªæ ¸å¿è§ç¹ï¼å å
¥èªå·±çåæ
â ç¨æ·ç¡®è®¤ååå¸
ç»æï¼
⢠çæäº 2300 åçæ·±åº¦åææç«
⢠å¼ç¨äºåæ 3 个è§ç¹å 2 ä¸ªæ°æ®
⢠添å äºåèèµæé¾æ¥
⢠已åå¸å°å¾®ä¿¡è稿箱
ç¤ºä¾ 3: ç´æ¥åå¸é¾æ¥æç«
ç¨æ·ï¼åå¸è¿ç¯æç« å°å
¬ä¼å·ï¼https://blog.example.com/great-article
Agentï¼
â è¯å«ä¸ºé¾æ¥å叿¨¡å¼
â ä¸è½½æç« HTML å 5 å¼ å¾ç
â æ¸
æ´å¾çå
æ°æ®ï¼æ£æµå° 2 å¼ å« AIGC æ è®°ï¼å·²æ¸
æ´ï¼
â è½¬æ¢æ ·å¼ä¸ºå
èæ ¼å¼
â å±ç¤ºå¤çç»æ
â ç¨æ·ç¡®è®¤"ç´æ¥åå¸"
â ä½¿ç¨ API åå¸
ç»æï¼
⢠å¤çå HTMLï¼wechat-temp/20260209-153000/processed.html
⢠æ¸
æ´åå¾çï¼wechat-temp/20260209-153000/images/ (5å¼ )
⢠微信è稿箱 media_id: xyz789...
ç¤ºä¾ 4: Markdown æä»¶åå¸
ç¨æ·ï¼åå¸è¿ä¸ª Markdown æä»¶ï¼./posts/my-article.md
Agentï¼
â 读åæä»¶ï¼è§£æ frontmatter
â 询é®ä¸»é¢ â ç¨æ·éæ© "grace"
â 转æ¢ä¸º HTMLï¼åºç¨ä¸»é¢æ ·å¼
â ä¸è½½æç« ä¸ç 3 å¼ è¿ç¨å¾ç
â èªå¨çæå°é¢å¾ï¼åºäºæ é¢ï¼
â åå¸å°å¾®ä¿¡
ç»æï¼
⢠HTML è¾åºè³ ./posts/my-article.html
⢠å°é¢å¾ï¼./posts/my-article-cover.jpg
⢠已åå¸å°è稿箱
ç¤ºä¾ 5: å¾ææ¶æ¯åå¸
ç¨æ·ï¼åå¸ä¸ç»äº§åå¾çå°å
¬ä¼å·ï¼æ 颿¯"æ°åä¸å¸"
Agentï¼
â è¯å«ä¸ºå¾æå叿¨¡å¼
â æå¼æµè§å¨ï¼å®ä½å°å¾ææ¶æ¯ç¼è¾å¨
â å¡«åæ é¢
â ä¸ä¼ 6 å¼ å¾ç
â æäº¤åå¸
ç»æï¼
â¢ å¾ææ¶æ¯å·²ä¿åå°è稿箱
⢠å
å« 6 å¼ äº§åå¾ç
åèææ¡£
| ä¸»é¢ | ææ¡£ |
|---|---|
| 徿åå¸åæ°ãèªå¨å缩 | references/image-text-posting.md |
| æç« 主é¢ãå¾çå¤ç | references/article-posting.md |
æéè¦æ±
- ç½ç»è®¿é®ï¼è·å龿¥å 容ãä¸è½½å¾ç
- æä»¶è¯»åï¼ä¿åæç« ãå¾çåé ç½®
- ç¯å¢åéï¼è¯»å微信 API åè¯
- å¤é¨å½ä»¤ï¼è°ç¨ bun/npx æ§è¡ TypeScript èæ¬
- æµè§å¨ï¼å¯éï¼ï¼Chrome ç¨äºæµè§å¨å叿¹å¼
ä¾èµä¸è®¸å¯
æ ¸å¿ä¾èµ
- Bun/Node.jsï¼è¿è¡ TypeScript èæ¬ï¼Node.js >= 18.0.0ï¼
- npm/bunï¼å 管çå¨ï¼ç¨äºå®è£ ä¾èµï¼
èªå¨å®è£ çä¾èµ
èæ¬ä¼å¨é¦æ¬¡è¿è¡æ¶éè¿ scripts/ensure-deps.ts èªå¨å®è£
以ä¸ä¾èµï¼
å¿ éå ï¼
front-matter– Frontmatter è§£æhighlight.js– 代ç é«äº®marked– Markdown 渲æå¼æreading-time– é 读æ¶é´è®¡ç®juice– CSS å è转æ¢åº
å¯éå ï¼å°é¢å¾çæï¼ï¼
@napi-rs/canvas– 髿§è½å¾ççæsharp– å¾çå¤çåº
è¿è¡æ¶ä¾èµï¼å¯éï¼
- Chrome/Chromiumï¼æµè§å¨å叿¹å¼éè¦
- å¾®ä¿¡å ¬ä¼å· API åè¯ï¼API å叿¹å¼éè¦
许å¯è¯
- Markdown 渲æå¼æåºäº MIT 许å¯è¯
- å¾®ä¿¡å ¬ä¼å· API 使ç¨ééµå®å¾®ä¿¡å ¬ä¼å¹³å°æå¡åè®®
è´è°¢
æ¬æè½æ´åäºä»¥ä¸åè½åææ¯ï¼
- Markdown 渲æï¼åºäº marked 忩屿件
- æ ·å¼ä¸»é¢ï¼åèå¾®ä¿¡å ¬ä¼å·ä¼ç§æçå®è·µ
- å¾çå¤çï¼JPEG å æ°æ®æ¸ æ´ç®æ³
- 微信 APIï¼å®æ¹ææ¡£åæä½³å®è·µ
æ´æ°æ¥å¿
v1.0.3 (2026-02-10)
- â ä¼åå°é¢å¾è§åï¼è®¾ç½®ä¸ºå¼ºå¶é»è¾ãæªæå®å°é¢æ¶ï¼è¥æç« 䏿å¾åé»è®¤ä½¿ç¨ç¬¬ä¸å¼ ï¼ä» å¨æç« æ 徿¶æçæé»è®¤å°é¢ã
v1.0.2 (2026-02-10)
- â ä¼åé å¾çç¥ï¼ä¼å 使ç¨å¤æ¨¡æå¤§æ¨¡åçæé«è´¨éå°é¢å¾
- â ä¿®æ£
md-to-wechat.tsèæ¬æ¯æ--outputåæ°
v1.0.1 (2026-02-10)
- â æ°å¢æ é¢çæ 5 大ååï¼çç¹æç¡®ãæ°åå¸å¼ãç»æå¯¼åãæ ç»ªè°å¨ãæ¬å¿µè®¾ç½®ï¼
- â æ°å¢æç« æçè§èï¼æ®µè½ç»æãé å¾ä½ç½®ã代ç åãéå¥è®¾è®¡ï¼
- â ä¼åå 容å使µç¨ï¼æåæç« å¯è¯»æ§åä¼ ææ§
v1.0.0 (2026-02-09)
- â æ´åå 容åä½å龿¥åå¸åè½
- â å ç½® Markdown 转 HTML 转æ¢å¨
- â æ¯æä¸ç§ä¸»é¢æ ·å¼ï¼default, grace, simpleï¼
- â èªå¨å¾çå æ°æ®æ¸ æ´
- â CSS èªå¨å è转æ¢
- â å°é¢å¾çæï¼æ ç³»ç»ä¾èµï¼
- â API åæµè§å¨ä¸¤ç§å叿¹å¼
- â 宿´ç工使µç¨åé误å¤ç
æè½çæ¬ï¼1.0.3 æåæ´æ°ï¼2026-02-10 ä½è ï¼æ´åèª wechat-article-writer å baoyu-post-to-wechat