Giter VIP home page Giter VIP logo

gd-utils's Introduction

Google Drive 百宝箱

与其他工具的对比

目录

demo

https://drive.google.com/drive/folders/124pjM5LggSuwI1n40bcD5tQ13wS0M6wg

English Version (thanks to @roshanconnor123)

无需域名和nginx版

此版本无需域名和web服务即可使用tg机器人,大大简化了配置过程,感谢贡献者 @dissipator

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

colab脚本(省去本地安装步骤,直接网页可用,感谢贡献者@orange2008

https://colab.research.google.com/drive/1i1W9nAzgiDtfA_rmTBcpMpwxVUhwgLsq

打开上面链接后,保存到自己的云端硬盘(请一定要保存,因为上面的共享链接操作记录所有人可见)

colab使用录屏:https://drive.google.com/drive/folders/19T37ARH7M1h67JGYanKp9LvORjJLEp_x

这里还有另一位网友@iErics制作的colab脚本,界面更加规整,功能也更完整些(比如可以选择是否继续任务等),使用方法大同小异: https://colab.research.google.com/github/iErics/gd-utils/blob/master/Colab_gd_utils.ipynb

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

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

请访问 https://github.com/vitaminx/gd-utils 获取安装方法

繁体中文版(感谢贡献者@liaojack8

https://github.com/liaojack8/gd-utils-cht

目前项目处于起始阶段,尚不支持 i18n(多语言) ,所以上面繁体版是hard code的fork,如果你有兴趣让本项目增加多语言支持,欢迎PR。

Docker 版(感谢贡献者@gdtool)

https://github.com/gdtool/gd-utils-docker

常见问题

如果你遇到任务完成时拷贝成功的文件少于统计的文件数,请务必点击查看

在命令行操作时有时会输出Google内部报错信息,这是正常情况,不会影响最终结果,因为程序对每个请求都有7次重试的机制。 如果经常出现404 file not found的错误,说明是sa的权限有问题,请点击上面的链接查看解决办法。

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

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

如果你使用tg机器人拷贝文件数超多的目录时,发送拷贝命令以后,任务进度很久未开始,这是因为程序正在获取源文件夹的所有文件信息。

转存的运行机制严格按照以下顺序

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

如果源文件夹的文件数非常多(数十万),在命令行操作时需要添加额外参数:(因为程序运行的时候会把文件信息保存在内存中,文件数太多的话容易内存占用太多被nodejs干掉)

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

这样进程就能最大占用 1G 内存了,我最多测试过200万+文件数的任务,1G 内存足以完成。

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

搭建过程

机器人搭建过程录屏:https://drive.google.com/drive/folders/1Lu7Cwh9lIJkfqYDIaJrFpzi8Lgdxr4zT

需要注意的地方:

  • 视频中省略了一个比较重要的步骤就是从本地上传service account授权文件到 sa 目录下,tg机器人的所有操作默认都是通过sa授权的,所以读者请不要忘了
  • 视频中nginx的配置里,server_name就是你的二级域名,需要和cloudflare的设置一样的(mybbbottt),我分开录的视频所以没做到一致。
  • 还有省略的步骤就是注册域名和把域名托管到cloudflare了,这一步网上太多资料了,甚至也有免费注册(一年)域名的地方( https://www.freenom.com/ ),具体教程请自行搜索

功能简介

本工具目前支持以下功能:

  • 统计任意(您拥有相关权限的,下同,不再赘述)目录的文件信息,且支持以各种形式(html, tree, table, json)导出。 支持中断恢复,且统计过的目录(包括其所有递归子目录)信息会记录在本地数据库文件中(gdurl.sqlite) 请在本项目目录下命令行输入 ./count -h 查看使用帮助

  • 拷贝任意目录所有文件到您指定目录,同样支持中断恢复。 支持根据文件大小过滤,可输入 ./copy -h 查看使用帮助

  • 对任意目录进行去重,删除同一目录下的md5值相同的文件(只保留一个),删除同目录下的同名空目录。 命令行输入 ./dedupe -h 查看使用帮助

  • 在 config.js 里完成相关配置后,可以将本项目部署在(可正常访问谷歌服务的)服务器上,提供 http 文件统计接口

  • 支持 telegram bot,配置完成后,上述功能大多可以通过 bot 进行操作

环境配置

本工具需要安装nodejs,客户端安装请访问https://nodejs.org/zh-cn/download/,服务器安装可参考https://github.com/nodesource/distributions/blob/master/README.md#debinstall

建议选择v12版本的node,以防接下来安装依赖出错。

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

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

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

其他环境

nodejs本身是跨平台的,所以项目可以在各种操作系统上运行,下面的说明是针对Linux系统,如果你需要在 Windows 或 Android 上进行安装,可以参考: https://github.com/roshanconnor123/gd-utils#installation (英文)

依赖安装

  • 命令行执行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目录,请不要删除它,接下来进行下一步配置。

Service Account 配置

强烈建议使用service account(后称SA),因为机器人的所有操作默认都用的SA权限。 SA授权文件获取方法请参见

获取到 SA 的 json 文件并将其加入团队盘成员后,请将文件拷贝到gd-utils的 sa 目录下。
注意,AutoRclone 将 SA 加入 group 的脚本有点问题,可能会加入不完全,而gd-utils混入未授权的SA文件会导致严重的问题,暂时的解决方法是批量验证SA的有效性

配置好 SA 以后,如果你不需要对个人盘下的文件进行操作,可跳过[个人帐号配置]这节,而且命令行执行命令的时候,记得带上 -S 参数告诉程序使用SA授权进行操作。

个人帐号配置

  • 命令行执行 rclone config file 找到 rclone 的配置文件路径
  • 打开这个配置文件 rclone.conf, 找到 client_id, client_secretrefresh_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-Secrethttps://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,如果命令返回了你的谷歌硬盘根目录的数据,说明配置成功,可以开始使用本工具了。

Bot配置

如果要使用 telegram bot 功能,需要进一步配置。

首先在 https://core.telegram.org/bots#6-botfather 根据指示拿到 bot 的 token,然后填入 config.js 中的 tg_token 变量。

然后获取自己的 telegram username,这个username不是显示的名称,而是tg个人网址后面的那串字符,比如,我的tg个人网址是 https://t.me/viegg ,用户名就是 viegg,获取用户名的目的是在代码里配置白名单,只允许特定的用户调用机器人。将username填入 config.js里的配置,像这样: tg_whitelist: ['viegg'],就代表只允许我自己使用这个机器人了。

如果想把机器人的使用权限分享给别的用户,只需要改成:

tg_whitelist: ['viegg', '其他人的username'],

接下来需要将代码部署到服务器上。 如果你一开始就是在服务器上配置的,可以直接执行npm i pm2 -g

如果你之前是在本地操作的,请在服务器上同样重复一遍,配置好相关参数后,执行npm i pm2 -g安装进程守护程序pm2

安装好pm2之后,执行 pm2 start server.js --node-args="--max-old-space-size=1024",代码运行后会在服务器上监听23333端口。

如果你启动程序后想看运行日志,执行 pm2 logs

查看 pm2 守护的进程列表,执行 pm2 l

停止运行中的进程,执行 pm2 stop 对应的进程名称

如果你修改了代码中的配置,需要 pm2 reload server 才能生效

如果你不想用nginx,可以将server.js中的23333改成80直接监听80端口(可能需要root权限)

接下来可通过nginx或其他工具起一个web服务,示例nginx配置:

server {
  listen 80;
  server_name your.server.name;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:23333/;
  }
}

配置好nginx后,可以再套一层cloudflare,具体教程请自行搜索。

检查网站是否部署成功,可以命令行执行(请将YOUR_WEBSITE_URL替换成你的网址)

curl 'YOUR_WEBSITE_URL/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg'

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

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

curl -F "url=YOUR_WEBSITE/api/gdurl/tgbot" 'https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook'

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

补充说明

config.js文件里,还有另外的几个参数:

// 单次请求多少毫秒未响应以后超时(基准值,若连续超时则下次调整为上次的2倍)
const TIMEOUT_BASE = 7000

// 最大超时设置,比如某次请求,第一次7s超时,第二次14s,第三次28s,第四次56s,第五次不是112s而是60s,后续同理
const TIMEOUT_MAX = 60000

const PAGE_SIZE = 1000 // 每次网络请求读取目录下的文件数,数值越大,越有可能超时,不得超过1000

const RETRY_LIMIT = 7 // 如果某次请求失败,允许其重试的最大次数
const PARALLEL_LIMIT = 20 // 单个任务的网络请求并行数量,可根据网络环境调整

const DEFAULT_TARGET = '' // 必填,拷贝默认目的地ID,如果不指定target,则会拷贝到此处,建议填写团队盘ID,注意要用英文引号包裹

读者可根据各自情况进行调整

专家设置

这一节面向更加注重安全的专家用户,并假设读者了解nodejs的基本语法

config.js 中,你可以额外设置两个变量 ROUTER_PASSKEYTG_IPLIST 来进一步保证接口安全。

// 如果设置了这个值,那么调用 /api/gdurl/count 这个接口必须携带一个叫 passkey 的query,且必须等于ROUTER_PASSKEY的值
// 如果不设置这个值,那么默认关闭 /api/gdurl/count 这个接口的功能(因为观察到很多用户公开的贴出了自己的API地址……)
const ROUTER_PASSKEY = 'your-custom-passkey'

// 与你的服务器通信的tg服务器的 ip 地址,可以在pm2 logs 中看到
// 如果设置了这个值,那么调用 /api/gdurl/tgbot 这个接口的IP地址必须是 TG_IPLIST 数组的其中之一
// 如果不设置这个值,则默认任何IP都可以调用此接口(考虑到后面还有个 tg username的白名单验证)
const TG_IPLIST = ['tg-ip-address']

module.exports = {
  AUTH,
  PARALLEL_LIMIT,
  RETRY_LIMIT,
  TIMEOUT_BASE,
  TIMEOUT_MAX,
  LOG_DELAY,
  PAGE_SIZE,
  DEFAULT_TARGET,
  ROUTER_PASSKEY,
  TG_IPLIST
}

注意事项

gd-utlis(以及所有GD转存工具)的原理是调用了google drive官方接口

gd-utils比较快的原因在与其他工具的对比有具体阐述,概括来讲,当它进行转存任务时,不会向google服务器查询目标文件是否已存在,因为它会把复制记录存储在本地数据库,这样就节省了查询花费的时间,而查询接口是google drive所有接口里最耗时的。

这也就导致了gd-utils目前无法对已存在的文件进行增量更新,除非文件之前就是它拷贝的,由于它已经将记录保存在本地,所以可以对之前的记录进行增量更新。

目前尚不知道google是否会对接口做频率限制,也不知道会不会影响google账号本身的安全。

请勿滥用,后果自负

gd-utils's People

Contributors

iwestlin avatar sachialanlus avatar vitaminx avatar vizv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gd-utils's Issues

tgbot输入命令无反应

  • node check.js成功获取文件目录
  • 已获取token:123...:aEfeg....
  • config.js中添加了token,bot白名单格式为:tg_whitelist: 't.me/username',
  • 共享文件夹数量获取成功:curl 'YOUR_WEBSITE_URL/api/gdurl/count?fid=共享文件夹id'
  • ssh中输入命令:curl -F "url=https://my-site-url/api/gdurl/tgbot" 'https://api.telegram.org/bot123...:aEfeg..../setWebhook'
    返回消息:{"ok":true,"result":true,"description":"Webhook was set"}
  • bot中输入命令“/help”无反应

能否在windows 10 PowerShell下运行

大佬你好,请问这个程序只能在服务器环境下运行吗? 我在windows 10 PowerShell下输入copy -h 命令,显示
Copy-Item : A parameter cannot be found that matches parameter name 'h'.
At line:1 char:6

  • copy -h
  •  ~~
    
    • CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
    • FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.CopyItemCommand

测试 curl 'xxxx/api/gdurl/count?fid=1LggSuwI1n40bcD5tQ13wS0M6wg' 输出错误

执行 倒数第二步 curl 'YOUR_WEBSITE_URL/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg' 后,出现以下提示,并没有对文件进行统计,请问什么原因?

<!doctype html><title></title><script src="https://www.google.com/adsense/domains/caf.js" type="text/javascript"></script><style>#content-main{display:none}</style>

For full functionality of this site it is necessary to enable JavaScript. Here are the instructions how to enable JavaScript in your web browser.
<script type="text/javascript" src="https://d1hi41nc56pmug.cloudfront.net/static/js/main.314a8987.js"></script></h

下面的错误是什么原因,目的盘超限了?

下面的错误是什么原因,目的盘超限了?
源和目的的SA权限都检查通过了
复制文件失败,文件id: 1Q5X6LhLQV8MSaQZJWv-Jd-uq3-Ddzn-f
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
复制文件失败,文件id: 1b5bvb0lt4E33pZFAoZZ7YxQFjU8Irt1-
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has been exceeded."}],"code":403,"message":"The file limit for this shared drive has been exceeded."}}
{"error":{"errors":[{"domain":"global","reason":"teamDriveFileLimitExceeded","message":"The file limit for this shared drive has

重装了一遍以后无法复制

报错:

0|server | }
0|server | TypeError: process.stdout.cursorTo is not a function
0|server | at print_progress (/root/gd-utils/src/gd.js:705:18)
0|server | at Timeout._onTimeout (/root/gd-utils/src/gd.js:158:5)
0|server | at listOnTimeout (internal/timers.js:531:17)
0|server | at processTimers (internal/timers.js:475:7)

复制文件的报错

检查了有效的sa,但是出现以下错误

0|server | {"error":{"errors":[{"domain":"global","reason":"storageQuotaExceeded","message":"The user's Drive storage quota has been exceeded."}],"code":403,"message":"The user's Drive storage quota has been exceeded."}}

执行 node check.js 出错

执行 node check.js 出现很长一段代码,最后一段如下,求问哪里出了问题?

_ended: true,
res: [IncomingMessage],
aborted: false,
timeoutCb: null,
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
[Symbol(kCapture)]: false,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kOutHeaders)]: [Object: null prototype]
},
data: { error: 'invalid_grant', error_description: 'Bad Request' }
},
isAxiosError: true,
toJSON: [Function]

关于复制完整性

这是第一次复制后的提示:文件完成数:48968/153914 提示复制完成
image

之后git pull 了最新代码

执行copy -u后
第二次复制的提示:
image

不知道我这个到底复制完了没有?

关于tg机器人

在服务器上能用命令行操作,但是tg机器人发 /help无反应
api token和username检查过没有错误
是可能在哪一步出错

取消任务

有的时候一个任务卡了几小时也不动,有没有取消任务的命令

curl 'YOUR_WEBSITE_URL/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg' 返回的是html内容

输入curl '我的ip/api/gdurl/count?fid=124pjM5LggSuwI1n40bcD5tQ13wS0M6wg' 返回了下面的内容

<title>502 Bad Gateway</title>

502 Bad Gateway


nginx/1.14.1 还有一个就是nginx的配置文件我要修改什么地方吗 就修改了ip server { listen 80; server_name 我的ip; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:23333/; } } 我没有使用域名 听其他人说需要htmls加证书才能使用 感谢作者

