使用SA突破GD上传限制

发布于 2020-03-06  541 次阅读


只针对本地文件上传GD/TD,GD/TD内互传可能不适用

1.创建Service Account并添加到teamdrive(现在也叫共享云端硬盘)中。(至于为什么要用SA,当然是因为创建真实用户账户成本过高,而且不能批量添加呀。)
2.使用python脚本运行rclone,以多账户协力的形式突破单账号750G上传限制,并在对应账户上传超限(750G/帐号)时进行切换。

此文的目的在于上传文件到共享云端硬盘,仅在部分步骤中利用了folderclone相关脚本来批量创建Service Account并添加到teamdrive中。

请注意:本教程第一、二部分教程使用OAuth2客户端形式完成,与 手动创建辅助账户不同,请视需要,选择本教程或参考该他人教程,完成Service Account的创建以及Shared Drive用户添加,并得到SA的JSON文件。如果已经完成了上述步骤,请直接跳转本教程第三部分Rclone设置。

请根据个人需求创建项目数量,已知限制如下
1. 一个真实帐号最多能创建12(或25)个项目,每个项目最多100个SA账户,每个账户(无论是真实还是SA)每日最多上传750G
2. 个共享云端硬盘最多添加600个账户

一、创建Google Cloud项目

一、在 Google云端控制台 上新建项目,填入项目名称并完成创建

二、点击【OAuth同意屏幕】,填入应用名称并点击最下面的保存

三、保存后会自动跳转到【凭据】页面,点击创建【OAuth客户端ID】

应用类型选【其他】

不用在意弹出的客户端ID和密钥窗口,直接点击下载JSON格式的认证文件,并重命名为credentials.json备用。

二、使用Folderclone中脚本添加共享云端硬盘成员

如果使用科学方式上网,请保证CMD走代理!!!!!
请使用有浏览器环境(非Remote或者headless)的环境进行配置

一、 安装Python3,clone项目文件,使用pip安装依赖

git clone https://github.com/Rhilip/folderrclone.git
cd folderrclone
pip3 install -r requirements.txt

二、将前面JSON格式的OAuth凭据文件credentials.json复制到项目文件夹目录下,并运行multifactory.py文件

cp credentials.json .
python multifactory.py --quick-setup 1

其中,--quick-setup后面跟着的数字为想要创建的Project数量,并在每个project中创建满100个Service Account。(当该数字大于能有的最大项目数(12)时,会为当前所有project添加SA帐号。)

会弹出Google登录页面,登录刚才创建项目帐号,由于我们是随意创建的OAuth应用会提示应用未经过认证,不用管它,点开高级,并转至该应用。

然后在新的页面中允许应用申请的3个权限,并确认 。

然后回到Python窗口,其中可能出现如下提示,打开画线部分链接,并启用【Service Useage API】

启用后稍等几秒回到Python窗口,等待应用跑完(消耗时间视创建Service Account数量)。

multifactory.py 还支持以下调用参数,如果不知道具体用法则不用附加。
其中我觉得还有用的有 --new-only 方法,这样可以保证创建的Service Account都在新的项目中,而不占用老项目的名额空间,因为默认情况下multifactory脚本会首先尝试在已经存在的项目中创建Service Account。

跑完后在项目目录会自动生成 accounts目录,其中一堆JSON文件就是我们需要的service_account_credentials文件,留存备用

三、然后使用folderclone脚本将生成的Service Account用户添加到该共享云端硬盘中,folderclone会自动设置Service Account权限为内容管理员。

查看【共享云端硬盘】的ID,请注意(即前面创建并认证登录的用户)应该是该共享云端硬盘的管理员角色

然后运行下面命令,其中SDFolderID需要改成前面查看的对应【共享云端硬盘】的ID

python masshare.py -d SDFolderID

结果如下,可以看到前面生成的IAM账户均被添加到该【共享云端硬盘】中了

三、设定rclone自动备份及切换

通常情况下(即本人是这么使用的),我们用crontab定时跑一个rclone move/copy/sync方法,这样会存在几个问题,即:

  • 如果crontab时间过密,前一个rclone尚未跑完就拉起了另一个rclone进程(特别是750G后长时间等待),导致产生了大量rclone占用系统io资源
  • rclone在消耗完某一账户的750G后不能自动更换,导致长时间等待。
  • 使用--max-transfer 750G(或更低的配额)做限制。在触碰到限制时,rclone会直接退出而不是平滑停止,即不考虑将正在传输的文件传完。

本处尽可能尝试解决这些问题。

一、修改设置rclone配置文件

修改rclone配置文件(一般位于$HOME/.config/rclone/rclone.conf),添加如下字段 。

[GDrive]
type = drive
scope = drive
service_account_file = 
team_drive = SDFolderID

其中SDFolderID需要改成前面查看的对应【共享云端硬盘】的ID

注意:
也可以使用rclone config的形式交互添加,并在rclone提示如下信息时,任意填入一个上面步骤在account目录生成的JSON文件。

Service Account Credentials JSON file path
Leave blank normally.
Needed only if you want use SA instead of interactive login.
Enter a string value. Press Enter for the default ("").
service_account_file> C:\Repositories\folderclone\accounts\xxxxxxxxxxxxxxxxxxx.json
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
Configure this as a team drive?
y) Yes
n) No
y/n> y
Fetching team drive list...
Choose a number from below, or type in your own value
 1 / xxxxxxx@xxxxxx
   \ "xxxxxxxxxxxxxxxxxx"
Enter a Team Drive ID> 1

使用rclone自带的client id和client secert在大流量情况下可能出现403 Rate Limit等问题,可以参照下面教程,创建自己的client id和client secert信息,并填入配置项中。

