还在手动 git add/commit/push?还在打开网页拖拽上传图片?大人,时代变了!今天分享我是如何利用 Serverless 魔法,把我的 Astro 博客打造成一个全自动化的“赛博生产力流水线”。
作为一名追求极致效率的极客,我无法忍受写博客时任何打断心流的摩擦力。传统的博客工作流(写 Markdown -> 打开图床网页传图 -> 复制链接 -> 回到编辑器粘贴 -> 手动 Git 推送)简直是灵感杀手。
于是,我决定利用 Cloudflare Workers 和 Telegram Bot,重构这一切。
我的目标很明确:双手不离键盘,在一个聊天窗口内完成图文创作和发布。
🛠️ 核心架构:极简且强大
我的这套“赛博流水线”由两个核心的 Telegram 机器人构成,它们背后都运行在 Cloudflare 强大的全球 Serverless 网络上:
- 🧠 写作助理机器人:负责接收我的灵感碎片,调用 AI 模型进行润色排版,自动生成带有 Frontmatter 的 Markdown 文件,并直接推送到 GitHub 仓库,触发 Cloudflare Pages 的自动构建。
- 📸 图床直传机器人:这是今天刚竣工的重头戏!负责解决最头疼的配图问题。
⚡️ 实战展示:只要 1 秒的极速图床体验
以前为了给文章配一张图,我要切出编辑器,打开浏览器,访问我的图床主站,拖拽上传,等待,然后复制链接。
现在?我只需要做一个动作:Ctrl+V。
我将我的“文件传输助手”改造成了 R2 直传机器人。我把截图粘贴给它,它背后的 Worker 会瞬间把图片二进制流塞进我的 Cloudflare R2“维洛克斯”存储桶,并利用 R2 的公共加速域名生成链接。
为了追求极致的体验,我甚至给代码加上了“豪华双显”功能。看看这性感的部署代码:
👆 核心魔法:利用 Worker 接收 TG 图片流并直传 R2 存储桶
部署完成后,实际体验简直爽到飞起!机器人不仅会秒回一个方便写博客的 Markdown 代码块,Telegram 还会自动抓取链接生成一张超大的实时预览图,安全感拉满!
看看这丝滑的效果:
👆 最终形态:发图即得 Markdown 源码,外带超大预览图
💻 附录:核心 Worker 源码
分享一下我打磨好的 R2 图床机器人的完整 Cloudflare Worker 代码。这段代码实现了“非图片消息静默”、“自动提取最高画质原图”以及“返回纯净版直连链接”的核心功能。
export default {
async fetch(request, env) {
// 1. 验证 POST 请求
if (request.method !== "POST") return new Response("🚀 Velox 的 R2 图床极速通道已就绪!");
let update;
try {
update = await request.json();
} catch (e) {
return new Response("OK");
}
// 2. 核心逻辑:如果没有收到消息,或者收到的不是图片,直接静默放行(不打扰当备忘录用)
if (!update.message || !update.message.photo) {
return new Response("OK");
}
const chatId = update.message.chat.id;
// 获取 TG 压缩数组里最后一张(分辨率最高)的图片
const photo = update.message.photo[update.message.photo.length - 1];
const fileId = photo.file_id;
try {
// 3. 向 TG 索要真实下载路径
const fileRes = await fetch(`https://api.telegram.org/bot${env.TG_BOT_TOKEN}/getFile?file_id=${fileId}`);
const fileData = await fileRes.json();
if (!fileData.ok) throw new Error("获取 TG 图片路径失败");
const filePath = fileData.result.file_path;
// 4. 下载图片二进制流
const imgRes = await fetch(`https://api.telegram.org/file/bot${env.TG_BOT_TOKEN}/${filePath}`);
const imgBuffer = await imgRes.arrayBuffer();
// 5. 生成极客时间戳文件名
const fileExt = filePath.split('.').pop() || 'png';
const fileName = `blog-img-${Date.now()}.${fileExt}`;
// 6. 暴力塞入 R2 维洛克斯网盘
await env.MY_BUCKET.put(fileName, imgBuffer, {
httpMetadata: { contentType: `image/${fileExt}` }
});
// ==========================================
// ⚠️ 极其关键:下面这里换成你图床真实的加速域名
const customDomain = "pub-65eb3861e8d64d24a3280e55bd221735.r2.dev";
// ==========================================
const rawUrl = `https://${customDomain}/${fileName}`;
// 7. 发送极简纯净版回复给 TG
await fetch(`https://api.telegram.org/bot${env.TG_BOT_TOKEN}/sendMessage`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chat_id: chatId,
text: `📸 **R2 直传成功!**\n\n🌐 **纯净链接 (长按或右键复制)**:\n${rawUrl}`,
parse_mode: "Markdown"
})
});
} catch (error) {
await fetch(`https://api.telegram.org/bot${env.TG_BOT_TOKEN}/sendMessage`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chat_id: chatId,
text: `❌ 翻车了:${error.message}`
})
});
}
return new Response("OK");
}
};
🎉 总结:进入“心流”写作状态
现在,我写这篇文章的体验是这样的:
- 在 Telegram 里敲下这段文字。
- 随手截几张刚才的部署图,粘贴给图床机器人。
- 点击机器人回传的代码块,一键复制图片链接插到文字里。
- 点击发送给写作机器人。
一分钟后,你现在看到的这篇文章就自动上线了。
这就是 Serverless 时代给极客带来的终极自由。不需要维护服务器,不需要繁琐的操作,把一切重复劳动都交给机器人,而我们,只专注于创造价值本身。😎
💡 提示: > 本文首发于我的个人博客 Velo.x 的极客空间。我在那里存放了更完整的 从 GSC 瞬间收录到 Cloudflare 301 权重聚合系列教程,排版更精美,更新也更及时,欢迎来踩踩!🚀