// ==UserScript==
// @name 跳过抖音广告
// @namespace https://gf.qytechs.cn/zh-CN/users/1034730-%E9%9A%8F%E7%BC%98%E7%8E%A9%E5%AE%B6?locale_override=1
// @version 0.26
// @description 关闭抖音弹窗登录(不可用),跳过抖音广告和直播,观看直播默认原画
// @author 随缘玩家
// @license 随缘玩家
// @match https://www.douyin.com/
// @match https://live.douyin.com/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
let url = window.location.host;
if (url == "www.douyin.com") {
let next;
let configxgIcon = [
{ name: "清屏", option: false, type: "qingping" },
{ name: "评论区", option: false, type: "comment" },
{ name: "直播", option: true, type: "live" },
{ name: "右侧", option: true, type: "right" },
{ name: "底部", option: true, type: "bottom" },
{ name: "提示", option: true, type: "tips" },
{ name: "回退", option: true, type: "rollback" },
{ name: "屏蔽", option: true, type: "filter" },
]
if (!localStorage.getItem("xg-icon")) {
localStorage.setItem("xg-icon", JSON.stringify(configxgIcon))
} else if (JSON.parse(localStorage.getItem("xg-icon")).length != configxgIcon.length) {
localStorage.setItem("xg-icon", JSON.stringify(configxgIcon))
} else {
configxgIcon = JSON.parse(localStorage.getItem("xg-icon"))
}
let listModuleContent = ` <div class="userInput"> <div class="choice"> ﹀ </div> <input class="content" type="text"> <div class="confirm"> ✔ </div> </div> <div class="option"></div> <div class="list"> </div></div> `;
let listModule = document.createElement("div")
listModule.className = "listModule"
listModule.innerHTML = listModuleContent
let rootvideo = document.querySelector(".YwClj8rK.fullscreen_capture_feedback")
let createlistModule = setInterval(() => {
if (rootvideo) {
clearInterval(createlistModule)
rootvideo.appendChild(listModule)
}
}, 1000)
let userValue = listModule.querySelector(".content")
let KeywordFiltering = [
{ name: "名字", class: "username", data: [] },
{ name: "文案", class: "Copywriting", data: [] },
{ name: "标签", class: "Tag", data: ["图文", "购物", "广告"] },
{ name: "全选", class: "selectall", data: [] },
]
if (!localStorage.getItem("KeywordData")) {
localStorage.setItem("KeywordData", JSON.stringify(KeywordFiltering))
} else {
let i = JSON.parse(localStorage.getItem("KeywordData")).filter(item => item.data.length != 0)
KeywordFiltering = KeywordFiltering.map(item => i.find(subItem => subItem.name == item.name) || item)
}
for (const item of KeywordFiltering) {
let li = document.createElement("li")
li.innerText = item.name
listModule.querySelector(".option").appendChild(li)
let div = document.createElement("div")
div.className = item.class
listModule.querySelector(".list").appendChild(div)
li.onclick = () => {
for (const allDiv of listModule.querySelectorAll(".list div")) {
allDiv.style.display = "none"
}
div.style.display = "block"
listModule.querySelector(".option").style.display = "none "
listModule.querySelector(".choice").innerText = li.innerText
listModule.querySelector(".confirm").onclick = () => {
if (item.data.includes(userValue.value)) {
alert("已存在")
return
} else if (userValue.value == "") {
alert("不允许为空")
return
}
let span = document.createElement("span")
span.innerText = userValue.value
div.appendChild(span)
item.data.push(userValue.value)
localStorage.setItem("KeywordData", JSON.stringify(KeywordFiltering))
userValue.value = ""
}
userValue.onkeydown = (e) => {
if (e.keyCode == 13) {
listModule.querySelector(".confirm").click()
}
}
}
item.data.forEach(subitem => {
let span = document.createElement("span")
span.innerText = subitem
div.appendChild(span)
});
div.onclick = (e) => {
if (e.target.nodeName === "SPAN") {
e.target.remove()
item.data = item.data.filter(item => item != e.target.innerText)
localStorage.setItem("KeywordData", JSON.stringify(KeywordFiltering))
}
}
}
listModule.querySelector(".choice").onmouseover = () => {
listModule.querySelector(".option").style.display = "block "
listModule.querySelector(".choice").innerText = " ﹀ "
for (const allDiv of listModule.querySelectorAll(".list div")) {
allDiv.style.display = "none"
}
}
listModule.querySelector(".option").onmouseleave = () => {
listModule.querySelector(".option").style.display = "none "
}
document.onclick = function () {
listModule.style.opacity = 0
setTimeout(() => {
listModule.style.display = "none"
listModule.querySelector(".choice").innerText = " ﹀ "
listModule.querySelectorAll(".list div").forEach(item => { item.style.display = "none" })
listModule.querySelector(".confirm").onclick = null
}, 300);
}
listModule.onclick = function (e) {
e.stopPropagation()
}
let observer = new MutationObserver((e) => {
e.forEach((i) => {
if (i.addedNodes.length > 0 && i.addedNodes[0].className) {
let getClass = i.addedNodes[0].classList[0]
if (getClass != undefined) {
if (getClass == "OFZHdvpl" && document.querySelector('[data-e2e="feed-active-video"] ._QjzkgP3.Vw_S4MTA.isDark') != null && configxgIcon[1].option) {
let commentsOff = document.querySelector('[data-e2e="feed-active-video"] ._QjzkgP3.Vw_S4MTA.isDark.z_zS3jcn.dLCldFlr') || document.querySelector('[data-e2e="feed-active-video"] .aDQw7OWI._628BWQES.JFWzESlW.LookModalFrameFast')
if (commentsOff) {
setTimeout(() => {
i.addedNodes[0].querySelector(".pBxTZJeH.Qz1xVpFH.aLzJ7lUV").click()
}, 200);
}
}
if (getClass == "gear") {
let clear = i.addedNodes[0].querySelectorAll(".virtual .item")
if (clear[0] != null && clear[0].classList.length <= 1 && clear[0].querySelectorAll("span")[1] == undefined) {
clear[0].click()
}
if (clear[0].querySelectorAll("span")[1] != undefined && clear[2].classList.length <= 1) {
clear[2].click()
}
if (document.querySelector("[data-e2e='feed-active-video']") && !document.querySelector("[data-e2e='feed-active-video'] [data-peizhi]")) {
let config = document.querySelector("[data-e2e='feed-active-video'] .xg-right-grid")
let xgIcon = document.createElement("xg-icon")
xgIcon.className = "xgplayer-autoplay-setting automatic-continuous"
xgIcon.innerHTML = `<div class="xgplayer-icon" data-e2e="video-player-auto-play" data-e2e-state="video-player-auto-playing"><div class="xgplayer-setting-label"><span class="xg-switch-inner"></span></button><span class="xgplayer-setting-title" data-peizhi>配置</span></div></div><div class="xgTips">
</div>`
for (const item of configxgIcon) {
let icon = `<div class="xgplayer-icon" data-e2e="video-player-auto-play" data-e2e-state="video-player-auto-playing"><div class="xgplayer-setting-label"><button data-type="${item.type}" aria-checked="${item.option}" class="${item.option ? "xg-switch-checked" : ""} xg-switch" aria-labelledby="xg-switch-pip" type="button"><span class="xg-switch-inner"></span></button><span class="xgplayer-setting-title">${item.name}</span></div></div>`
let range = document.createRange()
let iconitem = range.createContextualFragment(icon)
let button = iconitem.querySelector("button");
let xgTips = xgIcon.querySelector(".xgTips")
xgTips.style.display = "none"
xgTips.style.visibility = "visible"
xgTips.style.bottom = 31 + "px"
button.onclick = () => {
if (item.option == true) {
item.option = false
button.classList.remove("xg-switch-checked")
button.setAttribute("aria-checked", "false")
localStorage.setItem("xg-icon", JSON.stringify(configxgIcon))
} else {
item.option = true
button.classList.add("xg-switch-checked")
button.setAttribute("aria-checked", "true")
localStorage.setItem("xg-icon", JSON.stringify(configxgIcon))
}
}
xgIcon.onmouseover = () => {
xgTips.style.display = "block"
}
xgIcon.onmouseleave = () => {
xgTips.style.display = "none"
}
xgTips.onclick = (e) => {
e.stopPropagation()
let item = e.target
if (item.nodeName == "BUTTON") {
if (item.dataset.type == "filter") {
if (item.ariaChecked == "true") {
listModule.style.display = "block"
setTimeout(() => { listModule.style.opacity = "1" }, 50);
}
}
}
}
xgTips.appendChild(iconitem)
}
config?.appendChild(xgIcon)
}
}
if (getClass == "mPWahmAI") {
let loginOff = i.addedNodes[0].querySelector(".box-align-center .dy-account-close")
if (loginOff != null) {
loginOff.click()
}
}
if (getClass == "xgplayer-playswitch") {
i.addedNodes[0].style.opacity = 0
}
}
}
})
})
observer.observe(document, { childList: true, subtree: true })
//广告
let body;
let time;
let VideoNumber = []
let bodyTime
let geteStyle = document.createElement("style")
geteStyle.innerText = `
* { margin: 0; padding: 0; } body { background-color: #252526; } input { text-decoration: none; border: none; outline: none; } li { list-style: none; } .listModule { box-sizing: border-box; position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; width: 500px; height: 300px; background-color: #fff; opacity: 0; border-radius: 25px; padding: 10px; transition: all .3s; display: none; } .userInput { display: flex; justify-content: space-evenly; align-items: center; text-align: center; } .userInput .content { position: relative; background-color: #d3d3d4; width: 400px; height: 35px; font-size: 20px; font-weight: 400; border-radius: 25px; text-align: center; } .choice, .confirm { cursor: pointer; width: 35px; } .option { position: absolute; width: 130px; text-align: left; padding: 10px; display: none; } .option li { padding: 7px 5px; font-size: 13px; cursor: pointer; border-radius: 5px; width: 100px; } .option li:hover, .selected { background-color: #e5e5e5; } .list { width: 400px; margin: 20px auto; } .list div { display: none; padding: 0 0 10px 5px; background-color: #fff; border-radius: 20px; } .list span { display: inline-block; cursor: pointer; padding: 11px; margin: 3px; background-color: #a5c6ef; font-size: 13px; border-radius: 5px; } .list span:hover { background-color: #235eac; color: #fff; }
.JrMwkvQy.playerContainer.YFEqUSvt{cursor:none !important}
.Xu8BXy_K{display:none}
#douyin-sidebar{display:none}
.N7WC10t2.R0e9n3hS{display:none}
.C0PKXv0T.vVKvTOe_{display:none}
.XOS1zQWA{display:none}
`
document.head.appendChild(geteStyle)
function Tips(tipsText) {
let RootVideo = document.querySelector(".YwClj8rK.fullscreen_capture_feedback")
let TipsBox = document.createElement("div")
TipsBox.style = ` position: absolute; left: 0; right: 0; bottom: 90px; margin: 0 auto; text-align: center; width: 300px; height: 30px; line-height: 30px; background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); cursor: pointer; z-index: 99999999999999999999999999; opacity:.9; transition: all .3s
`
TipsBox.innerText = "已为您跳过了" + tipsText
RootVideo.appendChild(TipsBox)
setTimeout(() => { TipsBox.style.opacity = 0 }, 500);
setTimeout(() => { TipsBox.remove() }, 1000);
}
function skip(item, index) {
if (configxgIcon[6].option && VideoNumber.includes(index)) return
if (VideoNumber.length > 20) VideoNumber = []
if (index && !VideoNumber.includes(index)) VideoNumber.push(index)
let videos = document.querySelector("[data-e2e='feed-active-video'] .slider-video")
if (videos != null) {
videos.style.display = "none"
if (videos.querySelector("video") != null) videos.querySelector("video").pause()
}
let zhibonode = document.querySelector("[data-e2e='feed-live'] video")
if (zhibonode != null && zhibonode.style.display == "") {
zhibonode.style.display = "none"
zhibonode.pause()
}
if (configxgIcon[5].option) {
Tips(item)
}
time = setInterval(function () {
next.click()
}, 3);
}
bodyTime = setInterval(() => {
body = document.querySelector(".u0N5WOYm.Srjrb_Q0") || document.querySelector(".swiper-wrapper")
next = document.querySelectorAll(".xgplayer-playswitch-next")[0]
if (body && next) {
clearInterval(bodyTime)
let observers = new MutationObserver((e) => {
e.forEach((i) => {
if (i.target.attributes[0].nodeValue == 'feed-active-video') {
clearInterval(time)
let gouwu = i.target.querySelector(".tSXOCvQc .xgplayer-shop-anchor")
if (gouwu != null && gouwu.innerText.includes("剪映")) {
gouwu.style.display = "none"
}
if (i.target.querySelector(".tSXOCvQc") != null && configxgIcon[0].option) {
i.target.querySelector(".tSXOCvQc").style.display = "none"
}
if (i.target.querySelector(".tSXOCvQc") != null && configxgIcon[3].option) {
let rightHide = i.target.querySelector(".L1TH4HdO.d6KxRih3.positionBox") || i.target.querySelector(".L1TH4HdO.positionBox")
rightHide.style.opacity = 0
}
if (i.target.querySelector(".Xu8BXy_K") != null && configxgIcon[4].option) {
let imgBackground = i.target.querySelector(".Xu8BXy_K")
imgBackground.style.display = "none"
}
if (i.target.querySelector(".xg-video-container") != null && configxgIcon[4].option) {
let time
let video = i.target.querySelector(".xg-video-container")
let qingping = i.target.querySelector(".tSXOCvQc")
let xgplayer = i.target.querySelector(".xgplayer-controls")
let bottomItem = xgplayer.querySelector(".xg-inner-controls.xg-pos")
video.style.height = '99%'
video.style.cursor = "none"
video.style.bottom = 0
video.style.margin = "auto 0"
qingping.style.bottom = "6px"
bottomItem.style.bottom = -bottomItem.offsetHeight + "px"
xgplayer.style.backgroundImage = "none"
if (qingping.querySelector(".video-info-mask")) {
qingping.querySelector(".video-info-mask").remove()
}
let CommentItem = i.target.querySelectorAll(".UXyEyqbq.UdkDK3ea.DZKZZklc .otZjcQr3")
if (CommentItem) {
CommentItem.forEach((i) => {
i.remove()
})
}
xgplayer.onmouseover = () => {
clearTimeout(time)
bottomItem.style.transition = "all 0.3s"
bottomItem.style.bottom = 0 + "px"
i.target.querySelector(".tSXOCvQc").style.display = "none"
}
xgplayer.onmouseleave = () => {
clearTimeout(time)
time = setTimeout(() => {
bottomItem.style.bottom = -bottomItem.offsetHeight + "px"
if (!configxgIcon[0].option && i.target.querySelector(".tSXOCvQc")) {
i.target.querySelector(".tSXOCvQc").style.display = ""
}
}, 1000);
}
}
if (configxgIcon[7].option) {
function sustain() {
let username = i.target.querySelector(".Nu66P_ba")?.innerText
let Copywriting = i.target.querySelector(".UCT89JiM")?.innerText
let tagAll = i.target.querySelector(".tSXOCvQc")?.innerText
let selectallData = [username, Copywriting]
let user = KeywordFiltering.find(item => item.class == "username")?.data.filter(item => username?.includes(item))
let copy = KeywordFiltering.find(item => item.class == "Copywriting")?.data.filter(item => Copywriting?.includes(item))
let selectall = KeywordFiltering.find(item => item.class == "selectall")?.data.find(item => selectallData.find(subkey => subkey?.includes(item))
)
if (tagAll) {
clearInterval(tSXOCvQc)
}
tagAll = KeywordFiltering.find(item => item.class == "Tag")?.data.filter(item => tagAll?.includes(item))
let findContent = tagAll[0] || user[0] || copy[0] || selectall
if (findContent) {
skip(`"${findContent}"`, i.target.dataset.e2eVid)
return
}
}
let tSXOCvQc = setInterval(sustain, 10)
sustain()
}
}
if (document.querySelector("[data-e2e='feed-active-video']") == null && configxgIcon[2].option) {
clearInterval(time)
skip("直播", document.querySelector("[data-e2e='feed-live'] .Nu66P_ba")?.innerText)
}
})
})
observers.observe(body, { attributeOldValue: true, attributes: true, subtree: true, attributeFilter: ['data-e2e'] })
}
else {
return
}
}, 500);
}
if (url == "live.douyin.com") {
window.onload = function () {
setTimeout(() => {
let liwu = document.querySelector('.tgMCqIjJ')
if (liwu) {
liwu.style.display = 'none'
}
let inall = document.querySelectorAll('.tY7dfAwO')
let quanping = inall[1]?.querySelectorAll('div')[1]
let pbliwu = inall[3]?.querySelectorAll('div')[1]
quanping.click()
let size = document.querySelector('.FKQqfehj')
if (size) size.style.height = '99.8%'
let danmus = document.querySelector('.basicPlayer.xgplayer .xgplayer-danmu')
danmus.style.top = '0px'
let vid = document.querySelector('.Zs4Pv2bD')
let time;
vid.onmousemove = function () {
clearInterval(time)
vid.style.cursor = 'auto'
time = setInterval(function () {
vid.style.cursor = 'none'
}, 2000)
}
let huazhi = document.querySelectorAll('.J1hZCcks .LH4RopWg')[0] || document.querySelectorAll('.iDyiVE4p.bWLQ7URi .LgIvTpnw')[0]
huazhi.click()
let config = [
{ name: "弹幕", option: true },
{ name: "特效", option: true },
]
if (!localStorage.getItem("xg-icon")) {
localStorage.setItem("xg-icon", JSON.stringify(config))
}
else if (JSON.parse(localStorage.getItem("xg-icon")).length === config.length) {
config = JSON.parse(localStorage.getItem("xg-icon"));
} else {
localStorage.setItem("xg-icon", JSON.stringify(config))
}
let bottom = document.querySelector(".xgplayer-controls.control_autohide.xgplayer-controls-initshow .xg-right-grid")
let danmu = bottom.querySelector(".danmu-icon")
let div = document.createElement("xg-icon")
div.dataset.index = 1
div.classList.add("tGBLU2eM")
div.innerHTML = `
<div class="tY7dfAwO">
<div class="xuUeCQbT Gv4jhKug">
</div>
<div>配置</div>
</div>`
for (const item of config) {
let label = document.createElement("label")
let input = document.createElement("input")
let span = document.createElement("span")
input.type = "checkbox"
input.checked = item.option
span.innerText = item.name
label.appendChild(input)
label.appendChild(span)
div.querySelector(".xuUeCQbT.Gv4jhKug").appendChild(label)
div.querySelector(".xuUeCQbT.Gv4jhKug").style.bottom = "26px"
label.onclick = function () {
item.option = input.checked
localStorage.setItem("xg-icon", JSON.stringify(config))
window.location.reload()
}
}
div.onmousemove = () => {
div.querySelector(".xuUeCQbT.Gv4jhKug").style.display = "block"
}
div.onmouseleave = () => {
div.querySelector(".xuUeCQbT.Gv4jhKug").style.display = "none"
}
bottom.appendChild(div)
let liveVoice = document.querySelector(".xgplayer-volume").dataset.state
if (liveVoice == "mute") {
document.querySelector(".xgplayer-volume .xgplayer-icon").click()
}
if (config[0].option) {
danmu?.click()
}
if (config[1].option) {
pbliwu?.click()
}
if (document.querySelector(".xgplayer-play").dataset.state == "pause") {
document.querySelector(".xgplayer-play").click()
}
}, 3200);
setInterval(() => {
let ClosePrompt = document.querySelector(".B10aL8VQ.s6mStVxD.vMQD6aai.u9TZ1Vxb")
if (ClosePrompt) {
ClosePrompt.click()
}
}, 500);
}
}
})();