banner
约 2,400 字
8 分钟

Cloudflare pages 搭建免费图床! 享受 Telegram 的无限空间

摘要

Cloudflare Pages + Telegraph 的免费图床方案,作为 Flickr/imgur 替代品,利用 Telegram Channel 的无限空间存储图片(原 Telegraph API 已关闭,需改用 TG Bot Token + Chat ID)。文章讲解获取 Bot Token 与频道 ID、Fork 仓库并在 Cloudflare Pages 部署、配置环境变量,支持图片审查 API 与后台管理。限制:单图最大 5MB、Cloudflare 每日 10 万请求。

前言

做个人网站、写博客,最头疼的往往是图片往哪放。要么用商业图床怕跑路,要么用免费图床担心哪天接口就关了。今天分享一个很稳的思路:用 Cloudflare Pages + Telegraph 自建一个完全免费、图片数量不设限的图床,托管的底层是 Telegram 的存储 —— 等于把"无限图床"这件事交给 Telegram 来扛。

这套方案脱胎于开源的 Telegraph-Image 项目。原本它依赖的 Telegraph API 接口已经被官方关闭了,所以现在需要把上传渠道切换成 Telegram Channel(频道)。部署时按文档设置好 TG_Bot_TokenTG_Chat_ID 两个环境变量,上传功能就能正常使用。下面从零开始讲清楚。

先理解这套方案是怎么"免费"的

在动手之前,值得先想明白它的成本结构——理解了这一点,你就知道它的边界在哪、什么时候该换别的方案。

图片到底存在哪? 不是存在 Cloudflare 上,而是存在你的 Telegram 频道里。上传时,前端把图片发给 Cloudflare 的 Functions,Functions 再调用 Telegram Bot API 把图片发进你指定的频道;Telegram 服务器把图存下来后返回一个文件标识,Functions 记下"这张图的 URL ↔ 这个文件标识"的对应关系。之后有人访问图片链接,Functions 再拿文件标识去 Telegram 取图,转发给访问者。

所以整套方案里有三个角色,分工很清晰:

角色

干什么

出问题会怎样

Cloudflare Pages

提供网页、接收上传、转发图片

项目被删则全部直链失效

Telegram

真正的图片存储

频道被删则图片全丢

你的域名

对外访问入口

域名过期则直链全挂

为什么原来能用、现在要改? 这个项目最初是把图存到 Telegraph(Telegram 旗下的匿名发布服务)上的,但Telegraph 的公开上传接口后来被官方关闭了,所以社区把它改成"上传到自己的 Telegram 频道"。这个改动的实际好处是:图片存在你自己的频道里,你能看见、能管理、能删除,比存在第三方服务上更可控。

看明白这层结构,下面几个事实就顺理成章了:所谓"无限容量"其实是你的 Telegram 账号能存多少,图床就能存多少;所谓"完全免费",是免费在 Cloudflare 的额度 + Telegram 的存储上。它不是无中生有的免费,而是把成本转移到了两个你本来就在用的免费服务上。

先做准备工作

你唯一需要提前准备的,是一个 Cloudflare 账户(免费注册即可)。另外还要有一个 Telegram 账户,以及按下面的方法拿到机器人的 Token 和频道 ID。

⚠️ 一个前置条件:这套方案必须能正常访问 Telegram。如果你的网络环境访问不了 TG,那这套图床跑不起来——这是它唯一但也是硬性的门槛。用不了 TG 的话,建议换用 R2、WebDAV 之类的存储后端方案。

一、获取 Telegram 的 Bot Token 和 Chat ID

如果还没有 Telegram 账户,先创建一个。然后按以下步骤操作:

**1. 获取 **Bot_Token

在 Telegram 里搜索并打开 @BotFather,发送命令 /newbot,根据提示依次输入机器人的名称用户名。创建成功后,BotFather 会返回一串 BOT_TOKEN,这就是之后用来和 Telegram API 交互的凭证。

blog image

