AList使用Cloudflare Workers加速onedrive

这是一个基于Cloudflare Workers加速AList的教程,旨在更好的加速onedrive下载

步骤 1: 打开 Cloudflare 并创建 Worker

  1. 登录到你的 Cloudflare 账户。
  2. 在左侧边栏中找到并点击 “Workers 和 Pages” 选项,进入 Workers 配置页面。

步骤 2: 创建一个 Worker 应用

  1. Workers 和 Pages 页面中,点击 “创建” 按钮。
  2. 在弹出的窗口中选择 “创建应用程序” ,然后点击 “创建 Workers”
  3. 完成后,右下角会出现 “部署” 按钮,点击后你会看到提示 “成功!您的项目已部署到以下区域:全球”

步骤 3: 编辑 Worker 代码

  1. 点击 “继续处理项目” ,进入项目设置。
  2. 在右上角点击 “编辑代码” ,进入编辑模式。
  3. 复制并粘贴代码到 workers.js 文件中
  4. 将代码中的 YOUR_ADDRESS YOUR_TOKEN YOUR_WORKER_ADDRESS 替换为你的实际信息。
  5. 完成后点击 “部署” 按钮。
// src/const.ts
var ADDRESS = "YOUR_ADDRESS";
var TOKEN = "YOUR_TOKEN";
var WORKER_ADDRESS = "YOUR_WORKER_ADDRESS";

// src/verify.ts
var verify = async (data, _sign) => {
  const signSlice = _sign.split(":");
  if (!signSlice[signSlice.length - 1]) {
    return "expire missing";
  }
  const expire = parseInt(signSlice[signSlice.length - 1]);
  if (isNaN(expire)) {
    return "expire invalid";
  }
  if (expire < Date.now() / 1e3 && expire > 0) {
    return "expire expired";
  }
  const right = await hmacSha256Sign(data, expire);
  if (_sign !== right) {
    return "sign mismatch";
  }
  return "";
};
var hmacSha256Sign = async (data, expire) => {
  const key = await crypto.subtle.importKey(
    "raw",
    new TextEncoder().encode(TOKEN),
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign", "verify"]
  );
  const buf = await crypto.subtle.sign(
    {
      name: "HMAC",
      hash: "SHA-256"
    },
    key,
    new TextEncoder().encode(`${data}:${expire}`)
  );
  return btoa(String.fromCharCode(...new Uint8Array(buf))).replace(/\+/g, "-").replace(/\//g, "_") + ":" + expire;
};

// src/handleDownload.ts
async function handleDownload(request) {
  const origin = request.headers.get("origin") ?? "*";
  const url = new URL(request.url);
  const path = decodeURIComponent(url.pathname);
  const sign = url.searchParams.get("sign") ?? "";
  const verifyResult = await verify(path, sign);
  if (verifyResult !== "") {
    const resp2 = new Response(
      JSON.stringify({
        code: 401,
        message: verifyResult
      }),
      {
        headers: {
          "content-type": "application/json;charset=UTF-8"
        }
      }
    );
    resp2.headers.set("Access-Control-Allow-Origin", origin);
    return resp2;
  }
  let resp = await fetch(`${ADDRESS}/api/fs/link`, {
    method: "POST",
    headers: {
      "content-type": "application/json;charset=UTF-8",
      Authorization: TOKEN
    },
    body: JSON.stringify({
      path
    })
  });
  let res = await resp.json();
  if (res.code !== 200) {
    return new Response(JSON.stringify(res));
  }
  request = new Request(res.data.url, request);
  if (res.data.header) {
    for (const k in res.data.header) {
      for (const v of res.data.header[k]) {
        request.headers.set(k, v);
      }
    }
  }
  let response = await fetch(request);
  while (response.status >= 300 && response.status < 400) {
    const location = response.headers.get("Location");
    if (location) {
      if (location.startsWith(`${WORKER_ADDRESS}/`)) {
        request = new Request(location, request);
        return await handleRequest(request);
      } else {
        request = new Request(location, request);
        response = await fetch(request);
      }
    } else {
      break;
    }
  }
  response = new Response(response.body, response);
  response.headers.delete("set-cookie");
  response.headers.set("Access-Control-Allow-Origin", origin);
  response.headers.append("Vary", "Origin");
  return response;
}

// src/handleOptions.ts
function handleOptions(request) {
  const corsHeaders = {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET,HEAD,POST,OPTIONS",
    "Access-Control-Max-Age": "86400"
  };
  let headers = request.headers;
  if (headers.get("Origin") !== null && headers.get("Access-Control-Request-Method") !== null) {
    let respHeaders = {
      ...corsHeaders,
      "Access-Control-Allow-Headers": request.headers.get("Access-Control-Request-Headers") || ""
    };
    return new Response(null, {
      headers: respHeaders
    });
  } else {
    return new Response(null, {
      headers: {
        Allow: "GET, HEAD, POST, OPTIONS"
      }
    });
  }
}

// src/handleRequest.ts
async function handleRequest(request) {
  if (request.method === "OPTIONS") {
    return handleOptions(request);
  }
  return await handleDownload(request);
}

// src/index.ts
var src_default = {
  async fetch(request, env, ctx) {
    return await handleRequest(request);
  }
};
export {
  src_default as default
};
//# sourceMappingURL=index.js.map

参数说明:

  • ADDRESS:你的 AList 地址,必须加上协议头(例如:https://pan.nn.ci)且后面不能加 /
  • TOKEN:在 AList 管理页面的 “其他设置” 中获取。
  • WORKER_ADDRESS:你的 Worker 地址,通常与下载代理URL相同。

此处代码来源github请访问https://github.com/alist-org/alist-proxy/blob/main/alist-proxy.js

步骤 4: 配置路由

  1. 返回到 “Workers 和 Pages” 页面,找到刚才创建的项目。
  2. 点击项目下的 “设置” ,然后选择 “添加”
  3. “区域” 选择你的域名,并在 “路由” 中输入 www.example.com/*,点击 “添加路由”

步骤 5: 配置下载代理 URL

  1. 在设置中,找到 “下载代理 URL” 并填入正确的 URL。
  2. 根据需求,选择其他选项进行配置。

步骤 6: 配置DNS,优选Cloudflare IP

找到域名,然后进入DNS,填写 CNAME记录,代理域名(www.example.com)CNAME到cloudflare.182682.xyz(开启小黄云)

完成以上步骤后,你的 Cloudflare Worker 应该已经成功加速了 AList。

评论

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据