天翼云盘cloud.189.cn批量转存

当天翼云文件夹超过1000时使用最合适,低于1000文件请用天翼云自带功能!

目前為 2024-07-06 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name 天翼云盘cloud.189.cn批量转存
  3. // @namespace StartMenu
  4. // @version 1.0
  5. // @description 当天翼云文件夹超过1000时使用最合适,低于1000文件请用天翼云自带功能!
  6. // @author StartMenu
  7. // @license MIT
  8. // @match https://cloud.189.cn/web/share?code=*
  9. // @icon https://www.google.com/s2/favicons?domain=189.cn
  10. // @grant GM_addStyle
  11. // @grant GM_addElement
  12.  
  13. // @ 测试用: https://cloud.189.cn/web/share?code=iqQjMn3e6Nfu
  14. // @ 测试用2 : https://cloud.189.cn/web/share?code=reIJv2rE7Fni
  15.  
  16. // ==/UserScript==
  17. //动作间隔,单位毫秒,根据自己的网速和电脑性能调节
  18. let ActionInterval=1000;
  19. //一次保存数量,普通用户最多1000,设太大容易卡住
  20. let SaveNumber=200;
  21. //保存文件夹名
  22. let SaveDirectoryName="批量转存-";
  23.  
  24. //以下变量不要修改
  25. //文件列表,它自己的分页都有问题,出现重复文件,会导致保存失败
  26. let NowFileList=[];
  27. //加载是否完成
  28. let LoadFinish=false;
  29. let MYloadingText;
  30.  
  31. function RemoveRepeatItem() {
  32. document.querySelectorAll(".file-list-ul>li").forEach(function (Item) {
  33. if (NowFileList.indexOf(Item.querySelector(".file-item-name-fileName-span").textContent.trim())>-1){
  34. Item.remove();
  35. }
  36. });
  37. }
  38.  
  39. function SelectListFile() {
  40. let Items=document.querySelectorAll(".file-list-ul>li");
  41. for (let i = 0; i <Items.length; i++) {
  42. if (i<=SaveNumber){
  43. let Name=Items[i].querySelector(".file-item-name-fileName-span").textContent.trim();
  44. NowFileList.push(Name);
  45. Items[i].querySelector(".file-item-check").click();
  46. }
  47. else
  48. {
  49. break;
  50. }
  51. }
  52. //console.log("完成文件选择",NowFileList);
  53. console.log("完成文件选择:"+NowFileList.length);
  54. }
  55.  
  56. async function ClickNewSaveButton() {
  57. return new Promise(resolve => {
  58. let Interval=setInterval(function () {
  59. //点击转存
  60. let SaveButton = document.querySelector("[class^=FileListHead_file-list-li-head-select]").nextSibling.firstChild;
  61. if(SaveButton!==null){
  62. clearInterval(Interval);
  63. SaveButton.click();
  64. return resolve();
  65. }
  66. },0);
  67. });
  68. }
  69.  
  70. // document.querySelector("[class^=Directory_directory-button]")
  71. // 生成需要的文件夹
  72. async function makeDir(){
  73. return new Promise(resolve => {
  74. let makeDirCheck=setInterval(function () {
  75. //let makeDirectory=document.querySelector("[class^=Directory_directory-button]").firstChild;
  76. //makeDirectory.click();
  77.  
  78. // console.log('查找新建按钮');
  79. // console.log(makeDirectory);
  80. let url = 'https://cloud.189.cn/api/open/file/createFolder.action?noCache=0.'+Date.now();
  81. // document.querySelectorAll(".info-detail-name span")[0].textContent.trim()
  82. let data = {
  83. parentFolderId: "-11",
  84. folderName: SaveDirectoryName+document.querySelector("[class^=FileListHead_file-list-nav]").lastChild.textContent.trim()
  85. };
  86.  
  87. // 将数据转换为x-www-form-urlencoded格式
  88. let params = Object.keys(data).map(function(key) {
  89. return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]);
  90. }).join('&');
  91.  
  92. fetch(url, {
  93. method: 'POST',
  94. headers: {
  95. 'Content-Type': 'application/x-www-form-urlencoded',
  96. },
  97. body: params,
  98. })
  99. .then(function(){
  100. clearInterval(makeDirCheck);
  101. })
  102. .catch((error) => {
  103. });
  104.  
  105. return resolve();
  106. },ActionInterval);
  107. });
  108. }
  109.  
  110. /**
  111. 保存时覆盖已有的文件
  112. */
  113. function autoRewrite(){
  114. let myAutoRewrite=setInterval(function () {
  115. if(document.querySelector("[class^=HandleConflict_conflict-choose] input[type='checkbox']:not(:checked)")){
  116. document.querySelector("[class^=HandleConflict_conflict-choose] input[type='checkbox']:not(:checked)").click();
  117. }
  118. if(document.querySelector("[class^=HandleConflict_conflict-bottom-button-replace]")){
  119. document.querySelector("[class^=HandleConflict_conflict-bottom-button-replace]").click();
  120. }
  121. },ActionInterval);
  122. }
  123.  
  124.  
  125. async function SelectSaveDirectory() {
  126. let selectedDir = false;
  127. return new Promise(resolve => {
  128.  
  129. let Check=setInterval(function () {
  130. let AllDirectory=document.querySelectorAll("[class^=DirectoryTree_directory-li] [class^=DirectoryTree_c-directory-tree]>div");
  131. for (let i = 0; i < AllDirectory.length; i++) {
  132. let Name=AllDirectory[i].querySelector(".directory-name").textContent;
  133. //document.querySelectorAll(".info-detail-name span")[0].textContent.trim()
  134. if (Name===SaveDirectoryName+document.querySelector("[class^=FileListHead_file-list-nav]").lastChild.textContent.trim()){
  135. clearInterval(Check)
  136. AllDirectory[i].childNodes[0].childNodes[1].dispatchEvent(new MouseEvent("mousedown"));
  137. selectedDir = true;
  138. break;
  139. }
  140. }
  141. //目录加载完了还是没看到文件夹,刷新一下
  142. if(AllDirectory.length > 0 && !selectedDir){
  143. document.querySelector("[class^=Directory_directory-button]").nextElementSibling.click();
  144. }
  145. return resolve();
  146. },ActionInterval);
  147. });
  148. }
  149.  
  150. function ClickYesButton() {
  151. let YesButton=document.querySelector("[class^=Directory_directory-button-confirm]");
  152. YesButton.click();
  153. }
  154.  
  155. async function SaveIsDone() {
  156. // 页面切到后台会导致此方法失效,不管用下面哪种方式。 都无法检测当转存的项已经完成!
  157. /*
  158. return new Promise(resolve => {
  159. let Loading=setInterval(function () {
  160. let LoadingBlock=document.querySelector("[class^=loading_c-loading]");
  161. if (LoadingBlock.style.display==="none"){
  162. clearInterval(Loading);
  163. return resolve();
  164. }
  165. },ActionInterval);
  166. });
  167. */
  168. return new Promise(resolve => {
  169. let Loading=setInterval(function () {
  170. let LoadingBlock=document.querySelector(".ant-message .ant-message-notice");
  171. if (LoadingBlock){
  172. console.log("消息完成!");
  173. clearInterval(Loading);
  174. return resolve();
  175. }
  176. },100);
  177. });
  178.  
  179. }
  180.  
  181. function RemoveSelectItem() {
  182. let List=document.querySelectorAll(".file-list-ul .selected");
  183. for (let i = 0; i < List.length; i++) {
  184. List[i].querySelector("input").click();
  185. List[i].remove();
  186. }
  187. }
  188.  
  189.  
  190. let nowsaveIndex = 0; //当前保存到第几个文件了
  191.  
  192. async function StartSave() {
  193.  
  194. console.log("开始保存");
  195. MYloadingText.textContent="正在保存选中的文件(页面不要切到后台)";
  196. //删除重复项目
  197. RemoveRepeatItem();
  198. //选择列表文件
  199. SelectListFile();
  200. //点击转存
  201. await ClickNewSaveButton();
  202. //选择保存文件夹
  203. await SelectSaveDirectory();
  204.  
  205. //点击确定
  206. ClickYesButton();
  207. //等待转存完成
  208. await SaveIsDone();
  209. //移除选择项
  210. RemoveSelectItem();
  211. console.log("当前保存完成");
  212. if (LoadFinish&&document.querySelectorAll(".file-list-ul>li").length===0){
  213. //alert("全部保存完成");
  214. MYloadingText.textContent="全部保存完成";
  215. }
  216. else{
  217. StartSave();
  218. }
  219. }
  220.  
  221. function InitHtml() {
  222. //
  223. //document.querySelector(".info-detail")
  224. let Holder=document.querySelector(".info-detail h2");
  225. let SaveAllButton=GM_addElement(Holder,"button",{textContent:"全部保存",class:"JXNButton"});
  226.  
  227. //绑定事件
  228. SaveAllButton.onclick=function () {
  229. //隐藏保存按钮
  230. SaveAllButton.style.display="none";
  231. MYloadingText=GM_addElement(Holder,"button",{textContent:"正在加载(页面不要切到后台)",class:"JXNButton"});
  232. //先强制排一下序
  233. document.querySelector('.file-list-ul').previousElementSibling.childNodes[1].childNodes[1].click();
  234. //生成目录
  235. makeDir();
  236. //设置全局显示
  237. ScrollFileList2();
  238. }
  239. }
  240.  
  241. let trytimes = 0; //加载时尝试次数
  242. function ScrollFileList2() {
  243. let LastName=""; // 最后一个元素
  244. MYloadingText.textContent="正在加载所有文件(页面不要切到后台)";
  245. let ScrollFileList2xx=setInterval(function () {
  246. if (document.querySelector(".file-list-load")===null){
  247. //多等5秒再执行
  248. if(trytimes < 5){
  249. trytimes++;
  250. }
  251. else{
  252. //取当前最后一个文件名 .querySelector(".file-list-ul")
  253. let CheckLastName=document.querySelector(".selDiv").previousSibling.querySelector(".file-item-name-fileName-span").textContent.trim();
  254. console.log(CheckLastName);
  255. if(CheckLastName===LastName){
  256. console.log("列表全部加载完成");
  257. LoadFinish=true;
  258. MYloadingText.textContent="完成加载所有文件(页面不要切到后台)";
  259. let NowLength=document.querySelector(".file-list-ul").querySelectorAll("li").length;
  260. console.log("当前加载完成,数量"+NowLength);
  261. clearInterval(ScrollFileList2xx);
  262. StartSave();
  263. }
  264. else{
  265. LastName=CheckLastName;
  266. document.querySelector(".file-list-ul").scrollTo(0,document.querySelector(".file-list-ul").scrollHeight);
  267. }
  268. }
  269. }
  270. else {
  271. console.log("正在加载");
  272. }
  273. },ActionInterval);
  274. }
  275.  
  276.  
  277. function InitCss() {
  278. GM_addStyle(`.JXNButton {
  279. left: 0;
  280. padding: 5px 10px;
  281. background-color: #ff1eee;
  282. color: white;
  283. border: none;
  284. cursor: pointer;
  285. border-radius: 5px;
  286. }`);
  287. }
  288.  
  289. /**
  290. 调用自己,直到file-list-ul出现,再返回执行下面的操作
  291. */
  292. async function WaitUI() {
  293. return new Promise(resolve => {
  294. let CheckHtml=setInterval(function () {
  295. if (document.querySelector(".file-list-ul")!==null){
  296. clearInterval(CheckHtml);
  297. resolve();
  298. }
  299. },ActionInterval);
  300. });
  301. }
  302.  
  303. function Run() {
  304. //等待界面加载完成
  305. WaitUI().then(()=>{
  306. InitCss();
  307. InitHtml();
  308. });
  309. }
  310. Run();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址