Bot Token 的权限认知:这串 Token 相当于机器人的身份证,谁拿到谁就能以这个机器人的身份操作——往它加入的群里发消息、删消息、读消息。所以这东西等于密码,别截图发出来、别提交到 Git 仓库。好消息是它只作用于你新建的这个机器人,不涉及你的 Telegram 账号本身;万一泄露,去 BotFather 那里点 /revoke 重新生成一个,旧的就立刻失效。这也是强烈建议单独建一个机器人专门给图床用、而不要和别的项目共用同一个 Token 的原因。

2. 把机器人设为频道管理员

创建一个新的 Channel(频道),进入频道设置 → 管理员,把刚创建的机器人添加为频道管理员。这样机器人才能往频道里发消息(也就是替你存图)。

blog image

blog image

为什么必须是管理员? Telegram 的群组权限模型是分级的:普通成员只能发消息,而机器人代表你(频道所有者)往里写内容,需要"发布权限"。频道里普通成员默认不能发言,所以必须把机器人提升为管理员并授予发布权限,否则上传时 Bot API 会直接返回权限错误(表现为"上传失败")。

**3. 获取 **Chat_ID

频道 ID 可以用机器人获取。向 @VersaToolsBot@GetTheirIDBot 发消息,按提示操作即可拿到频道的 ID(通常是一串带负号的数字,如 -1234567)。

blog image

那个负号不是笔误。Telegram 的 ID 体系里,正数是个人用户的 ID,负数是群组/频道的 ID,其中以 -100 开头的一般是"超级群"或频道。填环境变量时连负号一起填,漏掉负号就会报"chat not found"。

4. 在 Cloudflare Pages 配置环境变量

到 Cloudflare Pages 后台,给项目添加下面两个环境变量(注意:修改环境变量后,需要重新部署一次才会生效):

环境变量

示例值

说明

TG_Bot_Token

123456789:AAxxxGKrn5...

从 @BotFather 获取的 Telegram Bot Token

TG_Chat_ID

-1234567

频道 ID,确保 TG Bot 是该频道/群组的管理员

"改完必须重新部署"是这类 Serverless 项目的通病。原因是环境变量在构建时被注入到运行环境里,只存在当前这一次部署的实例中。你在后台改了变量,线上跑的仍然是旧实例——光改不重部署,等于没改。这条规则对后面所有涉及环境变量、绑定的操作都适用,记住它能省下大量排查时间。

二、部署到 Cloudflare Pages

简单 3 步就能完成部署:

  1. 下载或 Fork 项目仓库(注意:目前请使用 Fork 方式)——项目来自 cf-pages/Telegraph-Image

  2. 打开 Cloudflare Dashboard → 进入 Pages 管理页面 → 创建项目

  • 如果第 1 步选择了 Fork 本仓库,这里就选 "连接到 Git 提供程序",授权并选到你的仓库;

  • 如果第 1 步是下载本仓库,就选 "直接上传",把文件拖进去。

部署入口

blog image
  1. 按页面提示填写项目名称,选择要连接的 Git 仓库(Fork 方式)或上传刚下载的仓库文件(直接上传方式),点击 "部署站点" 即可。部署完成后,在后台把第 4 步的两个环境变量补上,再重新部署一次让它们生效。

Fork 方式和直接上传,该选哪个? 建议 Fork。区别在于:Fork 之后项目更新,你可以在 GitHub 上点一次 "Sync fork" 把作者的修复合并进来,然后 Cloudflare 检测到仓库变动会自动重新部署;而直接上传是"一次性快照",作者修了 bug 你也收不到。图床这类依赖第三方接口的项目,上游接口一变就得跟着改,能持续跟进更新很重要

三、特性一览

部署好后,这个自建图床拥有这些优点:

  1. 图片数量不设限:可以上传不限数量的图片,因为底层存储用的是 Telegram。

  2. 完全免费:不用买服务器,托管在 Cloudflare 网络上,只要用量在免费额度内就免费。

  3. 自带免费域名:可用 Cloudflare Pages 提供的 *.pages.dev 免费二级域名,也支持绑定自定义域名。

  4. 可选图片审查:需要时开启审查 API,不良图片会自动屏蔽、不再加载。

  5. 后台图片管理:支持在线预览,还能给图片加白名单、黑名单,管理更灵活。

