Sleazy Fork is available in English.

RandomSexyPicParser

Random Sexy Pictures Parser

  1. // ==UserScript==
  2. // @name RandomSexyPicParser
  3. // @name:zh-TW 軟瑟盤
  4. // @name:ja RandomSexyPicParser
  5. // @namespace hoothin
  6. // @version 1.3.19
  7. // @description Random Sexy Pictures Parser
  8. // @description:zh-TW 隨機色圖
  9. // @description:ja ランダムセクシー画像パーサー
  10. // @author hoothin
  11. // @match https://api.lolicon.app/setu/v2*
  12. // @match https://api.nyan.xyz/httpapi/sexphoto*
  13. // @match https://huanmengii.xyz/ZY/aCOS/cos*
  14. // @match https://api.uomg.com/api/rand.img3*
  15. // @match https://api.vvhan.com/api/tao*
  16. // @match https://www.hlapi.cn/api/mjx*
  17. // @match https://3650000.xyz/api/?*
  18. // @match *://*/*
  19. // @icon data:image/jpg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAABgcICQX/xAAsEAABAwMEAQIFBQEAAAAAAAABAgMEBQYRAAcSITEIQRMUIjJRIyRCYYHB/8QAFgEBAQEAAAAAAAAAAAAAAAAABgQF/8QAIxEAAgEDBAEFAAAAAAAAAAAAAQMCABESBCFBUQUVMWHB8P/aAAwDAQACEQMRAD8AHNrPQdFYZlXBX6fJuRqns/NhptIUmSodhCG0nsdeCcqOAPOnVLvK3r227YVFjy6OEpLaWavEMKU2cY4utn7eseMjAHeq7vuaxtDs/VnaRSG6nIp9MffjwnMhD7jTKlpQsgZ7KcfnWQFv+sO6d0txKOxcFuw7ibqUpDUmPT4vwnWStQT+ksKJPHOfqB6Hf50Qd4vUOjlKWUj3x8Dik6PIJhO2Nojr7qo6fGtG1YUVNSrcJMl7PAzpjcZtPXkKUQCP+6CNz7Ttq+rdmP1iOKnDhq5iTBd5OMjoFbS0+evbvIGmfbm2dgVrcmq29W4MauJSwWYqpzaHUK4r+ocVAgE9eOzpmVnYaj2zt4qZQ4saOWnlhuBGYRHa+AnyPhoAGcknx3qD05qEiUY2MeR+vWgNeljTAm4l3T6vCDG3k2YffoFQfDdRhplQ5UNYK1j7hxPvyHX+6yhqm3tV2XuqrV2mJpLkpt1TiXFMltb5UMlOBnifOR1351f3owrEmgekbb52mKXVG2qU0ostjms9q5cO++8jGkp6lrQtLca6H7lp8gUCsrBcqESYSxyUPKig/wAseT76ZLcJQBB3omV4zsfapo2gq993nuhR6vUGl01EV/5pNOhO/uJCgfpSpRGG289n+vfV/wBs3LMNoNxn1olzo6HEvSgrkyHVrJWEqx2lOeIPvjU02Kzbe3VBkvPzIkl+SOSni5kke3+f1jXN3i9Vsdi2GqDakOUoBHFElCShAI8qB/GfbUmoeFrMb7mrFJLGAgbCv//Z
  20. // @grant GM_addStyle
  21. // @grant GM_setValue
  22. // @grant GM_getValue
  23. // @grant GM_xmlhttpRequest
  24. // @grant GM_registerMenuCommand
  25. // @run-at document-idle
  26. // @license MIT
  27. // ==/UserScript==
  28. if (window.top != window.self) {
  29. return;
  30. }
  31.  
  32. (function() {
  33. 'use strict';
  34. var setuConfig={
  35. "api.lolicon.app":{
  36. include: /setu\/v2/i,
  37. name:"Lolicon ACG SexyPic",
  38. url:"https://api.lolicon.app/setu/v2?r18=1&num=10",
  39. luckyUrl:["https://api.lolicon.app/setu/v2?r18=0&num=5",
  40. "https://api.lolicon.app/setu/v2?r18=1&num=5",
  41. "https://api.lolicon.app/setu/v2?r18=2&num=5"],
  42. run:()=>{
  43. var searchNum=getSearchParam("num");
  44. var leftNum=searchNum;
  45. if(jsonData != "Forbidden"){
  46. let datas=jsonData.data;
  47. datas.forEach(function(data){
  48. leftNum--;
  49. let img=createImg(data.urls?data.urls.original:data.url);
  50. img.title=data.title+" - "+data.author;
  51. });
  52. }else{
  53. location.href=curConfig.url;
  54. }
  55. processByTime(leftNum,loadNum=>{
  56. GM_xmlhttpRequest({
  57. method: 'GET',
  58. url: curConfig.url.replace("num=5","num="+loadNum),
  59. timeout:15000,
  60. onload: function(result) {
  61. let datas=JSON.parse(result.responseText).data;
  62. datas.forEach(function(data){
  63. let img=createImg(data.urls?data.urls.original:data.url);
  64. img.title=data.title+" - "+data.author;
  65. });
  66. }
  67. });
  68. },5,1000);
  69. },
  70. getSearch:(param)=>{
  71. return `v2?r18=${param.r18}&num=${param.num}`;
  72. },
  73. initSearch:()=>{
  74. var searchNum=getSearchParam("num");
  75. var searchR18=getSearchParam("r18");
  76. numInput.value=searchNum;
  77. r18Check.checked=searchR18==1||searchR18==2;
  78. sfwCheck.checked=searchR18==0||searchR18==2;
  79. }
  80. },
  81. "api.nyan.xyz":{
  82. hide: true,
  83. include: /httpapi\/sexphoto/i,
  84. name:"Nyan ACG SexyPic",
  85. url:"https://api.nyan.xyz/httpapi/sexphoto/?r18=true&num=10",
  86. luckyUrl:["https://api.nyan.xyz/httpapi/sexphoto/?r18=true&num=5",
  87. "https://api.nyan.xyz/httpapi/sexphoto/?r18=false&num=5"],
  88. run:()=>{
  89. var searchNum=getSearchParam("num");
  90. var leftNum=searchNum;
  91. var urls=jsonData.data.url;
  92. if(!urls instanceof Array){
  93. urls=[urls];
  94. }
  95. urls.forEach(function(data){
  96. leftNum--;
  97. createImg(data);
  98. });
  99. processByTime(leftNum,loadNum=>{
  100. GM_xmlhttpRequest({
  101. method: 'GET',
  102. url: curConfig.url.replace("num=5","num="+loadNum),
  103. timeout:15000,
  104. onload: function(result) {
  105. urls=JSON.parse(result.responseText).data.url;
  106. urls.forEach(function(data){
  107. createImg(data);
  108. });
  109. }
  110. });
  111. },5,1000);
  112. },
  113. getSearch:(param)=>{
  114. return `?r18=${param.r18==1?"true":"false"}&num=${param.num}`;
  115. },
  116. initSearch:()=>{
  117. var searchNum=getSearchParam("num");
  118. var searchR18=getSearchParam("r18");
  119. numInput.value=searchNum;
  120. r18Check.checked=searchR18=="true";
  121. sfwCheck.checked=searchR18=="false";
  122. }
  123. },
  124. "buyersShow":{
  125. include: /api\/(rand|tao|mjx1|taobaoBuyerShow)/i,
  126. name:"Taobao Buyers Show",
  127. urls:["https://api.uomg.com/api/rand.img3?format=json&num=15",
  128. "https://api.suxun.site/api/tao?type=json&num=15",
  129. "https://api.03c3.cn/api/taobaoBuyerShow?type=json&num=15"],
  130. run:()=>{
  131. r18Check.style.display=sfwCheck.style.display=r18CheckLabel.style.display=sfwCheckLabel.style.display="none";
  132. var searchNum=getSearchParam("num");
  133. processByTime(searchNum,loadNum=>{
  134. for(let i=0;i<loadNum;i++){
  135. createImg(location.href.replace(/1?\?.*/,"?")+"r="+Math.random());
  136. }
  137. },5,1000);
  138. },
  139. getSearch:(param)=>{
  140. return location.href.replace(/\d+$/,"")+param.num;
  141. },
  142. initSearch:()=>{
  143. var searchNum=getSearchParam("num");
  144. numInput.value=searchNum;
  145. }
  146. },
  147. "huanmengii.xyz":{
  148. hide: true,
  149. include: /ZY\/aCOS\/cos/i,
  150. name:"Cosplay Show",
  151. url:"https://huanmengii.xyz/ZY/aCOS/cos/?type=json&num=15",
  152. run:()=>{
  153. r18Check.style.display=sfwCheck.style.display=r18CheckLabel.style.display=sfwCheckLabel.style.display="none";
  154. var searchNum=getSearchParam("num");
  155. processByTime(searchNum,loadNum=>{
  156. for(let i=0;i<loadNum;i++){
  157. GM_xmlhttpRequest({
  158. method: 'GET',
  159. url: curConfig.url+"&"+Math.random(),
  160. timeout:15000,
  161. onload: function(result) {
  162. var curUrl=JSON.parse(result.responseText).pic;
  163. createImg(curUrl);
  164. }
  165. });
  166. }
  167. },5,1000);
  168. },
  169. getSearch:(param)=>{
  170. return "?type=json&num="+param.num;
  171. },
  172. initSearch:()=>{
  173. var searchNum=getSearchParam("num");
  174. numInput.value=searchNum;
  175. }
  176. },
  177. "3650000.xyz":{
  178. include: /\/api\/\?type=json/i,
  179. name:"3650000",
  180. url:"https://3650000.xyz/api/?type=json&mode=7&num=6",
  181. luckyUrl:["https://3650000.xyz/api/?type=json&num=6",
  182. "https://3650000.xyz/api/?type=json&mode=1&num=6",
  183. "https://3650000.xyz/api/?type=json&mode=2&num=6",
  184. "https://3650000.xyz/api/?type=json&mode=3&num=6",
  185. "https://3650000.xyz/api/?type=json&mode=5&num=6",
  186. "https://3650000.xyz/api/?type=json&mode=6&num=6",
  187. "https://3650000.xyz/api/?type=json&mode=7&num=6",
  188. "https://3650000.xyz/api/?type=json&mode=8&num=6",
  189. "https://3650000.xyz/api/?type=json&mode=9&num=6"],
  190. run:()=>{
  191. r18Check.style.display=sfwCheck.style.display=r18CheckLabel.style.display=sfwCheckLabel.style.display="none";
  192. var searchNum=getSearchParam("num");
  193. var searchMode=getSearchParam("mode");
  194. processByTime(searchNum,loadNum=>{
  195. for(let i=0;i<loadNum;i++){
  196. GM_xmlhttpRequest({
  197. method: 'GET',
  198. url: `${curConfig.url}&mode=${searchMode}&${Math.random()}`,
  199. timeout:15000,
  200. onload: function(result) {
  201. var curUrl=JSON.parse(result.responseText).url;
  202. createImg(curUrl);
  203. }
  204. });
  205. }
  206. },5,1000);
  207. },
  208. getSearch:(param)=>{
  209. return location.pathname+`?type=json&mode=${param.mode}&num=${param.num}`;
  210. },
  211. initSearch:()=>{
  212. var searchNum=getSearchParam("num");
  213. var searchMode=getSearchParam("mode");
  214. var modeObj=[
  215. ["Public",""],
  216. ["Weibo","1"],
  217. ["Instagram","2"],
  218. ["Cosplay","3"],
  219. ["Mtcos","5"],
  220. ["Mtcos2","6"],
  221. ["Legs","7"],
  222. ["MoreCoser","8"],
  223. ["Tuwan","9"]
  224. ];
  225. modeObj.forEach(item=>{
  226. var option=document.createElement("option");
  227. option.value=item[1];
  228. option.innerText=item[0];
  229. if(item[1]==searchMode){
  230. option.selected=true;
  231. }
  232. modeSelect.appendChild(option);
  233. });
  234. modeSelect.style.display="inline";
  235. numInput.value=searchNum;
  236. }
  237. },
  238. "api.uomg.com":"buyersShow",
  239. "api.vvhan.com":"buyersShow",
  240. "www.hlapi.cn":"buyersShow",
  241. "api.ghser.com":"buyersShow",
  242. "api.03c3.cn":"buyersShow",
  243. "api.suxun.site":"buyersShow"
  244. };
  245. var customRule=GM_getValue("RSPrules") || {};
  246. var customRuleArr=[];
  247. for(var j in customRule){
  248. let href=customRule[j];
  249. customRuleArr.push(href);
  250. }
  251. GM_registerMenuCommand("I am feeling lucky", ()=>{
  252. var luckyUrls=[],targetUrl;
  253. for(var i in setuConfig){
  254. let sc=setuConfig[i];
  255. if(sc.hide){
  256. continue;
  257. }else if(sc.luckyUrl){
  258. luckyUrls=luckyUrls.concat(sc.luckyUrl);
  259. }else if(sc.urls){
  260. luckyUrls=luckyUrls.concat(sc.urls);
  261. }else if(sc.url){
  262. luckyUrls.push(sc.url);
  263. }
  264. }
  265. luckyUrls=luckyUrls.concat(customRuleArr);
  266. var randomIndex=Math.floor(Math.random()*luckyUrls.length);
  267. targetUrl=luckyUrls[randomIndex];
  268. location.href=targetUrl;
  269. });
  270. const _unsafeWindow = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
  271. const escapeHTMLPolicy = (_unsafeWindow.trustedTypes && _unsafeWindow.trustedTypes.createPolicy) ? _unsafeWindow.trustedTypes.createPolicy('rspp_default', {
  272. createHTML: (string, sink) => string
  273. }) : null;
  274.  
  275. function createHTML(html) {
  276. return escapeHTMLPolicy ? escapeHTMLPolicy.createHTML(html) : html;
  277. }
  278. if (location.href.indexOf("randomsexypicparser") != -1) {
  279. GM_addStyle(".discussion-rating{display:none}");
  280. }
  281. var curConfig=setuConfig[document.domain],jsonData,hasFloatImg=false,grabed=false,oClient;
  282. if(curConfig){
  283. if(!curConfig.run){
  284. curConfig=setuConfig[curConfig];
  285. }
  286. if(curConfig.include && !curConfig.include.test(location.href)){
  287. curConfig=false;
  288. }
  289. }
  290. if(!curConfig){
  291. let currentParsing=customRule[document.domain+location.pathname];
  292. if(!currentParsing){
  293. GM_registerMenuCommand("Parse current api", customSet);
  294. return;
  295. }else{
  296. GM_registerMenuCommand("Stop parse api", () => {
  297. delete customRule[document.domain+location.pathname];
  298. GM_setValue("RSPrules", customRule);
  299. location.reload();
  300. });
  301. curConfig={run:()=>{
  302. var searchNum=getSearchParam("num");
  303. var leftNum=searchNum;
  304. r18Check.style.display=sfwCheck.style.display=r18CheckLabel.style.display=sfwCheckLabel.style.display="none";
  305. let parsePics=(data)=>{
  306. let picUrls=[],urlReg=/(https?|ftp|file):\/\/[\-A-Za-z0-9\+&@#/%?=~_\|!:,\.;]+[\-A-Za-z0-9\+&@#/%=~_\|]/g;
  307. if(typeof data == "string"){
  308. picUrls=data.match(urlReg);
  309. }else{
  310. let checkJson=obj=>{
  311. for(let i in obj){
  312. if(typeof obj[i] == "string"){
  313. let pics=obj[i].match(urlReg);
  314. if(pics)picUrls=picUrls.concat(pics);
  315. }else checkJson(obj[i]);
  316. }
  317. };
  318. checkJson(data);
  319. }
  320. if(picUrls){
  321. picUrls=picUrls.filter((item, index) => picUrls.indexOf(item) === index);
  322. picUrls.forEach(url=>{
  323. leftNum--;
  324. createImg(unescape(url));
  325. });
  326. }
  327. }
  328. parsePics(jsonData);
  329. processByTime(leftNum||1, loadNum=>{
  330. let href=location.href.replace(/num=\d+(&time=\d+)?/,"num="+loadNum+"&time="+Date.now()),postParams=href.match(/#p{(.*)}/);
  331. if(postParams){
  332. postParams=postParams[1];
  333. href=href.replace(/#p{.*/,"");
  334. }
  335. GM_xmlhttpRequest({
  336. method: postParams?'POST':'GET',
  337. data: postParams,
  338. headers: {
  339. 'Referer': location.href,
  340. "Content-Type": (postParams ? "application/x-www-form-urlencoded" : "text/html") + ";charset=" + (document.characterSet || document.charset || document.inputEncoding),
  341. },
  342. url: href,
  343. timeout:15000,
  344. onload: function(result) {
  345. var parseData;
  346. try{
  347. parseData=JSON.parse(result.responseText);
  348. console.log(parseData);
  349. }catch(e){
  350. parseData=result.responseText;
  351. }
  352. parsePics(parseData);
  353. }
  354. });
  355. }, (leftNum < searchNum - 1 ? 5 : 1), 1000);
  356. },
  357. getSearch:(param)=>{
  358. var href=location.href;
  359. if(/\bnum=/.test(href)){
  360. href=href.replace(/\bnum=\d+(&time=\d+)?/,"num="+param.num+"&time="+Date.now());
  361. }else{
  362. if(href.indexOf("?")==-1){
  363. if(href.indexOf("#")==-1){
  364. href+="?num="+param.num+"&time="+Date.now();
  365. }else{
  366. href=href.replace("#","?num="+param.num+"&time="+Date.now()+"#");
  367. }
  368. }else{
  369. href+="&num="+param.num+"&time="+Date.now();
  370. }
  371. }
  372. return href;
  373. },
  374. initSearch:()=>{
  375. var searchNum=getSearchParam("num");
  376. numInput.value=searchNum;
  377. }};
  378. }
  379. }
  380. document.title=curConfig.name?curConfig.name:"Random Sexy Pictures";
  381. try{
  382. var firstText = "";
  383. for (var i = 0; i < document.body.childNodes.length; i++) {
  384. var curNode = document.body.childNodes[i];
  385. if (curNode.nodeType == 1 || curNode.nodeName == "PRE") {
  386. firstText = curNode.nodeValue || curNode.innerText;
  387. if (firstText) break;
  388. }
  389. }
  390. if(firstText)jsonData=JSON.parse(firstText);
  391. }catch(e){
  392. console.log(e);
  393. jsonData=firstText;
  394. }
  395. document.body.innerHTML=createHTML("");
  396. var imgCon=document.createElement("div");
  397. var btns=document.createElement("div");
  398. var numInput=document.createElement("input");
  399. var r18Check=document.createElement("input");
  400. var r18CheckLabel=document.createElement("label");
  401. var sfwCheck=document.createElement("input");
  402. var sfwCheckLabel=document.createElement("label");
  403. var modeSelect=document.createElement("select");
  404. var submit=document.createElement("button");
  405. var referrerMeta=document.createElement("meta");
  406. var viewportMeta=document.createElement("meta");
  407. var overMask=document.createElement("div");
  408. var homepage=document.createElement("a");
  409. var lightBtn=document.createElement("span");
  410. for(var name in setuConfig){
  411. var config=setuConfig[name];
  412. if(config.hide || !config.name)continue;
  413. var siteA=document.createElement("a");
  414. var url=config.url;
  415. if(config.urls){
  416. var randomIndex=Math.floor(Math.random()*config.urls.length);
  417. url=config.urls[randomIndex];
  418. config.url=url;
  419. }
  420. siteA.href=url;
  421. siteA.innerText=config.name;
  422. btns.appendChild(siteA);
  423. }
  424. if(customRuleArr.length){
  425. var otherSiteA=document.createElement("a");
  426. otherSiteA.href=customRuleArr[Math.floor(Math.random()*customRuleArr.length)];
  427. otherSiteA.innerText="Other";
  428. btns.appendChild(otherSiteA);
  429. }
  430. btns.appendChild(numInput);
  431. btns.appendChild(r18Check);
  432. btns.appendChild(r18CheckLabel);
  433. btns.appendChild(sfwCheck);
  434. btns.appendChild(sfwCheckLabel);
  435. btns.appendChild(modeSelect);
  436. btns.appendChild(submit);
  437. btns.appendChild(homepage);
  438. btns.appendChild(lightBtn);
  439. overMask.className="over-mask";
  440. imgCon.appendChild(overMask);
  441. referrerMeta.name="referrer";
  442. referrerMeta.content="never";
  443. document.head.appendChild(referrerMeta);
  444. viewportMeta.name="viewport";
  445. viewportMeta.content="width=device-width, initial-scale=1";
  446. document.head.appendChild(viewportMeta);
  447.  
  448. curConfig.run();
  449. if(curConfig.initSearch)curConfig.initSearch();
  450.  
  451. function sleep(fn,param,time) {
  452. return new Promise((resolve) => {
  453. setTimeout(() => resolve(fn(param)), time)
  454. })
  455. }
  456. async function processByTime(num,fn,limit,time) {
  457. while(num>0){
  458. var loadNum=limit;
  459. if(num<limit)loadNum=num;
  460. num-=loadNum;
  461. await sleep(fn,loadNum,time);
  462. }
  463. }
  464.  
  465. overMask.onclick=e=>{
  466. if(hasFloatImg){
  467. restoreImg(hasFloatImg);
  468. }
  469. };
  470.  
  471. function mousedownHandler(e){
  472. let img=e.target;
  473. img.addEventListener("mouseup",mouseupHandler);
  474. img.addEventListener("mousemove",mousemoveHandler);
  475. img.style.cursor="grabbing";
  476. oClient={
  477. x:window.scrollX+e.clientX,
  478. y:window.scrollY+e.clientY,
  479. };
  480. e.stopPropagation();
  481. e.preventDefault();
  482. e.returnValue=false;
  483. }
  484. function mousemoveHandler(e){
  485. let img=e.target;
  486. grabed=true;
  487. window.scrollTo(oClient.x-e.clientX, oClient.y-e.clientY);
  488. }
  489. function mouseupHandler(e){
  490. let img=e.target;
  491. img.removeEventListener("mouseup",mouseupHandler);
  492. img.removeEventListener("mousemove",mousemoveHandler);
  493. img.style.cursor="grab";
  494. }
  495. function grabHandler(img,add){
  496. if(add){
  497. img.addEventListener("mousedown",mousedownHandler);
  498. }else{
  499. img.removeEventListener("mousedown",mousedownHandler);
  500. }
  501. }
  502.  
  503. function restoreImg(img){
  504. hasFloatImg=false;
  505. img.style.zIndex=0;
  506. img.style.bottom="";
  507. img.style.width="100%";
  508. img.style.position="";
  509. img.style.margin="";
  510. document.body.style.overflow="";
  511. imgCon.style.maxHeight="";
  512. imgCon.style.maxWidth="";
  513. overMask.style.display="none";
  514. overMask.style.opacity=0;
  515. img.className="list-show";
  516. grabHandler(img,false);
  517. img.style.cursor="";
  518. img.scrollIntoView({ block: "center", inline: "center" });
  519. }
  520.  
  521. function createImg(url){
  522. let img=document.createElement("img");
  523. img.onerror=e=>{
  524. img.style.display="none";
  525. };
  526. img.src=url;
  527. img.className="list-show";
  528. img.style.width="100%";
  529. img.onclick=()=>{
  530. if(grabed){
  531. grabed=false;
  532. return;
  533. }
  534. window.scrollTo(0,0);
  535. var de=document.documentElement;
  536. var body=document.body;
  537. var backCompat=document.compatMode=='BackCompat';
  538. var windowSize={
  539. h: backCompat ? body.clientHeight : de.clientHeight,
  540. w: backCompat ? body.clientWidth : de.clientWidth,
  541. };
  542. if(img.style.zIndex==2){
  543. restoreImg(img);
  544. }else if(img.style.zIndex==1){
  545. img.style.bottom="";
  546. img.style.width="";
  547. img.style.maxWidth="";
  548. img.style.maxHeight="";
  549. img.style.zIndex=2;
  550. img.style.cursor="grab";
  551. grabHandler(img,true);
  552. document.body.style.overflow="";
  553. imgCon.style.maxWidth="100vw";
  554. imgCon.style.maxHeight="100vh";
  555. }else{
  556. if(hasFloatImg)return;
  557. hasFloatImg=img;
  558. document.body.style.overflow="hidden";
  559. img.style.bottom=0;
  560. if(img.naturalWidth>windowSize.w || img.naturalHeight>windowSize.h){
  561. img.style.zIndex=1;
  562. img.style.maxWidth="99%";
  563. img.style.maxHeight="99%";
  564. }else{
  565. img.style.zIndex=2;
  566. img.style.maxWidth="";
  567. img.style.maxHeight="";
  568. }
  569. img.style.width="";
  570. img.style.position="absolute";
  571. img.style.margin="auto";
  572. overMask.style.display="block";
  573. img.className="";
  574. setTimeout(()=>{
  575. overMask.style.opacity=1;
  576. }, 0);
  577. }
  578. };
  579. imgCon.appendChild(img);
  580. return img;
  581. }
  582.  
  583. function getSearchParam(name){
  584. let reg = new RegExp("(&|^)" + name + "=([^&]*)(&|$)", "i");
  585. let r = window.location.search.substr(1).match(reg);
  586. if (r != null) {
  587. return decodeURIComponent(r[2]);
  588. };
  589. return "";
  590. }
  591.  
  592. function submitParam(){
  593. var num=numInput.value,mode;
  594. if(modeSelect.options.length>0){
  595. mode=modeSelect.options[modeSelect.selectedIndex].value;
  596. }
  597. var r18=2;
  598. if(sfwCheck.checked && !r18Check.checked){
  599. r18=0;
  600. }else if(!sfwCheck.checked && r18Check.checked){
  601. r18=1;
  602. }
  603. if(numInput.value != ""){
  604. location.href=curConfig.getSearch({"r18":r18, "num":num, "mode":mode});
  605. }else{
  606. location.reload();
  607. }
  608. }
  609.  
  610. function customSet(){
  611. if(window.confirm("Parse current api?")){
  612. customRule[document.domain+location.pathname]=location.href;
  613. GM_setValue("RSPrules", customRule);
  614. location.reload();
  615. }
  616. }
  617.  
  618. GM_addStyle(`
  619. @media screen and (min-width: 1024px) {
  620. .img-con{
  621. column-count: 5;
  622. -moz-column-count: 5;
  623. -webkit-column-count: 5;
  624. }
  625. .img-con>img{
  626. min-height: 250px;
  627. }
  628. }
  629. @media screen and (max-width: 1024px) {
  630. .img-con{
  631. column-count: 2;
  632. -moz-column-count: 2;
  633. -webkit-column-count: 2;
  634. }
  635. .img-con>img{
  636. min-height: 50px;
  637. }
  638. }
  639. body{
  640. background: black;
  641. scrollbar-width: none;
  642. }
  643. body::-webkit-scrollbar {
  644. width: 0 !important;
  645. height: 0 !important;
  646. }
  647. .btns>select{
  648. display: none;
  649. height: 29px;
  650. border-radius: 3px 0 0 3px;
  651. -moz-border-radius: 3px 0 0 3px;
  652. -webkit-border-radius: 3px 0 0 3px;
  653. -ms-border-radius: 3px 0 0 3px;
  654. -o-border-radius: 3px 0 0 3px;
  655. border: none;
  656. color: #cacaca;
  657. background-color: #363636;
  658. font-size: 14px;
  659. outline: 0;
  660. padding: 2px 5px;
  661. vertical-align: top;
  662. }
  663. .over-mask{
  664. display: none;
  665. opacity: 0;
  666. width: 100%;
  667. height: 100%;
  668. background-color: #000000e6;
  669. position: fixed;
  670. z-index: 1;
  671. top: 0;
  672. left: 0;
  673. transition: opacity .3s ease-in-out;
  674. -moz-transition: opacity .3s ease-in-out;
  675. -o-transition: opacity .3s ease-in-out;
  676. -webkit-transition: opacity .3s ease-in-out;
  677. }
  678. .list-show:hover,.list-show.hover{
  679. opacity: 1;
  680. transform: scale(1.05);
  681. }
  682. .list-show{
  683. opacity: 0.6;
  684. transition: opacity .3s ease-in-out, transform .3s;
  685. -moz-transition: opacity .3s ease-in-out, transform .3s;
  686. -webkit-transition: opacity .3s ease-in-out, transform .3s;
  687. }
  688. .img-con{
  689. overflow-x: hidden;
  690. overflow: auto;
  691. width: 100%;
  692. min-height: calc(100vh - 70px);
  693. display: block;
  694. scrollbar-width: none;
  695. }
  696. .img-con::-webkit-scrollbar {
  697. width: 0 !important;
  698. height: 0 !important;
  699. }
  700. .img-con>img{
  701. -webkit-column-break-inside: avoid;
  702. break-inside: avoid;
  703. float: left;
  704. margin-bottom: 15px;
  705. margin-right: 15px;
  706. overflow: hidden;
  707. position: relative;
  708. top: 0;
  709. left: 0;
  710. right: 0;
  711. background: url(data:image/png;base64,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) no-repeat center center;
  712. }
  713. .btns{
  714. padding: 10px 0;
  715. text-align: center;
  716. line-height: 30px;
  717. position: fixed;
  718. z-index: 1;
  719. width: 100%;
  720. top: 0;
  721. left: 0;
  722. background: #000000de;
  723. -webkit-transition:transform .5s ease-out;
  724. -o-transition:transform .5s ease-out;
  725. transition:transform .5s ease-out;
  726. }
  727. .btns.hide{
  728. -webkit-transform:translateY(-100px);
  729. -ms-transform:translateY(-100px);
  730. -o-transform:translateY(-100px);
  731. transform:translateY(-100px);
  732. }
  733. .btns>a{
  734. padding: 5px;
  735. background: #f8981e;
  736. color: black;
  737. border-radius: 5px;
  738. font-weight: bold;
  739. text-decoration: none;
  740. margin: 1px;
  741. font-family: Arial,Helvetica,sans-serif;
  742. }
  743. .btns>a:hover{
  744. background: #ffa31a;
  745. }
  746. .btns>a>span{
  747. background: #2f2f2f;
  748. color: white;
  749. padding: 5px;
  750. margin: 0 5px 0 -5px;
  751. border-radius: 5px 0 0 5px;
  752. }
  753. .btns>a:hover>span{
  754. background: #3f3f3f;
  755. }
  756. .btns>label{
  757. background: #f8981e;
  758. color: black;
  759. border-radius: 5px;
  760. font-weight: bold;
  761. text-decoration: none;
  762. padding: 3px;
  763. }
  764. .btns>input[type=checkbox]{
  765. width:20px;
  766. height:20px;
  767. vertical-align: top;
  768. }
  769. .btns>input[type=number]{
  770. width: 48px;
  771. height: 25px;
  772. border-radius: 3px 0 0 3px;
  773. -moz-border-radius: 3px 0 0 3px;
  774. -webkit-border-radius: 3px 0 0 3px;
  775. -ms-border-radius: 3px 0 0 3px;
  776. -o-border-radius: 3px 0 0 3px;
  777. border: none;
  778. color: #cacaca;
  779. background-color: #363636;
  780. display: inline-block;
  781. font-size: 14px;
  782. outline: 0;
  783. padding: 2px 5px;
  784. vertical-align: top;
  785. margin: 0 5px;
  786. }
  787. .btns>span{
  788. right: 10px;
  789. font-size: x-large;
  790. position: absolute;
  791. cursor: pointer;
  792. filter: brightness(0.5);
  793. }
  794. .lighted>.btns>span{
  795. filter: none;
  796. }
  797. .btns>button:hover{
  798. transform: scale3d(1.1, 1.1, 1.1);
  799. }
  800. .lighted>.img-con>img.list-show{
  801. opacity: 1;
  802. }
  803. .btns>button{
  804. cursor: pointer;
  805. background: #0075ff;
  806. color: white;
  807. border-radius: 5px;
  808. font-weight: bold;
  809. text-decoration: none;
  810. padding: 8px 5px 5px 5px;
  811. margin: 0px 10px 0 10px;
  812. border: 0;
  813. transition: transform .3s ease 0s;
  814. transform: scale3d(1, 1, 1);
  815. }`);
  816.  
  817. btns.className="btns";
  818. document.body.appendChild(btns);
  819. homepage.innerHTML=createHTML("<span>Home</span>page");
  820. homepage.href="https://sleazyfork.org/en/users/8227-hoothin";
  821. homepage.target="_blank";
  822. numInput.type="number";
  823. numInput.title=numInput.placeholder="Num of sexy pictures";
  824. r18Check.type="checkbox";
  825. r18Check.id="r18Check";
  826. r18CheckLabel.innerText="R18 ";
  827. r18CheckLabel.htmlFor="r18Check";
  828. sfwCheck.type="checkbox";
  829. sfwCheck.id="sfwCheck";
  830. sfwCheckLabel.innerText="SFW ";
  831. sfwCheckLabel.htmlFor="sfwCheck";
  832. submit.innerText="Refresh";
  833. submit.onclick=submitParam;
  834. document.onkeyup = function(e) {
  835. var event = e || window.event;
  836. var key = event.which || event.keyCode || event.charCode;
  837. if (key == 13) {
  838. submitParam();
  839. }
  840. };
  841. lightBtn.innerText="💡";
  842. lightBtn.onclick=e=>{
  843. document.body.classList.toggle("lighted");
  844. }
  845.  
  846. imgCon.className="img-con";
  847. document.body.appendChild(imgCon);
  848. imgCon.style.paddingTop=parseInt(window.getComputedStyle(btns).height.replace("px",""))+20+"px";
  849. document.body.addEventListener("touchstart",e=>{
  850. var lastHover=document.querySelector(".list-show.hover");
  851. if(lastHover)lastHover.classList.remove("hover");
  852. if(e.target.className=="list-show"){
  853. e.target.classList.add("hover");
  854. }
  855. });
  856.  
  857. var newPos,lastPos=0;
  858. window.addEventListener('scroll', function(e) {
  859. newPos=window.scrollY;
  860. if (newPos > lastPos) {
  861. btns.classList.add("hide");
  862. } else {
  863. btns.classList.remove("hide");
  864. }
  865. lastPos=newPos;
  866. });
  867. })();