字节笔记本
2026年8月29日
GitHub Action + Podwise:自动听中文播客热榜
中文播客每天上新很多,真要听完热榜不现实。有人把《枫言枫语》的中文播客榜做成了定时 GitHub Action,每天把热门节目、热门播客、新锐节目写成 JSON;再把小宇宙链接丢给 Podwise CLI,就能自动出转录、摘要和思维导图。后面用关键词搜一下,热点大概在聊什么,不用先戴上耳机。
整条链路是:GitHub Action 抓热榜 → Podwise 转录和摘要 → 关键词检索。
热榜数据从哪来
仓库是 cellinlab/xyzrank,fork 自 eddiehe99/xyzrank(上游已经 archived)。数据源是 xyzrank.com,作者是播客《枫言枫语》。Action 每天 UTC 12:00 跑一次(也可以在仓库里手动触发),调官方 API 分页拉取,再把结果 commit 回去。
脚本 update_data.py 拉这四份:
| 文件 | 内容 |
|---|---|
hot_episodes.json | 热门节目 |
full.json | 热门播客 |
hot_episodes_new.json | 新锐节目 |
new_podcasts.json | 新锐播客 |
每条节目大概有这些字段:title、podcastName、link(小宇宙 URL)、playCount、duration、postTime。link 正好能喂给 Podwise。
托管页 xyzrank.eddiehe.top 也挂过这几份 JSON,更新不一定跟 fork 同步。要最新数据,直接读仓库里的 raw 文件更稳。
先把榜拉下来
不必自己 fork。本地看一眼热门节目:
curl -sL https://raw.githubusercontent.com/cellinlab/xyzrank/main/hot_episodes.json \
| python3 -c "
import json,sys
eps=json.load(sys.stdin)['data']['episodes']
for i,e in enumerate(eps[:10],1):
print(f\"{i}. {e['podcastName']} | {e['title']}\")
print(f\" {e['link']}\")
"想自己养一份每日更新,fork 仓库即可。.github/workflows/daily_update.yml 已经写好:装 Python 3.13、跑 update_data.py、有变更就 commit。权限只要 contents: write。
装 Podwise CLI
podwise-cli 是 Go 写的命令行,给代理和脚本用。文档写明:CLI 和 MCP 需要 Podwise 的 Pro 或 Enterprise。
macOS:
brew install hardhackerlabs/podwise-tap/podwise其它平台:
curl -sL https://raw.githubusercontent.com/hardhackerlabs/podwise-cli/main/install.sh | sh授权一次:
podwise auth
podwise config show已经有 key 的话:
podwise config set api_key your-sk-xxxx配置落在 ~/.config/podwise/config.toml。
接编码代理可以装 Skill,或开 MCP:
npx skills add hardhackerlabs/podwise-cli
podwise mcp把热榜喂给 Podwise
podwise process 认小宇宙、YouTube、Podwise 链接,也认本地音频。热榜里的 link 就是小宇宙,可以直接丢进去。
本机先处理前 5 条(已经听过的会重复消耗额度,建议自己记一份已处理 URL):
curl -sL https://raw.githubusercontent.com/cellinlab/xyzrank/main/hot_episodes.json \
> /tmp/hot_episodes.json
python3 - <<'PY'
import json, subprocess
eps=json.load(open("/tmp/hot_episodes.json"))["data"]["episodes"][:5]
for e in eps:
url=e.get("link") or ""
if not url: continue
print("process", e["podcastName"], e["title"])
subprocess.run(["podwise","process",url], check=False)
PY处理完按链接取结构化结果:
podwise get summary "$URL"
podwise get mindmap "$URL"
podwise get keywords "$URL"
podwise get chapters "$URL"
podwise get transcript "$URL"关键词检索用 ask 或 search:
podwise ask "最近中文播客在聊什么 AI 和宏观"
podwise search episode "AI Agent" --limit 10
podwise popularpopular 是 Podwise 自己的热门,和 xyzrank 的中文榜不是同一份数据。想盯中文圈,继续用 xyzrank 的 JSON。
想每天自动跑
本机 cron 或另一条 GitHub Action 都可以。Action 里注意两件事:Podwise 的 API key 放进 Actions secrets,不要写进仓库;每天只处理新增 link,用一个 seen.json 去重。
示意(本机或自托管 runner,官方 ubuntu-latest 每次都是新机器,要自己把 CLI 装进去):
name: listen-hot-podcasts
on:
schedule:
- cron: "30 13 * * *"
workflow_dispatch:
jobs:
listen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: install podwise
run: curl -sL https://raw.githubusercontent.com/hardhackerlabs/podwise-cli/main/install.sh | sh
- name: process new hot episodes
env:
PODWISE_API_KEY: ${{ secrets.PODWISE_API_KEY }}
run: |
podwise config set api_key "$PODWISE_API_KEY"
curl -sL https://raw.githubusercontent.com/cellinlab/xyzrank/main/hot_episodes.json \
> hot_episodes.json
python3 scripts/process_new.pyprocess_new.py 自己写就行:读 hot_episodes.json,和昨天的 seen.json 做差集,对新 URL 调 podwise process,再把摘要写进当天的 markdown。额度有限的话,先按 primaryGenreName 滤「科技」「创业」,或只取 playCount 前 10。
几个坑
- 托管 JSON 可能停更,以 cellinlab/xyzrank 的 raw 文件为准。
- 热榜很长,全量
process会很快烧掉 Podwise 额度。先截前几条,或按分类筛。 - CLI 要登录后的 API key。GitHub Action 里用 secret,本机用
podwise auth。 - 小宇宙链接失效或节目下架时,
process会失败,脚本里不要check=True一刀切。 - 榜单是播放量热度,不等于信息密度。摘要能帮你决定听不听,替代不了原片里的语气和细节。
小结
xyzrank 解决「今天中文播客热什么」,Podwise 解决「这条不用完整听完也能知道在讲什么」。中间只隔一层 JSON 里的小宇宙链接。自己 fork 养榜,或直接 curl 别人已经跑着的 Action 产物,都能接上。
- 热榜仓库:https://github.com/cellinlab/xyzrank
- 榜单站点:https://xyzrank.com/#/
- Podwise CLI:https://github.com/hardhackerlabs/podwise-cli
- Agent 文档:https://docs.podwise.ai/ai-agent