Gofile Link Resolver

resolve link from gofile

安装此脚本?
作者推荐脚本

您可能也喜欢Arca base64 autodecoder

安装此脚本
  1. // ==UserScript==
  2. // @name Gofile Link Resolver
  3. // @namespace GFLR_V1D
  4. // @version 1.0
  5. // @description resolve link from gofile
  6. // @icon https://www.google.com/s2/favicons?sz=64&domain=gofile.io
  7. // @author Laria
  8. // @match https://gofile.io/d/*
  9. // @license MIT
  10. // @grant none
  11.  
  12. // ==/UserScript==
  13. 'use strict';
  14. let taskRepID = -1;
  15.  
  16. const gfsprefix = '[®] ';
  17.  
  18. const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
  19.  
  20. function waitForElm(selector) {
  21. return new Promise(resolve => {
  22. if (document.querySelector(selector)) {
  23. return resolve(document.querySelector(selector));
  24. }
  25. const observer = new MutationObserver(mutations => {
  26. if (document.querySelector(selector)) {
  27. observer.disconnect();
  28. resolve(document.querySelector(selector));
  29. }
  30. });
  31. observer.observe(document.body, {
  32. childList: true,
  33. subtree: true
  34. });
  35. });
  36. }
  37.  
  38. async function replaceLink(gfdb) {
  39. //try to get file db list
  40. let filedb = null;
  41.  
  42. let target_db = appdata.fileManager.mainContent.data;
  43. if (target_db.hasOwnProperty('children')) {
  44. filedb = target_db.children;
  45. } else if (target_db.hasOwnProperty('contents')) {//deprecated in V2
  46. filedb = target_db.contents;
  47. } else {
  48. console.error('cannot detect any contents in gofile internal db, please update script..', target_db);
  49. return;
  50. }
  51.  
  52. //data-item-id : file's uuid
  53. //
  54. Array.from(document.querySelector('#filemanager_itemslist').children).filter((i)=>i.getAttribute('data-item-id')).forEach((target)=>{
  55. let contid = target.getAttribute('data-item-id');
  56. target.setAttribute('data-uuid', contid); //backup id
  57. target.removeAttribute('data-item-id'); //remove id prevent interval task
  58. let contdb = filedb[contid];
  59. if (!contdb) {
  60. //no item in gofile db
  61. console.error('id:', contid, '- not found in gofile file db..');
  62. return; //skip current item, run next(foreach)
  63. } else {
  64. //item in gofile db
  65.  
  66. //chk data available
  67. if(!contdb.hasOwnProperty('name') || !contdb.hasOwnProperty('link')) {
  68. //no name or link in gofile db
  69. console.error('id:', contid, '- not found name or link in gofile file db..');
  70. return; //skip current item, run next(foreach)
  71. } else {
  72. //item ok, link,name ok
  73.  
  74. //old(with original click event)
  75. let oldLinkElem = target.querySelector('a.item_open');
  76. //new(to be replace)
  77. let newLinkElem = document.createElement("a");
  78.  
  79. //copy title
  80. newLinkElem.innerHTML = gfsprefix+oldLinkElem.innerHTML;
  81. //file link
  82. newLinkElem.href = contdb.link;
  83. newLinkElem.rel = "external nofollow noopener noreferrer";
  84. newLinkElem.target = "_blank";
  85. newLinkElem.title = GM.info.script.name + "에 의해 링크 재설정됨";
  86. //copy class
  87. newLinkElem.classList = oldLinkElem.classList;
  88. //remove item open class(remove listner)
  89. newLinkElem.classList.remove('item_open');
  90.  
  91.  
  92. if (contdb.overloaded) {
  93. //current item overloaded
  94. newLinkElem.innerHTML = '[❌] '+newLinkElem.innerHTML;
  95. newLinkElem.title += ', 다운시도 너무 많아서 일시적 잠김';
  96. }
  97.  
  98. //replace elem
  99. oldLinkElem.parentNode.replaceChild(newLinkElem, oldLinkElem);
  100. }
  101. }
  102. });
  103. }
  104.  
  105. async function disableAds() {
  106. //removed
  107. }
  108.  
  109. async function intervalTask() {
  110. await waitForElm('#filemanager_itemslist');
  111. console.log('wait gofile db..');
  112.  
  113. //await gofile db
  114. while(!appdata.hasOwnProperty('fileManager')) {
  115. await delay(100);
  116. }
  117. await disableAds(); //disable ads
  118.  
  119. //await gofile db 2
  120. while(!appdata.fileManager.mainContent.data) {
  121. await delay(100);
  122. await disableAds(); //disable ads
  123. }
  124. console.log('db loaded.');
  125.  
  126. //check hidden password form created
  127. await waitForElm('#filemanager_alert_passwordform');
  128.  
  129. //await password solved
  130. //chk form for prevent parent elem refresh
  131. await disableAds(); //disable ads
  132. while(!(document.querySelector('#filemanager_alert_passwordform') && document.querySelector('#filemanager_alert_passwordform').classList.contains('hidden'))) {
  133. await delay(100);
  134. }
  135. await disableAds(); //disable ads
  136.  
  137. //await gofile db ready
  138. while(!appdata.fileManager.mainContent.data.canAccess) {
  139. await delay(100);
  140. await disableAds(); //disable ads
  141. }
  142. await disableAds(); //disable ads
  143.  
  144. //hide ads area
  145. document.querySelector('#index_ads').style.display = 'none';
  146. await replaceLink(appdata);
  147. console.log('resolve finished.');
  148. await disableAds(); //disable ads
  149. }
  150.  
  151. async function rootProcedure(){
  152. await intervalTask();
  153. //taskRepID = setInterval(intervalTask, 100);
  154. //setTimeout(() => { clearInterval(taskRepID); }, 5000);
  155. }
  156.  
  157.  
  158. window.addEventListener('load', () => setTimeout(rootProcedure, 100));

QingJ © 2025

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