关于sa和个人盘

image
这里说可以用sa传到个人盘,但是我执行
./copy 1gHLzyYOXo0NRDLqAK75Z_vdslSuL6Bzz -S
到个人盘时会提示错误,
{"error":{"errors":[{"domain":"global","reason":"notFound","message":"File not found: 1zinYLW3anjVUe25aPtyrYL1SnYcwXUCQ.","locationType":"parameter","location":"fileId"}],"code":404,"message":"File not found: 1zinYLW3anjVUe25aPtyrYL1SnYcwXUCQ."}} 创建目录重试中: 物语系列 重试次数: 7 复制文件夹出错 Error: 创建目录失败,请检查您的帐号是否有相应的权限
如何操作可用sa传递到个人盘

执行node check.js返回[]

执行node check.js的时候返回
[]
执行node check.js -S也一样返回
[]

config.js内的const DEFAULT_TARGET,client_id,client_secret,refresh_token都正确填写的

pm2 log 报错

[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)
/root/.pm2/pm2.log last 15 lines:
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] online
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] online
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2020-07-03T21:58:20: PM2 log: App [server:0] online
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] online
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2020-07-03T21:58:21: PM2 log: App [server:0] online
PM2        | 2020-07-03T21:58:22: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-07-03T21:58:22: PM2 log: Script /home/Jobin/gd-utils/server.js had too many unstable restarts (16). Stopped. "errored"

