采用CFworker布置的网盘程序-Goindex等安装过程

写在最前

由于近期dowan大佬失联,期间很多项目没有维护均出现了一些问题,代码自动部署也已经无法使用,导致很多小白无法正常开车,为了获得此项目的流量,本人特在此写这一篇科普,顺便把类似的程序全部都总结一下,当然总结还不太完全,有时间就更新,欢迎有类似项目的大佬推荐,目前较为流行的goindex版本及魔改版均采用CFworker进行部署,可以实现免流|扶墙等一些列骚操作,另外CF的cdn在挂载后,采用IDM多线程下载速度也大多可以跑满,当然限制是肯定有的,需求量不大的小白可以试试,写的不好,大佬多多指教

《采用CFworker布置的网盘程序-Goindex等安装过程》

前期准备

  • CloudFlare帐号
    申请免费,大部分服务都是免费用,不会的可以百度,教程非常多,申请也非常简单。
    申请地址:https://dash.cloudflare.com/sign-up
  • Google Drive帐号
    这个前提是你得有一个google帐号,国内手机是可以申请的,gmail绑定到QQ邮箱也是无障碍收邮件,下面地址可以点开,但是申请依然需要FQ。另外找个国外edu邮箱是可以免费申请到无限空间的,当然个人也支持,就是空间大小少了点,不建议使用个人帐号部署,基本失去了意义。
    申请地址:http://www.google.cn/intl/zh_cn/drive/
    团队盘也可以操作,并且是无限的,申请及使用请看这里:免费开通Google Drive团队盘(无限空间)及使用教程
  • 域名(非必须,但是强烈建议有)
    申请地址:https://www.freenom.com/zh/index.html?lang=zh
    记得申请完成之后,立刻套上CloudFlare。为什么强烈建议有,因为那些二级域名很有可能被和谐,并且不好看。
  • 因为需要访问google的API,所以你懂的,还需要准备个梯子。因为某些项目需要手动部署,所以还需要梯子+全局代理(保证rclone可以访问代理)

GDindex

项目简介

使用Vue编写的 Google Drive 目录,速度可以的,GDIndex与GOIndex相似。它使您可以在CloudFlare Workers上部署“ Google Drive Index”以及许多其他功能,顺便说一句,这是完全重写,而不是从GOIndex进行修改.目前这个支持快速部署,这简直是新手保姆,推荐搞这个
项目地址:https://github.com/maple3142/GDIndex

演示地址
https://gdindex-demo.maple3142.workers.dev/

《采用CFworker布置的网盘程序-Goindex等安装过程》

安装教程

打开网址快速部署:传送门

点击蓝色按钮,获取code

《采用CFworker布置的网盘程序-Goindex等安装过程》

《采用CFworker布置的网盘程序-Goindex等安装过程》

复制一下code粘贴到下面

《采用CFworker布置的网盘程序-Goindex等安装过程》

粘贴到下面

《采用CFworker布置的网盘程序-Goindex等安装过程》

点击验证,上面的身份验证以后可以修改,启用文件上传,可选可不选CF的工作机制,理论上上传超过40M就会报错

《采用CFworker布置的网盘程序-Goindex等安装过程》

点击上面蓝色按钮,将代码复制到CFworker中去部署即可,在CFworker中部署代码的方法,可以看看我以前的这篇文章:传送门

打开CFworker网站:传送门,注册用户,点击worker-快速部署-保存即可

Goindex

项目简介

dowan大佬的作品,值得信赖,最近可能因为pandown事件消失了
项目地址https://github.com/swjsky/goindex

部署方法

下载Rclone并解压到目录,将文件解压到这个位置d:/gatc/,当然你自己选个目录也行

#Rclone WIN64 下载后直接解压到system32文件夹,或者添加系统变量,或者直接在文件夹内开搞,看你自己的了
https://downloads.rclone.org/v1.51.0/rclone-v1.51.0-windows-amd64.zip
#linux系统,直接输入以下命令安装,国内的不建议在VPS上搞,真心麻烦
curl https://rclone.org/install.sh | sudo bash

挂载配置Google Drive

进入上述目录的CMD,输入rclone config或者gclone config开始配置

《采用CFworker布置的网盘程序-Goindex等安装过程》

