闲人吧重新回归
不一样的福利体验,一样的专注

【很简单但又很牛逼】通过Cloudflare的Worker很简单的可以畅游全球,关键是速度快,很简单。

Cloudflare是全球最大的免费CDN加速网站,cloudflare在大多中小型站长心中,是神一样的存在。

Cloudflare的Worker 是 CloudFlare 的边缘计算服务。开发者可通过 JavaScript 对 CDN 进行编程,从而能灵活处理 HTTP 请求。这使得很多任务可在 CDN 上完成,无需自己的服务器参与。

当然,我们不需要知道Cloudflare和Worker到底是什么,我们只需要由于Cloudflare提供的CDN是全球性质的,因此在它上面搞的东西都是可以“出国”的

因此很多Github的开发者开发了一些通过Cloudflare反向代理某被墙网站的程序,从而可以不需要我们耗费任何成本进行“出国服务”

优点就是:

1,不需要我们花费任何服务器什么的,就能免费出国,Cloudflare对于免费用户提供每天10W次请求,对于个人来说一般打死都用不完

2,Cloudflare的全球CDN可以实现一些目标站的表开,有时候比一些付费墙软件要快多了

不多说,今天站长通过2种Github的开源项目,来教大家如何简单优雅的出国

教程开始:

1:首先,我们需要注册一个Cloudflare的账号,注册地址:点击我呀

注册完毕后,回到Cloudflare后台主页,然后点击右边的“Workers”

2:进入“Workers”的配置界面

1,配置一个项目名字 然后点击“set up”

 

2,根据下图示例完成

3,点击“create a Worker”新建一个工作项目

4,点击左上角可以任意设置这个项目的子域名名字,下面的编辑框是写代码的地方

二:到了这里,我们已经学会了Cloudflare和Worker的玩法,因此下面就是2个Github项目的复制粘贴了

1,GitHub项目地址:https://github.com/EtherDream/jsproxy

这个主项目由于太复杂,因此项目作者提供了CloudflareWorker的简易版:https://github.com/EtherDream/jsproxy/tree/master/cf-worker

这个简易版是通过Cloudflare和Worker反代Github项目作者已经完工的成品项目,从而通过自己的worker地址实现访问。

这个项目强大在于它是全局反代,而不是单一的域名反代,经过站长测试,油管看1080没问题,虽然加载速度只有200多KB左右,但是还算很流畅,而且打开静态网站,诸如谷歌之类的秒开没问题

教程开始:

1,打开:https://github.com/EtherDream/jsproxy/blob/master/cf-worker/index.js  复制里面的所有代码

2,粘贴到CloudflareWorker的编辑框中,然后如下图所示,建议先点击“run”查看调试的情况,然后再点击【Save and deploy】 部署代码

3:我们再右边可以看到代码的执行情况,复制项目的连接,即可自行的访问了!

第二个项目:https://github.com/Siujoeng-Lau/WorkersProxy

这个项目是单纯的通过CloudflareWorker的CDN进行反代,其效果和“宝塔面板”的反代效果是一样的,只不过“宝塔”需要我们有服务器,而CloudflareWorker是免费的。

这个项目的缺点和“宝塔”一样,只能通过无墙连接去替换掉目标站的“被墙主域名”,但是如果这个站有其他链接被和谐了,虽然能进站,但干不成其他事

比如,虽然我们通过这个项目能进“youtube”,但由于油管的视频是google的链接,而google是被和谐了,因此我们能进入,但看不了视频

但是,诸如xvideos这种的,由于其视频链接是没有被和谐了,因此通过这个项目代理Xvideos这种的,是很爽的。

因为第一个项目是全局代理形式,有时候某些网站视频通过这种代理无法观看,而这第二个项目可以作为一种尝试

教程开始:

其实这个教程和第一个项目方法是一样的

1,复制:https://github.com/Siujoeng-Lau/WorkersProxy/blob/master/index.js  里面的所有代码。

新建一个项目,和第一个项目方法一样,然后我们把复制的所有文件都粘贴到编辑框

2,修改代码,如下图所示

      1,把地址修改为自己的worker链接地址

      2,这里填写你向访问的被墙网址,比如:Google  91porn xvideos之类的网址

      3,把里面的CN去掉,这个是限制其他国家IP地址访问,由于我们是中国,不可能自己限制自己

3,老步骤,建议先点run再点save and deploy

注意事项:

1,注册Cloudflare账号的时候,千万要记得验证邮箱地址,Cloudflare会发验证信息到你的邮箱的,否则你的worker地址无法外链访问

2,对于有些Github基础的,不需要任何服务器,可以自己搭建一个和站长:xianrenba.github.io  一样的站,具体的不怎么详细的教程:https://yremp.live/jsproxy-github-pages/

