// ==UserScript== // @name 抖音时间控制 // @description 自用抖音时间管理+其他优化(想要实现但未实现:下载视频(已实现ps:跳到另外一个页面右下角有下载按钮):替换广告(已实现):替换超过5分钟的视频(已实现,但必须是先加载好的,刷太快可能就没有效果):5分钟后搜索视频上提醒10s后遮罩,一个小数只能刷2次(已实现):替换直播(实现自动下滑(可能bug) // @namespace http://tampermonkey.net/ // @version 2023.3.21.24 // @author 仰晨 // @match *://*.douyin.com/* // @icon https://lf1-cdn-tos.bytegoofy.com/goofy/ies/douyin_web/public/favicon.ico // @grant none // @license AGPL License // @downloadURL none // ==/UserScript== //插入下载视频按钮2023.3.23 alert(); function downloadVideo() { let innerControls = document.querySelectorAll('.xg-right-grid');//下载视频的父级元素 //undefined的值会是false if(innerControls[0]){ let videoIndex =Math.floor(innerControls.length/2);//当前视频索引 let videoLink = document.getElementsByTagName("video")[videoIndex].getElementsByTagName("source");//视频链接在这个标签的src if(videoLink[videoIndex]){ const downloadLink = document.createElement('a'); // 创建一个a标签 downloadLink.href = videoLink[videoIndex].src; // 设置链接地址 downloadLink.download = true; // = 'image.jpg'设置下载文件的名称//// 将download属性设置为=true,表示使用默认文件名 downloadLink.textContent = '下载'; // 设置链接文本 downloadLink.target = "_blank"; // 新页面打开 downloadLink.setAttribute('id','downloadLink'); //设置标签属性 innerControls[videoIndex].appendChild(downloadLink); // 将a标签添加到xg-inner-controls xg-pos元素中 } } } //替换视频 function replacVideo(tip) { let videos = document.getElementsByTagName("video"); let index=videos.length != 1 ? 2 : 0; if(index>1){ let video = videos[index]; // 判断是否存在src属性 if (!video.hasAttribute("src")){ video.src = '//www.douyin.com/aweme/v1/play/?video_id=v0200fg10000cg2650rc77u1uog8eaig&line=0&file_id=ea45ae18d426468187776aaacaed6f30&sign=6cdbe8be7c6a55eb9a95a38bc7194185&'; // 设置视频URL video.load(); // 加载视频 //如果视频出现直播的话会没有这些标签.所以《视频标签》==《正常视频父类标签》是就是没有出现直播 就执行2023.3.9 let fuClass=document.getElementsByClassName("zK9etl_2 slider-video"); if(index+1==fuClass.length){ let fu=fuClass[index]; //隐藏弹幕(失败了:因为不会提前加载只会滚动到视频的时候才出现,点击下方的关闭样式又会影响到其他的,现在想法就到五分钟直接吧弹幕的样式none)2023.3.8 [class="I6WvmKj6 E8wnDxIb danmu"] //隐藏左边的点赞那栏2023.3.8 fu.getElementsByClassName("L1TH4HdO positionBox")[0].style.display = "none"; //隐藏名字和描述2023.3.8 fu.getElementsByClassName("tSXOCvQc")[0].style.display = "none"; //替换评论区 replacComment(index,tip); } } } } //替换评论区2023.3.7 function replacComment(index,tip) { let Comment=document.getElementsByClassName("aDQw7OWI _628BWQES LookModalFrameFast")[index]; Comment.innerHTML="ikun:"+tip; let styles=`font-size: 78px; color: white; justify-content: center; /* 水平居中 */ align-items: center; /* 垂直居中 */ ` Comment.style=styles; // 包涵集合的评论区得隐藏 let set=Comment.getElementsByClassName("nNXxvS1t"); if(set.length>0){ set[0].style="display:none;"; } } //次数控制(用newBing生成修改2023.3.11) function countControl() { //"use strict"是一个字面量表达式,它表示代码应该在严格模式下执行。 //'use strict'; // 获取当前时间的小时数 let hour = new Date().getHours(); console.log("当前时间的小时数"+hour); // 获取本地存储中保存的上一次访问抖音的小时数和次数 let lastHour = localStorage.getItem("lastHour"); let count = localStorage.getItem("count"); console.log("@@@@@@@@@@@@@@之前的小时数"+lastHour+" 次数"+count); // 如果本地存储中没有数据,则初始化为0 if (lastHour === null || count === null) { lastHour = count = 0; }else { // 把字符串转换成数字 lastHour = parseInt(lastHour); count = parseInt(count); } // 如果当前时间和上一次访问抖音的时间不在同一个小时内,则重置计数器为0 if (hour !== lastHour) { count = 0; } // 增加计数器,并保存到本地存储中 localStorage.setItem("lastHour", hour); localStorage.setItem("count", count+1); // 如果计数器大于等于2,则不给看了 if (count >= 2) { // 替换body的内容 let body = document.querySelector("body"); body.innerHTML = "2次了"; body.setAttribute("style", "font-size: 200px; color: red; font-family: monospace;left: 33%;top: 30%;position: fixed;"); //关闭网页,如果失败就跳转到指定主页 setTimeout(function (){window.opener = null; window.open('', '_self'); window.close(); window.location.href = "https://www.jianfast.com/"; },500) } } //进入的是刷视频页才执行↓↓↓ if (location.href === "https://www.douyin.com/"){ //次数控制(用newBing生成修改2023.3.11) countControl(); var min5 = false; //监听 鼠标滚轮滚动2023.3.9 // 选取要观察的节点 var targetNode = document; // 监听鼠标滚轮事件 targetNode.addEventListener('wheel', function(event) { //显示下载按钮2023.3.23 setTimeout(downloadVideo(),1000); if (event.deltaY > 0) {//如果是向下滚动就管2023.3.15 if(min5){//alert('5分钟到啦'); //如果打开了消息就不管2023.3.15 if(document.getElementsByClassName("TNoRtROB").length > 0){ console.log("打开了消息--不管"); } else { // 关闭网页,如果关闭失败就跳转到指定主页 window.opener = null; window.open('', '_self'); window.close();window.location.href = "https://www.jianfast.com/"; } } //如果没打开了消息就管2023.3.21 if(document.getElementsByClassName("TNoRtROB").length === 0){ //前五分钟滚动判定代码(直播修改思路:video标签 带src的就是了 setTimeout(function (){ let videos = document.getElementsByTagName("video"); const gun = setInterval(() => { //console.log('********测试 需不需要加个变量防止5分钟的代码不会被卡在这不往下执行***************************'); //如果视频有src标签,说明不是一个正常视频,就点向下的按钮 或时间时长超过5分钟2023.3.21 if(videos[Math.floor(videos.length/2)].hasAttribute("src")||videos[Math.floor(videos.length/2)].duration>300){ clearInterval(gun); // 停止定时器 // 向下点击的元素 const element = document.querySelector('.xgplayer-playswitch-next'); // 如果找到元素,则模拟点击事件 if (element){ element.click(); // 创建一个滚轮事件 分发事件到文档中2023.3.21 document.dispatchEvent(new WheelEvent('wheel', {deltaY: 100})); } }else if(videos[Math.floor(videos.length/2)].duration>1){ clearInterval(gun); // 停止定时器 } }, 100); let fuClass=document.getElementsByClassName("zK9etl_2 slider-video");//视频标签的父级标签 if(fuClass.length>2){ let Advertising = fuClass[2].getElementsByClassName("RA5iG98_");//广告 let Shopping = fuClass[2].getElementsByClassName("Lnsyat3L"); //购物推荐视频 2023.3.12 let VideoDuration = fuClass[2].getElementsByClassName("time-duration"); //视频时长 // 设置每半秒检查一次的定时器2023.3.14 const timer = setInterval(() => { if(VideoDuration.length>0){ const videoDuration = VideoDuration[0]; console.log('视频时长:'+videoDuration.innerText); if (videoDuration.innerText > '00:00') { // 加载完成后执行的代码 clearInterval(timer); // 停止计时器 if(Advertising.length>0){replacVideo("广告"); }else if(Shopping.length>0){replacVideo("购物"); }else if(VideoDuration[0].innerText>"05:00"){replacVideo("超长");} //document.getElementsByTagName("video")[2].duration//这样也可以获取视频长度的秒 } else { console.log('视频还未加载完成...'); } }else {//如果视频时长标签不存在也没必要 console.log('——————视频加载完成——————'); clearInterval(timer); // 停止计时器 } }, 100); // 每0.1秒检查一次 } },200)// 0.2秒后开始执行 } } }); //抖音最近默认进来是静音的,直接解除静音(muted)// 每秒检查 video 是否存在2023.3.14 const Muted = setInterval(() => { const videoElements = document.getElementsByTagName("video"); if (videoElements.length > 0 ) { videoElements[0].muted = false; downloadVideo();//显示下载按钮 //alert(videoElements[0].duration); if (videoElements[0].duration > 300 ){ // 创建一个滚轮事件 分发事件到文档中2023.3.24 document.dispatchEvent(new WheelEvent('wheel', {deltaY: 100})); } clearInterval(Muted); // 停止定时器 } }, 1000); //加载完成时自行↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ window.onload=function (){ //1.5秒后自动打开评论区 setTimeout(function (){document.getElementsByClassName("tzVl3l7w")[0].click();},1500) //加载完成时自行-↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ } //chat生成 说明快捷键:2023.3.10 { let shortcut = document.createElement('div'); shortcut.classList.add('shortcut'); let label = document.createTextNode('快捷键'); shortcut.appendChild(label); let infoBox = document.createElement('div'); infoBox.classList.add('shortcut-info'); shortcut.appendChild(infoBox); let keys = ['W:上一个视频', 'S:下一个视频', 'A:后退进度条', 'D:前进进度条', 'X:打开/关闭评论', 'G:关注/取关作者', 'Z:点赞/取消小红心']; for (let i = 0; i < keys.length; i++) { let p = document.createElement('p'); let text = document.createTextNode(keys[i]); p.appendChild(text); infoBox.appendChild(p); } document.getElementById('root').appendChild(shortcut); } var 延迟时间=5*60*1000; //开始计时=============================================================================================== setTimeout(function (){ //赋初始值 var i = 1; var sj="00:00" var videoTime=document.getElementsByClassName('time-current'); var index=0;//如果只刷一个视频就只有一个索引,开始第二个的时候就会出现三个索引【0,1,2】当前一般是【1】 min5 = true; var div = document.createElement("div"); div.innerText="5分钟到了-----------------------------------------------------"; div.setAttribute('id','kun'); //设置标签属性 var fu = document.getElementById("slidelist");//找到想成为的父标签 var one=fu.firstChild;// 获取父标签的第一个子元素 fu.insertBefore(div,one); // 在父标签的第一个子元素,前插入div标签 //改一下样式 { let style=` ul.JTui1eE0{ transition: all 20s ; width: 100px; background-color: #5f6175a8; border-radius: 8px; margin: 0px 10px; box-shadow: 0 0px 9px 1px #fff; /*阴影 水平偏移 垂直偏移 模糊 阴影大小*/ } #kun{ width:100%; height: 100%; animation:ikun 5s infinite; } @keyframes ikun { 0% {background-color: red;} 50% {background-color: #06f;} 100% {background-color: red;} } [class="xgplayer-playswitch recommend-out-switch-btn IvL3R0Q4"], /*隐藏右边点击上下看视频按钮*/ [class="I6WvmKj6 E8wnDxIb danmu"] /*隐藏弹幕*/ { display: none !important; } `; let ele=document.createElement("style"); ele.innerHTML=style; document.getElementsByTagName('head')[0].appendChild(ele); } //判断退出代码↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ for (let i=0; i<3600; i++)task(i); function task(i) {setTimeout( function () { try{ if (videoTime.length===3){ index=1; //获取视频个数 要么是1个要么是3个 三个的时候 当前看的是第二个 // 到时间了 替换视频 replacVideo("够钟"); } //判断这一秒的时间是否大过上一秒的时间 大过说明看完了 该润了 if(sj>videoTime[index].innerText){ alert("够钟死心了"); window.opener = null; window.open('', '_self'); window.close(); //这种情况是偶尔才会出现,没有自动关闭,就让声音隐藏 setTimeout(function (){ document.getElementsByTagName("video")[0].muted = true; },1000) } //刷新时间值 sj=videoTime[index].innerText; document.getElementsByClassName("time")[index].innerHTML = "---------5分钟到了+"+i+"秒"+sj+">?"+videoTime[index].innerText;i++; }catch(err){ console.log("离谱"); } }, 1000 * i);} },延迟时间);//在5分钟后执行代码-------------------------------------------------------------------------------------------------------- }//进入的是刷视频页才执行↑↑↑↑ //个人主页生效---------------------------- else if(location.href.startsWith("https://www.douyin.com/user")){ //添加一个到刷视频的按钮 const parent = document.querySelector("#root"); const newLink = document.createElement("a"); newLink.setAttribute("href", "https://www.douyin.com/"); newLink.setAttribute("id", "ikun"); newLink.setAttribute("title", "到刷视频页面"); parent.appendChild(newLink); } //样式-|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|- { let css = ""; /*整个抖音域名都生效*/ if ((location.hostname === "douyin.com" || location.hostname.endsWith(".douyin.com"))) { css += ` /*眼不见为净*/ [class="n9PPTk22"], /*左边栏底下的说明*/ [class="DsdpRAYf fP8n2eAM"], /*私信通知里面的下载抖音*/ [class="DsdpRAYf n4H8QMkw"], /*私信通知里面的下载抖音*/ #douyin-sidebar /*右下角的意见反馈*/ { display: none !important; } /*左边栏设置*/ [data-e2e="douyin-navigation"], /*抖音的左边栏内容*/ .HQwsRJFy, /*左上 抖音 logo */ .N_HNXA04.KYtgzo9m{ /*抖音大大的左边栏*/ transition: all 0.5s ; /*过渡效果2023.1.31*/ max-width: 5px; } /*移动到左边就弹出来*/ .N_HNXA04.KYtgzo9m:hover .HQwsRJFy, .N_HNXA04.KYtgzo9m:hover [data-e2e="douyin-navigation"], [class="N_HNXA04 WcK6IrkT JVPLvXh3"]:hover [data-e2e="douyin-navigation"], /*搜索页面特别一点*/ .N_HNXA04.KYtgzo9m:hover{ max-width:172px; display: block; } /*下载按钮*/ #downloadLink{ color:white; } `; } /*个人主页生效-----------------------------*/ if (location.href.startsWith("https://www.douyin.com/user")) { css += ` [class="VgThzTk9 vwAQ8Y04"], /*观看历史-今天 漂浮*/ [class="bbec3J8x m5e7YGwM"], /*视频|影视综 观看历史漂浮*/ .MFb3tP0s._bpGHYWu > :nth-child(-n+3), /*前3个直接子元素 1、客户端 2、收藏网页 3、合作*/ [class="feXqXaSk a3sjxRqS"], /*收藏夹|视频|合集*/ [class="iwzpXgQ3 lXuWkeYW dSNgkU25 K4TZD9ct wJgU15d1"], /*滚动还显示搜索栏*/ [class="gX8AKvzT gthle0Gj"], /*滚动还显示作品栏*/ [class="_7gdyuNUv"] /*主页的下载电脑客户端*/ { display: none !important; /*使用!important可以覆盖所有其他样式规则,但不建议过度使用*/ } /*背景全黑----------------------------------*/ [class="VgThzTk9"], /*观看历史-今天*/ [class="bbec3J8x"], /*视频|影视综*/ .feXqXaSk, /*收藏夹|视频|合集*/ [class="gX8AKvzT"], /*作品栏*/ [class="UKp0VfC1"], /*下面的视频背景*/ html[dark] ._LDrC7Wb.Smb5gBZJ:before{ /*名片*/ background-image: linear-gradient(to bottom, #000, #000); } /*使用!important可以覆盖所有其他样式规则,但不建议过度使用。例如: .N_HNXA04 { background-color: red !important; } 但是,使用!important可能会导致样式难以维护和调试,因此应该尽量避免使用它。*/ /*生成的到刷视频按钮的样式*/ #ikun { z-index: 503; position: absolute; top: 5px; left: 5px; width: 39px; height: 39px; border-radius: 50%; text-align: center; line-height: 30px; background-color: #4a4949; box-shadow: 0 0 5px #999; cursor:pointer; background-image: url(https://www.douyin.com/favicon.ico); background-repeat: no-repeat; background-size: 100%; } `; } /*刷视频 搜索视频 页面生效 */ if (location.href === "https://www.douyin.com/" || location.href.startsWith("https://www.douyin.com/search/")) { css += ` [class="XNmfpct4 fJOjbqAw"], /*直播间名字 标题*/ [class="NWMyy49m"], /*点击进入直播间*/ [class="U6kxNmZU"], /*直播叫你买浮窗*/ [class="QUUswvJ3"], /*客户端*/ [class="JTui1eE0"]:nth-child(2), /*收藏网页*/ [class="JTui1eE0"]:nth-child(3) { /*合作*/ display: none !important; } `; } /*刷视频 页面生效 */ if (location.href === "https://www.douyin.com/") { css += ` /*评论区广告提交表单*/ .htirveP0:before{ display: flex; min-width: 60px; min-height: 680px; color: #929faf; content: "ikun:广告已被覆盖"; justify-content: center; /* 水平居中 */ align-items: center; /* 垂直居中 */ font-size: 40px; } /*说明快捷键---------样式--------------*/ .shortcut { z-index: 501; position: fixed; right: 15px; top: 90px; width: 40px; height: 40px; opacity: 30%; border-radius: 50%; color: #fff; font-size: 10px; line-height: 40px; cursor: pointer; box-shadow: 0 0px 6px 3px #7b849c87; /*阴影 水平偏移 垂直偏移 模糊 阴影大小*/ transition: all 0.5s ; /*过渡效果2023.1.31*/ } .shortcut:hover, .shortcut:hover .shortcut-info { opacity: 80%; display: block; } .shortcut-info { display: none; position: absolute; top: 40px; right: 0px; width: 130px; padding: 10px; border-radius: 5px; background-color: rgb(242, 242, 242); font-size: 12px; color: #6a5acd; z-index: 999; text-align: left; /* 文字靠左 */ line-height: 1.2; /* 设置行高 */ } `; } if (typeof GM_addStyle !== "undefined") { GM_addStyle(css); } else { let styleNode = document.createElement("style"); styleNode.appendChild(document.createTextNode(css)); (document.querySelector("head") || document.documentElement).appendChild(styleNode); } } //样式结束-|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|-