使用 Cloudflare Workers 实现 OneDrive 代理加速下载并接入 Cloudreve V3

免费资源 技术教程

使用 Cloudflare Workers 实现 OneDrive 代理加速下载并接入 Cloudreve

1. 准备工作

首先,你需要一个 Cloudflare 账号,并创建一个 Workers 服务。登录 Cloudflare 后,点计算(Workers)旁边的小角,点击Workers,点击“创建”创建一个新的 Worker。
创建Workers

2. 编写 Worker 脚本

在 Worker 的编辑器中,输入以下代码:

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// 替换成你OneDrive的网址
const upstream = '*-my.sharepoint.com'

// 替换成你OneDrive的网址
const upstream_mobile = '*-my.sharepoint.com'

// 下面的配置都不用动
const upstream_path = '/'

const blocked_region = ['KP', 'SY', 'PK', 'CU']

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;
}

这段代码会将请求转发到指定的 OneDrive 域名,并处理响应内容。你可以根据需要修改 upstreamupstream_mobile 的值。

3. 部署 Worker

在编辑器中点击“保存并部署”,然后选择“发布”将 Worker 部署到 Cloudflare。

4. 绑定 Worker 到域名

由于Workers默认域名已被GFW墙,所以我们需要在 Cloudflare 的 Workers 的设置页面,找到域和路由,点击添加自定义域,输入你的域名和路径,例如 your-domain.com,Cloudflare 会自动为你创建好一个DNS记录到Workers。
创建域名

4. 配置 Cloudreve V3

在 Cloudreve V3 的设置中,找到“存储策略”选项,选择你的OneDrive 存储策略,并将下载链接设置为你的 Cloudflare 自定义域名。例如,如果你的自定义域名是 https://your-worker.example.com,那么在 Cloudreve V3 中的下载链接应该设置为 https://your-worker.example.com/
配置Cloudreve V3

5. 测试下载

现在,你可以通过 Cloudreve V3 的下载链接来测试 OneDrive 的下载速度了。访问你的 Cloudreve V3 文件页面,点击下载链接,看看下载速度是否有所提升。

6. 注意事项

  • 确保你的 Cloudflare Workers 已经正确配置,并且域名解析已经生效。
  • 如果遇到下载速度慢的问题,请检查 Cloudflare Workers 的配置是否正确。
  • 免费套餐每日请求次数有限制,超过限制后可能会导致下载失败。
  • 如果你需要更高的请求次数,可以考虑升级到 Cloudflare 的付费套餐。
  • 注意遵守 Cloudflare 的使用条款,避免滥用代理服务。

7. 总结

通过使用 Cloudflare Workers,我们可以轻松地实现 OneDrive 的代理加速下载,并接入 Cloudreve V3,提供更快的下载体验。这种方法不仅简单易用,而且可以有效地绕过一些地区的网络限制,让用户享受到更流畅的下载服务。

本文作者:墨尘

本文链接: https://blog.sord.top/posts/cf-workers-onedrive.html

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。

评论