项目的地址: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_id
,client_secret
和refresh_token
这三个变量,将其分别填入本项目下的config.js
中,需要注意这三个值必须被成对的英文引号包裹,且引号后以英文逗号结尾,也就是需要符合JavaScript的对象语法
如果你没有配置过rclone,可以搜索rclone google drive
教程
完成相关配置。
如果你的rclone.conf
里没有client_id
和client_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_id和****client_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
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付