作者用 GitHub Actions cron 定时抓取 HN、arXiv 等来源,Python stdlib 处理,Next.js 静态导出托管在 Vercel,用 IndexNow 加速 Bing 索引,全程零费用。
以前每天早上我都要打开十几个标签页——Hacker News、arXiv、几个厂商博客、两份 newsletter——就为了弄清楚前一天 AI 领域到底发生了什么。耗时 30 分钟不说,该漏的还是漏了。
所以我写了一套自动化管道来替我做这件事,成本是 0 美元/月。下面是完整的架构设计。
成果已经上线:AI Nexus Daily,感兴趣的话可以先看看效果再读正文。
最大的成本节省来自一个决定:干脆不跑服务器。定时工作流就够用了:
name: build
on:
schedule:
- cron: '0 10 * * *'
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: python generate.py
- name: Commit results
run: |
git config user.name "bot"
git config user.email "bot@users.noreply.github.com"
git add -A
git diff --staged --quiet || git commit -m "chore: daily rebuild"
git push
公共仓库有无限的 Actions 时长。每天运行一次、每次 40 秒的 Job,永远不会产生任何费用。
generate.py 写入 data/items.json 然后 commit。这样你白嫖到了三样东西:
版本控制——git log data/items.json 就是每次变动的完整审计日志。
回滚——一次糟糕的抓取,一个 git revert 就能撤销。
部署触发——commit 本身就会让 Vercel 重新构建。无需 webhook,无需 token。
当你伸手去拿 Postgres 来存几千行以读为主的 JSON 时,你其实已经在为一份用不着的月账单和备份策略买单了。
内容一天只变一次。如果每次请求都做服务端渲染,意味着要为那 4 万次完全相同的渲染(延迟 + 函数调用次数)付出代价。
// next.config.js
module.exports = {
output: 'export',
trailingSlash: true,
}
静态导出还意味着即使构建管道挂了,网站依然能正常服务——最后一份正常的 HTML 仍然在 CDN 上。
对于一个新的内容站来说,真正被搜索引擎爬取才是实际瓶颈。Sitemap 是被动的——你发出去,然后祈祷。IndexNow 是主动的——你向端点发个 ping,Bing、Yandex 和 Seznam 就会来抓取这个 URL,通常几分钟内就生效。
这里有两个坑,花了我一个下午才踩明白:
key 文件必须放在域名根目录下能访问到的地方。在 Next.js 里,这意味着 public/<key>.txt,而不是仓库根目录。放在仓库根目录会导致一个理直气壮的 404。
key 文件内容必须恰好是 key 本身,不能有多余的换行符,不能有 HTML 包装。
import json, urllib.request
payload = {
"host": "ainexusdaily.vercel.app",
"key": "YOUR_KEY_HERE",
"keyLocation": "https://ainexusdaily.vercel.app/YOUR_KEY_HERE.txt",
"urlList": ["https://ainexusdaily.vercel.app/"],
}
req = urllib.request.Request(
"https://api.indexnow.org/indexnow",
data=json.dumps(payload).encode(),
headers={"Content-Type": "application/json; charset=utf-8"},
)
print(urllib.request.urlopen(req).status) # 200 or 202
Google 不参与 IndexNow,所以还是要为他们保留 sitemap。但在 Bing 同一天就建好索引,仍然比苦等一周等所有人来爬要强。
What I would do differently
从静态导出开始。我一开始出于习惯用了 SSR,花了一整天才把它删掉。
从第一天起就 commit 数据。我的第一个版本每次运行都重新生成所有内容,所以根本无法看到发生了什么变化——而这恰恰是最有趣的部分。
在写任何内容之前就加上 IndexNow。索引延迟是复利效应——第 1 天发布、第 8 天才被索引的页面,失去的那一周流量永远也找不回来了。
整套系统已经无人值守运行了好几周。想看它每天产出什么,可以访问 ainexusdaily.vercel.app。
对任何一层架构有问题的,欢迎在评论区问我——尤其是 IndexNow 部分,相关文档少得可怜,而且失败方式是静默的。