From db3a1101a6358ac3e1a134a2a4f0cfbdf1b8ce36 Mon Sep 17 00:00:00 2001 From: liaojack8 Date: Tue, 7 Jul 2020 01:09:51 +0800 Subject: [PATCH] update readme --- compare.md | 126 +++++++++++++++++++++--------------------- pic/example1.png | Bin 15762 -> 0 bytes readme.md | 141 ++++++++++++++++++++++++----------------------- 3 files changed, 134 insertions(+), 133 deletions(-) delete mode 100644 pic/example1.png diff --git a/compare.md b/compare.md index fa567b5..af90879 100644 --- a/compare.md +++ b/compare.md @@ -1,63 +1,63 @@ -# 对比本工具和其他类似工具在 server side copy 的速度上的差异 - -以拷贝[https://drive.google.com/drive/folders/1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3](https://drive.google.com/drive/folders/1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)为例([文件统计](https://gdurl.viegg.com/api/gdrive/count?fid=1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)) -共 242 个文件和 26 个文件夹 - -如无特殊说明,以下运行环境都是在本地命令行(挂代理) - -## 本工具耗时 40 秒 - -![](static/gdurl.png) - -另外我在一台洛杉矶的vps上执行相同的命令,耗时23秒。 -这个速度是在使用本项目默认配置**20个并行请求**得出来的,此值可自行修改(下文有方法),并行请求数越大,总速度越快。 - -## AutoRclone 耗时 4 分 57 秒(去掉拷贝后验证时间 4 分 6 秒) - -![](static/autorclone.png) - -## gclone 耗时 3 分 7 秒 - -![](static/gclone.png) - -## 为什么速度会有这么大差异 -首先要明确一下 server side copy(后称ssc) 的原理。 - -对于 Google Drive 本身而言,它不会因为你ssc复制了一份文件而真的去在自己的文件系统上复制一遍(否则不管它有多大硬盘都会被填满),它只是在数据库里添上了一笔记录。 - -所以,无论ssc一份大文件还是小文件,理论上它的耗时都是一样的。 -各位在使用这些工具的时候也可以感受到,复制一堆小文件比复制几个大文件要慢得多。 - -Google Drive 官方的 API 只提供了复制单个文件的功能,无法直接复制整个文件夹。甚至也无法读取整个文件夹,只能读取某个文件夹的第一层子文件(夹)信息,类似 Linux 命令行里的 `ls` 命令。 - -这三个工具的ssc功能,本质上都是对[官方file copy api](https://developers.google.com/drive/api/v3/reference/files/copy)的调用。 - -然后说一下本工具的原理,其大概步骤如下: - -- 首先,它会递归读取要复制的目录里的所有文件和文件夹的信息,并保存到本地。 -- 然后,将所有文件夹对象过滤出来,再根据彼此的父子关系,创建新的同名文件夹,还原出原始结构。(在保证速度的同时保持原始文件夹结构不变,这真的费了一番功夫) -- 根据上一步创建文件夹时留下的新旧文件夹ID的对应关系,调用官方API复制文件。 - -得益于本地数据库的存在,它可以在任务中断后从断点继续执行。比如用户按下`ctrl+c`后,可以再执行一遍相同的拷贝命令,本工具会给出三个选项: - -![](static/choose.png) - -另外两个工具也支持断点续传,它们是怎样做到的呢?AutoRclone是用python对rclone命令的一层封装,gclone是基于rclone的魔改。 -对了——值得一提的是——本工具是直接调用的官方API,不依赖于rclone。 - -我没有仔细阅读过rclone的源码,但是从它的执行日志中可以大概猜出其工作原理。 -先补充个背景知识:对于存在于Google drive的所有文件(夹)对象,它们的一生都伴随着一个独一无二的ID,就算一个文件是另一个的拷贝,它们的ID也不一样。 - -所以rclone是怎么知道哪些文件拷贝过,哪些没有呢?如果它没有像我一样将记录保存在本地数据库的话,那么它只能在同一路径下搜索是否存在同名文件,如果存在,再比对它们的 大小/修改时间/md5值 等判断是否拷贝过。 - -也就是说,在最坏的情况下(假设它没做缓存),它每拷贝一个文件之前,都要先调用官方API来搜索判断此文件是否已存在! - -此外,AutoRclone和gclone虽然都支持自动切换service account,但是它们执行拷贝任务的时候都是单一SA在调用API,这就注定了它们不能把请求频率调太高——否则可能触发限制。 - -而本工具同样支持自动切换service account,区别在于它的每次请求都是随机选一个SA,我的[文件统计](https://gdurl.viegg.com/api/gdrive/count?fid=1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)接口就用了20个SA的token,同时请求数设置成20个,也就是平均而言,单个SA的并发请求数只有一次。 - -所以瓶颈不在于SA的频率限制,而在运行的vps或代理上,各位可以根据各自的情况适当调整 PARALLEL_LIMIT 的值(在 `config.js` 里)。 - -当然,如果某个SA的单日流量超过了750G,会自动切换成别的SA,同时过滤掉流量用尽的SA。当所有SA流量用完后,会切换到个人的access token,直到流量同样用尽,最终进程退出。 - -*使用SA存在的限制:除了每日流量限制外,其实每个SA还有个**15G的个人盘空间限额**,也就是说你每个SA最多能拷贝15G的文件到个人盘,但是拷贝到团队盘则无此限制。* +# 對比本工具和其他類似工具在 server side copy 的速度上的差異 +### 這裡使用機器翻譯直接簡轉繁, 大家看得懂就好: ) +以拷貝[https://drive.google.com/drive/folders/1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3](https://drive.google.com/drive/folders/1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)為例([文件統計](https://gdurl.viegg.com/api/gdrive/count?fid=1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)) +共 242 個文件和 26 個文件夾 + +如無特殊說明,以下運行環境都是在本地命令行(掛代理) + +## 本工具耗時 40 秒 + +![](static/gdurl.png) + +另外我在一台洛杉磯的vps上執行相同的命令,耗時23秒。 +這個速度是在使用本項目默認配置**20個並行請求**得出來的,此值可自行修改(下文有方法),並行請求數越大,總速度越快。 + +## AutoRclone 耗時 4 分 57 秒(去掉拷貝後驗證時間 4 分 6 秒) + +![](static/autorclone.png) + +## gclone 耗時 3 分 7 秒 + +![](static/gclone.png) + +## 為什麽速度會有這麽大差異 +首先要明確一下 server side copy(後稱ssc) 的原理。 + +對於 Google Drive 本身而言,它不會因為你ssc覆制了一份文件而真的去在自己的文件系統上覆制一遍(否則不管它有多大硬盤都會被填滿),它只是在數據庫里添上了一筆記錄。 + +所以,無論ssc一份大文件還是小文件,理論上它的耗時都是一樣的。 +各位在使用這些工具的時候也可以感受到,覆制一堆小文件比覆制幾個大文件要慢得多。 + +Google Drive 官方的 API 只提供了覆制單個文件的功能,無法直接覆制整個文件夾。甚至也無法讀取整個文件夾,只能讀取某個文件夾的第一層子文件(夾)信息,類似 Linux 命令行里的 `ls` 命令。 + +這三個工具的ssc功能,本質上都是對[官方file copy api](https://developers.google.com/drive/api/v3/reference/files/copy)的調用。 + +然後說一下本工具的原理,其大概步驟如下: + +- 首先,它會遞歸讀取要覆制的目錄里的所有文件和文件夾的信息,並保存到本地。 +- 然後,將所有文件夾對象過濾出來,再根據彼此的父子關系,創建新的同名文件夾,還原出原始結構。(在保證速度的同時保持原始文件夾結構不變,這真的費了一番功夫) +- 根據上一步創建文件夾時留下的新舊文件夾ID的對應關系,調用官方API覆制文件。 + +得益於本地數據庫的存在,它可以在任務中斷後從斷點繼續執行。比如用戶按下`ctrl+c`後,可以再執行一遍相同的拷貝命令,本工具會給出三個選項: + +![](static/choose.png) + +另外兩個工具也支持斷點續傳,它們是怎樣做到的呢?AutoRclone是用python對rclone命令的一層封裝,gclone是基於rclone的魔改。 +對了——值得一提的是——本工具是直接調用的官方API,不依賴於rclone。 + +我沒有仔細閱讀過rclone的源碼,但是從它的執行日志中可以大概猜出其工作原理。 +先補充個背景知識:對於存在於Google drive的所有文件(夾)對象,它們的一生都伴隨著一個獨一無二的ID,就算一個文件是另一個的拷貝,它們的ID也不一樣。 + +所以rclone是怎麽知道哪些文件拷貝過,哪些沒有呢?如果它沒有像我一樣將記錄保存在本地數據庫的話,那麽它只能在同一路徑下搜索是否存在同名文件,如果存在,再比對它們的 大小/修改時間/md5值 等判斷是否拷貝過。 + +也就是說,在最壞的情況下(假設它沒做緩存),它每拷貝一個文件之前,都要先調用官方API來搜索判斷此文件是否已存在! + +此外,AutoRclone和gclone雖然都支持自動切換service account,但是它們執行拷貝任務的時候都是單一SA在調用API,這就注定了它們不能把請求頻率調太高——否則可能觸发限制。 + +而本工具同樣支持自動切換service account,區別在於它的每次請求都是隨機選一個SA,我的[文件統計](https://gdurl.viegg.com/api/gdrive/count?fid=1W9gf3ReGUboJUah-7XDg5jKXKl5XwQQ3)接口就用了20個SA的token,同時請求數設置成20個,也就是平均而言,單個SA的並发請求數只有一次。 + +所以瓶頸不在於SA的頻率限制,而在運行的vps或代理上,各位可以根據各自的情況適當調整 PARALLEL_LIMIT 的值(在 `config.js` 里)。 + +當然,如果某個SA的單日流量超過了750G,會自動切換成別的SA,同時過濾掉流量用盡的SA。當所有SA流量用完後,會切換到個人的access token,直到流量同樣用盡,最終進程退出。 + +*使用SA存在的限制:除了每日流量限制外,其實每個SA還有個**15G的個人盤空間限額**,也就是說你每個SA最多能拷貝15G的文件到個人盤,但是拷貝到團隊盤則無此限制。* diff --git a/pic/example1.png b/pic/example1.png deleted file mode 100644 index f425083c9169e923e2a5f3144f2fa47a8832ce25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15762 zcmd6uWmKF?x91@Qf(3U7(73x3tnuLP5Fof)aCaxTTX1)m-~ocWJ2cwC9j0^6J9E!F z_ug5v=F@z5s-J$kSFft-s=fFBw|9jr%1gdSBtV3Mf_g74C8i7o1?>#E*x=zHPmYY} z$sjM#PRf!%sH$P$+$WF6beR_te`)>z%FK-}W}@NRL(2?P$BuTCufu^HtGv zM-b@>1+M||`G^Q=bRsDQ0VyA)ZPUb&!WfW7;@zAs=>p!~H^2VK2y-;i2z(Pz?JFQ~ zaP=#V{UFmMgn(>oBi_C;I*x|U9!h-n^^=NKv8TVv>udgnuP|GiV+o| z4vGsC{%=~eXxm5ukIe`x8T)}BM!L(z%pO;5{U@YBac2W52VFmwRBY~!4bp!vpc2f5 zjDP!l*pzx1uwL#;;^orcJk<_{st-m3ItI?z44rShTOVwlDgKollkoUFnPl=Zw}s^d zl(HpTri3ds*D{Nn31G5KUVo<94~knA7t?E~VE<_&LZWFs59zV%Ap_&6g-8mVA`pJq zg->SGQG0SJBNz<>_RoF0QX*t1M2LKVAhEaqXoEgtUHP}18{lpY>VmrjH%(U`s=0S8 zF{7BcjaK{E(b@AdckLc@hM#pp@aqcXMAJRjPIFqrI#zI@7_Uer#`;^7OxGyQb*LS$ zgTzxE4x*`c(Ha`oA9~9t_EOf+IPuTua#X1Yt?M z+%kPFrp;X~?7J24P@IGb(@UvX6dAg6`H_|Sn&dulApYJQ%GJ#)4*{a*k zR`clm_oblz_!f&6gq8(A4@I+-@0~Y>9gPzw@u9aUpPOw&C~YvU_S*3Z7W|FdkCj+@ z*O(taIb0R);1zB&@hHVI3f)6-|7z8Fl}wc!SydfL5y z1-d>|Zd)t`0{L@FvmF#(`serWB=W3(h0Z^o?sk&C z=<4wdtv_^|RvQ1@)a~>zaJYWu+RFT%3xcapey?G)DWtmjP+f}qWlrJuqn?Xf_kvuD zg*Ej0YahS)i|7Zz&aZ49B`HVOzSVv0k2=3arkhY@KhFHV)v(r3TS_^viYb1xr$U)c zey1xy)a=Dr3trRf?tAB}R;_NS#p}f-G3mYYbfGax z7`h6*ecKlG(UR--S?Ad9>1XIJ&PS@uwZ?bU*R^ohy=trLFs}+)@$D2sB)%UC9Z?s+ z^9vZ?@SI7%b=_8101G{tr%x3yn-fr_6+$dHhn8-S6`uq{3fb?upRbnjTMki7c)PBA zYi!CBxWJt!`rT?|jK1dr%@=*?uMbh<$rwC6Tf&=G41Nd_sul z7JPI}&$20&^{FpO`q0kmKI_uQca&G?>j4m1{kFEgU)S8Ou`=j{_jw`V{@9Usep4I& z$I#<#Ugs;+m)G;kI=1yss<(pctsjOSVu5*h=_JIGkH4jdeWrH0dydP}Q)_r^`!}~9 zYbGu~-!+xKb5QgJvyR!#eP65KFKOsV|Ctc#?TLAaA?qbc`Mxg3qvN>f;EtGxpA|8% z{+tE2V8RJ9TN8=0GX(Ymav_H`dRR6jw3rv0H$jx8;KJt$$WEpMY1RE?c};h|m&(8~ zAXe!_P3JhgAw8oVT~jWvIA2;1(T$C?*x-6XkblX%ebO#ga#f{;%UX>5e$Ej&Dw);3 zAt!oacXdAgzO3m*FRI;%%J#@0b`8Jqc00Z}po+N4Eqo)*%kKsgM$tZ6d#<=tF-yHcIW`}16W_SNuH&N2L z1XX*wZQez_=PhT;ut3#OdOr+Fs^GDH!3qgZvs{sdoJ;p~p=iQd{Zy7ud9K;8sKh;Y z!Kh?<0|okpV1b+~9@%170LA?+`+Wj%D6G99Jp4CzcQa~WRr?gyXOjG}uLhLoxE+_4 z0*E2SZi4O5)>xgSPt3iIM}TG$nuT=DU}JKew^#8F6>nBXP*^#xCX(E?TY`GrXF8eyH&LX4_3>vdWcKq!z`)|GUcN< zhj<3cUgM?((bC*$*NJ~>@o6WvPVuVmqa|BaDEKbdrihP! zq|VZ4XGH1qJbP~?#s;mL9KDZCW8zLoL9c{iv6{fI>2^}ZyEoGZt+5%N|oD~sDm zn!%dRw=FZ8HX;Vo=EXVnlht^IDW6&i)r_gQAT1Y_dkEdbBC0m38yGlL+~D%4f33v) z36Cw=Czw@a+<07hm(_ATM6G6;Fdo{C+hZ{40ac=^wtqa9-0y%fM7L>xd3bq~E!8dL z0-65eIp6M8eWtC$pD~bO0azG)>V|#Wyb9!Ha+5N)y~Ebhq}yyHjH5oOqdH-oA!vPTs|cF!I99C)xbw{}=?&M5HWfDGx*!XQNOg-jq1=_?%ANU3Lfj1I>59E?XJt3(cSFwG+WR>*v|e z1|#>ku1FLH36t4MZM&LQC)NfpnXG-{&ML^u1>K5?tnGbmK5#iXVf-hn))(92zO%a| z8G2hWfoCKd{Fw1MsKNJ$OFiyIpR2ae;@&+9dX7`KqO>!9m74tUElh!olsSxeR`7D7 zdvA|u&Y;uq9fkonRp;)*K%j~y=*<_b7#Du%ZZvC=TZGtgFx1HhtatM+V|RTx?EXJOho+86 zsPe!{u5n)O?zs637Qej$F)Z;*x?jv$;db=c9e_WCpGahI=}0>xHn&Q+(2eGe_c2)<+Skc`1$(OxiZ!@-11=T`NNmLvkpv-^?Vt9M<(O)Jbh{_;OExU?>!5QRZ>x$-?6cNR5%!&+m*((?&y|Os`h@sN8qPc*9vAY z`^@JN{fcKtEFsG{5L(?8W%}qoo4SL7BDREj*4JDG-b?cf+=a{B%qIsqWDC_W5V=ap zX{F$9l-?X|2^%bjie&d(&P9@|yHd^R3ix&5?~O&trg%6vDYYE7b)EyHntv{C&Yv8S zfOYXVn)B2POGo4q67(IOTOMQe51zNDNp9^>%W9gqD(^;=-@_g$;3^{%(vi=X8Vg`z zn(=jAL+J_u=i;XI$-}J2PeI;_w=E~>$f2%sF9K}$%Z>LM__J(RK^RBDBnMH{XCx}R z2MR^@3CGg`6FQ4DmI~Ux5?j0YU-=}^ZPR^F&wiP=zW*L?o66^V6iw?J zSi=5rqt(*O{p;&wQ&m8KEhZPzXi1s}aEYb6lwYJTd9BB;J1pDyJy0vuP=KSO{%6=I zCE#r`Y?T$^q3O`@=gjlOFCJB@_tA0XPp5;(N#nAfKMJ}fjJA=qPTp{4bhw-dg3@d% zfaHlB-J#qhXo+ztqgIOt!`4Dk>3leg zuk!EAtQ`>(G7#k^CvQVmrm@ISf{jmlB^Zq(ei4gr5IQ({ZMfYrP0@zg-^RWlimTK4 zmAq-AC;fuZMvS`ji@v0mN<)elDN?mPDNS&-u_onE9}U(R=X1y&fy0zBW$62tZoAI1 zixuYYuLBLHT1v3eh1oW%auduLIBnxHmXTNafV0BD?l7dpmazW9Z>cy8lKA%Q64%Y* z9PckYQ|IK1>37bs#G>p5Tws52ciDuO`PPchOCZ_OR$Z7W+q{15S$6}}*$COMxdvE5 zJ=@Qz*|>qZ)&1++2ToKh+TB^!U2i+zKN(Xmkm+s-PI;ku`gAhwHC0i)zFiZViO?&Q zhjf02tyWyW!X6);WznEC#;(SD&F2du1NmaeWLhjkxdNE|xJm{TU^;Zj@P&Z6o*=PX zSL}=uzn0RbJ_ibYy2*3prK@fOEEI@bXw-O$K7@23pFd_N z9GITIY4~h7Yqve7jXVTWXYcqJ~<^ZCiRgDY;C6DG5tI;UiZUu3d9Ar*;8@YXKoDhky9GCN(Y z<-zYP(@cJ;K^L35rZyj}iWj%lZzy*ZzCfryINrjNs!HS59e)}Xk^$QEI)Gw~jp z6EDZ=}4J5)+ zBc&oW+nu>bSAzrOv6N-daC=C={r#2Le!=U57=5{N@1WOVkcgFrmEv*T-w7R z+h0y{gb_qvkk%2pvf)qrT^Xrk@`bR;=GrySdHb>b)?i}!036Y@iRgO5k4^J(^JStb z#?k22*6U_U33DX->FFv5E&hXdB#Wlj-Vj@Zx!wZ`)0>#4w;Z2~iolywH0B!_E$UlB zhEH)_EtZq!x0cqo-bB$O{3AKO&Uy@_kr{SAL%{x9cioZc>06*B;=7EmQ=Ln zp%DNDgidN(*C6-9J*q?jUPh4bvrK{(IfQx?FBEo8`R>YrroN{v#eZmJ1d(uTJFkd8 zsK%fHncj3hq6oh#8BguR%Zw%e8b0*_8Tf?13jXF2&qBkXW$N}It$HR=ak$rDe}0(< zG{fpSoL$j+wYa_$6uipexg18|O2hz?^-!i5_*X|0m;uwi&8*=d0D^ez86bgAI2x8S zq=o-KxA?cB-Me+`9*0Yp7%s_6Qt*Ja_l4#M6Tbe;n>}(H}7gt@Vp(hZQNnw_1F*vR_<*lQ8lw>V5ezLVB3DR@!k1p_$k?MA@j_` zg7Y`udJkWU9$B;wln|qES&M%z9ZW_vvYUEL%fcV>$u~YXYeiD&aTJ%-nscuPO5b*Y z8a-t8jdV7VO)@_*n!n3(6czda5z60L5PTZE!f4(#2G?wy$=gXi@YDbSj24sd~ zW?%!luytG`u4(hH*_ybAYNoHbx#x{D>Y8w^L{uJ+j-zu4QbN&(8b75PbT%V9C2lh2 zD2D7=W<0+B48c8zSz!F$@3q4IBQ^<}VZKq23dS&Lxwm{kNTI3!wz?<(!9f$BrjBaO ze^gm7@F${6h*=Fd8TV9n!W`beLt)3G~$ z>~2?gWH*o?QQE1^?DO86TWwmLQQRC}Ii6|dFhHMd9AwA)jpI6Nn3Gu9dkt!Xnzo08 zY<_$bjj4W$$!Q|+z396u6dX3oi-cXjU^`f?TF}Y6i}bl zyUtkjx;|Yo60I{I))Fv?dd&8x$m$A6V;M^+mA5fdLAEfiFm8)(RO9m(d@6y`7sA`2 zFe92g=bKIsyF9a;&)j^Lk*h7r&bT52{#2A(fl0y-q`1LgW`xe4^7>?Jy? z(GS5m^$Wtk5`V@{jn zD(BanGsS>)apn1l)cJn{)Vt{_nuJUZav;VWx& z%plpVCTM!i;pTH8Xkd97)mcfCnJ2%5!G-SeR1K)cc0U!p#5b3s>GyZ`z2%E>C+nnRZ(-fR-U(B#x8dRf8z-G1$%g}SN zsN<%$eR0=FZDggZI>b+M+0S^4%Q}Q((WyruIOYKSSVbwUr`cn?Dt)x50ak;Rg`W;1 zh}~F_*kpJr2}7H1bzV!!4?>%c-u&|dbcFi{%>F0X{`)@2mI5?A#2?AbD9tT8INv&n zpTV??zj-;Mc4vm+B+dIOJXhC0751=UghJ}?JQgZ`L28Zn zt^q6mkn-{Jt2kJv*DBbTi_&g2(scw3m@mRMh;Ua+n1TJ}P6g6T3sL-FbwPdEEWb?q-NrP)18zj^ zJ?$xHz|Z~FnDuuqv1X`)%eZWJV=z9kL1Bed*N?_|@4q$sJ+8S98)%k1X@Z4oVC`_x zMD7Mj;}2E|J}qa9GiYV%)OOmI`!MeWPM4bDMIUi5Z5Hv~E$askWFM1W^Y(9%aYrm0 zr*~Aoo?i6^lp^TL_B=1${^Dj zQ=A6f8)Sl|pg6B4f!fyF!Qp{t(Ag2jD{h+OVLmX2vCr*No^Dk67CmQP-jXb@3Kp#D zB8?MOza(uJY4`D#g6T_0f$W4!*_!rGwHKT%RtQR9EWcW?2bb3`GP`lPA1``OPGqZ@ z2gUE-{@y2NKVB1!G_eM0D>cpFkMJ6Tqc?!Qn)qLQaKp4!ZA>4HZ7YG6EG9Hvx8gS6 zgea<%-0i4Zz~36r=J}$nKt5{6`h<2G$_rJIX$V_tnYa82Jqh+NO#xN41`Mw-77A1Q zZNMU#dbmEbb07@n&)Hz@n;3jCq<{;iv{GN$<)@O6DR8Bnq=O_ zaZ#(-9;WvKXQC(7MaRp~XRN4ZP-O(|iN;xO^MD_l^aWRhTZOWWYw!+ z>s773lh^dq>@|{d-N+Dma5kbxUqcScwbBDU;TSygp2>AKR_3lcT8N*i>1+DadDt@k4a zOk}qh=U>y2Stce%taWMAwqtb=Gb+I6>eqq=PQmx47=*NgDs{nU#m-w|MDEao;t9P# z1ugo<4Q7LAQltevLC0^5SB@34LIqj{B2(mkM_Z*Tr~ymWj7px}O~Oc1yXW3?=NWNE zIOKsXG}hg%#|o|tDDG~_Z>oe;Ofe$bzj!@f#g`uc2yN<>6U{4j4gMQHXxBE;4tP(V zBAy`uY@>5@yq&VHxTNKJPI8v9);F4E6y4|Ew^F^2@7~T4wAcgp{(j6>xsf=O{fj)f zG7Rr-kkbpf({#0Pmn;__;2$wW<*YXL7IG0;<{_z^2YL>WoXLJ9Pnb0~9>O-!D_5Ox zTkYJY>`=NQdtT>7q;3Iym2#=ad{l|_RrcV2J5MwX=(6`UIM=28l*f~p5j(@+1}cr30&VUgdKj_-&n6Z#}Y5DKTwN^KT9#4fciX13tB@#^jJVE z?1+o`ff^~5ZA4Jm-!{_n>gEdhO#lUvHYg~r!w(0NbdSsQ50Hlkp#QVYlYua%j`I2z zl3nB>(Q@Tzzv2>YQ$eD*b%YO3VWDWii#R6qtN!0rH)id&uNy|l;fG03iD45V?DCPw zEpxwYO@q+lY4s*;SmzcDD>WZyzNb1>U#Ha|dztwD&hM7cDSqdILBEl;)Gu?S5P|@p zz&>eO1VDmh(|z<6paDalvmkxoPW#GPpY}u)Lm8=C9kN_Bn|eqT>{b+wIch$b0aASc zkB}cpApR~xOFFU87HCGKhF!Z%(W8-+M z+m4UpW?t}s+rE|+7U$tsK&U`HlnF;Y4}gNR7GZ>8IXvWt^omWD#Gy@d{^r^>J`rIM z7L~~lTk!p}ZAEXQ5-inh%q`b~5qOBoT#3Vn>ct`s0e*;}=3LJBN$*)sb=?uBYTEz% zU99g)_+7~qe(w|xvl~OoZXUA?E>mBn4#^<36su>Cc;KE(l99cOY4f;MRX6mp@`;QcjIh`DzfiD6{-&>I~;CozRS(IZ_xo5m&_5 zI5DBCAk?+PP(h+*9BwnN9$TWEQOeH|+(0Rw4Lo+tByOsE4dj?qgGR86^;7fp`JPZr zIAtdMF{RWmZ1KWiHv@#Tm#_6bdpkmd1G+p*%Ml8Q5Bb$^#ZJ1pF-^{Gf7zI$)~uq_ z_jAXb%E5bI5_g0Gk>!)JKJIVdh*qZu56fxEZWW$iJ04E9tOxCKzczXb_=Gy75`#$W zfPomtjNrGW7N!jy_$Lz5`E~}nbL&L~D+)qbSjdAy!4J23f)edz2qljGcP%B)lNs7E z+rcXfhM;PL+4_Ugii2#e%R@&%!DX!;(;z3=yfe^`-MJaBz+P&v3ti|gcV6|eZn6En-y!Y~zdqZ}jA|i;sp4oq@bDRMHBU|nW zeecGFW)i~ass-=>}%^H zgQXEu4_1F#n_6Hlf#x2W43(FfmA=R`laTZRt>JS;;LwPG4c|a^S~*P;|6KM#bUp;- z82(jpGmOiKgnb2}I$Tze&)at+lMAu0E)T}j(Evfa#QBC;&V6YrzJ(>2Ku3%zrl}e) zKxJ-@kS}qL?*qcP7gg^|u&pkH57s3sRuZByM8q6m2Tj~sauUgBP zJ@h`YLT1S+Q6gMD+%)`ac*q`-#a^p|h>))1k_nX~H`zK@{~Q;bWKF0A@VN~GtKggb#9 zWx0EJEULw&u5xn|7#0JLDBBg41^BgupH;^OR~MPAt3Jf6P+{lS)=r(k1AI_eyj>t! zH!WguSVY!aY;Nm*?_HRZl;6{}bSyaZSAxEV!csoye9K1N&<5OA6wK&TUM5tZWLYxR zD_T9_ve&^uVsQtY>;_U+T|uO?BB@cCkCDu-B7 zUT6Vu9x_eoed58HA79MsapZVlKOmUBUeYi#ihk42?hX8;ndMSXWA$M%_?-(6U|$*S zR|Y)C2Wa9n2+J8#3EvU#U%Oh+Ee%P1>L_uCu?Sn;MJCd@E;_G+7QbRO77K4?SyJX0F1PY2Y5`h7D{lIqnzNw}h=tTPzq5?0={5 zXQ3rTE%Ln5&eHZoKbACNuSak<5pfVAlP87Imv>faRg$11`PM4@4&(_dE>1GkmMd@C zZ}c?Ll*L9IbgfzwEc@KzDL_D-JXCo_iX^~vk-hAv=1EG?3)xR>605`+Wjg1d4`uM0 zEIt%j;|et^OmbEUJ<)zH<*+Ow+j3oSP_Puws_UgUGUX>0evb8nok_2;x8vn9Q{}+} ziBbzfu70D55qvlM&?_3P&{q4W)h%n0##4;*$H|>!CrX?M8A>jkfwH(%br{)F*$vKk zL1$ox;-vIGO}XoUSUqt@cyQLdI1Av(=v<};@G7YhBPs2aFw~2K-rP>bHUDe+z{2%C zz#RoPt3cAX<2%DY_GajC$w2Q7Z11_Em1asRYHsqufuwf}qhAsQ3tV9XbSeN8UJMuD); ztF84ArVeyW@tUer6cKv9r>&QO>{*$=_H54m304=6(_j$9SKp$&$7CFRH_a81Z7C$J zL>;tC@i%YQ77_A&ArcgDe^V@I(brmUwxsw8{&1Zp8lw_p4C55z{U|Q*-2oY7zZ2Tq zGyT^j93NtUZ;}K--tHtI>dI)Y0`lm91!9 z_7y*fiCM8Ws2jC*!jCaz%{}}n5=#?XMHCyq&wak^^WjRl9dE|cuk}**TSY%3raxp^ zB$tfDqs<>)n&!VXt~CPl{ffpmI-^fcEy8jvW+^L;zYcWsNFVN7JDw`JaCRHLq*-uh z>+#K7tC;s-`n!x{Zqb)!S5|`l*j3xpOT2HrZELD}ps<2vZjY(kxyA~hDC3N! zcG3^QGx&0xCp|Ysa7Hla*nI6@w$g!ZMx*>A&6ao5JVLB~L(gy@Jv%gJb5qwG7xih8 zumj`SGeVDRiY0c6iY6zlfd;lZ>X{;JY?c|YjTY-FEFmeFDS+D0rZQr3!(G_YBUBvu`bnjjv_$wh_VE zN$k!dfI~fqDP6KWSW4-p;Epb1Wzepgo{xBUVCR6sI~z5)C~IA3iAlJj=pf5boFv~S zkhha}OZeNRUcwO-oq1?ko)q}Pj_f_qG>=WTImm`n?y538p~zu?-|5*M+b6T$pIEp} zd~TSvLwXkHXw9S-744yy<=O1uLPN2x=0>z9;f85g;w%XLr1*i~npeAMw%m%)0sHth z2`@W=XW+WFL9uWnTBYh+W-R9zJFA8+9hbDl7)Dl1nz=G;u;vv7H?RBCgehaXeLU#n z593Npg9{whp+3v=`zXmoEIRu3Db1-$9@UJKqRIKLIwRaR^|oGzP!8kNn|9oCMgWcn zS`yhJ!fou=EE;r1B?n@~ttru6uOwm>VJIpR+vwgANp%Q)-(mY??S!Kcc=kfYQR+J& z3M6nxID}K2Bv){>i@S@T&FHg0V=VP~!+F_X&0s_@NiV^$^Fd*tQmwXWz-%q-yi9`h zEcPI2k&h`utnZ7~Dj#mY-gZ!-g9PP$9qe)<8?vDc0lIiv#Cre7coo$PK*j;CNA z^Aygqb_M<=!04x&d!OOf{ZV6vDtrCF$&KK$Vsq!Y2|tTGMT0>bgDXydih z#)U@tGw?@e&6WD6&0q2Fq14sN?-DmTE4_)Vav5&trrG-)ZrwcETHZ$%0XVz#aB2s= z)jQk!pRa52BvRFc`c%jA&)yfa{2T$|3b~)k$hXb8ILjFiO>9?@g<>FIw^YF&W-Cs9 zAIC!1pwu@iJsK3WLyb$P-EV>FpN@{SpmY8X+Hn(ohqB#BGTv+2qFy_bFhC21G2grv zM}Vtqa?UTHuUo#Zm2#?#x#%ReP19eK`*IYqkSGqG$5Yk;p~P&iME94GK5ltn9cK&B zja8v;ggWn06!43R#PZoO%=gl&x00u?3og&aU{IID>yu1&eijR(FG@TfYmy4N@4H3L zh{m?BVy`Sxy#3;^?L^3q-2~Y#^qipw5iTjic~&{V1Sacw!;!B^5*oTz$4OAQMj#gI zRKztTNp)5ItN<~DhH9$q-2q$0O0noF0K75l#H)y^S}WgIT&{YNL}w=&kh>oTOH~-{ z)Rks7Wz3@pQrXHo9fSyE?8| zPt#=RctY37K2bsutXpqeRfKCq+hB}`wR1p_v(BQ;w_P-O4RIQgF7vf_F0Rrg0n%;8 z@w!wbZH&s0P}3dy5t3(yAIAUpGPM6FOzVYx?zmTg_(9q1Ke1~Lzw3MjI#B8?9^xtJ zK*d5rCjSWH*>kdbam~h4{}s9Co7@X8OH8SpQqvwmw7b~9yc6hPBB!sIT48gR+J?vV zhJo-CBymgl&%`ZAlj%=Z0w!h;QYVKV@Sik4U`JwVv}^iZCo?!uzmv&?RT%!TONu$g z$?SSa?0))H_vimtk^5!#mfIH<810+oQMiw6br_u4HkM0QP!bvSL5JmpirwZd2>23$ zejeUk2rH_L+zuHvWGpCzA2u9i7Y=37?Vj*}7lep>Q?rb;qDrL<3VGw!Fxs{Iw)Nh_ zO!Z?XJRt*qMda@U@;|mYe*Bca(QozWGAVOvBwG%>KVHs3NarvrmRsPF)x23F=KIi* zM$@BNvDl8{WE`CO7@^iu@V75y6A>Y?8fVYQd=ml-9gc$KoL{PW6mj^ygk=RvMmQyg za|KJANc?lwrMkJ&KYd%CSeHp7{VF1PNk$oxe|YSX_jg=x1HDl?j#;+KBJ60+*c}T! z(y&c%Z=lBpLxn|COxDfE8&Ft6T9@`-p1VMHrAzO3Tt>-fdS#Y7Mc7|~{HlhA#R+jl zAp!CnT3VpT9Ld(8By;&0ApHUJpuf1nXC@-R8jr!i_aJ^-%28gv7dFa#VPj)f9C_u} zQ(zyqSIV~mn)&(GlS?g-Whug};m}bEZ~)z_IL=*kPqgaTY=@AJ1as7)FhL3uAEs9@ zI1hjTpWHGs63vr8n?oYeb13z2ydhJg1Z;%?qUw#c#>a4;| z#UD{CvMUgXh|9uw41^^yB|ERCbc#H#5V8_G86VdQS2*v~IaJselhPQtPx6Y?n(ZND zawXs3)RrU_zO3SO`tEqCxGf60ke{VZh4mdh1c^Z-^09_}rZbFs9E`5k3F0b+p5|5e zs8E%4CJ;IRZ^XmUbZnGrD~1<+nhesWEKk zv1~c*tbkVLT?L%%3NR%=!V+Zy` z%<3&#uL6U1*|3~3Bnj{|`V-CDwo7OoypFXM3pFAY!wImfbhg8)?^+}G7mfvJ^_YAL zT*I#<7l7-Q49<8O5%)De>n2@vm7VU;YlMT#t>nH})~#k~2R*V*<5;W1Dh(v=3Pvw) zoH>!m<>X&9eqUcv35g>r{Ogd_mZNp{Cgmc{V(++QC2 zJ{-p6xt1mz&k`67QHF>b35!JYB=h9IfeByo-?+xO6{6ezZ*k4^=-#T0*QCkQKWu~@_(uZ(sn;nnM6&|{hEgG$AOV9QxYUI2O+k#X#F_}rYpfA z+rU5qkL`S(1{r8uRfic5@zShc za_3DQbZk_GShQJ&HkW|k)INjZ!x7vpGl4BIRZYNtmk~A-ZSX2> zlx11wBuIR8&LO;I?NlDRFThXi9mK_`GPuBkl~hx0{3vr}hSF^i84Jj2#@*=~XeQ>> zuWS+!m6~tdqZG+D>Xxx>g9VGB|6h&18nnxr+EKb3r-I?~T3L-Hld1(5SruaHJJ*ul zUU_N&FEVVFd0pM)tx&8Z0{v8GQLy^BK@?16_77biV4Fi%gd~FNDnYW7^OMOZG5^6q zBZka^mzCfU`a34_NTrHOr=^4X$vI`rlD?QZ=HLh%FYh({68%R)2v5tn|5)Cf({ z4&72VWcu(YcFMtsiXSNo43p!CAo?6xq*L$L_VL;_S6H&Dkbk=SG(6p3!lS~uwqPKo z60g%d@TQsD=;Qw2ys^LL;h@Qm=9avOV%J5kQ@|fQMCFC1pr8Uf_Fp&z;{MR;Ad(|K zTMr@v2Ti@4I2wo(g+rI6jB?m$Id_Siq~a9j8~PNR6cH{@UednNbR}?xY4ZW1GTgZS zm&zFJx6r-5a&{o3l@l#1jzhCrHTw_GFsEr`i;IJ@&Bj(9w9A9#yv-usuZHlwg*}R7 z^{{gr-ewHTNf&C{7jmSD&Ut6|pK_uKvzR(k1&X4=?tn-|xP^%XA}C&*7s_1c8x{1l z);(jSh{7clG=9mb0W2=l@?~CnNwg`Dm)GTR2AMnjsBDyHxPz#=KWCU7676Cyi??;V_c3Bj?N33*b z!+I2zrgDyP?qFdXfuqD+)DQb_UAo=0l!9j?3S$RT+>-{)stA=_4eN*Ai%Qu7MW`JL z{2jz)!;9!+(lLgbt6ll(yO^W9}ky+Rc4B*Au4qwk17Mq(q zsF9EbI7G=AN&=0f+R`@9u}n9*Rw~{?LT=Mzs)nW}>#)kjXG4YJ>7d6vQ(WS8T5@}n z2nk0Hl~{7`Wa_iU{sOr{yBO2Lk2JZ6xOOllsQ1dww5o>N#}86u!^1niTvk&B&u*Bo zS!nSjyMehge+A|L&Vl|TDF@J?sQy%9+F%LH`NZeT!w*aU4Xzpjd|sY-y*w`7%6m_TIGIh< 不只是最快的 google drive 拷贝工具 [与其他工具的对比](./compare.md) +> 不只是最快的 google drive 拷貝工具 [與其他工具的對比](./compare.md) -> 我就只寫我修改過的部分吧 具體說明還是看[這邊](https://github.com/iwestlin/gd-utils)和[這邊](https://github.com/vitaminx/gd-utils)吧 +> 我的readme可能不夠完全, 主要寫上我更新、修改的內容, 具體說明還是看[這邊](https://github.com/iwestlin/gd-utils)和[這邊](https://github.com/vitaminx/gd-utils)吧 ## 更新紀錄 -2020.07.07 整體繁體化, 新增用戶可以在config.js自訂按鈕顯示的個數(每列), 可設定為1或2 +### 2020.07.07 + - 整體繁體化, 介面部分 + - 新增用戶可以在config.js自訂按鈕顯示的個數(每列), 可設定為1或2 +### 2020.07.06以前 + - 部分繁體中文化 + - 執行/task命令時, 會回傳完成度百分比 + - 複製完成時, 跳出的通知會顯示文件大小 ## tg_bot 修改部分 - 執行/task命令時, 會回傳完成度百分比 ![](./pic/example2.png) -- 貼上分享連結時, 新增更多可用的常用選項, 不用每次都另外輸入dst ID - - 這邊預設三個複製目的地都相同, 皆為`config.js`中的`DEFAULT_TARGET` - - 修改處在[`config.js`](./config.js), `COPY_TARGET2` `COPY_TARGET2`, 賦值上對應的dstID就行 - - ![](./pic/example1.png) - 複製完成時, 跳出的通知會顯示文件大小 ![](./pic/example3.png) @@ -25,26 +26,26 @@ - ssl另外配置在nginx服務當中(後面會說明證書放置路徑) - 具體安裝條件、限制請去參考[腳本原作者的專案](https://github.com/vitaminx/gd-utils) - 這邊放了貼上就能用的命令 - - gdutils项目一键部署脚本(包括“查询转存”和“TG机器人”两部分) + - gdutils項目一鍵部署腳本(包括“查詢轉存”和“TG機器人”兩部分) ``` bash -c "$(curl -fsSL https://raw.githubusercontent.com/liaojack8/gd-utils-cht/master/gdutilsinstall.sh)" ``` - - gdutils项目一键部署脚本之“转存查询部分” + - gdutils項目一鍵部署腳本之“轉存查詢部分” ``` bash -c "$(curl -fsSL https://raw.githubusercontent.com/liaojack8/gd-utils-cht/master/gdutilscsinstall.sh)" ``` - - gdutils项目一键部署脚本之“TG机器人部分” + - gdutils項目一鍵部署腳本之“TG機器人部分” ``` bash -c "$(curl -fsSL https://raw.githubusercontent.com/liaojack8/gd-utils-cht/master/gdutilsbotinstall.sh)" ``` -- 安装过程中需要输入一下四个参数: - - 机器人TOKEN:这个在Telegram里面找“@BotFather”注册即可获得 - - Telegram用户ID:在Telegram里面向机器人@userinfobot发送消息即可获得 - - Google team drive ID:即为你转存文件的默认地址,脚本强制要求写谷歌团队盘ID +- 安裝過程中需要輸入一下四個參數: + - 機器人TOKEN:這個在Telegram裡面找“@BotFather”註冊即可獲得 + - Telegram用戶ID:在Telegram裡面向機器人@userinfobot发送消息即可獲得 + - Google team drive ID:即為你轉存文件的預設地址,腳本強制要求寫Google小組雲端硬碟ID - 域名:你在cloudflare上解析到VPS的域名(格式:abc.34513.com) - - 脚本安装问题请信息发给TG:onekings 或 vitaminor@gmail.com - - 系统使用问题(如无法转存、重启连不上机器人等等)请联系项目作者@vegg -- 测试可用完美安装系统: + - 腳本安裝問題請信息發給TG:onekings 或 vitaminor@gmail.com + - 系統使用問題(如無法轉存、重啟連不上機器人等等)請聯系項目作者@vegg +- 測試可用完美安裝系統: - Centos 7/8 - debian 9/10 - ubuntu 16.04/18.04/19.10/20.04 @@ -58,96 +59,96 @@ 6. 設定完成後, 確認主機的端口開放 7. 執行安裝腳本, 就會自動以nginx起動服務, 特別設定了http轉https的跳轉 -## 功能简介 +## 功能簡介 本工具目前支持以下功能: -- 统计任意(您拥有相关权限的,下同,不再赘述)目录的文件信息,且支持以各种形式(html, table, json)导出。 -支持中断恢复,且统计过的目录(包括其所有子孙目录)信息会记录在本地数据库文件中(gdurl.sqlite) -请在本项目目录下命令行输入 `./count -h` 查看使用帮助 +- 統計任意(您擁有相關權限的,下同,不再贅述)目錄的文件信息,且支持以各種形式(html, table, json)導出。 +支持中斷恢覆,且統計過的目錄(包括其所有子孫目錄)信息會記錄在本地數據庫文件中(gdurl.sqlite) +請在本項目目錄下命令行輸入 `./count -h` 查看使用幫助 -- 拷贝任意目录所有文件到您指定目录,同样支持中断恢复。 -支持根据文件大小过滤,可输入 `./copy -h` 查看使用帮助 +- 拷貝任意目錄所有文件到您指定目錄,同樣支持中斷恢覆。 +支持根據文件大小過濾,可輸入 `./copy -h` 查看使用幫助 -- 对任意目录进行去重,删除同一目录下的md5值相同的文件(只保留一个),删除空目录。 -命令行输入 `./dedupe -h` 查看使用帮助 +- 對任意目錄進行去重,刪除同一目錄下的md5值相同的文件(只保留一個),刪除空目錄。 +命令行輸入 `./dedupe -h` 查看使用幫助 -- 在 config.js 里完成相关配置后,可以将本项目部署在(可正常访问谷歌服务的)服务器上,提供 http api 文件统计接口 +- 在 config.js 里完成相關配置後,可以將本項目部署在(可正常訪問Google服務的)服務器上,提供 http api 文件統計接口 -- 支持 telegram bot,配置完成后,上述功能均可通过 bot 进行操作 +- 支持 telegram bot,配置完成後,上述功能均可通過 bot 進行操作 -## 环境配置 -本工具需要安装nodejs,客户端安装请访问[https://nodejs.org/zh-cn/download/](https://nodejs.org/zh-cn/download/),服务器安装可参考[https://github.com/nodesource/distributions/blob/master/README.md#debinstall](https://github.com/nodesource/distributions/blob/master/README.md#debinstall) +## 環境配置 +本工具需要安裝nodejs,客戶端安裝請訪問[https://nodejs.org/zh-cn/download/](https://nodejs.org/zh-cn/download/),服務器安裝可參考[https://github.com/nodesource/distributions/blob/master/README.md#debinstall](https://github.com/nodesource/distributions/blob/master/README.md#debinstall) -建议选择v12版本的node,以防接下来安装依赖出错。 +建議選擇v12版本的node,以防接下來安裝依賴出錯。 -如果你的网络环境无法正常访问谷歌服务,需要先在命令行进行一些配置:(如果可以正常访问则跳过此节) +如果你的網絡環境無法正常訪問Google服務,需要先在命令行進行一些配置:(如果可以正常訪問則跳過此節) ``` http_proxy="YOUR_PROXY_URL" && https_proxy=$http_proxy && HTTP_PROXY=$http_proxy && HTTPS_PROXY=$http_proxy ``` -请把`YOUR_PROXY_URL`替换成你自己的代理地址 +請把`YOUR_PROXY_URL`替換成你自己的代理地址 -## 依赖安装 -- 命令行执行`git clone https://github.com/iwestlin/gd-utils && cd gd-utils` 克隆并切换到本项目文件夹下 -- **执行 `npm install --unsafe-perm=true --allow-root` 安装依赖**,部分依赖可能需要代理环境才能下载,所以需要上一步的配置 +## 依賴安裝 +- 命令行執行`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命令,可参考[这里](https://askubuntu.com/questions/192645/make-command-not-found)或直接google搜索`Make Command Not Found` +如果在安裝過程中发生報錯,請切換nodejs版本到v12再試。如果報錯信息里有`Error: not found: make`之類的消息,說明你的命令行環境缺少make命令,可參考[這里](https://askubuntu.com/questions/192645/make-command-not-found)或直接google搜索`Make Command Not Found` -如果报错信息里有 `better-sqlite3`,先执行 `npm config set unsafe-perm=true` -然后 `rm -rf node_module` 删掉依赖目录,最后再执行下`npm i`安装试试。 +如果報錯信息里有 `better-sqlite3`,先執行 `npm config set unsafe-perm=true` +然後 `rm -rf node_module` 刪掉依賴目錄,最後再執行下`npm i`安裝試試。 -依赖安装完成后,项目文件夹下会多出个`node_modules`目录,请不要删除它,接下来进行下一步配置。 +依賴安裝完成後,項目文件夾下會多出個`node_modules`目錄,請不要刪除它,接下來進行下一步配置。 ## Service Account 配置 -强烈建议使用service account(后称SA), 获取方法请参见 [https://gsuitems.com/index.php/archives/13/](https://gsuitems.com/index.php/archives/13/#%E6%AD%A5%E9%AA%A42%E7%94%9F%E6%88%90serviceaccounts) -获取到 SA 的 json 文件后,请将其拷贝到 `sa` 目录下 +強烈建議使用service account(後稱SA), 獲取方法請參見 [https://gsuitems.com/index.php/archives/13/](https://gsuitems.com/index.php/archives/13/#%E6%AD%A5%E9%AA%A42%E7%94%9F%E6%88%90serviceaccounts) +獲取到 SA 的 json 文件後,請將其拷貝到 `sa` 目錄下 -配置好 SA 以后,如果你不需要对个人盘下的文件进行操作,可跳过[个人帐号配置]这节,而且执行命令的时候,记得带上 `-S` 参数告诉程序使用SA授权进行操作。 +配置好 SA 以後,如果你不需要對個人盤下的文件進行操作,可跳過[個人帳號配置]這節,而且執行命令的時候,記得帶上 `-S` 參數告訴程序使用SA授權進行操作。 -## 个人帐号配置 -- 命令行执行 `rclone config file` 找到 rclone 的配置文件路径 -- 打开这个配置文件 `rclone.conf`, 找到 `client_id`, `client_secret` 和 `refresh_token` 这三个变量,将其分别填入本项目下的 `config.js` 中,需要注意这三个值必须被成对的英文引号包裹,且引号后以英文逗号结尾,也就是需要符合JavaScript的[对象语法](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer) +## 個人帳號配置 +- 命令行執行 `rclone config file` 找到 rclone 的配置文件路徑 +- 打開這個配置文件 `rclone.conf`, 找到 `client_id`, `client_secret` 和 `refresh_token` 這三個變量,將其分別填入本項目下的 `config.js` 中,需要注意這三個值必須被成對的英文引號包裹,且引號後以英文逗號結尾,也就是需要符合JavaScript的[對象語法](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Object_initializer) -如果你没有配置过rclone,可以搜索`rclone google drive 教程`完成相关配置。 +如果你沒有配置過rclone,可以搜索`rclone google drive 教程`完成相關配置。 -如果你的`rclone.conf`里没有`client_id`和`client_secret`,说明你配置rclone的时候默认用了rclone自己的client_id,连rclone自己[都不建议这样做](https://github.com/rclone/rclone/blob/8d55367a6a2f47a1be7e360a872bd7e56f4353df/docs/content/drive.md#making-your-own-client_id),因为大家共享了它的接口调用限额,在使用高峰期可能会触发限制。 +如果你的`rclone.conf`里沒有`client_id`和`client_secret`,說明你配置rclone的時候默認用了rclone自己的client_id,連rclone自己[都不建議這樣做](https://github.com/rclone/rclone/blob/8d55367a6a2f47a1be7e360a872bd7e56f4353df/docs/content/drive.md#making-your-own-client_id),因為大家共享了它的接口調用限額,在使用高峰期可能會觸发限制。 -获取自己的clinet_id可以参见这两篇文章:[Cloudbox/wiki/Google-Drive-API-Client-ID-and-Client-Secret](https://github.com/Cloudbox/Cloudbox/wiki/Google-Drive-API-Client-ID-and-Client-Secret) 和 [https://p3terx.com/archives/goindex-google-drive-directory-index.html#toc_2](https://p3terx.com/archives/goindex-google-drive-directory-index.html#toc_2) +獲取自己的clinet_id可以參見這兩篇文章:[Cloudbox/wiki/Google-Drive-API-Client-ID-and-Client-Secret](https://github.com/Cloudbox/Cloudbox/wiki/Google-Drive-API-Client-ID-and-Client-Secret) 和 [https://p3terx.com/archives/goindex-google-drive-directory-index.html#toc_2](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 +獲取到client_id和client_secret後,再次執行一遍`rclone config`,創建一個新的remote,**在配置過程中一定要填入你新獲取的clinet_id和client_secret**,就能在`rclone.conf`里看到新獲取的`refresh_token`了。**注意,不能使用之前的refrest_token**,因為它對應的是rclone自帶的client_id -参数配置好以后,在命令行执行 `node check.js`,如果命令返回了你的谷歌硬盘根目录的数据,说明配置成功,可以开始使用本工具了。 +參數配置好以後,在命令行執行 `node check.js`,如果命令返回了你的Google雲端硬碟根目錄的數據,說明配置成功,可以開始使用本工具了。 ## Bot配置 -如果要使用 telegram bot 功能,需要进一步配置。 +如果要使用 telegram bot 功能,需要進一步配置。 -首先在 [https://core.telegram.org/bots#6-botfather](https://core.telegram.org/bots#6-botfather) 根据指示拿到 bot 的 token,然后填入 config.js 中的 `tg_token` 变量。 +首先在 [https://core.telegram.org/bots#6-botfather](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']`,就代表只允许我自己使用这个机器人了。 +然後獲取自己的 telegram username,這個username不是顯示的名稱,而是tg個人網址後面的那串字符,比如,我的tg個人網址是 `https://t.me/viegg` ,用戶名就是 `viegg`,獲取用戶名的目的是在代碼里配置白名單,只允許特定的用戶調用機器人。將username填入 `config.js`里的配置,像這樣: +`tg_whitelist: ['viegg']`,就代表只允許我自己使用這個機器人了。 -如果想把机器人的使用权限分享给别的用户,只需要改成这样子: `tg_whitelist: ['viegg', '其他人的username']` +如果想把機器人的使用權限分享給別的用戶,只需要改成這樣子: `tg_whitelist: ['viegg', '其他人的username']` -## 补充说明 -在`config.js`文件里,还有另外的几个参数: +## 補充說明 +在`config.js`文件里,還有另外的幾個參數: ``` -// 单次请求多少毫秒未响应以后超时(基准值,若连续超时则下次调整为上次的2倍) +// 單次請求多少毫秒未響應以後超時(基準值,若連續超時則下次調整為上次的2倍) const TIMEOUT_BASE = 7000 -// 最大超时设置,比如某次请求,第一次7s超时,第二次14s,第三次28s,第四次56s,第五次不是112s而是60s,后续同理 +// 最大超時設置,比如某次請求,第一次7s超時,第二次14s,第三次28s,第四次56s,第五次不是112s而是60s,後續同理 const TIMEOUT_MAX = 60000 -const LOG_DELAY = 5000 // 日志输出时间间隔,单位毫秒 -const PAGE_SIZE = 1000 // 每次网络请求读取目录下的文件数,数值越大,越有可能超时,不得超过1000 +const LOG_DELAY = 5000 // 日志輸出時間間隔,單位毫秒 +const PAGE_SIZE = 1000 // 每次網絡請求讀取目錄下的文件數,數值越大,越有可能超時,不得超過1000 -const RETRY_LIMIT = 7 // 如果某次请求失败,允许其重试的最大次数 -const PARALLEL_LIMIT = 20 // 网络请求的并行数量,可根据网络环境调整 +const RETRY_LIMIT = 7 // 如果某次請求失敗,允許其重試的最大次數 +const PARALLEL_LIMIT = 20 // 網絡請求的並行數量,可根據網絡環境調整 -const DEFAULT_TARGET = '' // 必填,拷贝默认目的地ID,如果不指定target,则会拷贝到此处,建议填写团队盘ID,注意要用英文引号包裹 +const DEFAULT_TARGET = '' // 必填,拷貝默認目的地ID,如果不指定target,則會拷貝到此處,建議填寫團隊盤ID,注意要用英文引號包裹 ``` -读者可根据各自情况进行调整 +讀者可根據各自情況進行調整 -## 注意事项 -程序的原理是调用了[google drive官方接口](https://developers.google.com/drive/api/v3/reference/files/list),递归获取目标文件夹下所有文件及其子文件夹信息,粗略来讲,某个目录下包含多少个文件夹,就至少需要这么多次请求才能统计完成。 +## 注意事項 +程序的原理是調用了[google drive官方接口](https://developers.google.com/drive/api/v3/reference/files/list),遞歸獲取目標文件夾下所有文件及其子文件夾信息,粗略來講,某個目錄下包含多少個文件夾,就至少需要這麽多次請求才能統計完成。 -目前尚不知道google是否会对接口做频率限制,也不知道会不会影响google账号本身的安全。 +目前尚不知道google是否會對接口做頻率限制,也不知道會不會影響google賬號本身的安全。 -**请勿滥用,后果自负** +**請勿濫用,後果自負**