四、绑定自定义域名

想用自己的域名,在 Pages 的 自定义域 设置里,绑定一个托管在 Cloudflare 的域名即可 —— 因为域名在 Cloudflare 托管,它会自动帮你改好 DNS 记录,基本是傻瓜式操作。

自定义域名

blog image

为什么图床特别建议用自定义域名? 因为图床的价值就在于"直链长期有效"。你今天把图片贴进博客和文档,三个月后平台临时域名调整、或者你要换个部署方式,*.pages.dev 的链接就全断了——而这些链接已经散落在各处,改都改不过来。用你自己的域名,域名不动、指向随便改,所有历史直链都能继续用

五、限制要心里有数

虽然是免费方案,但也有一些边界要提前知道:

  1. 单张图片上限 5MB:因为图片实际存到 Telegraph,而 Telegraph 限制单张上传最大 5MB。

  2. 部分地区加载速度一般:走的是 Cloudflare 网络,个别地区的访问速度不一定理想。

  3. 每日 10 万请求限额:Cloudflare Functions 免费版每日约 10 万次请求(上传或加载图片合计)。对个人博客来说,正常使用绰绰有余。

第 3 条最容易被低估,值得展开说:注意它是"上传或加载图片合计"——也就是说,每有一个访客打开你带图的文章,每张图都会消耗一次请求。个人博客日访问量几十上百,完全无感;但如果你哪天文章被大平台推荐、或者图片被大量外链引用导致流量暴涨,这 10 万次是有可能被撞破的。这也是"图床别当公共图床用"的另一层原因——不只是道德和合规问题,还直接关系到你自己的额度。

至于第 1 条 5MB 的限制,日常写的博客配图基本不会超(一张 1200 宽、压缩过的 JPG 通常在 100-300KB);如果确实要放大图,先在本地压缩再上传是标准做法,既绕开限制,也省访客流量。

这套方案,什么时候该换

Telegraph-Image 属于同类项目里最轻量的那一档:代码简单、依赖少、部署快。它的取舍也很清楚——

  • 适合:个人博客配图、文档截图、需要大量图片但访问量不大的场景。你只想"有个稳定的地方放图,能出直链",这套就够了。

  • 不太适合:想当网盘用(传视频、压缩包)、需要多存储后端、需要精细的权限管理和统计。

如果后面这几条正好是你的需求,建议看看更完整的多后端方案,比如 K-Vault 那套(支持 Telegram / R2 / S3 / WebDAV 多种存储后端)——功能更全,代价是配置项多一些。先用简单的跑起来,需求涨了再换,比一上来就折腾复杂方案更划算。

常见问题

Q:部署完了,上传图片报错 / 一直转圈?

按这个顺序查:① TG_Bot_TokenTG_Chat_ID 是否填对(Chat_ID 要带负号);② 环境变量改完之后有没有重新部署;③ 机器人是否已被设为频道管理员并给了发布权限。三条里必有一条没做到。

Q:图片链接能打开,换了个域名后老图全挂了?

大概率是换域名导致的。新版本的项目通常支持配置"基础 URL",你可以把历史直链的域名指向处理好再切;如果项目不支持,比较实际的做法是把旧域名继续保留(哪怕只是保留 DNS 解析),让老链接继续可用。

Q:会不会哪天免费额度用完就开始扣钱?

不会自动扣费。Cloudflare 的免费额度是"超了就限流/降级",不会自动转成付费。但要注意:额度超限后图片会加载失败——对图床来说,这个表现就是"文章里图片全裂了"。所以别把唯一的图片副本放在图床上,本地永远留一份原图。

Q:这套方案安全吗?会不会被看见我传的图?

图片存在你自己的 Telegram 频道里,只有你(和你授权的机器人)能访问。别人拿到直链能看这张图,但看不到你频道里的其他内容。需要留意的是:如果你把频道设置成公开,那频道内所有内容就是可被搜索到的——建议把这个存图频道设为私有。

END