使用Cloudflare Worker代理Blogger网站的详细步骤

 对于那些热衷于使用Google Blogger来构建他们的网站的人来说,典型的问题是无法在国内直接访问Blogger。幸好,有一个解决方法,那就是使用Cloudflare worker作为Blogger网站的代理。以下是该操作步骤的详细描述:

logo

第一步:创建一个访问Blogger的worker

在这个步骤中,你需要创建一个worker来访问Blogger的网站。以我的Blogger网站域名是imuer8.blogspot.com 为例,worker.js将如下所示:

// 替换成你想镜像的站点
const upstream = 'imuer8.blogspot.com'
// const upstream = 'blogger.googleusercontent.com'
// const upstream_img = 'blogger.googleusercontent.com'

// 如果那个站点有专门的移动适配站点,否则保持和上面一致
const upstream_mobile = 'imuer8.blogspot.com'
//const upstream_mobile = 'blogger.googleusercontent.com'
// const upstream_mobile_img = 'blogger.googleusercontent.com'

// 你希望禁止哪些国家访问
const blocked_region = []

// 禁止自访问
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

// 替换成你想镜像的站点
const replace_dict = {
'$upstream': '$custom_domain',
'//imuer8.blogspot.com': ''
}

//以下内容都不用动
addEventListener('fetch', event => {
try {
event.respondWith(fetchAndApply(event.request));
} catch (err) {
console.error(err);
event.respondWith(new Response(err.toString(), {status: 500}))
}
})

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_host = url.host;

if (url.protocol == 'http:') {
url.protocol = 'https:'
response = Response.redirect(url.href);
return response;
}

var upstream_domain;
if (await device_status(user_agent)) {
// if (url.href.includes('blogger.googleusercontent.com')) {
// upstream_domain = upstream_img
// } else {
upstream_domain = upstream
// }
} else {
// if (url.href.includes('blogger.googleusercontent.com')) {
// upstream_domain = upstream_mobile_img
// } else {
upstream_domain = upstream_mobile
// }
}

url.host = upstream_domain;

if (blocked_region !=null && blocked_region.includes(region)) {
response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
status: 403
});
} else if(blocked_ip_address != null && 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.href);

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');
console.log('content type is :' + 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_host);
} else {
original_text = original_response_clone.body
}

if (original_text != null) {
original_text = await replace_other_domins(original_text);
}

response = new Response(original_text, {
status,
headers: new_response_headers
})
}

return response;
}

async function replace_other_domins(text) {
// let text = await response.text();
let domain_ = 'imuer8res.songlee.eu.org';
let re1 = new RegExp('blogger.googleusercontent.com', 'g');
// console.log(text);
text = text.replace(re1, domain_);
//fonts.gstatic.com
// let re2 = new RegExp('fonts.gstatic.com', 'g');
// text = text.replace(re2, domain_);
// //www.blogger.com
// let re3 = new RegExp('www.blogger.com', 'g');
// text = text.replace(re3, domain_);
// //fonts.googleapis.com
// let re4 = new RegExp('fonts.googleapis.com', 'g');
// text = text.replace(re4, domain_);
// //www.gstatic.com
// let re5 = new RegExp('www.gstatic.com', 'g');
// text = text.replace(re5, domain_);
// //pagead2.googlesyndication.com
// let re6 = new RegExp('pagead2.googlesyndication.com', 'g');
// text = text.replace(re6, domain_);

return text;
}

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

这个代码将构建一个worker,使你能够从你的国内网络上访问Blogger的网站。

第二步:创建一个访问Blogger托管的图片文件的worker

接下来,你需要再创建一个worker来访问Blogger托管的图片文件。worker.js将如下所示:

addEventListener('fetch', event => {
event.respondWith(fetchAndApply(event.request))
})

async function fetchAndApply(request) {

let url=new URL(request.url);
let bloggerURL = 'https://blogger.googleusercontent.com' + url.pathname;

let response=await fetch(bloggerURL, {
method: request.method,
headers: request.headers,
body: request.body,
redirect: 'manual'
});

response = new Response(response.body, response);
response.headers.set('Access-Control-Allow-Origin', '*');

return response;

}

此代码将构建另一个worker,使你能够浏览并加载Blogger网站上托管的图片。

综上所述,通过这两步骤的操作,你可以轻松地从国内网络上访问Blogger网站。无需顾虑不能直接访问Blogger的问题,你可以充分利用Blogger来构建你的网站,展示你的创造力。

请记住,每一个成功的技术实现,都源于详尽的操作步骤和对技术的深入理解。同时,勇于探索新的技术也是必不可少的。我们希望这篇文章对你有所启发,并期待在你的Blogger网站上看到更多精彩的内容。

相关链接

Cloudflare 官网: https://www.cloudflare.com

Blogger地址: https://www.blogger.com


发表评论