前言
之前在基于uptime-status搭建自己的网站状态页已经使用CloudFlare Worker搭建了一个UptimeRobot地接口代理,但是效果并不好,官方接口1分钟只能请求10次,导致多次刷新网站就会出现429错误。
这次不仅更新了Worker的代码,还重构了Uptime-Status项目,改动非常的大。
可以参观我的新状态页面InsectMk的在线状态。
项目
insectmk/uptimerobot-status根据yb/uptime-status所重构,更先进的技术,更规范的代码,更易于阅读和修改,欢迎大家使用/修改。
项目异同:
界面UI:完全一致的样式(Ctrl + C
来的)
使用技术:yb/uptime-status采用react
,insectmk/uptimerobot-status采用Vite
+ Vue3
+ TS
配置文件:配置一致,insectmk/uptimerobot-status扩展了时间线排序
与代理接口
的配置。
易用性:yb/uptime-status支持用户级的配置,修改配置文件后无需再次编译;insectmk/uptimerobot-status阉割了用户级配置,采用项目级配置(每次编译后需重新部署打包文件)。
Worker
这次优化了一下Worker代码,不再一味纯代,加入了缓存支持,不会出现429的报错,建议缓存1分钟以上,默认缓存1分钟。
到cloudflare控制台,找到Workers 和 Pages
菜单,点击创建
-> 创建Workers
创建一个Workers
。
在编辑页面为Worker取一个名字,我取名为uptimerobot
,在worker.js
中写入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| export default { async fetch(request, env, ctx) { const cache = caches.default; const targetURL = 'https://api.uptimerobot.com/v2/getMonitors';
if (request.method === 'OPTIONS') { return new Response(null, { status: 204, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', }, }); }
let requestBody = ''; if (request.method === 'POST') { requestBody = await request.text(); try { const json = JSON.parse(requestBody); requestBody = JSON.stringify(sortObject(json)); } catch (error) { console.error('Failed to parse request body as JSON:', error); } }
const cacheKey = new Request(targetURL + '|' + requestBody);
let response = await cache.match(cacheKey); if (response) { console.log('Cache hit!'); } else { console.log('Cache miss. Fetching from target...'); const modifiedRequest = new Request(targetURL, { method: 'POST', headers: request.headers, body: requestBody, });
const fetchResponse = await fetch(modifiedRequest); if (fetchResponse.ok) { response = new Response(fetchResponse.body, fetchResponse); response.headers.set('Cache-Control', 'max-age=60'); ctx.waitUntil(cache.put(cacheKey, response.clone())); } else { console.error(`Target returned status: ${fetchResponse.status}`); response = new Response(fetchResponse.body, fetchResponse); } }
response = new Response(response.body, response); response.headers.set('Access-Control-Allow-Origin', '*'); response.headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
return response; }, };
function sortObject(obj) { if (Array.isArray(obj)) { return obj.map(sortObject); } else if (obj !== null && typeof obj === 'object') { return Object.keys(obj) .sort() .reduce((result, key) => { result[key] = sortObject(obj[key]); return result; }, {}); } return obj; }
|
编辑好后,点击部署
即可,现在就可以使用了,你会在面板上看到一个链接,这个链接就是你的代理地址。
如果你的CloudFlare绑定了域名的话,你可以在Worker的设置
中绑定域名。
参考文档
Uptime Robot-API 官方文档
Cloud Flare-Workers 官方文档