我用 Cloudflare 免费搭了一套 AI 内容流水线
@xiangxiang103 的实战:零服务器成本,用 Cloudflare 五件套搭"AI 科技周刊自动生成器"——定时抓取、AI 摘要、存库、发布,全自动。
开篇:缺的不是内容,是自动化的工作流
每天刷那么多信息,有用的记不住、存不下、找不到:好文章丢进收藏夹吃灰;想做行业周刊,每周手动复制粘贴、翻译转录、再排版,没干两周就放弃了。
作者 @xiangxiang103 的判断:信息过载时代,个人创作者最大的痛点不是"缺内容",而是"缺自动化的工作流"。
能不能一个人、不买云服务器、不掏月租,靠白嫖大厂免费套餐,搭一个"自动化内容工作台"?完全可以。这篇就用 Cloudflare 现成的五件套,搭一个 "AI 科技周刊自动生成器":每天自动抓你想看的信息源,让 AI 先做一轮中文摘要和分类,分好类存进数据库,最后自动发布成公开网页。
架构一览:五件套都在干嘛
只要你有一个 Cloudflare 账号,就相当于拥有了一个全栈的云端机房。这条流水线用到它家 5 个核心服务:
① Workers + Cron:打工人 + 定时闹钟,每天定时去 Hacker News、RSS 源抓文章。
② Workers AI:外包脑力,直接用 Llama 等开源大模型,先根据标题、链接或正文片段做中文摘要、推荐理由和标签。
③ R2:大仓库,存抓下来的文章封面图、或原始的超大 JSON 数据(免流量费)。
④ D1:账本,一个好用的数据库,存整理好的文章标题、链接、摘要内容。
⑤ Pages:门面,把 D1 里的数据渲染出来,做成别人能访问的静态网站。
五件套像一家"迷你报社":Workers+Cron 是外派记者(每天出去采访),Workers AI 是编辑(翻译整理稿件),R2 是资料室(存照片底稿),D1 是档案柜(存成稿),Pages 是印刷厂兼发行(变成报纸发出去)。
不用担心开销:个人项目跑这套流程,Cloudflare 给的免费额度通常够用(文末有成本测算)。
Step 1:用 Workers + Cron 定时抓取信息
第一步,需要一个"打工人"每天定点收集素材。在本地建好项目后,一切配置都在 wrangler.toml 里搞定,用 [triggers] 让 Worker 每天早上 8 点自动干活:
# wrangler.toml
name = "ai-content-pipeline"
main = "src/index.js"
compatibility_date = "2026-04-30"
[triggers]
crons = ["0 0 * * *"]
对应的代码逻辑写在 src/index.js 里(以 Hacker News 为例,取前 5 篇):
export default {
// 这是 Cron 定时触发的入口
async scheduled(event, env, ctx) {
// 1. 去源头抓数据 (这里拿 Hacker News 举例)
const hnResponse = await fetch("https://hacker-news.firebaseio.com/v0/topstories.json");
const storyIds = await hnResponse.json();
// 取前 5 篇
const top5Ids = storyIds.slice(0, 5);
let articles = [];
for (let id of top5Ids) {
const itemRes = await fetch("https://hacker-news.firebaseio.com/v0/item/" + id + ".json");
const item = await itemRes.json();
articles.push(item);
}
// 把文章传给下一步处理 (见下文)
await processArticles(articles, env);
}
};
这就完事了。一分钱不用花,你拥有了一个绝对不会睡过头的爬虫。
Step 2:用 Workers AI 做摘要、翻译、分类
文章信息抓回来了,但直接看英文标题和链接仍然很费时间。这时候让 AI 上场,先做一轮可读的中文整理。在 wrangler.toml 里加上 AI 的绑定:
[ai]
binding = "AI"
Cloudflare 在边缘节点上部署了各种开源大模型(比如 Llama 3 系列),可以直接调,不需要你再去 OpenAI 注册账号充 API。加上 processArticles 函数:
async function processArticles(articles, env) {
for (let article of articles) {
if (!article.url) continue;
const prompt =
"请将以下新闻标题和链接整理成严格 JSON,不要输出 Markdown。\n" +
"字段包括:\n" +
"- title_zh:中文标题\n" +
"- summary_zh:2-3 句话中文摘要,只根据标题和链接做保守判断\n" +
"- why_it_matters:1-2 句话说明它为什么值得创作者或开发者关注\n" +
"- tags:2-3 个分类标签数组\n\n" +
"原文标题:" + article.title + "\n" +
"原文链接:" + article.url;
// 调免费的 Llama 3 8B 模型干活
const aiResponse = await env.AI.run("@cf/meta/llama-3.1-8b-instruct-fast", {
messages: [{ role: "user", content: prompt }]
});
const aiResult = aiResponse.response;
console.log("AI 处理结果:", aiResult);
// 接下来把它存起来
await saveToDatabase(article, aiResult, env);
}
}
这里先用最基本的 prompt 演示标题和链接级别的整理。如果要做深度处理,还可以让 Worker 去 fetch 原文页面的 HTML,提取正文后再喂给 AI 做深度总结。
Workers AI 像请了个"免费实习生":你把一堆英文剪报丢给他,他按你的格式要求(JSON 模板)交回中文摘要——不用给他发工资(免 OpenAI 充值),也不用给他配电脑(跑在 Cloudflare 边缘节点上)。
Step 3:用 R2 存图片和原始资料
结构化数据存数据库,那些大块头的杂物(抓下来的文章配图、很长的原始 JSON)存哪里?放 D1 太浪费,放 R2 刚好。R2 是 Cloudflare 的对象存储,适合放原始 JSON、图片和网页快照这类大文件,重要优势是没有传统云存储常见的出站流量费用。
加配置,在本地创建一个叫 content-store 的 R2 bucket 并绑定:
npx wrangler r2 bucket create content-store[[r2_buckets]]
binding = "BUCKET"
bucket_name = "content-store"
在代码里把原始抓取的数据存个档,留着以后分析:
async function saveToStorage(article, env) {
const fileKey = "raw/" + article.id + ".json";
// 直接丢进 R2
await env.BUCKET.put(fileKey, JSON.stringify(article));
return fileKey;
}
以后如果前端要配图,直接把图抓下来 env.BUCKET.put() 进去。注意:R2 里的文件默认不是公开的,想让网页直接访问图片,还要给 bucket 开启公开访问、绑定自定义域名,或者由 Worker 生成临时访问链接。
Step 4:用 D1 存文章、链接、标签
AI 整理好的精炼内容,存在 D1 数据库里。D1 其实就是一个 Serverless 的 SQLite,极其轻量且不用管运维。
先建表,写一个 schema.sql:
DROP TABLE IF EXISTS articles;
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
title TEXT,
url TEXT,
summary_zh TEXT,
why_it_matters TEXT,
tags TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
执行命令创建数据库和表结构:
npx wrangler d1 create content-db
npx wrangler d1 execute content-db --local --file=schema.sql
npx wrangler d1 execute content-db --remote --file=schema.sql
更新 wrangler.toml:
[[d1_databases]]
binding = "DB"
database_name = "content-db"
database_id = "终端里吐出来的那个ID"
回到 Worker 代码,把 AI 处理完的数据塞进去:
async function saveToDatabase(article, aiResult, env) {
// 假设我们解析了 AI 的结果
const zhTitle = "AI 生成的中文标题";
const summary = "2-3 句话中文摘要";
const whyItMatters = "这条内容为什么值得看";
const tags = "AI, 自动化, 资讯";
// 用标准的 SQL 写入 D1
await env.DB.prepare(
"INSERT INTO articles (id, title, url, summary_zh, why_it_matters, tags) " +
"VALUES (?, ?, ?, ?, ?, ?) " +
"ON CONFLICT(id) DO NOTHING"
).bind(article.id, zhTitle, article.url, summary, whyItMatters, tags).run();
}
至此,一个最小版的后台自动抓取流水线已经能跑通了。上面的代码为了讲清流程做了简化:AI 返回结果还需要按中文标题、多段摘要、推荐理由、标签拆开,R2 存档函数也要接进主流程。补齐后,只等每天早上 8 点,内容就会源源不断自动流进数据库。
Step 5:用 Pages 展示成公开网站
光有数据库不行,得让人能看到。最后一步,用 Cloudflare Pages 搭一个极简的前端展示页。Pages 自带了 Functions 功能(基于 Workers),所以连后端 API 都不用单独部署,直接在 Pages 项目里建一个 functions/api/articles.js。
注意:这类接口请求会按 Workers 的规则计入用量,不能简单理解成"Pages 页面访问无限,所以接口也无限"。
// 当访问 /api/articles 时触发
// 文件:functions/api/articles.js
export async function onRequest(context) {
// 从绑定的 D1 里查数据
const { results } = await context.env.DB.prepare(
"SELECT * FROM articles ORDER BY created_at DESC LIMIT 20"
).all();
return Response.json(results);
}
然后在同目录下写一个普通的 index.html,用基础 JS 调这个接口渲染:
<!DOCTYPE html>
<html>
<head>
<title>我的 AI 科技周刊</title>
</head>
<body>
<h1>每日 AI 科技精选</h1>
<div id="content"></div>
<script>
fetch("/api/articles")
.then(res => res.json())
.then(data => {
const html = data.map(a =>
"<div>" +
"<h3><a href=\"" + a.url + "\">" + a.title + "</a></h3>" +
"<p>摘要:" + a.summary_zh + "</p>" +
"<p>为什么值得看:" + a.why_it_matters + "</p>" +
"<p>标签:" + a.tags + "</p>" +
"</div>"
).join("");
document.getElementById("content").innerHTML = html;
});
</script>
</body>
</html>
在 Dashboard 里新建一个 Pages 项目,把这俩文件扔上去(或用命令行一键部署),连上 D1 binding,个人内容订阅站就正式上线了。
Pages 像"免费的临街橱窗":D1 档案柜里的精选内容,摆进展柜(网页),路人(读者)随时能看——而你不用付房租(服务器钱)。
成本测算与防坑进阶
很多人一听到"全家桶",第一反应是"这跑起来不得破产?"作者算了笔账:假设每天自动抓取 50 篇文章做 AI 翻译和总结,前端页面每天 1000 次访问。
结论:只要不拿它做商业级别的大型爬虫,对个人或小团队的内容流自动化,Cloudflare 的免费套餐通常已经足够起步。真正上线前,还是建议按自己的抓取频率、AI 输出长度和访问量重新算一遍。
几个防踩坑与进阶玩法:
1. Cron 触发的超时问题:免费版 Workers 有 CPU 运行时间限制。一次性抓 100 篇文章喂给 AI 很可能超时——建议用多个短频快的定时任务(比如每 2 小时抓 5 篇),或用 Queue 把抓取和 AI 分析拆成异步。
2. AI 的神经元(Neurons)计算:Workers AI 的免费额度按 Neurons 算。尽量选 @cf/meta/llama-3.1-8b-instruct-fast 这样的小且快模型,便宜好用。
3. 加点"料":Vectorize 语义搜索。想在页面上加"按意思搜文章"的功能,把 AI 生成的文本再过一遍 Embedding 模型,存进 Cloudflare Vectorize 库里,瞬间变成高阶版的 RAG。
4. 邮件推送:想做邮件版周刊,可以再接邮件发送服务或 Cloudflare 的邮件相关能力。注意:收信转发、处理来信和主动发信不是一回事,具体实现前先确认当前账号可用的发送方式。
术语翻卡:点卡片看解释
自测一下:点问题展开参考答案
Workers + Cron 是打工人+定时闹钟(每天抓文章);Workers AI 是外包脑力(Llama 做中文摘要分类);R2 是大仓库(存图片和超大 JSON,免流量费);D1 是账本(Serverless SQLite 存整理好的内容);Pages 是门面(渲染成公开网站)。
加 [triggers] 配置:crons = ["0 0 * * *"]。一切配置都在 wrangler.toml 里搞定,代码入口是 src/index.js 的 scheduled 函数。
因为对象存储默认私有。要公开访问需要给 bucket 开启公开访问、绑定自定义域名,或者由 Worker 生成临时访问链接。
假设每天抓 50 篇文章做 AI 总结、前端每天 1000 次访问。结论:个人或小团队的内容流自动化,免费套餐通常够起步;但上线前要按自己的抓取频率、AI 输出长度和访问量重算。
免费版 Workers 有 CPU 运行时间限制,一次抓 100 篇喂 AI 很可能超时。解法:多个短频快的定时任务(如每 2 小时抓 5 篇),或用 Queue 把抓取和 AI 分析拆成异步。