首先获取谷歌API凭据,获取方法在之前很多文章都提过,这里就直接复制粘贴了,先启用Google Drive API,启用地址:点击进入

再创建一个OAuth client ID,创建地址:点击进入。应用类型选择其他(Other),名称自己填,这里博主填的Rclone

然后会获得自己的客户端ID和客户端密钥,再复制下来。

填入自己的client id和client secert信息后配置项结构如下(修改字段ClientID,ClientSecert,SDFolderID

[GDrive]
client_id = ClientID
client_secert = ClientSecert
type = drive
scope = drive
service_account_file = 
team_drive = SDFolderID

二、配置autorclone.py参数

autorclone.py文件是本人在 @superstaraug 等人实践上修改的rclone多帐号切换脚本。
如果没有使用本教程前面的步骤,可能需要安装python依赖库,方法如下:

pip3 install psutil filelock

使用前需要修改部分配置信息(该部分可能随版本迭代有些不同,请根据使用的文件配置说明修改)

vi autorclone.py

依次设置如下配置项,请根据注释说明修改
(如果是在linux上跑的脚本,一般不需要对配置项进行较多的更改,修改sa_json_foldercmd_rclone基本就可以了)
这里只是配置项信息,完整python文件请在作者的Github中下载

# ------------配置项开始------------------

# Account目录
sa_json_folder = r'/root/folderrclone/accounts'  # 绝对目录,最后没有 '/',路径中不要有空格

# Rclone运行命令
# 1. 填你正在用/想要用的,这里写的是move,也可以是copy/sync ......
# 2. 建议加上 `--rc` ,不加也没事,后面脚本会自动加上的
# 3. 因为不起screen,如果你希望关注rclone运行的状态,请一定要用 `--log-file` 将rclone输出重定向到文件
cmd_rclone = 'rclone move /home/tomove GDrive:/tmp --drive-server-side-across-configs -v --log-file /tmp/rclone.log'

# 检查rclone间隔 (s)
check_after_start = 60  # 在拉起rclone进程后,休息xxs后才开始检查rclone状态,防止 rclone rc core/stats 报错退出
check_interval = 10  # 主进程每次进行rclone rc core/stats检查的间隔

# rclone帐号更换监测条件
switch_sa_level = 1  # 需要满足的规则条数,数字越大切换条件越严格,一定小于下面True(即启用)的数量,即 1 - 4(max)
switch_sa_rules = {
    'up_than_750': False,  # 当前帐号已经传过750G
    'error_user_rate_limit': False,  # Rclone 直接提示rate limit错误
    'zero_transferred_between_check_interval': True,  # 100次检查间隔期间rclone传输的量为0
    'all_transfers_in_zero': False,  # 当前所有transfers传输size均为0
}

# rclone帐号切换方法 (runtime or config)
# runtime 是修改启动rclone时附加的 `--drive-service-account-file` 参数
# config  是修改rclone的配置文件 `$HOME/.config/rclone/rclone.conf` ,此时你需要指定后面的rclone配置参数参数
switch_sa_way = 'runtime'

# rclone配置参数 (当且仅当 switch_sa_way 为 `config` 时使用,且需要修改)
rclone_config_path = '/root/.config/rclone/rclone.conf'  # Rclone 配置文件位置
rclone_dest_name = 'GDrive'  # Rclone目的地名称(与cmd_rclone中对应相同,并保证SA均已添加)

# 本脚本临时文件
instance_lock_path = r'/tmp/autorclone.lock'
instance_config_path = r'/tmp/autorclone.conf'

# 本脚本运行日志
script_log_file = r'/tmp/autorclone.log'
logging_datefmt = "%m/%d/%Y %I:%M:%S %p"
logging_format = "%(asctime)s - %(levelname)s - %(threadName)s - %(funcName)s - %(message)s"

# ------------配置项结束------------------

脚本设置了多种规则来检查当前Rclone脚本是否超过750G限制。只有当所有启用的监测规则均命中时,脚本才会切换到下一个帐号。(所以不要过多的启用监测规则,以防止应切换时未能正常切换)

配置完后就可以测试运行了,相关的运行结果会直接数出在stdout和配置的日志文件中。
除了在需要时在screen中手动调用之外,也可直接加入crontab中定时运行,脚本采用单例模式,所以不会导致过多rclone进程被创建。

0 */1 * * * /usr/bin/python3 /path/to/autorclone.py

其他

remove.py提供了快速从Shared Drive中删除SA的方式,如果已经不需要SA了,可以使用该文件进行删除。对应使用方法见下,其中ROLE的取值可为 ['owner', 'organizer', 'fileorganizer', 'writer', 'reader', 'commenter']中任一一个。使用脚本批量添加的ROLE值为 fileorganizer (即content manager) ,但更建议使用--prefix (前缀) 和--suffix (后缀) 匹配SA邮箱的形式来删除,防止误伤。

PS C:\Repositories\folderclone> python .\remove.py --help
usage: remove.py [-h] [--token TOKEN] [--credentials CREDENTIALS]
                 (--prefix PREFIX | --suffix SUFFIX | --role ROLE) --drive-id
                 DRIVE_ID

A tool to remove users from a Shared Drive.

optional arguments:
  -h, --help            show this help message and exit
  --token TOKEN         Specify the pickle token file path.
  --credentials CREDENTIALS
                        Specify the credentials file path.
  --prefix PREFIX       Remove users that match a prefix.
  --suffix SUFFIX       Remove users that match a suffix.
  --role ROLE           Remove users based on permission roles.

required arguments:
  --drive-id DRIVE_ID, -d DRIVE_ID
                        The ID of the Shared Drive.