前言
Cloudreve 也不是什么新玩意了,就不过多介绍了
本文主要讲述的是有关于 Cloudflare Workers 代理 onedrive 下载链接的部分,其他应该会一笔带过,除非有特别需要注意的地方
你只需要:
用于搭建 Cloudreve 的机器
一个域名
一个用于优选的 Cname 域名
一个 Cloudflare 帐号
一个用作网盘的 Microsoft 365 E5 帐号 (当然有 Onedrive 权限的任意账号也可以)
搭建 Cloudreve 并连接网盘 这里翻翻之前文章
记住这里,留意下,这里填写的就是等会使用的 Workers 的域名

目前可以先不管
中转 E5 下载地址
我们默认的 E5 下载地址直连还是比较慢的,中国移动 1000M 宽带速度高达 500kb/s
获取 E5 下载地址
一般地,E5 的通用下载地址域名为 xxxx-my.sharepoint.com
其中 xxxx 为 E5 的组织名字,也就是 xxxx.onmicrosoft.com 的二级,替换即可
比如我的域名为 genmine5.onmicrosoft.com,对应的下载域名为 genmine5-my.sharepoint.com
将其记住并保存下来
反代 E5 下载地址
来到 Cloudflare Dashboard,Workers And Pages,新建一个 Workers
将代码改为:
export default {
async fetch(request, env, ctx) {
let url = new URL(request.url);
if(url.pathname.startsWith('/')){
url.hostname="genmine5-my.sharepoint.com"; // 修改成自己的域名
let new_request = new Request(url, request)
return await fetch(new_request)
}
return await env.ASSETS.fetch(request);
},
};
记得修改其中的反代域名,保存部署即可
连接域名
回到 Cloudflare Dashboard 主界面,点进一个域名,找到 Workers 路由,新增一个类似于下图的路由:
PS: 不建议使用顶级域名,建议二级,顶级域名有 Cname 拉平
还有一个注意的点,后面的 /* 千万不要忘记
解析域名
回到 DNS 解析,将刚才设置的域名 Cname 到一个 Cloudflare 官方 IP 优选地址上
注意一定要 官方 IP,反代 IP 没用的!
解析就不多说了,简单得很
测试访问
现在,访问你的反代地址,当跳转到 Onedrive 登陆界面即为完成:
编辑反代 IP
还记得这里吗,将其改为反代的地址即可,以后所有的下载请求都会走反代了
PS: 上传不走,也不太可能走,Cloudflare 上传最大 100MB
测试
前后提升巨大,优选前下载速度 500KB/s,优选后下载速度 80MB/s+
也算是把 E5 优化到极致了
小结
差不多整个过程就是这样,最重要的步骤只是在 Workers 配置反代
还有,Workers 免费版每天只有 10w 次访问,但是个人使用完全是足够的,即使放在商用大网盘也完全没有问题
如果上面JS代码不够用可以用这个
// 随便去 "OneDrive 里找个文件下载" 或 "先不写反代域名绑定 OneDrive 到 ZFile,再找个文件下载",去浏览器下载记录中找到下载链接,将域名部分写入到这里,不带协议头
// 如 https:/abc-my.sharepoint.com/personal/xxx_xxx_onmicrosoft_com/_layouts/15/download.aspx?UniqueId=xxx&SourceUrl=xxx
// 则填写 abc-my.sharepoint.com
const upstream = '*-my.sharepoint.com'
// 一般情况和上面的一样,只是这个是移动端下载使用的域名.
const upstream_mobile = '*-my.sharepoint.com'
// 下面的配置都不用动
const upstream_path = '/'
// 禁止访问的国家代码,可参考:https://wenku.baidu.com/aggs/bad9979951e79b89680226aa.html
const blocked_region = ['KP', 'SY', 'PK', 'CU']
// 禁止访问的 IP 地址
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']
const https = true
const disable_cache = false
const replace_dict = {
'$upstream': '$custom_domain',
'//sunpma.com': ''
}
addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request));
})
async function fetchAndApply(request) {
const region = request.headers.get('cf-ipcountry').toUpperCase();
const ip_address = request.headers.get('cf-connecting-ip');
const user_agent = request.headers.get('user-agent');
let response = null;
let url = new URL(request.url);
let url_hostname = url.hostname;
if (https == true) {
url.protocol = 'https:';
} else {
url.protocol = 'http:';
}
if (await device_status(user_agent)) {
var upstream_domain = upstream;
} else {
var upstream_domain = upstream_mobile;
}
url.host = upstream_domain;
if (url.pathname == '/') {
url.pathname = upstream_path;
} else {
url.pathname = upstream_path + url.pathname;
}
if (blocked_region.includes(region)) {
response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
status: 403
});
} else if (blocked_ip_address.includes(ip_address)) {
response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {
status: 403
});
} else {
let method = request.method;
let request_headers = request.headers;
let new_request_headers = new Headers(request_headers);
new_request_headers.set('Host', upstream_domain);
new_request_headers.set('Referer', url.protocol + '//' + url_hostname);
let original_response = await fetch(url.href, {
method: method,
headers: new_request_headers
})
connection_upgrade = new_request_headers.get("Upgrade");
if (connection_upgrade && connection_upgrade.toLowerCase() == "websocket") {
return original_response;
}
let original_response_clone = original_response.clone();
let original_text = null;
let response_headers = original_response.headers;
let new_response_headers = new Headers(response_headers);
let status = original_response.status;
if (disable_cache) {
new_response_headers.set('Cache-Control', 'no-store');
}
new_response_headers.set('access-control-allow-origin', '*');
new_response_headers.set('access-control-allow-credentials', true);
new_response_headers.delete('content-security-policy');
new_response_headers.delete('content-security-policy-report-only');
new_response_headers.delete('clear-site-data');
if (new_response_headers.get("x-pjax-url")) {
new_response_headers.set("x-pjax-url", response_headers.get("x-pjax-url").replace("//" + upstream_domain, "//" + url_hostname));
}
const content_type = new_response_headers.get('content-type');
if (content_type != null && content_type.includes('text/html') && content_type.includes('UTF-8')) {
original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname);
} else {
original_text = original_response_clone.body
}
response = new Response(original_text, {
status,
headers: new_response_headers
})
}
return response;
}
async function replace_response_text(response, upstream_domain, host_name) {
let text = await response.text()
var i, j;
for (i in replace_dict) {
j = replace_dict[i]
if (i == '$upstream') {
i = upstream_domain
} else if (i == '$custom_domain') {
i = host_name
}
if (j == '$upstream') {
j = upstream_domain
} else if (j == '$custom_domain') {
j = host_name
}
let re = new RegExp(i, 'g')
text = text.replace(re, j);
}
return text;
}
async function device_status(user_agent_info) {
var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
var flag = true;
for (var v = 0; v < agents.length; v++) {
if (user_agent_info.indexOf(agents[v]) > 0) {
flag = false;
break;
}
}
return flag;
}
文章结尾附送一个优选域名列表
CLOUDFLARE YES!
此处评论已关闭