redbook-creator-publish
npx skills add https://github.com/yanquankun/redbook-creator-publish --skill redbook-creator-publish
Agent 安装分布
Skill 文档
å°çº¢ä¹¦å¸ååä½ä¸å叿è½
æ¦è¿°
å¿«éåä½å¹¶åå¸å°çº¢ä¹¦å¸å,å æ¬æ é¢ãæ£æãæ ç¾ãé å¾,èªå¨ä¸ä¼ å°å°çº¢ä¹¦å¹³å°ã
æ ¸å¿ç¹ç¹(v5.3):
- ð æç®æµç¨:æç´¢ â çæå 容 â è·åé å¾ â éªè¯å¾ç â èªå¨ä¸ä¼
- ð¼ï¸ æºè½é å¾:ä»ç½ç»ä¸è½½å ¬å¼å¾çæ AI çæ
- â å¾çéªè¯:èªå¨æ£æµæ æå¾çå¹¶å é¤,ç¡®ä¿5-6å¼ ææå¾ç
- ð ç²¾ç®è¾åº:åªçæ preview.htmlãconfig.jsonãimages/
- ð¤ èªå¨ä¸ä¼ :ç´æ¥è§¦å,åå°æå¨ç¡®è®¤
- ð ç»å½æ£æµ:æºè½æ£æµç»å½ç¶æ,20ç§çå¾ æç¤º
- ð é¶ä¾èµ:Python åçè½å为主
åç½®æ£æ¥(ç¬¬ä¸æ¥,èªå¨æ§è¡)
æ£æ¥ Python
python3 --version # è¦æ± 3.7+
å ¨å±æ£æµå¹¶å®è£ Playwright
éè¦: åªå¨æªå®è£ æ¶æå®è£ ,é¿å éå¤å®è£
# æ£æ¥ playwright æ¯å¦å·²å®è£
(å
¨å±æ£æµ)
if python3 -c "import playwright" 2>/dev/null; then
echo "â
Playwright å·²å®è£
,è·³è¿å®è£
"
else
echo "ð¦ æ£å¨å®è£
Playwright å°ç¨æ·å
¨å±ç¯å¢..."
# å®è£
å°ç¨æ·å
¨å±ç¯å¢
pip3 install --user playwright
# å®è£
Chromium æµè§å¨
python3 -m playwright install chromium
echo "â
Playwright å®è£
宿"
fi
æ£æµé»è¾:
- å æ£æ¥ç³»ç»æ¯å¦å·²å®è£ playwright 模å
- 妿已å®è£ ,è·³è¿å®è£ æ¥éª¤
- 妿æªå®è£
,å®è£
å°ç¨æ·å
¨å±ç¯å¢(
--user) - åªéå®è£ 䏿¬¡,åç»ä½¿ç¨æ ééå¤å®è£
è¾åº:â
ç¯å¢æ£æ¥å®æ
工使µç¨
æ¥éª¤1:深度æç´¢è¯é¢
ä½¿ç¨ WebSearch å·¥å ·æç´¢ 2-3 个ç¸å ³å ³é®è¯,è·åææ°æ°æ®åæ¡ä¾ã
æ¥éª¤2:çæå¸åå 容
- æ é¢:ä¸è¶ è¿20个å符(å«emoji),å å«é©åè¯,ç®æ´æå
- æ£æ:300-500å,å¼å¤´é©å â æ ¸å¿å 容 â æ»ç»äºå¨
- æ ç¾:5个(ç²¾éæ ¸å¿æ ç¾,ä¸è¦è¶ è¿5个)
æ¥éª¤3:è·åé å¾(5-6å¼ )
ä¼å 级:
- ä»ç½ç»ä¸è½½å ¬å¼å¾ç(Unsplash/Pexels/Pixabay)
- AI çæè¡¥å (å¯é,å¦ææ¨¡åæ æ³çæåè·³è¿)
è¦æ±:
- æ°é:5-6å¼ (1å°é¢ + 4-5å 容å¾)
- å½å:cover.png, image_1.png, image_2.png, image_3.png, image_4.png…
- æ ¼å¼:PNG/JPG
ð¯ ç²¾åé å¾å ³é®è¯çæçç¥(éè¦!)
æ ¸å¿åå: æç´¢å ³é®è¯å¿ é¡»é«åº¦å ·ä½å,é¿å æ³åè¯æ±
å ³é®è¯çæè§å:
-
主ä½è¯å¿ é¡»å ·ä½å: ä¸ç¨æ³åè¯,ç¨å ·ä½å®ä½å
- â é误: “æ¸¸æ” “game” “gaming”
- â æ£ç¡®: “Minecraft” “æçä¸çæ¹å” “Minecraft Steve”
-
åºæ¯/ç»é¢è¯ä¼å : æè¿°å ·ä½ç»é¢å 容
- â é误: “ç¾é£” “food”
- â æ£ç¡®: “æé¢ç¹å” “ramen noodles closeup”
-
è±æå ³é®è¯ä¸ºä¸»: å¾åºç¨è±ææç´¢æææ´å¥½
- å°ä¸æä¸»é¢ç¿»è¯æå¯¹åºçè±æä¸æåè¯
- 游æ:ç¨æ¸¸æå®æ¹è±æå
- åç:ç¨åçè±æå
ä¸å主é¢çå ³é®è¯æå»º:
| 主é¢ç±»å | æ³åè¯(âé¿å ) | ç²¾åè¯(â 使ç¨) |
|---|---|---|
| 游æãæçä¸çã | game, gaming, 游æ | Minecraft, Minecraft blocks, Minecraft world, pixel art cube |
| 游æãåç¥ã | game, RPG | Genshin Impact, Genshin character, anime game |
| 游æãçè è£èã | MOBA, ææ¸¸ | Honor of Kings, MOBA hero |
| ç¾é£-ç«é | food, ç¾é£ | hotpot, Chinese hotpot, spicy pot |
| æ è¡-æ¥æ¬ | travel, æ è¡ | Tokyo tower, Japan temple, cherry blossom |
| ç§æ-AI | technology | AI robot, artificial intelligence, neural network |
| ç©¿æ-é©ç³» | fashion, ç©¿æ | Korean outfit, OOTD, minimalist style |
é å¾æç´¢æ§è¡æ¥éª¤:
- åæå¸å主é¢,æåæ ¸å¿å®ä½(游æå/åçå/å°ç¹åç)
- å°æ ¸å¿å®ä½è½¬æ¢ä¸ºè±æä¸æåè¯
- ç»åæç´¢è¯:
[è±æä¸æåè¯] + [ç»é¢æè¿°è¯] - æ¯å¼ å¾ä½¿ç¨ä¸åè§åº¦çå ³é®è¯ç»å
ç¤ºä¾ – 主颔æçä¸ç游æ”:
å°é¢å¾: "Minecraft world landscape" æ "Minecraft building"
å¾1: "Minecraft blocks closeup"
å¾2: "Minecraft Steve character"
å¾3: "Minecraft castle build"
å¾4: "Minecraft pixel art"
å¾5: "Minecraft survival gameplay"
ç¤ºä¾ – 主颔ç«é æ¨è”:
å°é¢å¾: "Chinese hotpot restaurant"
å¾1: "hotpot ingredients fresh"
å¾2: "spicy hotpot soup"
å¾3: "hotpot meat slices"
å¾4: "hotpot dipping sauce"
mkdir -p ./redbook-article/[主é¢]-[æ¥æ]/images/
# 使ç¨ç²¾åå
³é®è¯ä¸è½½å¾çå° images ç®å½
æ¥éª¤3.5:éªè¯å¾çæææ§(éè¦!)
ä¸è½½å®æåå¿ é¡»éªè¯æ¯å¼ å¾ç,å 餿 æå¾çå¹¶è¡¥å ä¸è½½,ç¡®ä¿æç»æ5-6å¼ ææå¾çã
import os
import struct
def is_valid_image(file_path):
"""éªè¯å¾çæä»¶æ¯å¦ææ"""
if not os.path.exists(file_path):
return False
# æ£æ¥æä»¶å¤§å°(è³å°1KB)
if os.path.getsize(file_path) < 1024:
return False
try:
with open(file_path, 'rb') as f:
header = f.read(32)
# PNG: 89 50 4E 47 0D 0A 1A 0A
if header[:8] == b'\x89PNG\r\n\x1a\n':
return True
# JPEG: FF D8 FF
if header[:3] == b'\xff\xd8\xff':
return True
# GIF: GIF87a æ GIF89a
if header[:6] in (b'GIF87a', b'GIF89a'):
return True
# WebP: RIFF....WEBP
if header[:4] == b'RIFF' and header[8:12] == b'WEBP':
return True
except Exception:
return False
return False
def validate_and_clean_images(images_dir):
"""éªè¯å¹¶æ¸
çæ æå¾ç,è¿åææå¾çå表"""
valid_images = []
invalid_images = []
for filename in sorted(os.listdir(images_dir)):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp')):
file_path = os.path.join(images_dir, filename)
if is_valid_image(file_path):
valid_images.append(filename)
print(f"â
{filename} - ææ")
else:
invalid_images.append(filename)
print(f"â {filename} - æ æ,å·²å é¤")
os.remove(file_path)
return valid_images, invalid_images
# 使ç¨ç¤ºä¾
images_dir = '/path/to/images'
valid, invalid = validate_and_clean_images(images_dir)
print(f"\nææå¾ç: {len(valid)} å¼ ")
print(f"å·²å 餿 æå¾ç: {len(invalid)} å¼ ")
# 妿ææå¾çä¸è¶³5å¼ ,éè¦è¡¥å
ä¸è½½
if len(valid) < 5:
print(f"â ï¸ å¾çä¸è¶³,éè¦è¡¥å
{5 - len(valid)} å¼ ")
éªè¯æµç¨:
- ä¸è½½ææå¾çå,è¿è¡éªè¯èæ¬
- å 餿 æå¾ç(æä»¶å¤´ä¸æ£ç¡®æå¤§å°è¿å°)
- ç»è®¡ææå¾çæ°é
- 妿ææå¾çå°äº5å¼ ,å¿ é¡»è¡¥å ä¸è½½æ°å¾ç
- éå¤éªè¯ç´å°æ5-6å¼ ææå¾ç
æ¥éª¤4:çææ¬å°æä»¶
ç®å½ç»æ:
redbook-article/
âââ [主é¢]-[æ¥æ]/
âââ preview.html
âââ config.json
âââ images/
âââ cover.png
âââ image_1.png
âââ image_2.png
âââ image_3.png
âââ image_4.png
çæ config.json(éè¦:ä½¿ç¨ json.dump èªå¨è½¬ä¹):
import json
config = {
"title": title,
"content": content, # json.dump ä¼èªå¨å¤ç转ä¹
"tags": tags,
"cover": "images/cover.png",
"images": ["images/image_1.png", "images/image_2.png", "images/image_3.png", "images/image_4.png"]
}
with open('config.json', 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)
çæ preview.html(ä½¿ç¨ Newsprint 飿 ¼æ¨¡æ¿):
- è¯»åæ¨¡æ¿:
/Users/a58/.claude/skills/redbook-creator-publish/assets/preview-template.html - æ¿æ¢åé:
{{TITLE}}â æ é¢{{CONTENT}}â æ£æ{{DATE}}â æ¥æ{{TAGS}}â æ ç¾HTML(æ¯ä¸ªæ ç¾å 裹å¨<span class="tag">ä¸)
- æ·»å å°é¢å¾åé
å¾ç
<img>æ ç¾ - ä¿å为
preview.html
æ¥éª¤5:èªå¨ä¸ä¼ å°å°çº¢ä¹¦
éè¦:å¿ é¡»è§¦åèªå¨ä¸ä¼ ,å³ä½¿å颿é误ä¹è¦å°è¯ã
python3 /Users/a58/.claude/skills/redbook-creator-publish/scripts/auto_upload_playwright.py \
--config ./redbook-article/[主é¢]-[æ¥æ]/config.json
æµç¨(v5.1 ä¼å):
- æå¼å°çº¢ä¹¦åä½è å¹³å°
- æºè½ç»å½æ£æµ:
- èªå¨æ£æµä¸ä¼ æ§ä»¶DOMæ¯å¦åå¨
- 妿ªç»å½,æç¤ºç¨æ·å¨ 20 ç§å ç»å½
- æ¯ç§æ£æµä¸æ¬¡,ç»å½æååèªå¨ç»§ç»
- 20 ç§å仿ªæ£æµå°æ§ä»¶,éåºå¹¶æç¤ºæå¨ä¸ä¼
- ä¸ä¼ å¾ç(cover.png 第ä¸å¼ )
- å¡«åæ é¢
- 填忣æ
- é个è¾å ¥æ ç¾(é´é1ç§+å车)
- ç¹å»åå¸
- æµè§å¨ä¿ææå¼(ä¸èªå¨å ³é)
注æäºé¡¹
å 容åä½
- æ é¢:ä¸è¶ è¿20个å符(å«emoji)
- æ£æåæ°:300-500å
- é 徿°é:5-6å¼ (1å°é¢+4-5å¯å¾)
- æ ç¾:5个(ä¸è¦è¶ è¿5个)
- å¾çæ¥æº:å ¬å¼å è´¹å¾åºæ AI çæ
- å¾çéªè¯:ä¸è½½åå¿ é¡»éªè¯æææ§,å 餿 æå¾çå¹¶è¡¥å
èªå¨ä¸ä¼ (v5.1)
- å¿ é¡»è§¦åä¸ä¼ èæ¬
- 馿¬¡ä½¿ç¨:å¨20ç§æç¤ºæå ç»å½å°çº¢ä¹¦è´¦å·
- åç»ä½¿ç¨:èªå¨ä¿æç»å½,æ ééå¤ç»å½
- æ ç¾é´é 1 ç§å¹¶å车
- æµè§å¨ä¸ä¼èªå¨å ³é,å¯ç»§ç»æ¥çæç¼è¾
- å¦ 20 ç§å æªç»å½,请æå¨ä¸ä¼ æéæ°æ§è¡
ææ¯é ç½®
- Python 3.7+
- Playwright(åªéå®è£ 䏿¬¡,å ¨å±æ£æµ)
- config.json ä¸æç¬¦å·éæ£ç¡®è½¬ä¹
æå¨ä¸ä¼ å¤éæ¹æ¡
妿èªå¨ä¸ä¼ 失败:
- æå¼:https://creator.xiaohongshu.com/publish/publish
- æé¡ºåºä¸ä¼ å¾ç(cover.png 第ä¸å¼ )
- ä» preview.html å¤å¶æ é¢åæ£æ
- æ·»å æ ç¾
- ç¹å»åå¸
åèææ¡£
- references/style-guide.md – å°çº¢ä¹¦å 容飿 ¼è§è
- scripts/auto_upload_playwright.py – Playwright èªå¨ä¸ä¼ èæ¬
- assets/preview-template.html – Newsprint 飿 ¼é¢è§æ¨¡æ¿
æ´æ°æ¥å¿
v5.4 (2026-01-27)
- â æ°å¢ç²¾åé å¾å ³é®è¯çæçç¥
- â æ·»å ä¸å主é¢çå ³é®è¯æå»ºè§å表
- â 强è°ä½¿ç¨è±æä¸æåè¯æç´¢
- â æä¾æ¸¸æ/ç¾é£/æ è¡ç主é¢çæç´¢å ³é®è¯ç¤ºä¾
- â æ´æ°style-guide.mdå¢å 主é¢ç²¾åå¹é åå
v5.3 (2026-01-27)
- â æ°å¢å¾çæææ§éªè¯(æ£æµæä»¶å¤´å大å°)
- â èªå¨å 餿 æå¾çå¹¶æç¤ºè¡¥å ä¸è½½
- â é 徿°éè°æ´ä¸º5-6å¼ (1å°é¢+4-5å¯å¾)
- â æ·»å allowedCommands é ç½®,åå°æå¨ç¡®è®¤æç¤º
v5.2 (2026-01-27)
- â æ é¢éå¶æ¹ä¸º20个å符(å«emoji)
- â æ ç¾æ°éä»8-10个æ¹ä¸º5个
- â é ç½®èªå¨æ¹åæé,åå°ç¡®è®¤æç¤º
v5.1 (2026-01-27)
- â æ°å¢æºè½ç»å½æ£æµ(æ£æµä¸ä¼ æ§ä»¶DOM)
- â 20ç§ç»å½çå¾ æç¤º,æ¯ç§æ£æµ
- â æµè§å¨ä¸èªå¨å ³é,ä¿ææå¼ç¶æ
- â Playwright å ¨å±å®è£ æ£æµ,é¿å éå¤å®è£
v5.0 (2026-01-27)
- æç®çåå¸
çæ¬:v5.4(ç²¾åé å¾ç) æ´æ°æ¥æ:2026-01-27