您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
download bad videos
// ==UserScript== // @name x Downloader // @version 7.4 // @description download bad videos // @author https://t.me/cyru55 // @namespace cyru55_x // @match https://*.pornhub.com/* // @match https://xhamster.com/* // @match https://spankbang.com/* // @match https://*.tnaflix.com/* // @run-at document-end // @unwrap x // @sandbox raw // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_xmlHttpRequest // @grant GM.xmlHttpRequest // @grant GM_setClipboard // @license WTFPL // @connect pornhub.com // @connect pornhub.org // @connect phncdn.com // ==/UserScript== ( (N5,Win)=>{ const Cy = { is: (H=>{ let P,L;return P=H.split("."),L=P.length-1,P[L].length<3?H:P.slice(-(L<2?2:L)).join("."); })(Win.location.host)??"", el:{ id: str => document.getElementById(str), cls: str => document.getElementsByClassName(str), q: str => document.querySelectorAll(str), q1: str => document.querySelector(str), del: el => { if(typeof(el)=="string") el=Cy.el.id(el); try{if(el) el.parentNode.removeChild(el);}catch{} }, } }; Cy[N5] = { log: str=>{console.log("%c"+N5,"background-color:#930;color:#fff;",str);}, name_gen: str=>{ if(typeof(str)!="string"||str.length<1) return ""; let title = str .replace(/'s/ig,"") .replace(/[^\w\s\-\+\.,]/g,"") .replace(/([\-\+\.,]){2,}/g,"$1") .replace(/\s+/g," ") .replace(/^[\-\+\.\s_,]+/,"") .replace(/[\-\+\.\s_,]+$/,"") .replace(/\W*S\d+E\d+\W*/,""); return title.substr(0,232); }, fetch: (url,cb,obj)=>{ if(typeof(GM_xmlhttpRequest)!="undefined"){ Cy[N5].log("--------------- fetch: GM_xmlhttpRequest"); GM_xmlhttpRequest({ method:"GET", url:url, onabort:()=>{ alert("GM_xmlhttpRequest>onabort"); }, onerror:()=>{ alert("GM_xmlhttpRequest>onerror"); }, ontimeout:()=>{ alert("GM_xmlhttpRequest>ontimeout"); }, onload:function(r){ let txt=r.responseText; Cy[N5].log(">fetch "+txt); cb(txt,obj); } }); }else if(typeof(GM)!="undefined" && typeof(GM.xmlHttpRequest)!="undefined"){ Cy[N5].log("--------------- fetch: GM.xmlHttpRequest"); GM.xmlHttpRequest({ method:"GET", url:url, onabort:()=>{ alert("GM.xmlHttpRequest>onabort"); }, onerror:()=>{ alert("GM.xmlHttpRequest>onerror"); }, ontimeout:()=>{ alert("GM.xmlHttpRequest>ontimeout"); } }) .then( res=>{ let txt=res.responseText; Cy[N5].log(">fetch "+txt); cb(txt,obj); }) .catch( err=>{ alert("Error while GM.xmlHttpRequest\n\n"+err); }); }else{ Cy[N5].log("--------------- fetch: fetch"); fetch(url,{mode:"cors"}) .then( res=>{ if(res.ok) return res.text(); throw("server returns non2xx"); }) .then( txt=>{ Cy[N5].log(">fetch "+txt); cb(txt,obj); }) .catch( err=>{ alert("Error while api request\n\n"+err); }); } }, ph_block_adblock_blockers: ()=>{ if(typeof(page_params)!="undefined") page_params.isAdBlockEnable=false; if(typeof(setCookieAdvanced)=="function") setCookieAdvanced("adBlockAlertHidden",1,1,"/","pornhub.com"); Cy.el.del("abAlert"); if(typeof(MG_Utils)!="undefined"){ let header=Cy.el.id("header"); if(header) MG_Utils.removeClass(header,"hasAdAlert"); } }, ph_rm_age_nag: ()=>{ Cy.el.del("ageDisclaimerMainBG"); Cy.el.del("ageDisclaimerOverlay"); Cy.el.del("js-ageDisclaimerModal"); Cy.el.del("modalWrapMTubes"); if(typeof(setCookieAdvanced)=="function") setCookieAdvanced("accessAgeDisclaimerPH",1,1,"/","pornhub.com"); }, ph_change_params: ()=>{ for(let i=32;i;){ setTimeout( ()=>{ if(typeof(essentialCookiesListAll)!="undefined"){ essentialCookiesListAll["pornhub.com"]["CookieConsent"]=3; essentialCookiesListAll["pornhub.com"]["cookieConsent"]=3; essentialCookiesListAll["pornhub.com"]["accessAgeDisclaimerPH"]=1; essentialCookiesListAll["pornhub.com"]["accessAgeDisclaimerUK"]=1; essentialCookiesListAll["pornhub.com"]["accessPH"]=1; essentialCookiesListAll["pornhub.com"]["adBlockAlertHidden"]=1; essentialCookiesListAll["pornhub.com"]["age_verified"]=1; essentialCookiesListAll["pornhub.com"]["cookieBannerEU"]=1; essentialCookiesListAll["pornhub.com"]["cookieBannerState"]=1; essentialCookiesListAll["pornhub.com"]["cookiesBanner"]=1; essentialCookiesListAll["pornhub.com"]["cookiesBannerSeen"]=1; essentialCookiesListAll["pornhub.com"]["autoplay"]=0; } },500*--i); } }, ph_to_list: (obj,src)=>{ let out=""; if(src.length){ let title = Cy[N5].name_gen(obj.video_title); out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>'; if(Win.location.href.indexOf("embed/")!=-1){ out+='<div><a target="_blank" href="'+Win.location.href.replace("embed/","view_video.php?viewkey=")+'">🟡 High Resolution in New Tab</a></div><br>'; } let vhex = Win.location.href.substr(Win.location.href.indexOf("=")+1); for(let i in src){ if(src[i].format=="mp4"){ out+='<div>'+ '<a target="dl" download="'+title+(vhex.length>3?" ,PH"+vhex:"")+'.mp4" href="'+src[i].videoUrl+'">⬇️ '+src[i].quality+'</a>'+ '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[i].videoUrl+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[i].videoUrl+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+ '</div>'; } } if(vhex.length>3){ out+='<br><input type="text" value="PH_'+vhex+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; out+='<br><input type="text" value="'+title+(vhex.length>3?" ,PH"+vhex:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; } } return out; }, xh_to_list: (obj,src)=>{ let out=""; let title = Cy[N5].name_gen(obj?.videoTitle?.pageTitle??""); out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>'; let vid = Win.location.href.slice(Win.location.href.lastIndexOf("-")+1); for(let k in src){ let web = obj?.xhlMlSource?.payload?.site?? obj?.collectorData?.site; if(web=="mobile"){ let link = src[k]?.label?? src[k]?.quality?? "Click"; if(link!="auto"){ out+='<div>'+ '<a target="dl" style="color:#ff0" download="'+title+(vid.length>3?" ,XH"+vid:"")+'.mp4" href="'+src[k].url+'">⬇️ '+link+'</a>'+ '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k].url+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k].url+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+ '</div>'; } }else{// desktop out+='<div>'+ '<a target="dl" style="color:#ff0" download="'+title+(vid.length>3?" ,XH"+vid:"")+'.mp4" href="'+src[k]+'">⬇️ '+k+'</a>'+ '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k]+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k]+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+ '</div>'; } } if(vid.length>3){ out+='<br><input type="text" value="XH_'+vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; out+='<br><input type="text" value="'+title+(vid.length>3?" ,XH"+vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; } return out; }, sb_to_list: (name,src)=>{ let out=""; let title = Cy[N5].name_gen(name); out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>'; let vid = Win.location.pathname.split("/")[1]; for(let k in src){ if( ["240p","320p","480p","720p","1080p","4k"].includes(k)&& src[k].length ){ out+='<div>'+ '<a target="dl" style="color:#ff0" download="'+title+(vid.length?" ,SB"+vid:"")+'.mp4" href="'+src[k][0]+'">⬇️ '+k+'</a>'+ '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+src[k][0]+'\',\'text\');else try{navigator.clipboard.writeText(\''+src[k][0]+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+ '</div>'; } } if(vid.length>3){ out+='<br><input type="text" value="SB_'+vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; out+='<br><input type="text" value="'+title+(vid.length>3?" ,SB"+vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; } return out; }, tn_to_list: (obj)=>{ let out=""; let title = Cy[N5].name_gen(obj?.name); out = '<div style="text-align:center;"><a href="javascript:(()=>{ cymod.style.display=\'none\'; })();" style="color:#f00;font-size:99px;">x</a></div>'; for(let link of obj.vids){ let pos=link.lastIndexOf(".");let resolution=link.substring(pos-5,pos).replace("-",""); out+='<div>'+ '<a target="dl" style="color:#ff0" download="'+title+(obj?.vid.length?" ,TN"+obj?.vid:"")+'.mp4" href="'+link+'">⬇️ '+resolution+'</a>'+ '<button onclick="(()=>{ if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(\''+link+'\',\'text\');else try{navigator.clipboard.writeText(\''+link+'\');}catch(e){} })();" style="margin-left:32px;padding:8px;cursor:pointer">📎</button>'+ '</div>'; } if(obj?.vid.length>3){ out+='<br><input type="text" value="TN_'+obj?.vid+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; out+='<br><input type="text" value="'+title+(obj?.vid.length>3?" ,TN"+obj?.vid:"")+'" style="width:96%;font-size:20px;" onclick="((_)=>{_.select();if(typeof(GM_setClipboard)!=\'undefined\') GM_setClipboard(_.value,\'text\');else try{navigator.clipboard.writeText(_.value);}catch(e){};})(this);"/>'; } return out; }, make_modal: (obj,src)=>{ Cy[N5].log("--------------- make_modal"); let html = Cy.is=="pornhub.com"? Cy[N5].ph_to_list(obj,src): Cy.is=="xhamster.com"? Cy[N5].xh_to_list(obj,src): Cy.is=="tnaflix.com"? Cy[N5].tn_to_list(obj): Cy[N5].sb_to_list(obj,src);// spankbang.com if(html.length){ let top_pop = document.createElement("div"); top_pop.id = "cymod"; top_pop.style.cssText = 'position:fixed;'+ 'z-index:999;'+ 'top:50%;'+ 'left:50%;'+ 'transform:translate(-50%,-70%);'+ 'width:320px;'+ 'width:60vw;'+ 'background:#000;'+ 'background:#000c;'+ 'padding:0 40px 40px;'+ 'border-radius:44px;'+ 'box-shadow:0 0 44px 22px #000;'+ 'font-size:24px;'; top_pop.innerHTML = html; document.body.appendChild(top_pop); // hide modal in dl btn if(Cy.is=="pornhub.com"){ let is_mobile= typeof(isPlatformMobile)!="undefined"&&isPlatformMobile==1 || typeof(FLAG_COMMENT_DATA)!="undefined"&&FLAG_COMMENT_DATA.platform=="mobile"; let el=Cy.el.id(is_mobile?"flagVideoBtn":"video_flag"); if(el){ let dl_btn = document.createElement("button"); dl_btn.id = "btn_dl"; dl_btn.className = "reportBtn buttonClass generalBtn"; dl_btn.style.cssText="background:#723;animation:cyglow 2s infinite;"; if(!is_mobile) dl_btn.style.cssText+="padding:7px;"; dl_btn.innerHTML='<i class="ph-icon-arrow-down"></i><span>Download</span>'; dl_btn.onclick=()=>{ top_pop.style.display="block"; }; el.parentNode.insertBefore(dl_btn, el.nextSibling); Cy.el.del(el); top_pop.style.display="none"; } } } }, handler: obj=>{ Cy[N5].log("--------------- handler"); if(Cy.is=="pornhub.com"){ for(let i in obj.mediaDefinitions){ if(obj.mediaDefinitions[i].format=="mp4"){ Cy[N5].log("---------------> "+obj.mediaDefinitions[i].videoUrl); let str=Cy[N5].fetch( obj.mediaDefinitions[i].videoUrl, (t,o)=>{ Cy[N5].log("fetch>cb "+t); if(t.length){ let json={};try{ json=JSON.parse(t); }catch{} Cy[N5].log(json); if(Object.keys(json).length) Cy[N5].make_modal(o,json); } }, obj ); break; } } }else if(Cy.is=="xhamster.com"){ Cy[N5].make_modal(Win.initials, obj); }else if(Cy.is=="spankbang.com"){ let name = ""; let ld = document.querySelectorAll('script[type="application/ld+json"]')[0].textContent; if(ld){ let json = {}; try{ json = JSON.parse(ld); if(Object.keys(json).length){ name = json.name; } }catch(e){} } Cy[N5].make_modal(name, obj); }else if(Cy.is=="tnaflix.com"){ Cy[N5].make_modal(obj); } } }; Cy[N5].log("--------------- RUN @ "+Cy.is); if(Cy.is=="pornhub.com"){ if(Win.location.href.indexOf("embed/")>0||Win.location.href.indexOf("view_video.php")>0){ let vid = 0; let vars = null; if(typeof(Win.VIDEO_SHOW)!="undefined") vid = parseInt(Win.VIDEO_SHOW?.trackVideoId?? Win.VIDEO_SHOW?.video_id?? "0"); if(!vid && typeof(VIDEO_SHOW)!="undefined") vid = parseInt(VIDEO_SHOW?.trackVideoId?? VIDEO_SHOW?.video_id?? "0"); if(vid>0){ Cy[N5].log("vid: "+vid); if(Win.hasOwnProperty("flashvars_"+vid)){ vars = Win["flashvars_"+vid]; } } if(vars==null){// try find it in window scope for(let k in Win) if(k.startsWith("flashvars")) vars=Win[k]; } if(vars!=null){ Cy[N5].log("vars: "+JSON.stringify(vars)); if(vars.hasOwnProperty("mediaDefinitions")){ Cy[N5].handler(vars); }else Cy[N5].log("'flashvars' found but not contains 'mediaDefinitions'"); }else Cy[N5].log("cant find 'flashvars'"); } // maximize view with removing right panel //for(let sideColumn of Cy.el.q("div.sideColumn")) Cy.el.del(sideColumn);// remove every side contents // just hide righ-side panel Cy.el.del(Cy.el.q1("#vpContentContainer .topSectionGrid .sideColumn")); // then maximize video width let el=Cy.el.q1("#vpContentContainer .topSectionGrid"); if(el) el.style.display="block"; // bigger watched flag let style1 = document.createElement("style"); style1.innerText = "div.watchedVideoText{line-height:32px;font-size:32px;} @keyframes cyglow{0%{box-shadow:0 0 0px #f00}50%{box-shadow:0 0 48px #f00}}"; document.head.appendChild(style1); // remove adblock blockers for(let i=16;i;) setTimeout( ()=>Cy[N5].ph_block_adblock_blockers(), 200*--i); // remove cookie banner Cy.el.del("cookieBanner"); document.cookie = "cookieConsent=3; expires=0;domain=pornhub.com;secure;path=/"; // may set backend dont-show-ads if(typeof(MG_Utils)!="undefined") MG_Utils.ajaxCall({ type: "GET", url: "/front/cookie_kill_ajax", data: {cookie_name: "showPremiumWelcomeFromPornhub"} }); // try set custom settings Cy[N5].ph_change_params(); // remove Ads setInterval(()=>{ // overlay text ads on the video Cy.el.del(Cy.el.q1("#player div.mgp_overlayText")); // side of video ads, on desktop only let side_ads=Cy.el.q(".sideAds"); if(side_ads.length) side_ads.forEach(N=>N.remove()); },500); // remove age warning //Cy.ph_rm_age_nag(); }else if(Cy.is=="xhamster.com"){ if( Win.hasOwnProperty("initials")&& !Win.location.pathname.indexOf("/videos/") ){ let mp4 = initials?.videoModel?.sources?.mp4?? initials?.xplayerSettings?.sources?.standard?.h264; if(mp4){ Cy[N5].handler(mp4); }else alert("it seems website scripts changed\ncontact me @cyru55"); setInterval( ()=>{ let ads = document.querySelectorAll("div.thumb-list>div:not(.thumb-list__item)"); for(let ad of ads) Cy.el.del(ad); }, 200); let css = document.createElement("style"); css.innerText = ` .player-container{margin-right:unset !important} .thumb-image-container__watched{background:red !important;height:32px !important} .thumb-image-container__watched>div{font-size:26px}`; document.getElementsByTagName("head")[0].appendChild(css); } }else if(Cy.is=="spankbang.com"){ if( Win.location.pathname.length>1&& Win.hasOwnProperty("stream_data") ){ if(stream_data.length){ Cy[N5].handler(stream_data); }else alert("it seems website scripts changed\ncontact me @cyru55"); } let styl = document.getElementsByTagName("style"); styl[styl.length-1].innerText+="#cymod input{background:#323232}"; Cy.el.del(Cy.el.q1("#video .right")); }else if(Cy.is=="tnaflix.com"){ if(Win.location.pathname.length>1){ Cy[N5].i_tn1=setInterval(()=>{ let vid_el=Cy.el.id("video-player"); if(vid_el.children.length){ clearInterval(Cy[N5].i_tn1); let vid=~~vid_el.getAttribute("data-vid"); let vids=[]; for(let el of vid_el.children){ let link=el.getAttribute("src")??""; if(link.length) vids.push(link); } let name = ""; let ld = document.querySelectorAll('script[type="application/ld+json"]')[0].textContent; if(ld){ let json = {}; try{ json = JSON.parse(ld); if(Object.keys(json).length){ name = json.name; } }catch(e){} } Cy[N5].log({"vid":vid,"vids":vids,"name":name}); if(vids.length) Cy[N5].handler({"vid":vid+"","vids":vids,"name":name}); } },500); } } })( "cyru55_x", typeof(unsafeWindow)=="undefined"? window: unsafeWindow );