/root/.pm2/logs/server-out.log last 15 lines:
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333
0|server   | http://127.0.0.1:23333

/root/.pm2/logs/server-error.log last 15 lines:
0|server   |   syscall: 'listen',
0|server   |   address: '0.0.0.0',
0|server   |   port: 23333
0|server   | }
0|server   | Error: listen EADDRINUSE: address already in use 0.0.0.0:23333
0|server   |     at Server.setupListenHandle [as _listen2] (net.js:1313:16)
0|server   |     at listenInCluster (net.js:1361:12)
0|server   |     at doListen (net.js:1498:7)
0|server   |     at processTicksAndRejections (internal/process/task_queues.js:85:21) {
0|server   |   code: 'EADDRINUSE',
0|server   |   errno: 'EADDRINUSE',

Google Colab运行报错

运行npm i
npm WARN [email protected] No repository field.

added 185 packages from 96 contributors and audited 188 packages in 4.789s

5 packages are looking for funding
run npm fund for details

found 0 vulnerabilities

运行node check.js -S
Error: Request failed with status code 401
at createError (/content/gd-utils/node_modules/@viegg/axios/lib/core/createError.js:16:15)
at settle (/content/gd-utils/node_modules/@viegg/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/content/gd-utils/node_modules/@viegg/axios/lib/adapters/http.js:183:11)
at IncomingMessage.emit (events.js:327:22)
at endReadableNT (_stream_readable.js:1221:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21)

使用copy团队盘复制到团队盘出现问题

使用 ./copy 团队盘ID 团队盘ID -S
整体复制团队盘出现任务卡死,打开pm2 log查看日志 日志不断重复显示相同的任务执行状态,但是文件夹,文件数值没有发生任何变化 ,打开团队盘,发现只有文件夹被创建,但是文件没有被复制,同样的操作使用gclone可以正常执行复制操作。

建议拷贝目标可设置少套一层母文件夹

gd-utils/copy-n , 可以类比于 AutoRclone 的 -dp, 都是设置目标文件夹名称。
但不同的是, 当 gd-utils/copy 未指定 -n 时, 默认用源文件夹本名, 而当 AutoRclone 未指定 -dp 时, 默认不套那一层母文件夹

缺失 "目的地少套一层母文件夹" 功能会造成一些困难, 比如,
从 "团队盘 A" 同步到 " 团队盘 B",
期望的结果是 "团队盘 A/文件夹 A" ==> "团队盘 B/文件夹 A",
但实际效果为 "团队盘 A/文件夹 A" ==> "团队盘 B/Drive/文件夹 A"

按照现有的拷贝逻辑, 结果应该是 "团队盘 B/团队盘 A/文件夹 A" , 但实际上, "Drive" 确实是程序取得的 "团队盘 A" 根目录名字, 这到是另外一个问题了。

希望 gd-utils/copy 可以实现 "团队盘 A/文件夹 A" ==> "团队盘 B/文件夹 A" 这样的效果
(我是命令行用户, 暂未尝试 bot)

check.js没问题,但是copy报错

报错如下:

复制文件夹出错 ErrorWithCode: private_key and client_email are required.
    at GoogleToken.getCredentials (/home/Jobin/gd-utils/node_modules/gtoken/build/src/index.js:94:27)
    at async GoogleToken.getTokenAsync (/home/Jobin/gd-utils/node_modules/gtoken/build/src/index.js:128:27) {
  code: 'MISSING_CREDENTIALS'
}

关于node check.js报错

大佬,执行node check.js后报错如下,这是啥原因啊。。。

Error: connect EINVAL 0.0.30.210:80 - Local (0.0.0.0:0)
at internalConnect (net.js:923:16)
at defaultTriggerAsyncIdScope (internal/async_hooks.js:313:12)
at GetAddrInfoReqWrap.emitLookup [as callback] (net.js:1063:9)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:68:8) {
errno: 'EINVAL',
code: 'EINVAL',
syscall: 'connect',
address: '0.0.30.210',
port: 80,
config: {
url: 'https://www.googleapis.com/oauth2/v4/token',
method: 'post',
data: 'client_id=省略&client_secret=省略&refresh_token=省略&grant_type=refresh_token',
headers: {
Accept: 'application/json, text/plain, /',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'axios/1.0.0',
'Content-Length': 268
},
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 0,
adapter: [Function: httpAdapter],
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

copy问题

copy 不会覆盖原来已经存在的同名文件夹吗?必须全量copy吗?

文件复制如何保证文件相对位置不变

问题1

  • 前提
    共享文件夹有多个子文件夹
  • 命令
    ./copy 共享文件id
  • 问题
    复制到团队盘,发现子文件夹全部不见,所有文件都在根文件夹内

问题2

config.js中的默认盘

  • 前提
    将一个团队盘文件夹复制到其他团队盘
    -命令
    bot:/copy 默认盘ID 2盘ID
    ssh:./copy 默认盘ID 2盘ID
  • 问题
    bot命令复制会在2盘产生空文件夹Drive
    然后在ssh中复制成功盘根目录有个云端硬盘的文件夹,但同样有问题1,文件全部在根文件内。
    ssh复制成功后,2盘复制到3盘,会在默认盘产生Drive文件夹。
    2盘复制到4盘显示有相同源ID和目的ID的任务已复制完成,如需重新复制请更换目的地

copy失败

help成功了,然后copy返回401可能是什么原因呢。

关于专家设置

大大您好
请教专家设置中的const ROUTER_PASSKEY = 'your-custom-passkey',
要如何查询并获取passkey呢?
非常感谢

Trojan部署了伪装站点对百宝箱的影响

您好,我的vps上已经部署了Trojan,做了伪装站点,如果我想安装百宝箱,我看您的介绍说百宝箱也需要起一个web服务,会和Trojan的伪装站点冲突吗?如果可能会的话我需要怎么办,麻烦具体介绍一下

团队盘 to 团队盘

想问下是否支持从团队盘到另一个团队盘
ps. 两个团队盘里都有相同的sa

这个是我网络问题吗,还是并发请求设的大了,我有200个sa

ient network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | Client network socket disconnected before secure TLS connection was established
0|server | 12:25:51 | 已复制文件数 610 | 网络请求 进行中100/排队103359

默认文件夹问题

微信截图_20200629011755
微信截图_20200629011829
用默认指定的目标文件夹会提示没有权限,手动的话可以。都是同一个文件夹

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.