随机图片API:基于 Cloudflare Worker + 微博图床
一个全白嫖的免费随机图片 API 实现,通过使用免费的 Cloudflare Worker 与免费的微博相册实现。
通过使用 Cloudflare Worker 反向代理微博图床内图片实现:1、绕过微博防盗链。2、避免网页端看到微博图片链接从而查找到图片发布者的微博。
初步实现随机图片 API
首先也是最简单的,随机从图片链接中抽一个,返回结果,简单粗暴,直接写进代码里,在图片数量在2K行以内基本不用太担心性能问题。
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
/*需要随机到的图片的链接*/
]
var index = Math.floor((Math.random()*background_urls.length));
res = await fetch(background_urls[index])
return new Response(res.body, {
headers: { 'content-type': 'image/jpeg' },
})
}
反代微博图床
为什么要反代微博图床的图片,而不是直接返回图片地址给客户,主要是两个原因,
1. 微博是有防盗链设置的,会判断请求的 referer 是否是微博
2. 通过微博图片地址是可以反查到图片发送者的,如果打算提供公开服务,且不想暴漏自己的微博的话,最好隐藏图片实际地址。
因为代码有点长就不写文章里了,去github看吧。
基本就是构建请求头,检查图片地址是微博的话,就修改 referer 解决微博的防盗链,然后反向代理图片,返回结果。
简单的 Cloudflare Workers 部署步骤
- 登录你的Cloudflare
- 在主页右侧找到【计算(Workers)】
- 点进【Norkers和Pages】选择一个预设的子域,点击【set up】之后,我们选择免费套餐。
- 点进【Workers】,选择【创建Workers】-【快速开始】-【部署】-【编辑代码】
- 把这里的代码(https://github.com/tjsky/randompic/blob/main/index.js) 粘贴到页面左侧的输入框
- 修改代码中这部分网址为你想用来随机的图片的网址
var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
/*需要随机到的图片的链接,注意最后一行没英文逗号*/
- 点击【保存并部署】按钮,
- (非必须)单击你刚创建的Worker,选择重命名,起个好记好写的名字,比如pic
- 访问你的Worker的域名比如pic.tjsky.workers.dev就可以看到啦
- 因为众所周的原因Cloudflare Worker的默认域名国内是无法访问的,你可能需要套个自己的域名,
可以参考这个文章《Cloudflare Workers 添加自定义域名 解决部分区域网络无法访问的问题》
如果公开部署随机图片API还需要做点什么
以上基本自用就够了,但是如果你打算提供公开服务那么还需要在 Cloudflare 内考虑好这些事情
Worker那10W 次请求看起来很高,一天才 86400 秒够每秒1次多了,但如果有人反复刷或者用户极多的时候,还是很快就会没的了。最多的时候我的某个 API 后端怼了8个 Cloudflare Worker来满足前端需求,就这每天快到 UTC 0的时候还经常有额度接近 90% 的提醒。
1. 屏蔽爬虫。很多数据收集公司的采集爬虫是不管源站死活的,他会高频反复的采集网址。
2. 限制请求速率,防止有人恶意刷图。
3. 考虑缓存优化,现在每次刷新都是一张新图。
石樱灯笼
2025-02-25 14:38
没太搞清楚这随机图片的实际用途……随便在微博自己搞点背景图片然后在自己的网站上随机刷?
去年夏天
2025-02-25 15:59
有些人喜欢给自己博客或者在浏览器里用样式给微博B站知乎推特啥的加个随机背景图(博客头图、文章附图)功能,每次访问时都会随机请求一张新图片当背景图用。
石樱灯笼
2025-02-25 17:24
听起来像是非常营销号的功能
去年夏天
2025-02-25 17:50
喜欢搞美化的非常需要这个功能。搜
随机图片API
一大堆人在提供这个服务白熊阿丸
2025-02-20 03:37
这个白嫖的可以,有空我折腾看看
ACEVS
2025-02-19 13:07
不错。借鸡下蛋。
去年夏天
2025-02-19 13:27
能白嫖就白嫖,这种服务也不用稳定性非常高
涛叔
2025-02-19 10:32
我是自己用 Go + JS 开发了一套简单的图床。如果用 Cloudflare 的话,可以基于 Worker + R2 实现。
https://taoshu.in/web/picr.html
去年夏天
2025-02-19 12:58
本文这个主要是我拿来做自己样式随机图用的,我之所以这里选了微博图床是因为:我的R2空间已经基本满了。
博客和图片站用的Cloudflare CDN + B2架构的图床,主要是图片站的图有点多,进入需要付费的区间,B2的储存费用只有R2的一半。
如果只是博客配图你介绍的CF + R2架构的更好,毕竟同一家的东西,结合的更好嘛
涛叔
2025-02-19 13:07
我博客的图片都是同步的到博客服务器上,没有用三方服务。博客图片也不太多。
去年夏天
2025-02-19 13:26
博客确实没多少图,文章配图用不了多少空间,图片站就几十G出去了
Jeffer.Z
2025-02-18 17:44
这相当于自己做一个图床吗,使用它的文件来进行展示?是不是这个意思,我看好像是。
去年夏天
2025-02-18 18:12
主要是用来随机获取图片的,给网站、APP的实现随机背景图功能,只是这个代码可以用微博做图床,不需要额外付费储存图片。
obaby
2025-02-18 17:02
反代图片相对来说加载速度就慢了那么一丢丢,不过好处是省了自己的存储了。
去年夏天
2025-02-18 18:05
是的,主要就是不需要自己储存图片了。