随机图片API:基于 Cloudflare Worker + 微博图床

浏览: 119 次浏览 作者: 去年夏天 分类: 技术文章,佳软推荐 发布时间: 2025-02-18 15:01

一个全白嫖的免费随机图片 API 实现,通过使用免费的 Cloudflare Worker 与免费的微博相册实现。
通过使用 Cloudflare Worker 反向代理微博图床内图片实现:1、绕过微博防盗链。2、避免网页端看到微博图片链接从而查找到图片发布者的微博。

随机图片API:基于 Cloudflare Worker + 微博图床


初步实现随机图片 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 部署步骤

  1. 登录你的Cloudflare
  2. 在主页右侧找到【计算(Workers)】
  3. 点进【Norkers和Pages】选择一个预设的子域,点击【set up】之后,我们选择免费套餐。
  4. 点进【Workers】,选择【创建Workers】-【快速开始】-【部署】-【编辑代码】
  5. 把这里的代码(https://github.com/tjsky/randompic/blob/main/index.js) 粘贴到页面左侧的输入框
  6. 修改代码中这部分网址为你想用来随机的图片的网址
    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'
 /*需要随机到的图片的链接,注意最后一行没英文逗号*/
  1. 点击【保存并部署】按钮,
  2. (非必须)单击你刚创建的Worker,选择重命名,起个好记好写的名字,比如pic
  3. 访问你的Worker的域名比如pic.tjsky.workers.dev就可以看到啦
  4. 因为众所周的原因Cloudflare Worker的默认域名国内是无法访问的,你可能需要套个自己的域名,
    可以参考这个文章《Cloudflare Workers 添加自定义域名 解决部分区域网络无法访问的问题

如果公开部署随机图片API还需要做点什么

以上基本自用就够了,但是如果你打算提供公开服务那么还需要在 Cloudflare 内考虑好这些事情
Worker那10W 次请求看起来很高,一天才 86400 秒够每秒1次多了,但如果有人反复刷或者用户极多的时候,还是很快就会没的了。最多的时候我的某个 API 后端怼了8个 Cloudflare Worker来满足前端需求,就这每天快到 UTC 0的时候还经常有额度接近 90% 的提醒。
1. 屏蔽爬虫。很多数据收集公司的采集爬虫是不管源站死活的,他会高频反复的采集网址。
2. 限制请求速率,防止有人恶意刷图。
3. 考虑缓存优化,现在每次刷新都是一张新图。

15 条评论
  • 石樱灯笼

    2025-02-25 14:38

    没太搞清楚这随机图片的实际用途……随便在微博自己搞点背景图片然后在自己的网站上随机刷?

    1. 去年夏天

      2025-02-25 15:59

      有些人喜欢给自己博客或者在浏览器里用样式给微博B站知乎推特啥的加个随机背景图(博客头图、文章附图)功能,每次访问时都会随机请求一张新图片当背景图用。

      1. 石樱灯笼

        2025-02-25 17:24

        听起来像是非常营销号的功能

        1. 去年夏天

          2025-02-25 17:50

          喜欢搞美化的非常需要这个功能。搜随机图片API一大堆人在提供这个服务

  • 白熊阿丸

    2025-02-20 03:37

    这个白嫖的可以,有空我折腾看看

  • ACEVS

    2025-02-19 13:07

    不错。借鸡下蛋。

    1. 去年夏天

      2025-02-19 13:27

      能白嫖就白嫖,这种服务也不用稳定性非常高

  • 涛叔

    2025-02-19 10:32

    我是自己用 Go + JS 开发了一套简单的图床。如果用 Cloudflare 的话,可以基于 Worker + R2 实现。

    https://taoshu.in/web/picr.html

    1. 去年夏天

      2025-02-19 12:58

      本文这个主要是我拿来做自己样式随机图用的,我之所以这里选了微博图床是因为:我的R2空间已经基本满了。
      博客和图片站用的Cloudflare CDN + B2架构的图床,主要是图片站的图有点多,进入需要付费的区间,B2的储存费用只有R2的一半。
      如果只是博客配图你介绍的CF + R2架构的更好,毕竟同一家的东西,结合的更好嘛

    2. 涛叔

      2025-02-19 13:07

      我博客的图片都是同步的到博客服务器上,没有用三方服务。博客图片也不太多。

      1. 去年夏天

        2025-02-19 13:26

        博客确实没多少图,文章配图用不了多少空间,图片站就几十G出去了

  • Jeffer.Z

    2025-02-18 17:44

    这相当于自己做一个图床吗,使用它的文件来进行展示?是不是这个意思,我看好像是。

    1. 去年夏天

      2025-02-18 18:12

      主要是用来随机获取图片的,给网站、APP的实现随机背景图功能,只是这个代码可以用微博做图床,不需要额外付费储存图片。

  • obaby

    2025-02-18 17:02

    反代图片相对来说加载速度就慢了那么一丢丢,不过好处是省了自己的存储了。

    1. 去年夏天

      2025-02-18 18:05

      是的,主要就是不需要自己储存图片了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理