【最新】CloudFlare Workers 教程,搭建特定网站的网页代理

之前看到了一个帖子:

发现这代码功能不全,没有我的全(喜

那么今天分享一下我的workers代码:

// 反代目标网站.
const upstream = 'github.com';

// 反代目标网站的移动版.
const upstream_mobile = 'github.com';

// 访问区域黑名单(按需设置).
const blocked_region = [''];

// IP地址黑名单(按需设置).
const blocked_ip_address = ['0.0.0.0', '127.0.0.1'];

// 路径替换.
const replace_dict = {
  '$upstream': '$custom_domain', // 将"$upstream"替换为"$custom_domain"
  '//github.com': '' // 移除路径中的"//github.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'); // 获取访问者的IP地址
  const user_agent = request.headers.get('user-agent'); // 获取访问者的User-Agent头部信息

  let response = null;
  let url = new URL(request.url);
  let url_host = url.host;

  if (url.protocol == 'http:') { // 如果请求协议是HTTP,则重定向到HTTPS
    url.protocol = 'https:';
    response = Response.redirect(url.href);
    return response;
  }

  if (await device_status(user_agent)) { // 判断是否为移动设备
    var upstream_domain = upstream;
  } else {
    var upstream_domain = upstream_mobile;
  }

  url.host = upstream_domain;

  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)){ // 检查IP地址是否在黑名单中
    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); // 设置请求头的Host字段为反代目标网站的域名
    new_request_headers.set('Referer', url.href); // 设置请求头的Referer字段为当前请求的URL

    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('cache-control', 'public, max-age=14400');
    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 && 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;
    }

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

  for (let i in replace_dict) {
    let 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 workers被白嫖了之后那些用户不停拿来访问谷歌,于是谷歌干脆封了cf的ip)

具体怎么设置请看注释


如何注册cf、添加workers应该不用教了吧

26 个赞

牛,学习了,哈哈

榨干大善人

1 个赞

使用这个代理GitHub的时候需要注意了,如果使用自己域名的话,可能会被识别为钓鱼网站,然后封域名的。别问我怎么知道的。

2 个赞

如何反代open ai gpt

如何反代类似于chatgpt、poe之类的呢?

感谢分享!
但是好像存在一个问题,如下所示,均无法显示GitHubreleases资源,一直在转圈。

反代访问谷歌、YouTube网站用的吗?

mark

轻撸。大善人的workers实现的。

release 文件一般都不小,转存看网速,静态资源好弄一点

1 个赞

确实可以! :+1: :+1: :+1:

1 个赞

这个实用,谢谢分享

1 个赞

能不能实现反代google全部网站

Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions.

登陆不了,显示以上错误

这么狠吗,域名封了之后没法解除?

mark

域名封了之后可以找域名提供商申诉的,我的fun域名,很容易申诉成功的。

What‽

Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions.

Please contact us if the problem persists.

完全无法用