您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Sleazy Fork is available in English.
Adds more features to the chaturbate website filters such as age and keyword searching filtering. Look for these features under the normal options gear.
// ==UserScript== // @name Chaturbate Advanced Filters // @namespace http://tampermonkey.net/ // @version 1.03 // @description Adds more features to the chaturbate website filters such as age and keyword searching filtering. Look for these features under the normal options gear. // @author [email protected] // @match *chaturbate.com/* // @icon https://static-assets.highwebmedia.com/favicons/favicon.ico // @grant none // @license MIT // ==/UserScript== const defaultHomepage = "https://chaturbate.com/tag/milf/female/"; //homepage redirect const minAgeDefault = '30'; //default min age const maxAgeDefault = ''; //default max age const keywordDefaults = '-squirt'; //list of keywords (or negative keywords) separated by commas // Keep track of changes to the DOM and update as needed let timer; let targetNode = document.getElementsByClassName("roomlist_container")[0]; let config = { attributes: true, childList: true, subtree: true }; let callback = (mutationList, observer) => { if (timer) clearTimeout(timer); timer = setTimeout(() => { initialize(); }, 1000); }; let observer = new MutationObserver(callback); observer.observe(targetNode, config); homepageRedirect(); addFilters(); function initialize(){ showHideRoomCards(); } function addFilters(){ const searchMenu = document.getElementsByClassName("advance-search-element")[0]; // Age filter // ************************************************** const ageFilter = document.createElement("div"); const ageLabel = document.createElement("label"); const ageMin = document.createElement("input"); const ageMax = document.createElement("input"); const ageSeparator = document.createElement("span"); ageFilter.id = "age-filter"; ageLabel.innerHTML = "Age: "; ageMin.type = "text"; ageMin.id = "age-min"; ageMin.value = minAgeDefault; ageSeparator.innerHTML = " - "; ageMax.type = "text"; ageMax.id = "age-max"; ageMax.value = maxAgeDefault; ageFilter.appendChild(ageLabel); ageFilter.appendChild(ageMin); ageFilter.appendChild(ageSeparator); ageFilter.appendChild(ageMax); searchMenu.appendChild(ageFilter); searchMenu.insertBefore(addStyleBlock(), ageFilter); ageMin.addEventListener("change", (event) => { showHideRoomCards(); }); ageMax.addEventListener("change", (event) => { showHideRoomCards(); }); // Keyword filter // ************************************************** const keywordFilter = document.createElement("div"); const keywordLabel = document.createElement("label"); const keywordList = document.createElement("input"); keywordFilter.id = "keyword-filter"; keywordLabel.innerHTML = "keywords: "; keywordList.type = "text"; keywordList.id = "keyword-list"; keywordList.value = keywordDefaults; keywordFilter.appendChild(keywordLabel); keywordFilter.appendChild(keywordList); searchMenu.appendChild(keywordFilter); searchMenu.insertBefore(addStyleBlock(), keywordFilter); keywordList.addEventListener("change", (event) => { showHideRoomCards(); }); keywordList.addEventListener("change", (event) => { showHideRoomCards(); }); } function showHideRoomCards(){ var minAge = document.getElementById("age-min").value; var maxAge = document.getElementById("age-max").value; var keywordList = document.getElementById("keyword-list").value; var rooms = document.getElementsByClassName("roomCard"); for (let i = 0; i < rooms.length; ++i) { // Age check var ages = rooms[i].getElementsByClassName("age"); var age = (ages[0] !== undefined) ? ages[0].innerHTML : ''; var showAge = false; if ((age >= minAge || minAge == "") && (age <= maxAge || maxAge == "")){ showAge = true; } // Keyword check var subjects = rooms[i].getElementsByClassName("subject"); var subject = (subjects[0] !== undefined) ? subjects[0].innerHTML : ""; var keywords = keywordList.split(","); var showKeyword = true; if(subject != "" && keywords != ""){ for (let k = 0; k < keywords.length; ++k) { if(keywords[k].startsWith("-") == true && subject.includes(keywords[k].substring(1).toLowerCase())){ showKeyword = false; } if(keywords[k].startsWith("-") == false && !subject.includes(keywords[k].toLowerCase() in subject)){ showKeyword = false; } }} if(showAge == true && showKeyword == true){ rooms[i].dataset.hide = false; rooms[i].style.display = "list-item"; } else { rooms[i].dataset.hide = true; rooms[i].style.display = "none !important"; } } } function homepageRedirect(){ if(window.location.href == "https://chaturbate.com/"){ window.location.replace(defaultHomepage); return false; } else { return true; } } function addStyleBlock(){ var cssBlock = document.createElement("style"); cssBlock.innerHTML = "" + "#improvedSearch { height: 50px; }" + "" + "#age-min,#age-max { width:20px; }" + "body li[data-hide='true'] {display:none !important; }" + ""; return cssBlock; } function insertAfter(referenceNode, newNode) { referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); }