// ==UserScript== // @name BT之家plus // @namespace waitfortea // @version 1.1 // @description BT之家资源直接下载、种子页全部下载、框选下载、失效域名更换 // @author waitfortea // @match http*://btbtt15.com/* // @match http*://www.btbtt15.com/* // @match http://www.btbtt11.com/* // @grant GM_setClipboard // ==/UserScript== (function (){ remove_warp(); goto(); var xzlj=document.querySelectorAll(".attachlist>.noborder>tbody>tr>td>a"); //这个返回了每个种子发布表格的所有超链接对象,因为每个种子发布表格的超链接对象只有每个种子下面页面的跳转链接 var mangent=replacedownload(xzlj); var xzbt=document.querySelectorAll(".attachlist>.noborder>tbody>tr:nth-of-type(1)"); //queryselectorall是逐个遍历,因此具有顺序 //这里返回了每个种子发布表格的第一行的对象,种子发布表格的class属性的值是noborder //nth-of-type(1)这里表示的是tr元素的中的第一个 adddownload(xzbt); add_GBdownload(xzbt); var xzbox=document.querySelectorAll(".attachlist>.noborder>tbody>tr>td:nth-of-type(2)"); addcheckbox(xzbox); frameSelector(); })(); function remove_warp(){ var l_idObject = document.getElementById('wrapper_left_bg llll'); if (l_idObject != null){l_idObject.parentNode.removeChild(l_idObject)}; var r_idObject = document.getElementById('wrapper_right_bg'); if (r_idObject != null){r_idObject.parentNode.removeChild(r_idObject)}; } /* var xzycswz=document.querySelectorAll(".attachlist>.noborder>tbody>tr>td:nth-of-type(5)"); //这里返回每个种子发布页表格所有行的第五个单元格的对象 realnum(xzycswz); var xqycswz=document.querySelectorAll("#body>.border>dl>dd:nth-of-type(4)"); //这里返回了 realnum(xqycswz); */ function addcheckbox(xzbox){ //传入每个种子发布页的行的第二个单元格 var box=document.createElement("div") for(let i=0;i< xzbox.length;i++){ //创建一个表单项 let check=document.createElement('input') //设置表单项的类型为复选框 check.setAttribute("type","checkbox") //创建一个单元格 let newtd=document.createElement('td') //将复选框添加为新建单元格的子节点 newtd.appendChild(check) //将新建单元格添加到表格每行的第二个单元格 xzbox[i].parentElement.insertBefore(newtd, xzbox[i]); } } function frameSelector() { let flag = false;//是否开启拖拽 //鼠标按下时的位置 let oldLeft = 0; let oldTop = 0; //设置操作区,也就是鼠标按下松开会被计算坐标的区域 let box = document.querySelectorAll('.width')[3] //创建选区的元素 let moveSelected= document.createElement("div");//选区 let checkboxs= box.getElementsByTagName("input") //复选框 // 鼠标按下时开启拖拽,给选区设置定位 //设定操作区内鼠标按下事件对应的方法 box.onmousedown = function(e) { //设置框选为启用状态 flag = true; //获取鼠标按下时鼠标指针的位置,并将鼠标的位置设为选取元素的起始位置 moveSelected.style.top = e.pageY + 'px'; moveSelected.style.left = e.pageX + 'px'; //将起始位置另外保存 oldLeft = e.pageX; oldTop = e.pageY; } // 设定操作区内鼠标移动事件对应的方法 box.onmousemove = function(e) { //通过设置flag判断鼠标移动之前是否有鼠标按下作为前置动作,如果没有则不执行框选动作中的鼠标移动的部分 if (!flag) return; //当前鼠标横坐标位置小于起始位置 表示左移 if (e.pageX < oldLeft) { //更新选取的横轴坐标位置 moveSelected.style.left = e.pageX + 'px'; //设置鼠标左移下选取的宽度为新旧鼠标坐标的横轴坐标的差异 moveSelected.style.width = (oldLeft - e.pageX) + 'px'; //向左移动的距离作为选区的宽 } else { //设置鼠标右移下选取的宽度为新旧鼠标坐标的横轴坐标的差异 //没有更改左定位就表示左定位就是鼠标按下的位置的横坐标 moveSelected.style.width = (event.pageX - oldLeft) + 'px'; } //选取高度的设置方式同理 if (e.pageY < oldTop) { //向上移动 moveSelected.style.top = e.pageY + 'px'; moveSelected.style.height = (oldTop - e.pageY) + 'px'; } else { moveSelected.style.height = (e.pageY - oldTop) + 'px'; } //通过得到的left和top加上元素自身的宽高来计算选区的right和bottom //right=left+width bottom=top+height moveSelected.style.bottom = Number(moveSelected.style.top.split('px')[0]) + Number(moveSelected.style.height.split('px')[0]) + 'px'; moveSelected.style.right = Number(moveSelected.style.left.split('px')[0]) + Number(moveSelected.style.width.split('px')[0]) + 'px'; //到这里我们得到了文档下的选区相对于边框的距离 //找出选中的区域并激活 for (let i = 0; i < checkboxs.length; i++) { //计算每个checkbox的位置信息 //这里要选取到复选框到文档边框的距离 /* let left = checkboxs[i].offsetLeft + box.offsetLeft; let right = checkboxs[i].offsetWidth + left; let top = checkboxs[i].offsetTop + box.offsetTop; let bottom = checkboxs[i].offsetHeight + top;*/  var left = checkboxs[i].offsetLeft;// 当前元素左边距     var top= checkboxs[i].offsetTop;// 当前元素上边距 var right= checkboxs[i].offsetTop var bottom= checkboxs[i].offsetTop;     var parent= checkboxs[i].offsetParent;// 当前元素的父级元素     while (parent!== null){       left += parent.offsetLeft;// 累加左边距       top+= parent.offsetTop;// 累加上边距 right+= parent.offsetRight;// 累加上边距 bottom+= parent.offsetBottom;// 累加上边距       parent= parent.offsetParent;// 依次获取父元素     } //判断是否在选择区 //如果复选框的边框到文档边框的距离被包含在选区的边框到文档边框的距离之间,就是被包含 let leftCover = moveSelected.style.left.split('px')[0] <= left && left <= moveSelected.style.right.split('px')[0]; let rightCover = moveSelected.style.left.split('px')[0] <= right && right <= moveSelected.style.right.split('px')[0]; let topCover = moveSelected.style.top.split('px')[0] <= top && top <= moveSelected.style.bottom.split('px')[0]; let bottomCover = moveSelected.style.top.split('px')[0] <= bottom && bottom <= moveSelected.style.bottom.split('px')[0]; //只要复选框的上左或者右下被包含在选区中就算复选框被选中 if ((leftCover || rightCover) && (topCover || bottomCover)) { checkboxs[i].checked = true;//激活复选框 } }//for }//1 //鼠标抬起时清空选区数据 box.onmouseup = function(e) { if (!flag) return; flag = false; moveSelected.style.width = 0; moveSelected.style.height = 0; moveSelected.style.top = 0; moveSelected.style.left = 0; moveSelected.style.bottom = 0; moveSelected.style.right = 0; } // 鼠标超出ul选区失效 box.onmouseleave = function(e) { flag = false; moveSelected.style.width = 0; moveSelected.style.height = 0; moveSelected.style.top = 0; moveSelected.style.left = 0; } } //自动跳转到btbtt15.com function goto(){ var domain var replaceW //获取超链接元素 var link=document.querySelectorAll("table>tbody>tr>td:nth-of-type(2)>a"); //检测超链接网址并重新赋值 //console.log(link) for (let i=0;itd:nth-of-type(1)"); //更换标签页之前清空之前的记录 magnet_a='' //循环种子标题,判断是否包含相应字符 for (let j=2;jtitle[j].textContent.search(new RegExp(word,'i'))!=-1)) { console.log(title[j].textContent); magnet_a+=title[j].parentElement.querySelectorAll(`td:nth-of-type(2)>a`)[0].href+'\n'; } } // link.addEventListener('click', function(event) { event.preventDefault(); // 阻止默认跳转行为 GM_setClipboard(magnet_a); // 复制到剪切板 alert('文本已复制到剪切板'); }); console.log(magnet_a) } } //这里传入每个种子页第一行对应的元素 function adddownload(btl) { for(let i=0;i< btl.length;i++){ //对每个种子发布页进行操作 let newbtl = document.createElement("td"); //这里的变量只是对元素操纵的方式,产生的元素不会是不同的,但属性是一致的 //新建一个单元格 newbtl.width = "70"; //设定单元格的宽度 newbtl.className = "grey"; //设置单元格的样式 //设置单元格的内容 let btl2 = btl[i].getElementsByTagName('td')[1]; //将表格第一行的第一个单元格的对象指向所在行的对象,然后获取该行的第二个单元格对象 btl[i].insertBefore(newbtl, btl2); //在第一行的第二个单元格对象之前插入创建的单元格对象 let magnet_a=btl[i].parentElement.querySelectorAll("tr>td:nth-of-type(2)>a") let output="" //给每个种子页面生成链接合集 for(let j=0;j