《采用CFworker布置的网盘程序-Goindex等安装过程》

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
#输入n,新建一个网盘配置文件,将来调用要用到了,我已经建好了一个,swj,不要被我的图片误导

继续输入配置名称,我这里csr

《采用CFworker布置的网盘程序-Goindex等安装过程》

选择挂载类型,我们这里说的是GD,所以选13

《采用CFworker布置的网盘程序-Goindex等安装过程》

下面一直默认的走即可

《采用CFworker布置的网盘程序-Goindex等安装过程》

《采用CFworker布置的网盘程序-Goindex等安装过程》

一路默认一直继续即可

《采用CFworker布置的网盘程序-Goindex等安装过程》

最后会在浏览器弹出登录信息,登录授权即可

《采用CFworker布置的网盘程序-Goindex等安装过程》

《采用CFworker布置的网盘程序-Goindex等安装过程》

《采用CFworker布置的网盘程序-Goindex等安装过程》

注意:返回CMD,两个默认即可,这里挂载的是Google Drive还是Google Team Drive,如果你在上述中申请了Google Team Drive并且想挂载,那么你就要选y,如果你挂载的是个人云盘那么你就要选n

《采用CFworker布置的网盘程序-Goindex等安装过程》

这个是token,记不记无所谓,都在config文件里面

《采用CFworker布置的网盘程序-Goindex等安装过程》.

这个时候多出了个csr,代表配置成功

《采用CFworker布置的网盘程序-Goindex等安装过程》

配置成功后即可获得我们想要的参数,继续在CMD内输入rclone config show,把refresh_token里面的参数复制下来

《采用CFworker布置的网盘程序-Goindex等安装过程》

refresh_token里面的参数复制下来

修改以下代码里面对应的参数,将上面得到的替换成你的

