Github 下載慢怎么辦?好用工具分享:無服務器 Github 代理工具分享


GitHub 無服務器代理工具

GitHub 國內下載速度時快時慢,很不穩定。使用 Cloudflare 的 Workers 可以作為中轉站進行代理加速下載。
Workers 免費版可以接收 10W/day、1K/min 請求,個人使用是完全沒問題的。Cloudflare 注冊僅需郵箱認證即可。

注冊賬戶

點擊此處開始注冊,認證完成后,即可使用服務。

搭建 Github 代理加速服務

  1. 給自己的 Workers 起一個好的二級域名,最少三個字符。假設為 example
    baPShj.png
    選擇免費版,即可看到下面的頁面。
    baP99s.png
  2. 點擊新建服務,為服務命名。然后點擊創建服務。假設為 githubproxy,則該項目的域名為 githubproxy.example.wokers.dev
    baPC3n.png
  3. 點擊新創建的服務后,選擇編輯
  4. 粘貼下面的js代碼
    'use strict'
     /**
     * static files (404.html, sw.js, conf.js)
     */
     const ASSET_URL = 'https://xx.xx.workers.dev/'
     // 前綴,如果自定義路由為example.com/gh/*,將PREFIX改為 '/gh/',注意,少一個杠都會錯!
     const PREFIX = '/'
     // 分支文件使用jsDelivr鏡像的開關,0為關閉,默認開啟
     const Config = {
         jsdelivr: 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',
         }),
     }
    
    
     const exp1 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive)\/.*$/i
     const exp2 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob|raw)\/.*$/i
     const exp3 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:info|git-).*$/i
     const exp4 = /^(?:https?:\/\/)?raw\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+?\/.+$/i
     const exp5 = /^(?:https?:\/\/)?gist\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+$/i
     const exp6 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/tags.*$/i
    
     /**
     * @param {any} body
     * @param {number} status
     * @param {Object<string, string>} headers
     */
     function makeRes(body, status = 200, headers = {}) {
         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)
     })
    
    
     function checkUrl(u) {
         for (let i of [exp1, exp2, exp3, exp4, exp5, exp6]) {
             if (u.search(i) === 0) {
                 return true
             }
         }
         return false
     }
    
     /**
     * @param {FetchEvent} e
     */
     async function fetchHandler(e) {
         const req = e.request
         const urlStr = req.url
         const urlObj = new URL(urlStr)
         let path = urlObj.searchParams.get('q')
         if (path) {
             return Response.redirect('https://' + urlObj.host + PREFIX + path, 301)
         }
         // cfworker 會把路徑中的 `//` 合並成 `/`
         path = urlObj.href.substr(urlObj.origin.length + PREFIX.length).replace(/^https?:\/+/, 'https://')
         if (path.search(exp1) === 0 || path.search(exp5) === 0 || path.search(exp6) === 0 || path.search(exp3) === 0 || path.search(exp4) === 0) {
             return httpHandler(req, path)
         } else if (path.search(exp2) === 0) {
             if (Config.jsdelivr) {
                 const newUrl = path.replace('/blob/', '@').replace(/^(?:https?:\/\/)?github\.com/, 'https://cdn.jsdelivr.net/gh')
                 return Response.redirect(newUrl, 302)
             } else {
                 path = path.replace('/blob/', '/raw/')
                 return httpHandler(req, path)
             }
         } else if (path.search(exp4) === 0) {
             const newUrl = path.replace(/(?<=com\/.+?\/.+?)\/(.+?\/)/, '@$1').replace(/^(?:https?:\/\/)?raw\.(?:githubusercontent|github)\.com/, 'https://cdn.jsdelivr.net/gh')
             return Response.redirect(newUrl, 302)
         } else {
             return fetch(ASSET_URL + path)
         }
     }
    
    
     /**
     * @param {Request} req
     * @param {string} pathname
     */
     function httpHandler(req, pathname) {
         const reqHdrRaw = req.headers
    
         // preflight
         if (req.method === 'OPTIONS' &&
             reqHdrRaw.has('access-control-request-headers')
         ) {
             return new Response(null, PREFLIGHT_INIT)
         }
    
         const reqHdrNew = new Headers(reqHdrRaw)
    
         let urlStr = pathname
         if (urlStr.startsWith('github')) {
             urlStr = 'https://' + urlStr
         }
         const urlObj = newUrl(urlStr)
    
         /** @type {RequestInit} */
         const reqInit = {
             method: req.method,
             headers: reqHdrNew,
             redirect: 'manual',
             body: req.body
         }
         return proxy(urlObj, reqInit)
     }
    
    
     /**
     *
     * @param {URL} urlObj
     * @param {RequestInit} reqInit
     */
     async function proxy(urlObj, reqInit) {
         const res = await fetch(urlObj.href, reqInit)
         const resHdrOld = res.headers
         const resHdrNew = new Headers(resHdrOld)
    
         const status = res.status
    
         if (resHdrNew.has('location')) {
             let _location = resHdrNew.get('location')
             if (checkUrl(_location))
                 resHdrNew.set('location', PREFIX + _location)
             else {
                 reqInit.redirect = 'follow'
                 return proxy(newUrl(_location), reqInit)
             }
         }
         resHdrNew.set('access-control-expose-headers', '*')
         resHdrNew.set('access-control-allow-origin', '*')
    
         resHdrNew.delete('content-security-policy')
         resHdrNew.delete('content-security-policy-report-only')
         resHdrNew.delete('clear-site-data')
    
         return new Response(res.body, {
             status,
             headers: resHdrNew,
         })
     }
    
  5. 修改上面文件中 ASSET_URL,設置為該項目所屬域名,本案例中即為 https://githubproxy.example.workers.dev/

使用

將 GitHub 資源鏈接直接加在 https://githubproxy.example.workers.dev/ 后即可。

以下都是合法輸入(僅示例,文件不存在):


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM