• 谷歌 gd-utils 百宝箱详细教程

    本文更新于2020年9月19日,由于近期 DebianUbuntu 系统出现某些依赖无法安装导致部署失败,所以推荐使用 CentOS 系统

    注意:此工具很大的方便了我们的生活,请不要滥用

    Google Drive 百宝箱是 iwestlin 的一个项目,可以进行自动化转存谷歌云端硬盘的文件

    具体使用场景是什么?

    例如有的时候别人在谷歌云盘分享了一个资源,这个资源可以是文件,视频,压缩包,这个资源我想把它保存到我的谷歌网盘里,按照传统的思路,我们首先需要将别人网盘里的内容先下载下来,然后在上传到自己网盘,这是最传统的方法,也是最慢的。现在我们有了新的方法,那就是 gd-utils 百宝箱,在 VPS 上搭建一个百宝箱,配置好一个电报机器人,这样就可以实现别人网盘分享的链接,我们把链接发送给机器人,点一下复制,机器人会帮我们把别人网盘的内容存储到我们的网盘,非常便捷,因为每个谷歌账号每天只有 750G 的转存额度,所以还需要配置一些 SA 账号来提高额度

    搭建之前

    一个没有限额项目的谷歌账号,而且这个谷歌账号有一个团队云盘

    img

    谷歌搜索 google api ,然后登陆自己搭建的谷歌账号,找到下图所示页面,先点击左上角选择项目,如果已经有项目就点击所在项目,然后点击全部,查看已有项目;点击新建项目,查看项目额度

    img

    img

    还有项目额度的账号才可以使用,如果额度不够,需要自己申请,申请页面会在里新建项目时提示出现

    为什么需要一个没有限额的账号?

    因为我们搭建百宝箱需要用到 google api 项目,谷歌 api 项目一般默认只有 10 个,创建项目后即占用一个额度;而如果项目不够,就不能创建项目;只能删除原先的项目,但是删除项目需要 30 天才能删除,处于删除状态的还未删除的项目也占用你的项目额度;所以项目不能所以乱建,而如果额度不够,只能向谷歌申请,但是申请项目后,我发现在搭建过程中,可能会存在不能创建项目的情况!

    一台纯净系统的服务器

    一台纯净系统的服务器,推荐 CentOS 7 系统,使用域名给这个服务器的 IP 做一下 A 解析;据说使用谷歌云虚拟机实例搭建,转存网盘内容不使用谷歌云的流量;本文以 CentOS 7 64 位系统做演示

    img

    向电报申请机器人

    打开电报,搜索机器人 **@BotFather** ,并点击下方开始进行对话,寻找机器人的时候,一定要看清机器人的用户名

    点击图中所示点击创建机器人

    img

    img

    记录机器人的 token 值,在后面的步骤要用到

    打开 这个网站登陆你需要搭建的谷歌账号,然后按照图示操作点击创建

    img

    到了这里下载这个 credentials.json 的文件保存到本地,然后点击 done ,结束创建

    img

    谷歌搜索 google API ,打开后登陆自己的账号,按图示操作,点击左上角的项目,点击全部,最后点击我们刚才创建的新项目 Quickstart 进入到我们新建的项目

    img

    查看这个项目下开放了哪些 API,正常情况下需要创建开放 5个API ,如果你的项目没有或缺少某些 API ,请按照下面的 API 列表补齐,在上方搜索API和服务的地方搜索启用

    img

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Google Drive API

    Identity and Access Management (IAM) API

    Service Usage API

    Cloud Resource Manager API

    IAM Service Account Credentials API

    img

    开始搭建

    使用 SSH 连接到 VPS ,配置 VPS 环境

    CentOS

    1
    2
    3
    4
    5
    yum -y update

    yum install epel-release -y

    yum install wget curl python3 python3-pip git screen unzip sudo fuse fuse-devel -y

    Debian、Ubuntu

    1
    2
    3
    apt-get update && apt-get upgrade -y

    apt-get install wget curl python3 python3-pip git unzip screen sudo fuse -y

    安装完成后,试试输入 python 或者 python3 看看有没有反应,如果有说明 python 配置正确,请继续下一步;如果没有,请自行配置 python 环境


    安装 Node.js v12.x


    CentOS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    curl -sL https://rpm.nodesource.com/setup_lts.x | bash -

    yum install -y nodejs

    yum install gcc-c++ make

    curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo

    yum install yarn

    Debian

    1
    2
    3
    curl -sL https://deb.nodesource.com/setup_12.x | bash -

    apt-get install -y nodejs

    Ubuntu

    1
    2
    3
    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

    apt-get install -y nodejs

    安装好 Node.js 之后,检验一下,输入 node -v 代码,如果有输出且输出的是 node 的版本号,则表示 node 配置正确

    1
    2
    3
    node -v

    v12.18.3

    安装 Node 参考:https://github.com/nodesource/distributions/blob/master/README.md#debinstall

    安装 rclone 和 AutoRclone

    CentOS

    1
    2
    3
    cd && curl https://rclone.org/install.sh | sudo bash

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

    Debian、Ubuntu

    1
    2
    3
    sudo apt-get install screen git && curl https://rclone.org/install.sh | sudo bash

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

    进入到 AutoRclone 目录,将我们在谷歌网页创建项目时下载的 **credentials.json** 文件上传到 AutoRclone 文件夹里面

    img

    创建项目,在项目里创建服务账号 SA

    为什么要创建SA?

    单个谷歌账号在转存谷歌云盘内容时每天有 750G 的限制,解决这一限制要么自己有很多的谷歌账号要么就创建服务账号;拥有很多谷歌账号这是不现实的,所以我们需要创建服务账号,然后把这些服务账号添加到云盘,让他们成为云盘的管理员,在利用 AutoRclone 工具的自动切换功能实现一个账号限额后自动切换到下一个账号,这样就突破了每天750G的限制,可以转存大文件

    服务账号就是 service accounts,简称 SA,每个谷歌项目最多可以创建 100 个 SA


    创建项目,在项目里创建 SA,这里又分为三种情况


    如果你之前没创建过项目

    1
    python3 gen_sa_accounts.py --quick-setup 1

    这个代码的意思是创建 1 个新项目、每个项目里面创建100个 sa 、开启相关的服务、将 100 个 sa 的授权文件下载到 /root/AutoRclone/accounts 文件夹内

    已经存在项目,需要创建新的项目新的 sa

    1
    python3 gen_sa_accounts.py --quick-setup 1 --new-only

    创建 1 个新项目、每个项目创建 100 个 sa,开启相关的服务、将 100 个 sa 的授权文件下载到 /root/AutoRclone/accounts 文件夹内

    提示:把代码里面的 1 改为 2 或 3;则会分别创建 1,2,3个项目;100,200,300个服务账号,以此类推

    在已有的项目上来创建 sa

    1
    python3 gen_sa_accounts.py --quick-setup -1

    注意:这会创建新的 sa 并替换掉账户里已有的全部项目的 sa

    注意:

    方法一,因为我们之前在创建 credentials.json 文件的时候,我们其实就已经创建了一个叫 Quickstart 的项目,所以不存在账号里没有项目的情况

    方法三,在已有项目中创建新的 SA 替换掉原先的 SA ,但是我实践发现这样创建的 SA 存在不能自动下载到 /root/AutoRclone/accounts 文件夹的情况;并且这种方法会替换掉账户里所有项目的 SA

    建议使用方法二,创建新的项目新的 sa ,但是这种方法如果你的账号项目超出 10 个,并且你重新申请项目额度后也会出现不能创建新项目的情况,这跟程序有关;查看自己有多少项目就是进入到 google api 点击全部项目进行查看

    这里以第二种方法为例,输入代码开始创建

    1
    2
    3
    cd && cd /root/AutoRclone

    python3 gen_sa_accounts.py --quick-setup 1 --new-only

    复制网址粘贴到浏览器打开授权,将网页生成的代码粘贴到 SSH 中回车

    img

    img

    img

    出现这个页面,表示创建成功,进入 /root/AutoRclone/accounts 文件夹会发现这里面有 100 个服务账号,在回到 google api ,点击项目、点击全部,会发现账户里多了一个项目,这个项目就是我们刚才新建立的,进入这个项目,这时可以看到很多账号里面有 100 个服务账号

    img

    img

    img

    创建不成功,请自己查看提示,在结合本文提示进行寻找原因

    安装 gd-utils

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

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

    运行中没有报错且 /root/gd-utils 文件内有内容,则为安装成功

    img

    如果遇到这种情况,按照图示运行代码 npm audit fix 即可

    img

    重点

    /root/AutoRclone/accounts 文件夹下的 100sa账号,上传到 /root/gd-utils 文件的 sa 目录下

    img

    给 sa 添加访问云盘的权限


    **方法一:创建一个 Google Groups 群组,然后将这些 sa 添加为群组 *成员*,最后将群组的电子邮箱地址添加为云盘的成员,权限是内容管理员


    打开谷歌网上论坛,登陆自己账号切换到新版网上论坛,点击左上角的 创建群组 ,然后输入自己群组名称和电子邮件地址,创建群组,记下自己 Google Groups 群组的电子邮箱地址

    建议

    不要把自己的谷歌邮箱添加到群组成员里,因为谷歌群组每 24 小时只能添加 100 个成员,添加自己邮箱会占用一个额度导致 100 个 sa 只能添加 99 个,在下面检测 sa 的可用性时,会出现一个 sa 为无效的情况

    img

    本地新建一个文件夹,将 /root/AutoRclone/accounts 文件内所有的服务账号下载到本地新建的文件夹内,你可以使用 WinSCP 或者 FinalShel ;注意下载不要下载 .keep 这个文件

    点击下方本地下载下载 谷歌SA邮箱提取.exe ,这是批量提取谷歌服务账号的工具,方便我们把账号添加到 Google Groups;将下载的工具和下载的sa账号放在同一个文件夹内

    运行谷歌SA邮箱提取.exe,然后这个工具会生成一个 user.txt 文件夹,打开这个文件夹将提取出来的账号分成 10

    打开网上论坛,点击左边我的群组,点开我的群组,点击成员,添加成员,将分好的服务账号添加到群组成员里面,需要 10 次才能添加完成;添加完成后,论坛里应该有 101 位成员

    img

    1
    注意,谷歌网上论坛每次只能添加10个,每24小时,只能添加100个

    本地下载

    然后打开谷歌云盘,点击自己的共享盘,点击管理成员,添加用户和群组,将Google Groups 的群组电子邮箱地址添加为云盘成员,成员权限是内容管理员

    img

    img

    这个时候,云盘应该是 1个群组.1人

    img

    检验这些 sa 是否有权限

    为什么要检验服务账号 SA 的权限

    通过上面的方法给 sa 添加访问云盘的权限后,如果不检测sa,不把无效 SA 剔除时,有时则会遇到任务异常中断、命令行日志无限循环输出但进度不变、复制完发现丢文件等情况;在进行复制时,需要向 Google 的服务器提交要复制的文件 ID 和复制的位置,也就是新创建的目录 ID ,由于在请求时是随机选取的 sa ,所以当选中没有权限的 sa 时,这次拷贝请求没有对应目录的权限,就会发生这些错误,所以需要检测

    执行代码检测

    1
    2
    3
    cd && cd /root/gd-utils

    ./validate-sa.js 你的谷歌云盘ID

    img

    谷歌云盘 ID 要选择你添加sa所在的云盘 ID,程序会读取 sa 目录下所有 json 文件,依次检查它们是否拥有对你的目录云盘 ID 的阅读权限;如果最后发现了无效的 sa ,程序会提供选项让用户选择,出现下面的提示则说明 sa 都有权限

    img


    方法二:直接将这些 sa 添加为谷歌云盘成员


    1
    2
    3
    cd && cd /root/AutoRclone

    python3 add_to_team_drive.py -d 0AJuS7AAmub3BUk9PVA 0AJuS7AAmub3BUk9PVA 为自己云盘ID

    img

    此时我们打开谷歌云盘,找到这个页面,我一下云盘里面是不是多了我们刚才添加的 SA

    img

    检验这些 sa 是否有权限,检验方法跟上面的检验方法是一样的

    配置 rclone 挂载团队盘

    1
    2
    3
    4
    5
    6
    7
    8
    rclone config

    No remotes found - make a new one
    n) New remote
    s) Set configuration password
    q) Quit config
    n/s/q> n
    name> gd

    给你的团队盘起一个名字,英文字符,我这里以 gd 为例,然后下一步会让你选择云盘种类,选择谷歌云盘的代号回车,一般是 13 左右;接着输入 client_idclient_secret,这分别是 apiID 和密钥

    打开 google api ,左上角选择最开始创建的项目,一般是 Quickstart ,按图示操作

    img

    点开后,右边就是我们的 client_idclient_secret

    img

    根据提示,输入到 SSH 中,下一步选择 1

    img

    root_folder_idservice_account_file 这两个可以直接回车,下面两个选择都选 N,之后会生成一个链接粘贴到浏览器中,登陆自己的谷歌账号授权,将生成的 代码 复制到 SSH 中回车,详细操作请看图

    这里有一点需要注意,配置到这一步时

    1
    2
    3
    4
    Configure this as a team drive?
    y) Yes
    n) No
    y/n> n

    系统询问你是要挂载团队云盘还是挂载你个人的云盘,选 y 就是挂载团队云盘(前提你账户里面有团队云盘),选 n 就是挂载个人云盘,但是不管是选 y 还是选 n ,我们在下面的步骤中运行 node check.js 代码检查服务器的联通情况时,返回的都是个人云盘内容

    img

    img

    然后将以下信息记录下来

    1
    2
    3
    4
    5
    6
    7
    [gd]
    type = drive
    client_id = 959724asinf35vl.apps.googleusercontent.com
    client_secret = V7Rz-b6iZ7bUoXiF
    scope = drive
    token = {"access_token":"ya29.a0AfH6SMDy-hDacbkL8w3DaT_dhrZeVjGEtfb8KmZ9Xg4S7ECLNKRJ_HYU0ndWngegJR7PcgktASdPaDsupEmqweDBoZXCtRmzIclB4EMxS5KAB99yHny_IeusrcaVVAgQG2v2R59CdWfnw","token_type":"Bearer","refresh_token":"1//0dQ_xB5KS9KejCgYIARAAGA0SNwF-L9IruF5Fg4pB8vwF2UOFeIrq1AiBEs","expiry":"2020-08-22T03:51:25.629822745-07:00"}
    team_drive = 0AL5v92JLPVA

    其中 client_idclient_secret 是客户端的 ID 和密钥

    tokenrclone 连接云盘生成的值,这个值我们只取 refresh_toke 这一部分,即 1// 后面的内容,类似于这样

    1
    2
    1//0dQ_xB5KS9KejCgYIARAAGA0SNwF-L9IruF5Fg4pB8vwF2UOFeIrq1AiBEs
    team_drive` 是团队盘的 `ID

    配置 config.js

    编辑 /root/gd-utils/config.js 文件,将刚才记录的 client_idclient_secretrefresh_tokenTARGETtg_token 、控制机器人的 tg 用户名填入到对应的位置

    也可以运行命令 rclone config file 找到 rcone 的配置文件,在配置文件中找到信息

    img

    填写完成后保存,运行代码检查有没有连接上云盘

    1
    2
    3
    cd && cd /root/gd-utils

    node check.js

    如果你的云盘内没有文件输出的是 [] ,有文件输出文件信息;如果你的云盘有文件还是输出 [] 或者有其它报错,则没有连接上云盘,需检查配置;建议个人云盘和团队云盘都放入内容测试

    使用宝塔安装 PM2 和 Nginx

    宝塔安装完成后,点击宝塔左边软件商店,搜索 PM2Nginx 这两个软件安装,安装完成后,这个时候建议重启一下服务器,重启之后运行代码;而且每次重启后都要运行一次代码

    1
    2
    3
    cd && cd /root/gd-utils

    pm2 start server.js --node-args="--max-old-space-size=1024"

    然后进入宝塔在已安装的软件中找到 PM2 管理器,查看一下是否有任务运行;如果有任务运行直接添加站点,如果没有则手动添加任务,手动添加方法如下;最后记住一定要开放 23333 端口

    img

    手动添加 PM2 任务

    项目所在根目录选择 gd-utils 所在路径,启动文件名称为 server.js ,项目名称随意,根据图示填写

    img

    然后点击宝塔安全,放行23333端口,注意放行 23333 端口后端口是否是正常状态,如果不是,则说明上一步配置的 server.js 运行失败;如果厂商自带的有防火墙或者自己服务器本地设置了防火墙,请自行排查 23333 端口是否开放

    img

    在宝塔里添加站点,域名是解析到服务器的域名;添加成功后,给网站申请 SSL 证书,开启强制 HTTPS

    img

    img

    打开自己的网站,如果出现下面的页面,说明网站设置正确

    img

    设置反向代理

    img

    再次打开网站,打开网站后如果网页只在左上角显示 not found 字样时,说明反代配置成功

    回到SSH,执行下面代码以命令行的形式检查网站是否部署成功;代码一定要检查清楚,网址不能多 / ,字符不能少,请严格参考示例

    1
    2
    3
    4
    5
    6
    cd && cd /root/gd-utils
    curl 'YOUR_WEBSITE_URL/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg'
    示例
    curl 'https://bot.54215.tk/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg'

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

    在命令行执行(请将 YOUR_WEBSITEYOUR_BOT_TOKEN 分别替换成你自己的网址和 bot token),将你的服务器连接上你的 telegram bot

    1
    2
    3
    curl -F "url=YOUR_WEBSITE/api/gdurl/tgbot" 'https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook'
    示例
    curl -F "url=https://bot.54215.tk/api/gdurl/tgbot" 'https://api.telegram.org/bot1240808718:AAHupIg5gpMrMiDmGSh5b5-nlqi5uRvXQTw/setWebhook'

    如果返回 {"ok":true,"result":true,"description":"Webhook was set"} ,则说明你的服务器连接上你的 telegram bot 了,给自己的电报机器人发送 /help,如果它回复给你 使用帮助,那就配置成功了

    1
    注意:给机器人发送消息时,一般立刻就会回复信息,如果没有回复信息,可能会有延迟请稍等几分钟,或者重启一下服务器在试,如果还不行,请检查配置

    img

    这个时候,我们向机器人发送一条谷歌云盘的分享链接,机器人会识别这个链接,提示我们选择动作,点击复制它会立刻开始复制到我们设置的云盘里

    img

    当机器人提示复制成功后,我们打开我们的谷歌云盘,发现我们的云盘里已经有了一个同名的文件夹

    img

    参考:

    https://github.com/iwestlin/gd-utils

    https://github.com/iwestlin/gd-utils/blob/master/changelog.md

    https://kkdfxz.gitbook.io/fx/jiao-cheng-zhong-xin/drive750g

    https://blog.jialezi.net/?post=153

    https://pastebin.com/h89ZkD6t

    https://www.youtube.com/watch?v=EnNgRLQAaGU&t=17s

    https://www.youtube.com/watch?v=EJMZCnGIEVY&t=1548s