podcast-publish-xiaoyuzhou
npx skills add https://github.com/muzhicaomingwang/ai-ideas --skill podcast-publish-xiaoyuzhou
Agent 安装分布
Skill 文档
æå®¢åå¸å°å°å®å® Skill
æ¦è¿°
æ¤ Skill å®ç°äºæ¯æ¥ç§ææ©æ¥æå®¢çå ¨èªå¨å叿µç¨ï¼æå®¢çæ â RSS.comåå¸ â å°å®å®åæ¥ â é£ä¹¦éç¥ã
项ç®è·¯å¾: /Users/qitmac001395/workspace/QAL/ideas/apps/daily-podcast-ai
æ ¸å¿è½å
| åè½ | ç¶æ | æéé ç½® |
|---|---|---|
| æ©æ¥æå®¢çæ | â å¯ç¨ | ELEVENLABS_API_KEY |
| RSS.comèªå¨åå¸ | â å¯ç¨ | RSS_COM_API_KEY + RSS_COM_PODCAST_ID |
| å°å®å®RSS订é | â å¯ç¨ | 䏿¬¡æ§æå¨é ç½® |
| é£ä¹¦æ¶æ¯éç¥ | â å¯ç¨ | FEISHU_APP_ID + FEISHU_APP_SECRET + FEISHU_RECEIVER_OPEN_ID |
| 宿¶èªå¨æ§è¡ | â å¯ç¨ | macOS launchd (æ¯å¤©7ç¹) |
ä½¿ç¨æ¹æ³
æ¹å¼1: èªå¨æ§è¡ï¼æ¨èï¼
æ éæä½ï¼æ¯å¤©æ©ä¸7ç¹èªå¨è¿è¡ï¼
07:00 - ä»ç¼åè¯»åæ°é»ï¼0:00-6:00æ¶éç30-50ç¯ï¼
07:02 - AIä¼éTop 10æ°é»
07:05 - çæå¯¹è¯èæ¬ï¼åäººææ¥æ¨¡å¼ï¼
07:10 - TTSè¯é³åæï¼ElevenLabsï¼
07:15 - åå¹¶é³é¢ + çæå°é¢
07:17 - åå¸å°RSS.com
07:18 - åéé£ä¹¦éç¥
08:00 - å°å®å®èªå¨åæ¥
æ¹å¼2: æå¨å叿宿¥æ
cd /Users/qitmac001395/workspace/QAL/ideas/apps/daily-podcast-ai
# å叿¨å¤©çæå®¢
python scripts/publish_to_rss.py --date 2026-01-14
# çæä»å¤©çæå®¢å¹¶åå¸
python scripts/daily_generate.py --from-cache && \
python scripts/publish_to_rss.py --date $(date +%Y-%m-%d)
æ¹å¼3: ä» åéé£ä¹¦éç¥
python scripts/notify_feishu.py \
--date 2026-01-14 \
--rss-url "https://rss.com/podcasts/xxx/feed.xml" \
--episode-url "https://rss.com/podcasts/xxx/episodes/ep_xxx" \
--article-count 10
馿¬¡é ç½®æå
æ¥éª¤1: RSS.comé ç½®ï¼5åéï¼
-
注åè´¦å·: https://rss.com/ â Sign Up
-
å建æå®¢: Dashboard â Create New Podcast
åç§°: 仿¥ç§ææ©æ¥ åç±»: Technology / News è¯è¨: Chinese (Simplified) -
è·ååè¯:
- Settings â API Keys â Generate New API Key
- å¤å¶ API Key:
rss_com_sk_xxx - 仿客URLè·å Podcast ID
-
é ç½®ç¯å¢åé: ç¼è¾
apps/daily-podcast-ai/.envï¼RSS_COM_API_KEY=rss_com_sk_your_actual_key RSS_COM_PODCAST_ID=your-podcast-uuid
æ¥éª¤2: å°å®å®è®¢é é ç½®ï¼3åéï¼ä» é䏿¬¡ï¼
- ç»å½åä½è å¹³å°: https://podcaster.xiaoyuzhoufm.com/podcasts/695e1e64e0970c835fb2e784/home
- æ·»å RSS订é
:
- 设置 â RSS Feed设置
- è¾å
¥:
https://rss.com/podcasts/{YOUR_ID}/feed.xml - ç¹å»ãéªè¯å¹¶å¯¼å ¥ã
- 馿¬¡åæ¥: ç¹å»ãç«å³åæ¥ã
æ¥éª¤3: é£ä¹¦éç¥é ç½®ï¼å¯éï¼5åéï¼
- å建é£ä¹¦åºç¨: https://open.feishu.cn/app
- æ·»å æé:
im:message+im:message:send_as_bot - é
ç½®ç¯å¢åé:
FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx FEISHU_RECEIVER_OPEN_ID=ou_18b8063b232cbdec73ea1541dfb74890 # çæ¤è
æ¥éª¤4: æµè¯éªè¯ï¼2åéï¼
# æµè¯åå¸
python scripts/publish_to_rss.py --date 2026-01-14
# 颿çå°:
# â
Episode published successfully!
# ð± åéé£ä¹¦éç¥...
# â
é£ä¹¦æ¶æ¯åéæå
ææ¯æ¶æ
éææµç¨å¾
âââââââââââââââ
â æ©æ¥çæ â scripts/daily_generate.py
â (æ¯å¤©7ç¹) â - ä»cacheè¯»åæ°é»
ââââââââ¬âââââââ - AIä¼éTop 10
â - TTSè¯é³åæ
â
âââââââââââââââ
â è¾åºæä»¶ â output/{date}/dailyReport/
â â - podcast-{date}-1.2x.mp3
â â - cover-{date}.png
ââââââââ¬âââââââ - script-{date}.md
â
â
âââââââââââââââ
â RSSåå¸ â scripts/publish_to_rss.py
â â - ä¸ä¼ é³é¢å°RSS.com
ââââââââ¬âââââââ - å建åéå
æ°æ®
â
ââââââââââââââââââââ
â â
âââââââââââââââ âââââââââââââââ
â RSS Feed â â é£ä¹¦éç¥ â scripts/notify_feishu.py
â æ´æ° â â â - åéå¡çæ¶æ¯
ââââââââ¬âââââââ âââââââââââââââ - å
å«RSS龿¥
â
â (æ¯å°æ¶)
âââââââââââââââ
â å°å®å®åæ¥ â podcaster.xiaoyuzhoufm.com
â â - èªå¨æåRSS
âââââââââââââââ - åå¸å°App
å ³é®æä»¶
| æä»¶ | è¡æ° | åè½ |
|---|---|---|
scripts/publish_to_rss.py |
376 | RSS.comåå¸ä¸»èæ¬ |
scripts/notify_feishu.py |
191 | é£ä¹¦éç¥èæ¬ |
scripts/daily_generate.py |
651 | æå®¢çææ ¸å¿é»è¾ |
scripts/daily_automated_run.sh |
100 | 宿¶ä»»å¡æ§è¡èæ¬ |
docs/XIAOYUZHOU_INTEGRATION.md |
– | 宿´éææå |
QUICKSTART_XIAOYUZHOU.md |
– | 5åéå¿«éå¼å§ |
ç¯å¢å鿏 å
# å¿
é - æå®¢çæ
ELEVENLABS_API_KEY=sk_xxx # TTSè¯é³åæ
# å¯é - AIå¢å¼º
OPENAI_API_KEY=sk-xxx # AIæè¦åä¼é
# å¿
é - RSSåå¸
RSS_COM_API_KEY=rss_com_sk_xxx # RSS.com API
RSS_COM_PODCAST_ID=xxx-xxx-xxx # æå®¢é¢éID
# å¯é - é£ä¹¦éç¥
FEISHU_APP_ID=cli_xxx # é£ä¹¦åºç¨ID
FEISHU_APP_SECRET=xxx # é£ä¹¦å¯é¥
FEISHU_RECEIVER_OPEN_ID=ou_xxx # æ¥æ¶è
Open ID
ä»£ç æ¹è¿ï¼å·²å®ç°ï¼
1. æºè½æä»¶åè¯å«ï¼publish_to_rss.py:258-269ï¼
é®é¢: 项ç®çæ podcast-{date}-1.2x.mp3ï¼ä½èæ¬ææ podcast-{date}.mp3
è§£å³: èªå¨æ¥æ¾å¹¶ä½¿ç¨å¤éççæ¬
audio_file = base_path / f"podcast-{args.date}.mp3"
if not audio_file.exists():
audio_file_12x = base_path / f"podcast-{args.date}-1.2x.mp3"
audio_file_15x = base_path / f"podcast-{args.date}-1.5x.mp3"
if audio_file_12x.exists():
audio_file = audio_file_12x
2. å¤ç«¯ç¹éè¯æºå¶ï¼publish_to_rss.py:106-159ï¼
é®é¢: RSS.com API端ç¹å¯è½åå
è§£å³: 便¬¡å°è¯3个å¯è½ç端ç¹
upload_endpoints = [
f"{self.API_BASE_URL}/upload",
f"{self.API_BASE_URL}/media",
f"{self.API_BASE_URL}/podcasts/{self.podcast_id}/media"
]
3. é£ä¹¦éç¥éæï¼publish_to_rss.py:343-362ï¼
åè½: å叿ååèªå¨è°ç¨ notify_feishu.py
ç¹æ§:
- 使ç¨
check=Falseé¿å éç¥å¤±è´¥ä¸æä¸»æµç¨ - èªå¨æåæç« æ°é
- ä¼ éRSS URLååéURL
é£ä¹¦æ¶æ¯ææ
å叿ååï¼æ¥æ¶è 伿¶å°èè²å¡çæ¶æ¯ï¼
âââââââââââââââââââââââââââââââââââââââââââ
â ðï¸ ä»æ¥ç§ææ©æ¥å·²åå¸ â
âââââââââââââââââââââââââââââââââââââââââââ¤
â ð
æ¥æ: 2026-01-14 â
â ð° å
容: ç²¾é 10 ç¯ç§ææ°é» â
â â
â ð¢ åå¸ç¶æ: â
â - â
RSS.com å叿å â
â - â³ å°å®å®åæ¥ä¸ï¼é¢è®¡1å°æ¶å
ï¼ â
â â
â ð åé龿¥: https://rss.com/... â
â ð¡ RSS Feed: https://rss.com/...feed.xmlâ
â â
â âââââââââââââââââââââââââââââââââââââââ â
â ð¡ å°å®å®è®¢é
æ¥éª¤: â
â 1. æå¼å°å®å®åä½è
å¹³å° â
â 2. ç¹å»ãç«å³åæ¥ãæ¥çææ°åé â
â 3. 馿¬¡è®¾ç½®éæ·»å RSS订é
ï¼ä»
é䏿¬¡ï¼ â
âââââââââââââââââââââââââââââââââââââââââââ
æ éææ¥
常è§é®é¢
| é®é¢ | çç¶ | è§£å³æ¹æ¡ |
|---|---|---|
| RSSåå¸å¤±è´¥ | 401 Unauthorized |
æ£æ¥API Keyæ¯å¦æ£ç¡®/è¿æ |
| æä»¶æ¾ä¸å° | Missing required files |
确认æå®¢å·²çæï¼æ£æ¥outputç®å½ |
| å°å®å®æªåæ¥ | RSSæåä½Appæ åé | æå¨ç¹å»ãç«å³åæ¥ã |
| é£ä¹¦éç¥å¤±è´¥ | å叿å使 æ¶æ¯ | æ£æ¥åºç¨æéï¼éªè¯open_id |
| API端ç¹404 | Endpoint not found |
æ¥çRSS.comææ°APIææ¡£ |
è°è¯å½ä»¤
# æ¥çæè¿ççææ¥å¿
tail -50 logs/daily_run.log
# æ£æ¥é误æ¥å¿
tail -50 logs/daily_error.log
# éªè¯RSS Feedå¯è®¿é®
curl -I "https://rss.com/podcasts/{YOUR_ID}/feed.xml"
# éªè¯ç¯å¢åé
python3 -c "from dotenv import load_dotenv; import os; load_dotenv(); \
print('RSS Key:', bool(os.getenv('RSS_COM_API_KEY'))); \
print('Podcast ID:', bool(os.getenv('RSS_COM_PODCAST_ID')))"
使ç¨åºæ¯
åºæ¯1: æ¯æ¥èªå¨åå¸ï¼é»è®¤ï¼
触å: æ¯å¤©07:00èªå¨æ§è¡ æµç¨: 宿´ççæ â åå¸ â éç¥ æ éæä½: é ç½®ä¸æ¬¡åæ°¸ä¹ çæ
åºæ¯2: è¡¥åæ¨å¤©çæå®¢
# ç¨æ·è¯´: "帮æéæ°å叿¨å¤©çæå®¢å°å°å®å®"
python scripts/publish_to_rss.py --date 2026-01-14
åºæ¯3: ä» éç¥ä¸åå¸
# ç¨æ·è¯´: "éç¥æ¤èæå®¢å·²åå¸"
python scripts/notify_feishu.py \
--date 2026-01-14 \
--rss-url "https://rss.com/podcasts/xxx/feed.xml" \
--article-count 10
åºæ¯4: çæä½ä¸åå¸
# ç¨æ·è¯´: "çæä»å¤©çæå®¢ä½å
ä¸åå¸"
python scripts/daily_generate.py --from-cache
# ä¸è¿è¡ publish_to_rss.py
ææ¯ç»è
RSS.com APIéæ
APIçæ¬: v4 Base URL: https://api.rss.com/v4 è®¤è¯æ¹å¼: Bearer Token
æ ¸å¿ç«¯ç¹:
POST /upload # ä¸ä¼ æä»¶ï¼ä¸»ç«¯ç¹ï¼
POST /media # å¤é端ç¹1
POST /podcasts/{id}/media # å¤é端ç¹2
POST /podcasts/{id}/episodes # å建åé
GET /podcasts/{id}/feed.xml # RSS Feed
æä»¶ä¸ä¼ :
- é³é¢: æå¤§100MBï¼æ¯æMP3/M4A
- å°é¢: æå¤§5MBï¼æ¨è3000x3000px PNG
- è¶ æ¶: 120ç§
å°å®å®éææ¹å¼
æ¹å¼: RSS订é ï¼éAPIä¸ä¼ ï¼
ä¼å¿:
- â 䏿¬¡é ç½®ï¼æ°¸ä¹ çæ
- â æ ééåå·¥ç¨å°å®å®API
- â 宿¹æ¯æï¼ç¨³å®å¯é
- â æ¯æå¤å¹³å°åå
æ´æ°é¢ç:
- é»è®¤: æ¯å°æ¶
- å¯è®¾ç½®: 30åé/2å°æ¶/4å°æ¶
é£ä¹¦éç¥å®ç°
æ¶æ¯ç±»å: Interactiveï¼å¡çæ¶æ¯ï¼
å¡çç»æ:
{
"header": {"title": "ðï¸ ä»æ¥ç§ææ©æ¥å·²åå¸", "template": "blue"},
"elements": [
{"tag": "markdown", "content": "ð
æ¥æ: {date}\nð° å
容: ç²¾é {count} ç¯..."}
]
}
ä¾èµåº: httpx>=0.27.0
çæ§ä¸ç»´æ¤
æ¥å¿ä½ç½®
logs/
âââ daily_run.log # 主æ¥å¿ï¼çæ+åå¸ï¼
âââ daily_error.log # é误æ¥å¿
âââ hourly-stdout.log # æ¯å°æ¶æ¶éæ¥å¿
âââ hourly-stderr.log # æ¶éé误
å ³é®æ¥å¿æç´¢
# æ¥çæè¿5次åå¸ç¶æ
grep "Publication completed" logs/daily_run.log | tail -5
# æ¥çRSSåå¸é误
grep "RSS" logs/daily_error.log
# æ¥çé£ä¹¦éç¥è®°å½
grep "é£ä¹¦éç¥" logs/daily_run.log | tail -5
æ°æ®æ¸ ç
# æ¸
ç30天åçæå®¢æä»¶ï¼èç空é´ï¼
find output/ -type d -mtime +30 -exec rm -rf {} +
# æ¸
çç¼åï¼ä¿çæè¿7天ï¼
find cache/ -name "*.json" -mtime +7 -delete
ææ¬é¢ä¼°
æ¯æ¥ææ¬
| æå¡ | ç¨é | ææ¬ |
|---|---|---|
| ElevenLabs TTS | 3-5åéé³é¢ | Â¥1-2 |
| OpenAI GPT-4o-mini | æè¦+ä¼é | Â¥0.5-1 |
| RSS.com | 3-5MBåå¨+æµé | å è´¹ |
| å°å®å® | RSS订é | å è´¹ |
| é£ä¹¦API | 1æ¡æ¶æ¯/天 | å è´¹ |
æåº¦æ»è®¡: Â¥45-90ï¼ä¸»è¦æ¯ElevenLabsåOpenAIï¼
å è´¹é¢åº¦
- ElevenLabs: 10,000 credits/æï¼çº¦10åéï¼
- OpenAI: éä»è´¹ï¼ä½gpt-4o-miniææ¬æä½
- RSS.com: å è´¹çæ¯æ5GBåå¨+æµé
- é£ä¹¦: ä¼ä¸èªå»ºåºç¨å è´¹
æ©å±åè½ï¼å¯éï¼
1. å¤å¹³å°åå
å°åä¸ä¸ªRSS Feedæäº¤å°ï¼
- å°å®å®ï¼å·²æ¯æï¼
- å马æé
- èæFM
- Apple Podcasts
- Spotify Podcasts
2. æ°æ®åæ
ä»RSS.comè·åç»è®¡æ°æ®ï¼
curl -H "Authorization: Bearer $RSS_COM_API_KEY" \
"https://api.rss.com/v4/podcasts/$RSS_COM_PODCAST_ID/analytics"
3. æºè½æ¨é
æ ¹æ®ææ¾æ°æ®ä¼åï¼
- è°æ´å叿¶é´ï¼å½å07:00ï¼
- ä¼åæ°é»éæ©çç¥
- A/Bæµè¯ä¸åææ¥é£æ ¼
4. æ¹éæä½
# æ¹éå叿è¿7天çæå®¢
for date in $(seq -f "%Y-%m-%d" 7 -1 1); do
python scripts/publish_to_rss.py --date $date
sleep 10
done
注æäºé¡¹
éè¦æé
-
APIåè¯å®å ¨:
- â
.envå·²å¨.gitignoreä¸ - â ä¸è¦å°API Keyæäº¤å°Git
- â ä¸è¦å¨æ¥å¿ä¸æå°å®æ´API Key
- â
-
æä»¶å½åè§è:
- 项ç®çæå¸¦éçåç¼çæä»¶ï¼
-1.2x.mp3ï¼ - åå¸èæ¬ä¼èªå¨è¯å«
- ä¼å 使ç¨1.2xçæ¬ï¼å¹³è¡¡æ¶é¿åé³è´¨ï¼
- 项ç®çæå¸¦éçåç¼çæä»¶ï¼
-
é误å¤ççç¥:
- RSSåå¸å¤±è´¥ â 䏿æµç¨ï¼éè¦äººå·¥ä»å ¥ï¼
- é£ä¹¦éç¥å¤±è´¥ â ä» è®°å½æ¥å¿ï¼ä¸å½±ååå¸ï¼
- å°å®å®åæ¥å»¶è¿ â 坿å¨è§¦å
-
RSS Feedæ´æ°é¢ç:
- RSS.com: 宿¶æ´æ°
- å°å®å®: æ¯å°æ¶æåï¼å¯é ç½®ï¼
- å é忥: æå¨ç¹å»ãç«å³åæ¥ã
ç¸å ³èµæº
宿¹ææ¡£
- RSS.com API: https://api.rss.com/v4/docs
- å°å®å®åä½è æå: https://podcaster.xiaoyuzhoufm.com/help
- é£ä¹¦å¼æ¾å¹³å°: https://open.feishu.cn/document/
é¡¹ç®ææ¡£
- 宿´éææå: docs/XIAOYUZHOU_INTEGRATION.md
- å¿«éå¼å§: QUICKSTART_XIAOYUZHOU.md
- 主项ç®README: apps/daily-podcast-ai/README.md
å·¥å ·é¾æ¥
- Feedéªè¯: https://validator.w3.org/feed/
- å¡çæ¶æ¯æå»º: https://open.feishu.cn/tool/cardbuilder
- ElevenLabs管ç: https://elevenlabs.io/app/
æ´æ°è®°å½
- 2026-01-15: åå§çæ¬ï¼æ¯æRSS.comèªå¨åå¸åå°å®å®è®¢é
- 2026-01-15: æ·»å é£ä¹¦éç¥åè½ï¼çæ¤èï¼
- 2026-01-15: ä¿®å¤å¤éçé³é¢æä»¶åè¯å«é®é¢
- 2026-01-15: å¢å¼ºAPIé误å¤çï¼æ¯æå¤ç«¯ç¹éè¯
Skillç»´æ¤è
- å建è : Claude Code
- 项ç®: daily-podcast-ai
- çæ¬: v1.0.0
- æåæ´æ°: 2026-01-15