大人的Greasyfork

在Greasyfork的搜索结果中添加Sleazyfork上的成人脚本,增加评分与版本号,并在访问匿名不可用脚本时跳转至Sleazyfork

当前为 2021-12-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Greasyfork Search with Sleazyfork Results include
  3. // @name:zh-CN 大人的Greasyfork
  4. // @name:zh-TW 大人的Greasyfork
  5. // @name:ja 大人のGreasyfork
  6. // @namespace hoothin
  7. // @version 0.89
  8. // @description Merge adult results of sleazyfork into greasyfork when the script is no longer anonymously available, add rating score and version for scripts then
  9. // @description:zh-CN 在Greasyfork的搜索结果中添加Sleazyfork上的成人脚本,增加评分与版本号,并在访问匿名不可用脚本时跳转至Sleazyfork
  10. // @description:zh-TW 在Greasyfork的搜索結果中添加Sleazyfork上的成人腳本,增加評分與版本號,並在訪問匿名不可用腳本時跳轉至Sleazyfork
  11. // @description:ja 脚本付けるSleazyfork上の成人脚本検索結果からGreasyfork、脚本付ける採点とバージョン番号を訪問匿名利用できない脚本にジャンプからSleazyfork
  12. // @author hoothin
  13. // @include http*://greasyfork.org/*
  14. // @include http*://www.greasyfork.org/*
  15. // @include http*://sleazyfork.org/*
  16. // @include http*://www.sleazyfork.org/*
  17. // @grant GM_xmlhttpRequest
  18. // @grant GM_setValue
  19. // @grant GM_getValue
  20. // @connect greasyfork.org
  21. // @connect sleazyfork.org
  22. // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=rixixi@sina.com&item_name=Greasy+Fork+donation
  23. // @contributionAmount 1
  24. // ==/UserScript==
  25.  
  26. (function() {
  27. 'use strict';
  28. if(document.querySelector('span.sign-in-link')){
  29. var otherSite=/greasyfork\.org/.test(location.hostname)?"sleazyfork":"greasyfork";
  30. if(/scripts\/\d+/.test(location.href)){
  31. if(!document.querySelector("#script-info") && (otherSite == "greasyfork" || document.querySelector("div.width-constraint>section>p>a").href.indexOf("sign_in")!=-1)){
  32. location.href=location.href.replace(/\/\/([^\.]+\.)?(greasyfork|sleazyfork)\.org/,"//$1"+otherSite+"\.org");
  33. }
  34. }else if(/\/(scripts|users)(\/|.*(\?|&)q=|.*\?set=)/.test(location.href)){
  35. GM_xmlhttpRequest({
  36. method: 'GET',
  37. url: location.href.replace(/\/\/([^\.]+\.)?(greasyfork|sleazyfork)\.org/,"//$1"+otherSite+"\.org"),
  38. onload: function(result) {
  39. var doc = null;
  40. try {
  41. doc = document.implementation.createHTMLDocument('');
  42. doc.documentElement.innerHTML = result.responseText;
  43. }
  44. catch (e) {
  45. console.log('parse error');
  46. }
  47. if (!doc) {
  48. return;
  49. }
  50. var l = doc.querySelector('ol.script-list');
  51. if (l) {
  52. var ml = document.querySelector('ol.script-list');
  53. if(!ml){
  54. ml=document.createElement("ol");
  55. ml.setAttribute("class","script-list");
  56. var list=document.querySelector('.sidebarred-main-content');
  57. var ps=list.querySelectorAll("p");
  58. for(let i=0;i<ps.length;i++){
  59. let p=ps[i];
  60. list.removeChild(p);
  61. }
  62. list.appendChild(ml);
  63. }
  64. var scs=l.querySelectorAll("li");
  65. if(scs){
  66. for(let i=0;i<scs.length;i++){
  67. let sc=scs[i];
  68. if(!ml.querySelector("li[data-script-id='"+sc.getAttribute("data-script-id")+"']")){
  69. //addScore(sc);
  70. ml.appendChild(sc);
  71. }
  72. }
  73. }
  74. }
  75. },
  76. onerror: function(e) {
  77. console.log(e);
  78. }
  79. });
  80. }
  81. }
  82. function addScore(script){
  83. var separator=script.querySelector('h2>span.name-description-separator');
  84. var description=script.querySelector('h2>span.description');
  85. if(separator){
  86. var score=document.createElement("strong");
  87. score.style.color="#e09015";
  88. score.innerHTML=script.getAttribute("data-script-rating-score");
  89. separator.parentNode.insertBefore(score,separator);
  90. }
  91. if(description)description.innerHTML+="<strong>Ver."+script.getAttribute("data-script-version")+"</strong>"+'<div id="install-area" style="display:none;float: right;position: relative;"><a class="install-link" href="'+script.querySelector('h2>a').href.replace(/(\d)-.*/,"$1")+'/code/script.user.js">Install</a></div>';
  92. var installArea=script.querySelector("#install-area");
  93. if(installArea){
  94. script.onmouseover=function(e){
  95. installArea.style.display="block";
  96. };
  97. script.onmouseout=function(e){
  98. installArea.style.display="none";
  99. };
  100. }
  101. }
  102. var sortDiv=document.querySelector("#script-list-sort");
  103. if(sortDiv){
  104. var switchFilter=document.createElement("div"),enableFilter=!GM_getValue("disableFilter");
  105. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
  106. var observer = new MutationObserver(function(records){
  107. records.map(function(record) {
  108. for(var i=0;i<record.addedNodes.length;i++){
  109. var curNode=record.addedNodes[i];
  110. if(curNode.className=="script-list"){
  111. var scripts=curNode.querySelectorAll('li');
  112. for(let i=0;i<scripts.length;i++){
  113. let script=scripts[i];
  114. addScore(script);
  115. }
  116. if(enableFilter)filter(curNode);
  117. }else if(curNode.tagName=="LI"){
  118. addScore(curNode);
  119. if(enableFilter)filter(curNode);
  120. }
  121. }
  122. });
  123. });
  124. var option = {
  125. 'childList': true
  126. };
  127. observer.observe(document.querySelector("body>.width-constraint .sidebarred-main-content"), option);
  128. observer.observe(document.querySelector("body>.width-constraint #browse-script-list"), option);
  129. var scripts=document.querySelectorAll('ol.script-list>li');
  130. for(let i=0;i<scripts.length;i++){
  131. let script=scripts[i];
  132. addScore(script);
  133. }
  134. //Modify from GreasyFork Bullshit Filter,Thanks to darkred
  135. var style = document.createElement('style');
  136. style.textContent = 'li.filtered { display:none !important; }';
  137. style.type = 'text/css';
  138. document.querySelector('head').appendChild(style);
  139. var bullshit=/vip.*视频|网课|刷课|mooc.*答题|百度|网盘|網盤|云盘|Baidu|AntiGame|split|Agar|\.io(\b|:|\/|\.|$)|ExtencionRipXChetoMalo|AposBot|DFxLite|ZTx-Lite|AposFeedingBot|AposLoader|Blah Blah|Orc Clan Script|Astro\s*Empires|^\s*Attack|^\s*Battle|BiteFight|Blood\s*Wars|Bots|Bots4|Brawler|\bBvS\b|Business\s*Tycoon|Castle\s*Age|City\s*Ville|Comunio|Conquer\s*Club|CosmoPulse|Dark\s*Orbit|Dead\s*Frontier|\bDOA\b|DotD|Dossergame|Dragons\s*of\s*Atlantis|Dugout|\bDS[a-z]+\n|Empire\s*Board|eRep(ublik)?|Epic.*War|ExoPlanet|Falcon Tools|Feuerwache|Farming|FarmVille|Fightinfo|Frontier\s*Ville|Ghost\s*Trapper|Gladiatus|Goalline|Gondal|Grepolis|Hobopolis|\bhwm(\b|_)|Ikariam|\bIT2\b|Jellyneo|Kapi\s*Hospital|Kings\s*Age|Kingdoms?\s*of|knastv(ö|oe)gel|Knight\s*Fight|\b(Power)?KoC(Atta?ck)?\b|\bKOL\b|Kongregate|Last\s*Emperor|Legends?\s*of|Light\s*Rising|Lockerz|\bLoU\b|Mafia\s*(Wars|Mofo)|Menelgame|Mob\s*Wars|Mouse\s*Hunt|Molehill\s*Empire|NeoQuest|MyFreeFarm|Neopets|Nemexia|\bOGame\b|Ogar(io)?|Pardus|Pennergame|Pigskin\s*Empire|PlayerScripts|Popmundo|Po?we?r\s*(Bot|Tools)|PsicoTSI|Ravenwood|Schulterglatze|slitheriogameplay|SpaceWars|\bSW_[a-z]+\n|\bSnP\b|The\s*Crims|The\s*West|Travian|Treasure\s*Isl(and|e)|Tribal\s*Wars|TW.?PRO|Vampire\s*Wars|War\s*of\s*Ninja|West\s*Wars|\bWoD\b|World\s*of\s*Dungeons|wtf\s*battles|Wurzelimperium/i;
  140. var filterName="Enable Filter",filteredNum=0;
  141. var filter=function(t){
  142. [].forEach.call(t.querySelectorAll('article>h2'), function(item) {
  143. if(bullshit.test(item.innerText)){
  144. item.parentNode.parentNode.classList.add('filtered');
  145. filteredNum++;
  146. }
  147. });
  148. };
  149. if(enableFilter)filter(document);
  150. switchFilter.innerHTML='<input type="checkBox" name="switchFilter" id="switchFilter"/><label for="switchFilter">'+filterName+(filteredNum?' ('+filteredNum+' filtered)':'')+'</label>';
  151. var switchFilterCheckbox=switchFilter.querySelector('#switchFilter');
  152. var switchFilterLabel=switchFilterCheckbox.nextSibling;
  153. switchFilterCheckbox.checked=enableFilter;
  154. switchFilterCheckbox.onclick=function(){
  155. if(enableFilter){
  156. [].forEach.call(document.querySelectorAll('li.filtered'), function(item) {
  157. item.classList.remove('filtered');
  158. });
  159. switchFilterLabel.innerHTML=filterName;
  160. }else{
  161. filteredNum=0;
  162. filter(document);
  163. switchFilterLabel.innerHTML=filterName+' ('+filteredNum+' filtered)';
  164. }
  165. GM_setValue("disableFilter",enableFilter);
  166. enableFilter=!enableFilter;
  167. };
  168. sortDiv.insertBefore(switchFilter,sortDiv.firstChild);
  169. }
  170. })();