Google Drive 百宝箱详细搭建过程

项目的地址:https://github.com/iwestlin/gd-utils

准备工作

1、一台VPS,最好内存有1G。在扫描文件夹时如果文件夹数量过多,内存太小会不够用。

2、域名并且解析到你的VPS的IP上,二级域名也行。

3、TGbot一个。

本教程使用的系统为Dedian

一、安装宝塔(账号密码地址查看: /etc/init.d/bt default

Centos安装命令
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

Ubuntu/Deepin安装命令
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

Debian安装命令:

wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh

进入宝塔控制面板之后不要点一开始的推荐安装,进入软件商店→运行环境→安装Nginx→下一页→安装PM2管理器

安装完成之后在命令行输入:

node -v

如果有返回版本号则为成功安装了nodejs,在某些情况下宝塔PM2g管理器上显示有安装node但是实际上没有安装,如果没有安装nodejs则手动安装.

Debian安装命令

curl -sL https://deb.nodesource.com/setup_12.x | bash -
apt-get install -y nodejs

Ubuntu安装命令:

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

CentOS安装命令:

直接使用已编译好的包

Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用:

# wget https://nodejs.org/dist/v12.18.2/node-v12.18.2-linux-x64.tar.gz    // 下载
# tar xf  node-v12.18.2-linux-x64.tar.gz       // 解压
# cd node-v12.18.2-linux-x64 /                  // 进入解压目录
# ./bin/node -v                               // 执行node命令 查看版本

V**.**.**
一键脚本

# wget https://nodejs.org/dist/v12.18.2/node-v12.18.2-linux-x64.tar.gz &&  tar xf  node-v12.18.2-linux-x64.tar.gz &&  cd node-v12.18.2-linux-x64 / &&  ./bin/node -v  

确认安装完成Node.js再执行:

git clone https://github.com/iwestlin/gd-utils && cd gd-utils

把项目克隆到root目录下并且切换到gd-utils目录,reboot重启vps,再执行:

npm install –unsafe-perm=true –allow-root

安装依赖,部分依赖可能需要代理环境才能下载

如果你的网络环境无法正常访问谷歌服务,需要先在命令行进行一些配置:(如果可以正常访问则跳过此节)

http_proxy=”YOUR_PROXY_URL” && https_proxy=$http_proxy && HTTP_PROXY=$http_proxy && HTTPS_PROXY=$http_proxy

请把YOUR_PROXY_URL替换成你自己的代理地址

1、安装必要 

yum update

sudo yum install screen git && curl https://rclone.org/install.sh | sudo bash

yum install git python3 python3-pip -y

sudo git clone https://github.com/xyou365/AutoRclone && cd AutoRclone && sudo pip3 install -r requirements.txt

2、开启Drive API 并下载 credentials.json

https://developers.google.com/drive/api/v3/quickstart/python

3、将credentials.json保存到AutoRclone目录下面

依赖安装

  • 命令行执行git clone https://github.com/iwestlin/gd-utils && cd gd-utils 克隆并切换到本项目文件夹下
  • 执行 npm install --unsafe-perm=true --allow-root 安装依赖,部分依赖可能需要代理环境才能下载,所以需要上一步的配置

如果在安装过程中发生报错,请切换nodejs版本到v12再试。如果报错信息里有Error: not found: make之类的消息,说明你的命令行环境缺少make命令,可参考这里或直接google搜索Make Command Not Found

如果报错信息里有 better-sqlite3,先执行 npm config set unsafe-perm=true 然后 rm -rf node_module 删掉依赖目录,最后再执行下npm i安装试试。

依赖安装完成后,项目文件夹下会多出个node_modules目录,请不要删除它,接下来进行下一步配置。

个人帐号配置

  • 命令行执行 rclone config file 找到 rclone 的配置文件路径
  • 打开这个配置文件 rclone.conf, 找到 client_idclient_secret 和 refresh_token 这三个变量,将其分别填入本项目下的 config.js 中,需要注意这三个值必须被成对的英文引号包裹,且引号后以英文逗号结尾,也就是需要符合JavaScript的对象语法

如果你没有配置过rclone,可以搜索rclone google drive 教程完成相关配置。

如果你的rclone.conf里没有client_idclient_secret,说明你配置rclone的时候默认用了rclone自己的client_id,连rclone自己都不建议这样做,因为大家共享了它的接口调用限额,在使用高峰期可能会触发限制。

获取自己的clinet_id可以参见这两篇文章:Cloudbox/wiki/Google-Drive-API-Client-ID-and-Client-Secret 和 https://p3terx.com/archives/goindex-google-drive-directory-index.html#toc_2

获取到client_id和client_secret后,再次执行一遍rclone config,创建一个新的remote,在配置过程中一定要填入你新获取的clinet_idclient_secret,就能在rclone.conf里看到新获取的refresh_token了。注意,不能使用之前的refrest_token,因为它对应的是rclone自带的client_id

参数配置好以后,在命令行执行 node check.js,如果命令返回了你的谷歌硬盘根目录的数据,说明配置成功,可以开始使用本工具了。

二、配置config.js文件并添加SA

利用AutoRclone创建SA:点这里

把所有的SA都复制到:/root/gd-utils/sa 这个目录下面。

再用rclone绑定一下你要存放文件的团队盘,不会的点击这里

然后打开/root/.config/rclone/rclone.conf这个文件

找到refresh_token这个字段复制后面的内容:1//…………..,保存起来.

然后打开这个网址https://console.developers.google.com/apis确认好SA的那个账号

新创建一个OAuth 2.0客户端ID,在创建前需要去OAuth同意屏幕创建一下项目,User Type选择外部,应用名称填rclone就行,添加Google API 的范围全选上就行

然后点击保存就行,如果有创建过项目直接点创建OAuth 2.0客户端ID,类型选择桌面应用,创建完成后会弹出客户端 ID和客户端密钥,把这两个保存下来。

最后我们还要看一下刚刚创建OAuth 2.0客户端ID项目的信息中心API是否打开把下面所有的API都打开,没有的打开的需要打开一下。

打开/root/gd-utils/config.js文件,按照下图的内容配置修改好。

特别注意tg_whitelist的名字是没有t.me的只有你的名字。

修改完保存,然后输入下面的命令,命令需要在/root/gd-utils目录下执行

node check.js

执行完命令会返回你个人盘的根目录的文件信息,注意!!!不是团队盘的根目录信息,是个人盘的信息类似下面的,如果返回的是一大长串的东西,最后有一个权限不足的提示,就是你配置文件没配置好。

首先利用宝塔搭建一个站点具体步骤:把域名解析到IP→点击宝塔网站→添加站点→输入你解析的域名→点击提交。

再申请SSL证书,按下图步骤操作。

接着设置网站的反代,填写完成点击提交就行。

Copy_bot          127.0.0.1:23333

然后在宝塔最后放行23333端口,刚放行的时候端口是未占用。

最后子再打开PM2管理工具,

/root/gd-utils/               server.js                bot

按照图片上的内容填就行了,运行了之后23333端口的运行状态会变成正常,说明服务已经正常启动了。

在命令行输入下面的命令,将prlrr.com替换成你的网址

curl 'https://prlrr.com/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg'

如果返回gd-utils 成功启动的消息就说明成功了

最后,在命令行执行(请将yygt.online和ABCDEFG123分别替换成你自己的网址和bot token)

curl -F "url='yygt.online/api/gdurl/tgbot" 'https://api.telegram.org/botABCDEFG123/setWebhook'

这样,就将你的服务器连接上你的 telegram bot 了,试着给bot发送个 /help,如果它回复给你使用说明,那就配置成功了。

再运行下面的代码检查sa对你的团队盘是否有访问权限

./validate-sa.js 你要存放的目录ID

错误解析

1、在执行curl ‘https://yygt.online/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg’时出现502bad gateway

这个错误产生的原因的是连接超时 我们向服务器发送请求于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生报错。你可以尝试服务引号内的网址看能不能访问。最简单的方法就是重启,或者重新搭建,实在不行换服务器。看我教程的我猜测应该都是小白这样最方便。有能力的也可以百度一下解决问题。

2、向机器人发送/help时无反应

你需要查看一下你的config.js文件里面你的tg_token和tg_whitelist是否填写正确别把引号删除了。

示例:tg_whitelist: [‘yiyegantang’]

3、添加了新的用户名或者修改了端口

做出任何的修改都要重启程序,宝塔进入PM2管理器点击重启就行了。

4、用机器人复制文件时一直是未完成,而且没有进度

查看你要复制的文件的文件夹数量,文件夹数量过大的时候回导致内存占用过高被nodejs干掉。

https://gdurl.viegg.com/api/gdrive/count?fid=+你要复制的文件ID

用上面的网站查看你复制的文件个数,如果出现超过20W的文件建议使用SSH命令行复制。

常见问题

下面是一些网友的踩坑心得,如果你配置的时候也不小心掉进坑里,可以进去找找有没有解决办法:

在命令行操作时如果输出 timeout exceed 这样的消息,是正常情况,不会影响最终结果,因为程序对每个请求都有7次重试的机制。 如果timeout的消息比较多,可以考虑降低并行请求数,下文有具体方法。

复制结束后,如果最后输出的消息里有 未读取完毕的目录ID,只需要在命令行执行上次同样的拷贝命令,选continue即可继续。

如果你成功复制完以后,统计新的文件夹链接发现文件数比源文件夹少,说明Google正在更新数据库,请给它一点时间。。一般等半小时再统计数据会比较完整。

如果你使用tg操作时,发送拷贝命令以后,/task 进度始终未开始(在复制文件数超多的文件夹时常会发生),是正常现象。 这是因为程序正在获取源文件夹的所有文件信息。它的运行机制严格按照以下顺序:

1、获取源文件夹所有文件信息
2、根据源文件夹的目录结构,在目标文件夹创建目录
3、所有目录创建完成后,开始复制文件

如果源文件夹的文件数非常多(一百万以上),请一定在命令行进行操作,因为程序运行的时候会把文件信息保存在内存中,文件数太多的话容易内存占用太多被nodejs干掉。可以像这样执行命令:

 node --max-old-space-size=4096 count folder-id -S

这样进程就能最大占用4G内存了。

更新日志

[2020-07-02]

  • 机器人 /task 命令返回的进度信息每 10 秒更新一次
  • ./dedupe 改为将重复文件移动到回收站(需要内容管理者及以上权限)
  • 给 sqlite 打开 WAL 模式提升效率
  • 提前5分钟将access_token判定为过期,减少未授权错误

[2020-07-01](建议所有使用tg机器人的用户更新)

  • 给机器人的 /count 和 /copy 命令添加了 -u 参数的支持,命令最后加上 -u 表示强制从线上获取源文件夹信息
  • 允许继续状态为已完成的任务(适合搭配 -u 参数,增量复制刚分享出来的未更新完毕的文件夹)
  • 支持识别转发的 @gdurl 频道消息中的google drive链接
  • 机器人回复任务完成消息时,携带 成功拷贝目录(文件)数/总目录(文件)数
  • 机器人回复统计消息时,携带文件夹名称
  • 机器人回复/task消息时,携带源文件夹名称链接和新文件夹链接
  • 当统计表格太长导致机器人发送消息失败时,发送统计概要
  • 增加了 专家设置 一节,保障HTTPS接口安全

[2020-06-30]

  • 命令行操作时,不换行输出进度信息,同时将进度信息输出间隔调整为1秒
  • 隐藏 timeout exceed 报错信息

重要更新(2020-06-29)

如果你遇到了以下几种问题,请务必阅读此节:

  • 任务异常中断
  • 命令行日志无限循环输出但进度不变
  • 复制完发现丢文件

有不少网友遇到这些问题,但是作者一直无法复现,直到有tg网友发了张运行日志截图:  报错日志的意思是找不到对应的目录ID,这种情况会发生在SA没有对应目录的阅读权限的时候。 当进行server side copy时,需要向Google的服务器提交要复制的文件ID,和复制的位置,也就是新创建的目录ID,由于在请求时是随机选取的SA,所以当选中没有权限的SA时,这次拷贝请求没有对应目录的权限,就会发生图中的错误。

所以,上述这些问题的源头是,sa目录下,混杂了没有权限的json文件!

以下是解决办法:

  • 在项目目录下,执行 git pull 拉取最新代码
  • 执行 ./validate-sa.js -h 查看使用说明
  • 选择一个你的sa拥有阅读权限的目录ID,执行 ./validate-sa.js 你的目录ID

程序会读取sa目录下所有json文件,依次检查它们是否拥有对 你的目录ID 的阅读权限,如果最后发现了无效的SA,程序会提供选项允许用户将无效的sa json移动到特定目录。

将无效sa文件移动以后,如果你使用了pm2启动,需要 pm2 reload server 重启下进程。

操作示例: https://drive.google.com/drive/folders/1iiTAzWF_v9fo_IxrrMYiRGQ7QuPrnxHf

一键安装脚本(感谢 脚本制作者 @vitaminx)

如果你没有Linux操作经验或者是新开的vps,可尝试使用此脚本

  • 首先准备好以下两个条件:
    • 在Telegram上注册好机器人并取得并记录下该机器人TOKEN
    • 一个域名在cloudflare解析到该机器人所在VPS的IP
  • 准备好以上两个条件后,复制以下内容粘贴到VPS命令行窗口回车即可
bash -c "$(curl -fsSL https://raw.githubusercontent.com/iwestlin/gd-utils/master/gdutilsinstall.sh)"
  • 安装过程中需要输入一下四个参数:
    • 机器人TOKEN:这个在Telegram里面找“@BotFather”注册即可获得
    • 自己的的Telegram username:在Telegram里面直接查看
    • web服务名:这是个是很重要的识别标志,请设置为你的域名(格式:abc.34513.com)
    • 域名网址全称:你在cloudflare上解析到VPS的域名网址全称(格式:https://abc.34513.com)
  • 测试可用完美安装系统:
    • Centos 7/8
    • debian 9/10
    • ubuntu 16.04/18.04/19.10/20.04

发表评论

CAPTCHAis initialing...