选择插件功能
${Array.from(featureDict).map(([key, description]) => `
`).join('')}
`;
const newWindow = window.open();
newWindow.document.write(pageContent);
newWindow.document.close();
});
}
function removeAd(){//屏蔽广告
const adElement = document.querySelector('div[data-v-0a593618][data-v-1143714b]');
if(adElement) {
adElement.remove();
console.log('广告已被删除');
}
else console.log('没有找到广告');
}
function removeBack(){//移除网页跳转
function disableRedirect(){
window.history.go = function() {// 根据实际测试,洛谷使用的是 history.go
console.log("luogu_bot1:已为您屏蔽 history.go()");
};
}
function checkError(){
if(document.title === '错误 - 洛谷 | 计算机科学教育新生态'){
disableRedirect();
return true;
}
return false;
}
const observer = new MutationObserver((mutations, obs) => {
checkError();
});
const config = {
childList: true,
subtree: true,
};
observer.observe(document, config);// 监视 title 变化
if(document.readyState === 'complete' || document.readyState === 'interactive'){
checkError();
}
}
async function getUidByUsername(username){// 获取 uid
const apiUrl = `https://www.luogu.com.cn/api/user/search?keyword=${username}`;
return await fetch(apiUrl)
.then(response => response.json())
.then(data => {
if(data.users && data.users.length > 0){
return data.users[0].uid;
}
})
.catch(error => {
console.error('Error fetching user data:', error);
});
}
async function processItem(item) { // 添加 eventListener
item.parentElement.parentElement.addEventListener('click', (event) => {
if(event.ctrlKey){
getUidByUsername(item.textContent.trim())
.then(uid => {
const userLink = `/user/${uid}`;
if(userLink){
window.open(userLink, '_blank');
}
})
}
});
}
function addMessageLink(){ // Ctrl+Click 触发,动态修改网页
let items = document.querySelectorAll('span[data-v-5b9e5f50] > span[slot="trigger"]');
console.log("asdf");
console.log(items);
for(let i of items){
processItem(i);
}
const callback = async function(mutationsList, observer) {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
for (const addedNode of mutation.addedNodes) {
if (addedNode.nodeType === Node.ELEMENT_NODE) {
const newItems = addedNode.querySelectorAll('span[data-v-5b9e5f50] > span[slot="trigger"]');
for (const newItem of newItems) {
processItem(newItem);
}
}
}
}
}
};
const observer = new MutationObserver(callback);
observer.observe(document, { childList: true, subtree: true });
}
function removeCover(){
let profile = document.querySelector(".introduction.marked");
if(profile && profile.style.display === "none"){
profile.style.display = "block";
for(let i=0;i