通过这个,主要是可以修改代码,因为项目2是直接调用的项目大佬的成品,而那个大佬把pornhub域名给屏蔽了,然后你懂的。

3,本教程只是给大家一个技术思路,请不要用于非法用途。

评论 11

  • QQ号
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1
    avatar

    不怎么懂

    dixueqq10个月前 (09-24)国内网友谷歌浏览器  Android 8.0.0 MIX 2 Build/OPR1.170623.027 回复
  2. #2
    avatar

    看蒙了

    gaofeifei00810个月前 (09-25)国内网友谷歌浏览器 Windows 7 回复
  3. #3
    avatar

    看不懂

    ccfwl88810个月前 (09-25)国内网友谷歌浏览器 Windows 10 回复
  4. #4
    avatar

    特别好用,感谢站长辛苦分享

    ptyjlz10个月前 (09-25)国内网友谷歌浏览器  YAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36 回复
  5. #5
    avatar

    不太懂,但感觉很牛逼的样子

    shdhdndb10个月前 (09-25)国内网友谷歌浏览器  Android 9 V1824A Build/PKQ1.181216.001 回复
  6. #6
    avatar

    男人https://share.33dfh.site/?code=999

    ssyyt_8654310个月前 (09-27)Cambodia谷歌浏览器 Windows 10 回复
  7. #7
    avatar

    把js代码发出来啊!那网站都上不去啊!

    laozisnibb10个月前 (10-03)国内网友谷歌浏览器 Windows 7 回复
    • avatar

      要翻墙,这不是国内的IP地址'use strict'

      /**
      * static files (404.html, sw.js, conf.js)
      */
      const ASSET_URL = 'https://etherdream.github.io/jsproxy'

      const JS_VER = 10
      const MAX_RETRY = 1

      /** @type {RequestInit} */
      const PREFLIGHT_INIT = {
      status: 204,
      headers: new Headers({
      'access-control-allow-origin': '*',
      'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
      'access-control-max-age': '1728000',
      }),
      }

      /**
      * @param {any} body
      * @param {number} status
      * @param {Object} headers
      */
      function makeRes(body, status = 200, headers = {}) {
      headers['--ver'] = JS_VER
      headers['access-control-allow-origin'] = '*'
      return new Response(body, {status, headers})
      }

      /**
      * @param {string} urlStr
      */
      function newUrl(urlStr) {
      try {
      return new URL(urlStr)
      } catch (err) {
      return null
      }
      }

      addEventListener('fetch', e => {
      const ret = fetchHandler(e)
      .catch(err => makeRes('cfworker error:\n' + err.stack, 502))
      e.respondWith(ret)
      })

      /**
      * @param {FetchEvent} e
      */
      async function fetchHandler(e) {
      const req = e.request
      const urlStr = req.url
      const urlObj = new URL(urlStr)
      const path = urlObj.href.substr(urlObj.origin.length)

      if (urlObj.protocol === 'http:') {
      urlObj.protocol = 'https:'
      return makeRes('', 301, {
      'strict-transport-security': 'max-age=99999999; includeSubDomains; preload',
      'location': urlObj.href,
      })
      }

      if (path.startsWith('/http/')) {
      return httpHandler(req, path.substr(6))
      }

      switch (path) {
      case '/http':
      return makeRes('请更新 cfworker 到最新版本!')
      case '/ws':
      return makeRes('not support', 400)
      case '/works':
      return makeRes('it works')
      default:
      // static files
      return fetch(ASSET_URL + path)
      }
      }

      /**
      * @param {Request} req
      * @param {string} pathname
      */
      function httpHandler(req, pathname) {
      const reqHdrRaw = req.headers
      if (reqHdrRaw.has('x-jsproxy')) {
      return Response.error()
      }

      // preflight
      if (req.method === 'OPTIONS' &&
      reqHdrRaw.has('access-control-request-headers')
      ) {
      return new Response(null, PREFLIGHT_INIT)
      }

      let acehOld = false
      let rawSvr = ''
      let rawLen = ''
      let rawEtag = ''

      const reqHdrNew = new Headers(reqHdrRaw)
      reqHdrNew.set('x-jsproxy', '1')

      // 此处逻辑和 http-dec-req-hdr.lua 大致相同
      // https://github.com/EtherDream/jsproxy/blob/master/lua/http-dec-req-hdr.lua
      const refer = reqHdrNew.get('referer')
      const query = refer.substr(refer.indexOf('?') + 1)
      if (!query) {
      return makeRes('missing params', 403)
      }
      const param = new URLSearchParams(query)

      for (const [k, v] of Object.entries(param)) {
      if (k.substr(0, 2) === '--') {
      // 系统信息
      switch (k.substr(2)) {
      case 'aceh':
      acehOld = true
      break
      case 'raw-info':
      [rawSvr, rawLen, rawEtag] = v.split('|')
      break
      }
      } else {
      // 还原 HTTP 请求头
      if (v) {
      reqHdrNew.set(k, v)
      } else {
      reqHdrNew.delete(k)
      }
      }
      }
      if (!param.has('referer')) {
      reqHdrNew.delete('referer')
      }

      // cfworker 会把路径中的 `//` 合并成 `/`
      const urlStr = pathname.replace(/^(https?):\/+/, '$1://')
      const urlObj = newUrl(urlStr)
      if (!urlObj) {
      return makeRes('invalid proxy url: ' + urlStr, 403)
      }

      /** @type {RequestInit} */
      const reqInit = {
      method: req.method,
      headers: reqHdrNew,
      redirect: 'manual',
      }
      if (req.method === 'POST') {
      reqInit.body = req.body
      }
      return proxy(urlObj, reqInit, acehOld, rawLen, 0)
      }

      /**
      *
      * @param {URL} urlObj
      * @param {RequestInit} reqInit
      * @param {number} retryTimes
      */
      async function proxy(urlObj, reqInit, acehOld, rawLen, retryTimes) {
      const res = await fetch(urlObj.href, reqInit)
      const resHdrOld = res.headers
      const resHdrNew = new Headers(resHdrOld)

      let expose = '*'

      for (const [k, v] of resHdrOld.entries()) {
      if (k === 'access-control-allow-origin' ||
      k === 'access-control-expose-headers' ||
      k === 'location' ||
      k === 'set-cookie'
      ) {
      const x = '--' + k
      resHdrNew.set(x, v)
      if (acehOld) {
      expose = expose + ',' + x
      }
      resHdrNew.delete(k)
      }
      else if (acehOld &&
      k !== 'cache-control' &&
      k !== 'content-language' &&
      k !== 'content-type' &&
      k !== 'expires' &&
      k !== 'last-modified' &&
      k !== 'pragma'
      ) {
      expose = expose + ',' + k
      }
      }

      if (acehOld) {
      expose = expose + ',--s'
      resHdrNew.set('--t', '1')
      }

      // verify
      if (rawLen) {
      const newLen = resHdrOld.get('content-length') || ''
      const badLen = (rawLen !== newLen)

      if (badLen) {
      if (retryTimes 1) {
      resHdrNew.set('--retry', retryTimes)
      }
      }

      let status = res.status

      resHdrNew.set('access-control-expose-headers', expose)
      resHdrNew.set('access-control-allow-origin', '*')
      resHdrNew.set('--s', status)
      resHdrNew.set('--ver', JS_VER)

      resHdrNew.delete('content-security-policy')
      resHdrNew.delete('content-security-policy-report-only')
      resHdrNew.delete('clear-site-data')

      if (status === 301 ||
      status === 302 ||
      status === 303 ||
      status === 307 ||
      status === 308
      ) {
      status = status + 10
      }

      return new Response(res.body, {
      status,
      headers: resHdrNew,
      })
      }

      /**
      * @param {URL} urlObj
      */
      function isYtUrl(urlObj) {
      return (
      urlObj.host.endsWith('.googlevideo.com') &&
      urlObj.pathname.startsWith('/videoplayback')
      )
      }

      /**
      * @param {URL} urlObj
      * @param {number} newLen
      * @param {Response} res
      */
      async function parseYtVideoRedir(urlObj, newLen, res) {
      if (newLen > 2000) {
      return null
      }
      if (!isYtUrl(urlObj)) {
      return null
      }
      try {
      const data = await res.text()
      urlObj = new URL(data)
      } catch (err) {
      return null
      }
      if (!isYtUrl(urlObj)) {
      return null
      }
      return urlObj
      }

      James2个月前 (05-31)国内网友谷歌浏览器 Windows 10 回复
  8. #8
    avatar

    不懂

    dixueqq9个月前 (10-10)国内网友谷歌浏览器  Android 9 MI 9 Build/PKQ1.181121.001 回复
  9. #9
    avatar

    一件懵逼,看不懂

    8158138个月前 (11-25)来自美国的网友谷歌浏览器  Android 9 PCT-AL10 Build/HUAWEIPCT-AL10 回复
  10. #10
    avatar

    站长可太牛了!就是第二个项目的页面挂了,但可以照着readme操作。

    949457个月前 (01-03)来自美国的网友火狐浏览器 Windows 10 回复
切换注册

登录

忘记密码 ?

切换登录

注册