WorkerJS_CloudFlare_ImageBed/cloudflare-worker-js-api/index.js

97 lines
2.8 KiB
JavaScript
Raw Permalink Normal View History

2024-03-26 13:20:58 +08:00
addEventListener('fetch', event => {
2024-03-27 16:49:02 +08:00
const request = event.request;
if (request.method.toUpperCase() === "OPTIONS") {
// 处理预检请求
event.respondWith(handleOptions(request));
} else {
// 处理常规请求
event.respondWith(handleRequest(request));
}
});
// 处理常规请求
async function handleRequest(request) {
// 从环境变量中获取API密码作为Token使用
const apiToken = API_PASSWORD; // Cloudflare Worker中直接使用环境变量名
// 如果API_TOKEN存在且非空则进行Token验证
if (apiToken) {
// 获取请求头中的Authorization字段
const authHeader = request.headers.get('Authorization');
// 检查Authorization头是否存在且格式正确
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return new Response('Unauthorized', { status: 401 });
2024-03-26 13:42:43 +08:00
}
2024-03-27 16:49:02 +08:00
// 提取Token并验证
const token = authHeader.split(' ')[1];
if (token !== apiToken) {
return new Response('Unauthorized', { status: 401 });
2024-03-26 13:20:58 +08:00
}
}
2024-03-27 16:49:02 +08:00
const url = new URL(request.url);
let response;
switch (url.pathname) {
case '/upload/58img':
response = await handle58imgRequest(request);
break;
case '/upload/tgphimg':
response = await handleTgphimgRequest(request);
break;
default:
response = new Response('Not Found', { status: 404 });
break;
}
// 添加 CORS 头到响应中
response.headers.set('Access-Control-Allow-Origin', '*');
return response;
}
2024-03-26 13:20:58 +08:00
2024-03-26 13:42:43 +08:00
// 处理预检请求
function handleOptions(request) {
// 确保预检请求的访问控制请求头在允许的范围内
let headers = request.headers;
if (headers.get('Origin') !== null &&
headers.get('Access-Control-Request-Method') !== null &&
headers.get('Access-Control-Request-Headers') !== null) {
// 处理 CORS 预检请求
let respHeaders = new Headers({
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': headers.get('Access-Control-Request-Headers'),
'Access-Control-Max-Age': '86400', // 1 day
});
return new Response(null, { headers: respHeaders });
} else {
// 处理非预检请求
return new Response(null, {
headers: {
'Allow': 'GET, POST, OPTIONS',
},
});
}
}
2024-03-27 14:24:59 +08:00
2024-03-26 13:20:58 +08:00
// 此处省略了58img的处理逻辑直接复制自 API_IMG_58img.js
2024-03-27 14:24:59 +08:00
2024-03-26 13:20:58 +08:00
// 此处省略了tgphimg的处理逻辑直接复制自 API_IMG_tgphimg.js
2024-03-27 14:24:59 +08:00
2024-03-26 13:20:58 +08:00
// 复制自 API_IMG_58img.js 的辅助函数
function bufferToBase64(buf) {
var binary = '';
var bytes = new Uint8Array(buf);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
// 使用 btoa 进行 Base64 编码
return btoa(binary);
}