BT之家plus
// ==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;i<link.length;i++){
// console.log(link[i].href)
domain=link[i].href.match(/(?<=\/\/).*?(?=\/)/)
// console.log(domain)
if(domain.indexOf("btbtt15")!=-1){}else
{replaceW=link[i].href.replace((/(?<=\/\/).*?(?=\/)/),"www.btbtt15.com")
// console.log(replaceW)
link[i].setAttribute("href",replaceW)}
}
}
//这里传入每个种子页第一行对应的元素
function add_GBdownload(btl){
var trait=['chs','简','gb','B-Global'];
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')[0]; //获取每个种子页(对应tbody)标题栏的第一行的第一个单元格
//存放链接文本
let magnet_a='';
//将添加的单元格插入到文本之后
let textNode= btl2.lastChild; //获取最后一个节点,一个文本也是一个节点
textNode.parentNode.insertBefore(newbtl,textNode.nextSibling);
//创建一个超链接元素,并放到td中
let link=document.createElement('a');
newbtl.appendChild(link)
link.innerHTML='简体'
//设置添加的单元格靠右浮动
newbtl.style.float='right';
newbtl.style.display='inline-block';
//获取每个种子页所有种子的标题
var title=btl[i].parentElement.querySelectorAll("tr>td:nth-of-type(1)");
//更换标签页之前清空之前的记录
magnet_a=''
//循环种子标题,判断是否包含相应字符
for (let j=2;j<title.length;j+=2)
{
//如果包含,就找到对应种子的下载链接
if (trait.some(word=>title[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<magnet_a.length;j++){
output+=magnet_a[j].href+"\r\n"
}
//给标题栏的下载标题添加链接
//将Output保存为txt文件并提供下载
let blob = new Blob([output], {type: "text/plain;charset=utf-8"});
//生成blob类文件对象,设置文件类型为txt,编码为utf-8,内容为output
//console.log(output)
//创建超链接对象
let magnet_all= document.createElement("a");
//创建一个新的超链接对象
magnet_all.href = URL.createObjectURL(blob);
// console.log(magnet_all.href)
//设置跳转链接打开方式为在新页面打开
magnet_all.innerHTML="直接下载"
newbtl.appendChild(magnet_all)
magnet_all.setAttribute('download', '链接.txt');
}
}
function replacedownload(zjxz) {
//返回
for(let j=0;j< zjxz.length;j++){
let replaceword = zjxz[j].href.replace(/dialog/g, 'download');
//替换每个跳转下载页面的链接中的/dialog/g字符为download
let newdownload1 = document.createElement("td");
//创建一个新的单元格
// newdownload1.className = "grey";
let newdownload2 = document.createElement("a");
//创建一个新的超链接对象
newdownload2.href = replaceword;
//设置超链接对象的跳转链接为替换后的字符
newdownload2.target = "_blank";
//设置跳转链接打开方式为在新页面打开
newdownload2.rel = "nofollow";
//设置链接与链接对象的关系,一般用于预设链接对象的一些东西,nofollow并没有什么实际意义,表示不希望被搜索
newdownload2.innerHTML = "Download";
//设置超链接对象的文本内容为Download
newdownload1.appendChild(newdownload2);
//将超链接元素对象放入单元格元素中
let download2 = zjxz[j].parentElement.parentElement.getElementsByTagName('td')[1];
//返回每个种子发布表格的超链接对象的父元素(单元格元素)的父元素(行元素)的第二个单元格对象,
zjxz[j].parentElement.parentElement.insertBefore(newdownload1, download2);
//将新建的存放下载超链接的单元格放入第二个单元格之前
}
}
function realnum(xzcs) {
for(let k=0;k< xzcs.length;k++){
if(xzcs[k].innerHTML.match(/[0-9]*次/g)) {
//这里要排除标题行的影响,所以用确保每个单元的文本内容都是显示次数
let realnumber = parseInt(xzcs[k].innerHTML.replace(/次/g, '')/7);
xzcs[k].innerHTML = realnumber+" 次";
}
}
}