var authConfig = {
    "siteName": "GoIndex", // 网站名称修改成你自己的
    "root_pass": "",  // 根目录密码,优先于.password,没有特殊要求可以留空
    "version" : "1.0.6", // 程序版本
    "theme" : "material", // material  classic 
    "client_id": "202264815644.apps.googleusercontent.com",// 不需要修改 ,当然自己申请个速度会可能更好
    "client_secret": "X4Z3ca8xfWDb1Voo-F9a7ZxJ",// 不需要修改
    "refresh_token": "修改成你的token", // 授权 token,需要修改
    "root": "root" // 根目录ID,可以不修改,团队盘需要改成团队盘的ID,挂载到子目录需要修成成子目录ID
}; var gd; var html = ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/> <title>${authConfig.siteName}</title> <script src="//cdn.jsdelivr.net/combine/gh/jquery/jquery@3.2/dist/jquery.min.js,gh/swjsky/goindex/themes/${authConfig.theme}/app.js"></script> </head> <body> </body> </html> `; addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)); }); /** * Fetch and log a request * @param {Request} request */ async function handleRequest(request) { if(gd == undefined){ gd = new googleDrive(authConfig); } if(request.method == 'POST'){ return apiRequest(request); } let url = new URL(request.url); let path = url.pathname; let action = url.searchParams.get('a'); if(path.substr(-1) == '/' || action != null){ return new Response(html,{status:200,headers:{'Content-Type':'text/html; charset=utf-8'}}); }else{ if(path.split('/').pop().toLowerCase() == ".password"){ return new Response("",{status:404}); } let file = await gd.file(path); let range = request.headers.get('Range'); return gd.down(file.id, range); } } async function apiRequest(request) { let url = new URL(request.url); let path = url.pathname; let option = {status:200,headers:{'Access-Control-Allow-Origin':'*'}} if(path.substr(-1) == '/'){ // check password let password = await gd.password(path); console.log("dir password", password); if(password != undefined && password != null && password != ""){ try{ var obj = await request.json(); }catch(e){ var obj = {}; } console.log(password,obj); if(password != obj.password){ let html = `{"error": {"code": 401,"message": "password error."}}`; return new Response(html,option); } } let list = await gd.list(path); return new Response(JSON.stringify(list),option); }else{ let file = await gd.file(path); let range = request.headers.get('Range'); return new Response(JSON.stringify(file)); } } class googleDrive { constructor(authConfig) { this.authConfig = authConfig; this.paths = []; this.files = []; this.passwords = []; this.paths["/"] = authConfig.root; if(authConfig.root_pass != ""){ this.passwords["/"] = authConfig.root_pass; } this.accessToken(); } async down(id, range=''){ let url = `https://www.googleapis.com/drive/v3/files/${id}?alt=media`; let requestOption = await this.requestOption(); requestOption.headers['Range'] = range; return await fetch(url, requestOption); } async file(path){ if(typeof this.files[path] == 'undefined'){ this.files[path] = await this._file(path); } return this.files[path] ; } async _file(path){ let arr = path.split('/'); let name = arr.pop(); name = decodeURIComponent(name).replace(/\'/g, "\\'"); let dir = arr.join('/')+'/'; console.log(name, dir); let parent = await this.findPathId(dir); console.log(parent); let url = 'https://www.googleapis.com/drive/v3/files'; let params = {'includeItemsFromAllDrives':true,'supportsAllDrives':true}; params.q = `'${parent}' in parents and name = '${name}' andtrashed = false`; params.fields = "files(id, name, mimeType, size ,createdTime, modifiedTime, iconLink, thumbnailLink)"; url += '?'+this.enQuery(params); let requestOption = await this.requestOption(); let response = await fetch(url, requestOption); let obj = await response.json(); console.log(obj); return obj.files[0]; } // 通过reqeust cache 来缓存 async list(path){ let id = await this.findPathId(path); return this._ls(id); } async password(path){ if(this.passwords[path] !== undefined){ return this.passwords[path]; } console.log("load",path,".password",this.passwords[path]); let file = await gd.file(path+'.password'); if(file == undefined){ this.passwords[path] = null; }else{ let url = `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`; let requestOption = await this.requestOption(); let response = await this.fetch200(url, requestOption); this.passwords[path] = await response.text(); } return this.passwords[path]; } async _ls(parent){ console.log("_ls",parent); if(parent==undefined){ return null; } let url = 'https://www.googleapis.com/drive/v3/files'; let params = {'includeItemsFromAllDrives':true,'supportsAllDrives':true}; params.q = `'${parent}' in parents and trashed = false AND name !='.password'`; params.orderBy= 'folder,name,modifiedTime desc'; params.fields = "nextPageToken, files(id, name, mimeType, size , modifiedTime)"; params.pageSize = 1000; url += '?'+this.enQuery(params); let requestOption = await this.requestOption(); let response = await fetch(url, requestOption); let obj = await response.json(); return obj; } async findPathId(path){ let c_path = '/'; let c_id = this.paths[c_path]; let arr = path.trim('/').split('/'); for(let name of arr){ c_path += name+'/'; if(typeof this.paths[c_path] == 'undefined'){ let id = await this._findDirId(c_id, name); this.paths[c_path] = id; } c_id = this.paths[c_path]; if(c_id == undefined || c_id == null){ break; } } console.log(this.paths); return this.paths[path]; } async _findDirId(parent, name){ name = decodeURIComponent(name).replace(/\'/g, "\\'"); console.log("_findDirId",parent,name); if(parent==undefined){ return null; } let url = 'https://www.googleapis.com/drive/v3/files'; let params = {'includeItemsFromAllDrives':true,'supportsAllDrives':true}; params.q = `'${parent}' in parents and mimeType = 'application/vnd.google-apps.folder' and name = '${name}' and trashed = false`; params.fields = "nextPageToken, files(id, name, mimeType)"; url += '?'+this.enQuery(params); let requestOption = await this.requestOption(); let response = await fetch(url, requestOption); let obj = await response.json(); if(obj.files[0] == undefined){ return null; } return obj.files[0].id; } async accessToken(){ console.log("accessToken"); if(this.authConfig.expires == undefined ||this.authConfig.expires< Date.now()){ const obj = await this.fetchAccessToken(); if(obj.access_token != undefined){ this.authConfig.accessToken = obj.access_token; this.authConfig.expires = Date.now()+3500*1000; } } return this.authConfig.accessToken; } async fetchAccessToken() { console.log("fetchAccessToken"); const url = "https://www.googleapis.com/oauth2/v4/token"; const headers = { 'Content-Type': 'application/x-www-form-urlencoded' }; const post_data = { 'client_id': this.authConfig.client_id, 'client_secret': this.authConfig.client_secret, 'refresh_token': this.authConfig.refresh_token, 'grant_type': 'refresh_token' } let requestOption = { 'method': 'POST', 'headers': headers, 'body': this.enQuery(post_data) }; const response = await fetch(url, requestOption); return await response.json(); } async fetch200(url, requestOption) { let response; for (let i = 0; i < 3; i++) { response = await fetch(url, requestOption); console.log(response.status); if (response.status != 403) { break; } await this.sleep(800 * (i + 1)); } return response; } async requestOption(headers={},method='GET'){ const accessToken = await this.accessToken(); headers['authorization'] = 'Bearer '+ accessToken; return {'method': method, 'headers':headers}; } enQuery(data) { const ret = []; for (let d in data) { ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d])); } return ret.join('&'); } sleep(ms) { return new Promise(function (resolve, reject) { let i = 0; setTimeout(function () { console.log('sleep' + ms); i++; if (i >= 2) reject(new Error('i>=2')); else resolve(i); }, ms); }) } } String.prototype.trim = function (char) { if (char) { return this.replace(new RegExp('^\\'+char+'+|\\'+char+'+$', 'g'), ''); } return this.replace(/^\s+|\s+$/g, ''); };

