
大佬们有办法用 Workers 反向代理 OneDrive ,Dropbox 之类的云盘实现 webdav 吗
用 GPT 试着写了一点,但是不是很理想
addEventListener("fetch", event => { event.respondWith(handlRequest(event.request)); }); async function handleRequest(request) { // 从环境变量获取用户名和密码 const username = BASIC_AUTH_USERNAME; const password = BASIC_AUTH_PASSWORD; // 从请求中获取 Authorization 头部 const authHeader = request.headers.get("Authorization"); if (!authHeader || !isValidAuth(authHeader, username, password)) { // 如果没有提供 Authorization 头部或者认证失败,则返回 401 Unauthorized return new Response("Unauthorized", { status: 401, headers: { "WWW-Authenticate": 'Basic realm="Secure Area"', }, }); } // 认证成功,处理 OneDrive 相关的请求 return forwardRequestToOneDrive(request); } function isValidAuth(authHeader, username, password) { const encoded = authHeader.split(' ')[1]; // 获取 Base64 编码的部分 const decoded = atob(encoded); // 解码 Base64 const credentials = decoded.split(':'); // 分割用户名和密码 return credentials[0] === username && credentials[1] === password; } async function forwardRequestToOneDrive(request) { // 从环境变量获取 OneDrive 访问令牌 const accessToken = ONE_DRIVE_ACCESS_TOKEN; const url = new URL(request.url); const baseApiUrl = "https://graph.microsoft.com/v1.0/me/drive/root"; const apiRequestUrl = `${baseApiUrl}/${url.pathname}`; const init = { method: request.method, headers: { "Authorization": `Bearer ${accessToken}`, ...request.headers, "Host": undefined, // 删除原始请求中的 Host 头部 }, body: request.method !== "GET" ? await request.body : undefined, }; try { const respOnse= await fetch(apiRequestUrl, init); return new Response(response.body, { status: response.status, statusText: response.statusText, headers: response.headers, }); } catch (error) { return new Response(error.toString(), { status: 500 }); } } 1 chinni 2024-04-13 18:54:16 +08:00 用 rclone 完事 |
2 shinession 2024-04-13 18:57:25 +08:00 alist 可以 |
3 xiadd 2024-04-13 18:58:09 +08:00 via Android 用 alist 吧,worker 的限制怕是搞不了这种服务,要是小文件多了,可能分分钟超过限制 |
4 ysc3839 2024-04-13 21:25:29 +08:00 via Android 如果 WebDAV 客户端支持下载 302 跳转后的文件,那是比较好实现的,不然反向代理流量可能会比较慢。 |