使用cloudflare制作TikTok像站

使用说明

本项目仍然是使用全球最大的CDN服务商——CloudFlare提供的Workers

下面我将告诉你们自己搭建Tiktok镜像站点的方法,以解决在天朝无法访问Tiktok的问题。

开启workers

在控制面板主页左侧可以找到workers
可以将workers理解为cloudflare的一款proxy服务,这个服务的一大优点就是自带CDN。按照官方的说法:

构建无服务器应用程序并在全球范围内即时部署,从而获得卓越的性能、可靠性和规模性。

找到Workers

如图所示,点击创建服务,右侧显示每天的额度,如果只是搭建个人服务这些额度绰绰有余了。下方会显示所有已经搭建的服务。
创建服务

进入创建服务页面后,我们要稍微配置一下这个服务名称,将他改为自己心仪的名称,因为以后我们要用他访问镜像站(2022年后workers.dev就被墙了)
创建函数

这样我们的服务就搭建好了。但是我们还需要修改代码。转到控制界面,可以找到右下角有一个快速编辑的按钮。
控制界面

左边修改代码,下方部署,右侧可以选择预览窗口,以及打开链接。

一般我们就打开这个页面,把下方的代码复制进去,点击保存部署,然后输入链接就可以直接访问Tiktok镜像站了。
部署代码

代码内容

原来代码设置的是Google的镜像站,我这里改成Tiktok了。我们直接复制贴到workers里面即可。

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
// 你要镜像的网站.
const upstream = 'www.tiktok.com'

// 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可.
const upstream_path = '/'

// 镜像站是否有手机访问专用网址,没有则填一样的.
const upstream_mobile = 'www.tiktok.com'

// 屏蔽国家和地区.
const blocked_region = ['KP', 'SY', 'PK', 'CU']

// 屏蔽 IP 地址.
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

// 镜像站是否开启 HTTPS.
const https = true

// 文本替换.
const replace_dict = {
'$upstream': '$custom_domain',
'//tiktok.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', url.hostname);
new_request_headers.set('Referer', url.hostname);

let original_response = await fetch(url.href, {
method: method,
headers: new_request_headers
})

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;

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');

const content_type = new_response_headers.get('content-type');
if (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

就是把自己的域名转移到CloudFlare这个很简单,到Cloudflare 主页点击添加站点即可托管。

新增DNS解析

进入自己的域名后转到DNS界面,添加一条‘AAAA“DNS解析,IPv6为100::,最重要的是打开小黄云(即打开Cloudflare代理)
![DNS解析](http://zigeltd.eu.org/?/images/2022/07/12/5L8apau8GB/00c4d243e79aa4334a873dafe37c9396.png)

关联域名

进入你的域名,不是你的首页!进入Workers,添加路由

最终效果

现在已经无法打开Google了,显示错误(被撸爆也是很正常的吧),Github也被撸爆了。目前Tiktok还可以正常使用
Google显示错误
但是Tiktok还能正常访问:
Tiktok

最后再附上我的Tiktok镜像站地址:
[Tiktok- Make You Day](https://tik.zgtech.top/)

本文作者:Eric Zige
本文地址: https://www.zigecn.eu.org/25c2ca23.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0

许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信