复制上面的代码直接拷贝到CFworker里面部署即可!过程在上面已经描述!

Goindex-yanzai

支持多盘、搜索、分页加载等功能。配置方法基本如上,需要打开相应的index.js文件修改上面对应的代码,还有把dowan大佬的源地址更换成现有的,具体可以看这里:传送门
项目地址:https://github.com/yanzai/goindex

演示地址:https://yanzai-goindex.java.workers.dev/0:/
goindex
-theme-acrou

Goindex –acrou


项目地址:ttps:
//github.com/Aicirou/goindex-theme-acrou

演示地址:https://oss.achirou.workers.dev/0:/

OneDrive Index


OneDrive 目录,这个本站有介绍有安装过程,请自行搜索:传送门


项目地址:ttps:
//github.com/heymind/OneDrive-Index-Cloudflare-Worker

题外话

由于很多人都用默认的client_idclient_secret,google会对其总体查询速度限制导致你的goindex会卡,所以建议可以自己申请个,具体过程如下

申请自己的client_id

当您将rclone与Google驱动器的默认配置一起使用时,您将使用rclone的client_id。这在所有rclone用户之间共享。Google对每个client_id可以设置的每秒查询总数设置全局速率限制。rclone已经有很高的配额,我将通过与Google联系来继续确保它足够高。

强烈建议使用您自己的客户端ID,因为大量使用了默认的rclone ID。如果您有多个服务在运行,建议对每个服务使用API​​密钥。Google的默认配额是每秒10个事务,因此建议您保持在该数量以下,就好像您使用的配额超过该数量一样,这将导致rclone进行速率限制并降低运行速度。

以下是为rclone创建自己的Google云端硬盘客户端ID的方法:

  1. 使用您的Google帐户登录Google API控制台。您使用什么Google帐户都没有关系。(该帐户不必与您要访问的Google云端硬盘相同)

  2. 选择一个项目或创建一个新项目。

  3. 在“启用的API和服务”下搜索“驱动器”,然后启用“ Google Drive API”。

  4. 单击左侧面板中的“凭据”(不是打开向导的“创建凭据”),然后单击“创建凭据”,然后单击“ OAuth客户端ID”。如果您尚未设置OAuth同意屏幕产品名称,它将提示您设置OAuth同意屏幕产品名称。

  5. 选择“其他”的应用程序类型,然后单击“创建”。(默认名称很好)

  6. 它将显示一个客户端ID和客户端密码。在rclone config中使用这些值可添加新的遥控器或编辑现有的遥控器。

注意申请自己的client_id,是需要在rclone’等客户端里面授权活动re-token的哈,不要乱写

白嫖的OD

可以看看这里的文章:传送门

白嫖的TD

可以看看这里的文章:传送门

点赞
  1. 一抹说道:

    是不是 只能 部署谷歌网盘?

    1. 山涧小石说道:

      最后一个支持部署Onedrive

      1. 一抹说道:

        白嫖的OD
        可以看看这里的文章:传送门

        白嫖的TD
        可以看看这里的文章:传送门

        传送门 全部不能进显示404

        1. 山涧小石说道:

          可以啊

发表评论