// ==UserScript==
// @name 一键复制美剧链接
// @version 1.5.1
// @description 识别常用网址的美剧链接,实现一键复制,部分云盘可以直接进入,链接分类,可添加用户匹配自助提取。
// @author Bleu
// @supportURL https://greasyfork.org/zh-CN/scripts/430126-一键复制美剧链接/feedback
// @match https://www.meijutt.tv/*
// @match https://www.22tu.tv/*
// @match https://www.kpkuang.com/*
// @match https://www.mp4er.com/*
// @match https://91mjw.com/*
// @match https://www.bd2020.com/*
// @match https://www.ttmeiju.org/*
// @match https://yyds.fans/*
// @match https://www.rrdyw.cc/*
// @match https://pan.xunlei.com/s/*
// @match https://pan.baidu.com/share/*
// @match https://115.com/s/*
// @grant GM_setClipboard
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_openInTab
// @grant GM_info
// @run-at document-end
// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js
// @require https://lib.baomitu.com/limonte-sweetalert2/7.33.1/sweetalert2.all.min.js
/* globals jQuery, $, waitForKeyElements , swal,Swal*/
// @namespace http://tampermonkey.net/
// ==/UserScript==
(function () {
'use strict';
const webName = ['meijutt','91mjw','22tu','kpkuang','mp4er','ttmeiju','rrdyw'];
const panArry = ['xunlei','baidu','115'];
const pageURL = window.location.href;
let sign;
let floatSign = false;
let cssStyle;
let BleuButton;
let buttParent;
let openMark = 0;
let oldParent = null;
let panType = null;
let toolbox = {
addNewStyle() {
if(sign === 'cloudPan'){return 0;}
cssStyle = [
'.btn_bleu{padding: 10px 25px;font-size: 16px;cursor: pointer;text-align: center; text-decoration: none;outline: none;color: #fff;background-color: #008CBA;border: none;border-radius: 14px;display:block;margin:0 auto}',
'.btn_bleu:hover{background-color: #008CEA}',
'.btn_bleu:active{background-color: #008CEA;box-shadow: 0 5px #666;transform: translateY(4px);}',
'.floatButton {position: fixed;bottom: 10%;left:46%;right: 0;margin:0 auto;z-index:9999}',
];
BleuButton = '<div><input type="button" class="btn_bleu" id="btn_bleu" value="复制全部链接" ></div>';
cssStyle.forEach(function(value){
GM_addStyle(value);
});
},
getURLsign() {
let nameFU = GM_info.script.options.override.use_matches;
nameFU.length != 0 && webName.push(nameFU);
webName.forEach(function (value) {
if (pageURL.search(value) >= 0) { sign = value }
})
if (sign == undefined) {
//云盘界面
sign = 'cloudPan';
}
},
getButtonParent() {
//公众号屏蔽
let adshow = $("div.widget-weixin");
if(adshow.length != 0){
adshow.remove();
}
let box;
switch(sign) {
case 'meijutt':
$("div.widget-weixin").remove();
box = $("div.o_cn_r_box");
break;
case '91mjw':
box = $(".down-list");
break;
case '22tu':
box = $(".downurl.down-list");
break;
case 'kpkuang':
box = $(".fed-down-item.fed-drop-item.fed-visible");
break;
case 'mp4er':
box = $(".ui.middle.aligned.animated.list");
break;
case 'ttmeiju':
box = $("div.box_bor3");
break;
case 'rrdyw':
box = $(".movie-txt");
break;
case 'xl720':
box = $(".entry-content");
break;
default:
floatSign =true;
box = $("body");
break;
}
return box;
},
arryDel(arrold){
var arr=[] ;
arrold.forEach(function(value){
if(arr.indexOf(value) == -1){
if(sign == 'kpkuang'){
value = decodeURIComponent(escape(window.atob(value.replace('data-clipboard-text="',''))));
if(arr.indexOf(value) == -1){
arr.push(value);
}
return;
}
arr.push(value);
}
})
return arr;
},
getDownloadText(){
let ulstr=buttParent.innerHTML;
let reg = /magnet\:\?[^"]*|ed2k\:\/\/[^"]*|thunder\:\/\/[^"]*|data-clipboard-text="[^"]*/g;
let s = ulstr.match(reg);
return s == null ? s :this.arryDel(s);
},
findLinknode(buttdiv){
buttParent = buttdiv
if(sign == "meijutt"){
for(let tabs of document.getElementsByClassName('tabs-list')){
if(tabs.getAttribute('style') == 'display: block;'||tabs.getAttribute('style') == null){return tabs ;}
}
}
return buttParent;
},
noneLinkfunc(button){
openMark++;
if(sign === "mp4er"){
$(button).attr('value','下载全部文件');
(openMark === 1) ? alert("确定下载全部文件吗?共有"+$(buttParent).find('a').length+"个\r\n 再次点击确认"):(openMark = 0,$(buttParent).find("a").each(function(){this.click();}));
}
else if(sign === "meijutt"){
$(button).attr('value','打开全部链接') ;
if(openMark === 1||(openMark === 2 && oldParent != buttParent)){
openMark = 1
alert("确定打开所有链接吗?共有"+$(buttParent).find('li').length+"条\r\n 再次点击确认");
oldParent = buttParent;
}
if(openMark === 2 && oldParent === buttParent){//确定是同一标签下
openMark = 0;
if($(buttParent).find("input")){$(buttParent).find("input").each(function(){this.click();})};
if($(buttParent).find("a")){
$(buttParent).find("a").each(function(){
let href = $(this).attr('href');
href.indexOf("http") < 0 ? href = "https://www.meijutt.tv/"+href:href;
GM_openInTab(href, { active: true, insert: true, setParent :true });
});
};
}
}
else{
alert("没有复制任何链接");
}
},
sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
},
isHidden(el) {
try {
return el.offsetParent === null;
} catch (e) {
return false;
}
},
getHash(linkAddress){
//处理迅雷百度云分享链接
if(linkAddress == null){return 0}
if(!(linkAddress.search("xunlei")>=0|| linkAddress.search("baidu")>=0)){return 0}
let hashRex = /\/s\/[^?]*|surl=[^?]*/;
let res = linkAddress.match(hashRex)[0].replace('surl=','');
if (linkAddress.search("baidu") >= 0&&res.search("\/s\/") >=0 )
{
res = res.replace('\/s\/','').substr(1);
}
return res.replace('\/s\/','');
},
getPanType(){
panArry.forEach(function (value) {
if (pageURL.search(value) >= 0) { panType = value }
})
},
getButtSec(linkText){
let bleuButtSec = '';
for(let key in linkText ){
if(key === "magnet"&&linkText[key].length>0){bleuButtSec = bleuButtSec +`<input type="button" class="btn_bleu sec" value="磁力链接:${linkText[key].length}条" linktype="magnet"/></br>`;}
if(key === "ed2k"&&linkText[key].length>0){bleuButtSec = bleuButtSec + `<input type="button" class="btn_bleu sec" value="电驴链接:${linkText[key].length}条" linktype="ed2k"/></br>`;}
if(key === "thunder"&&linkText[key].length>0){bleuButtSec = bleuButtSec + `<input type="button" class="btn_bleu sec" value="迅雷链接:${linkText[key].length}条" linktype="thunder"/></br>`;}
if(key === "http"&&linkText[key].length>0){bleuButtSec = bleuButtSec + `<input type="button" class="btn_bleu sec" value="http链接:${linkText[key].length}条" linktype="http"/></br>`;}
}
bleuButtSec = bleuButtSec + '<input type="button" class="btn_bleu sec" value="全部链接" linktype="all"/>';
return bleuButtSec;
},
}
let linkHandler = {
webWithPanLink(){
let hash='',linkParent='',pswd='';
if(pageURL.indexOf('bd2020') >= 0){
let hide = document.querySelector('.layui-icon.layui-icon-down');
hide? hide.click():1;
linkParent =document.querySelectorAll('.option.copybtn.alert');
linkParent.forEach((value)=>{
hash = toolbox.getHash($(value).find('a')[0].getAttribute('href'));
pswd = $(value).find('span')[0].innerHTML;
GM_setValue(hash,pswd);
});
}
if(pageURL.indexOf('yyds') >= 0){
linkParent =document.querySelector('.post-content').children;
linkParent.forEach((value)=>{
let rex1 = /https.[^"]*/,rex2=/[\u4e00-\u9fa5]{3}:[\d\w]{4}/
value.innerHTML.match(rex2)?pswd = value.innerHTML.match(rex2)[0]:0;
value.innerHTML.match(rex1)?hash = toolbox.getHash(value.innerHTML.match(rex1)[0]):0;
pswd && hash ? GM_setValue(hash,pswd.replace(/[\u4e00-\u9fa5]{3}:/,'')):0;
});
}
if(pageURL.indexOf('rrdyw') >= 0){
linkParent =$('.movie-txt').children()
linkParent = linkParent[linkParent.length-2];
//$(linkParent).attr('txt','sf')
let rex1 = /https:\/\/pan.[^"]*/g;
let rex2=/[\u4e00-\u9fa5]{3}[:\s][\d\w]{4}/g;
pswd = $(linkParent).find('span').text()
pswd = pswd.match(rex2);
hash = linkParent.innerHTML.match(rex1);
hash.forEach(function(value,index){
GM_setValue(toolbox.getHash(value),pswd[index].replace(/[\u4e00-\u9fa5]{3}[:\s]/,''));
})
}
},
panListener(panInputSign,panBttonSign) {
let asda = toolbox.getHash(pageURL);
let password = GM_getValue(asda);
let maxTime = 10;
if(password == undefined){return 0}
let listener = setInterval(async() => {
maxTime--;
let panInput = document.querySelector(panInputSign);
let panBtton = document.querySelector(panBttonSign);
if (panInput &&!toolbox.isHidden(panInput)){
clearInterval(listener);
let lastValue = panInput.value;
panInput.value = password;
//Vue & React 触发 input 事件===》 可行
/*let event = new Event('input', {bubbles: true});
let tracker = panInput._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
panInput.dispatchEvent(event);*/
//js原生触发===》可行
var evt = document.createEvent('HTMLEvents')
evt.initEvent('input', true, true)
panInput.dispatchEvent(evt)
//jquery触发===》不可行
//$(panInput).bind('input propertychange', function() {$(this).val(lastValue);});
await toolbox.sleep(500); //1秒后点击按钮
panBtton.click();
}
else{
maxTime === 0 && clearInterval(listener);
}
}, 800);
},
clickPanButton(panBttonSign) {
let maxTime = 10;
let listener = setInterval(async() => {
maxTime--;
let panBtton = document.querySelector(panBttonSign);
if (panBtton &&!toolbox.isHidden(panBtton)){
clearInterval(listener);
await toolbox.sleep(500); //1秒后点击按钮
panBtton.click();
}
else{
maxTime === 0 && clearInterval(listener);
}
}, 800);
},
autoOpenPan(){
if(sign != 'cloudPan'){return 0;}
let panInput,panBtton;
if(panType === 'xunlei'){
panInput='.pass-input-wrap .td-input__inner';
panBtton='.pass-input-wrap .td-button';
}
if(panType === 'baidu'){
panInput='#accessCode';
panBtton='#submitBtn';
}
if(panType === '115'){
panBtton='.button.btn-large';
}
panInput && panBtton ? linkHandler.panListener(panInput,panBtton):linkHandler.clickPanButton(panBtton);
},
fixPanButton(){
if(sign != "meijutt"){return 0;}
let option = { active: true, insert: true, setParent :true };
$('.copy-pw').each(function(){
$(this).attr('value','点击进入');
$(this).attr('href',$(this).next().attr('href'));
$(this).next().remove();
})
$('.copy-pw').on('click',function(){
GM_setClipboard($(this).attr('data'), 'text');
let hash = toolbox.getHash($(this).attr('href'));
GM_setValue(hash,$(this).attr('data'));
GM_openInTab($(this).attr('href'), option);
})
},
organizeLink(linkArry){
let linkType = [0,0,0,0];
let linkText = {
'magnet':[],
'ed2k':[],
'thunder':[],
'http':[],
};
linkArry.forEach((value)=>{
if(value.search("magnet")>=0) {linkText.magnet.push(value);linkType[0]=1;return;}
if(value.search("ed2k")>=0) {linkText.ed2k.push(value);linkType[1]=1;return;}
if(value.search("thunder")>=0) {linkText.thunder.push(value);linkType[2]=1;return;}
if(value.search("http")>=0) {linkText.http.push(value);linkType[3]=1;return;}
})
if(linkType[0]+linkType[1]+linkType[2]+linkType[3] === 1)
{
let arrytxt = linkArry.toString().replace(/,/g,"\n");
GM_setClipboard(arrytxt, 'text');
}
else{
Swal.fire({
html:toolbox.getButtSec(linkText),
width:400+'px',
showConfirmButton:false,
//showCloseButton: true,
})
}
$('.btn_bleu.sec').on("click",function(){
let arrytxt;
let attr = $(this).attr("linktype");
if(attr!="all"){
arrytxt= linkText[attr].toString().replace(/,/g,"\n");
}
else{
let arry = [];
arry.push(linkText.magnet,linkText.ed2k,linkText.thunder,linkText.http);
arrytxt= arry.toString().replace(/,/g,"\n");
}
GM_setClipboard(arrytxt, 'text');
});
},
ButtonAddEvent(){
$('.btn_bleu').on("click",function(){
buttParent = toolbox.findLinknode(this.parentNode.parentNode);
let arryAll = toolbox.getDownloadText();
arryAll == null ? toolbox.noneLinkfunc(this):linkHandler.organizeLink(arryAll);
});
},
processButton() {
let BleuButton1 = '<div><input type="button" class="btn_bleu floatButton" id="btn_bleu" value="复制全部链接" ></div>';
if(sign === 'cloudPan'){return 0;}
buttParent = toolbox.getButtonParent();
//buttParent.append(BleuButton);
if(floatSign){
buttParent.append(BleuButton1);
}else{buttParent.append(BleuButton);}
console.log( $('#but_bleu'))
this.ButtonAddEvent();
this.fixPanButton();//适配meijutt网站
},
init(){
toolbox.getURLsign();
toolbox.getPanType();
toolbox.addNewStyle();
this.processButton();
this.webWithPanLink();
this.autoOpenPan();
},
}
linkHandler.init();
})();