aicnn 公益站 oaifree 筛选类型
// ==UserScript==
// @name aicnn oaifree 筛选
// @namespace http://tampermonkey.net/
// @version 0.1
// @description aicnn 公益站 oaifree 筛选类型
// @author Yearly
// @match https://aicnn.cn/oaifree
// @icon https://www.google.com/s2/favicons?sz=64&domain=https://aicnn.cn/oaifree.
// @license MIT
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @noframes
// ==/UserScript==
(function() {
'use strict';
//no animation
GM_addStyle(`
#app > div.oarfree-container > div.apply_content > div.card_content > div.child_content {
animation: none !important;
}
#app > div.oarfree-container > div.apply_content > div.card_content > div.child_content > div[class^=lightning] {
display: none !important;
}`);
// 自定义日志函数
function customLog(...args) {
let timenow = new Date().getTime();
let logs = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : arg).join(' ');
GM_setValue(timenow, logs);
}
// 函数: 创建多选组件
function createMultiSelect(imageSources) {
customLog("createMultiSelect");
const multiSelect = document.createElement('div');
multiSelect.style.cssText = 'display: flex; gap: 20px; margin: 10px;';
imageSources.forEach((src, index) => {
const option = document.createElement('label');
option.style.cssText = 'display: flex; align-items: center; cursor: pointer;';
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.checked = true;
checkbox.style.marginRight = '5px';
const img = document.createElement('img');
img.src = src;
img.style.width = '32px';
img.style.height = '32px';
option.appendChild(checkbox);
option.appendChild(img);
multiSelect.appendChild(option);
checkbox.addEventListener('change', () => filterContent());
});
return multiSelect;
}
// 函数: 过滤内容
function filterContent() {
const checkboxes = document.querySelectorAll('#userFilterMultiSelect input[type="checkbox"]');
const childContents = document.querySelectorAll("div.apply_content > div.card_content > div.child_content");
childContents.forEach(child => {
const img = child.querySelector("div.card_title > div.titleAppName > div > img[src]");
if (img) {
const checkbox = Array.from(checkboxes).find(cb => cb.nextElementSibling.src === img.src);
if (checkbox) {
child.style.display = checkbox.checked ? '' : 'none';
}
}
});
}
// MutationObserver
let observer;
function initObserver() {
const targetNode = document.querySelector("div.apply_content > div.card_content");
if (!targetNode) return;
const config = { childList: true, subtree: true };
const callback = function(mutationsList, observer) {
for(let mutation of mutationsList) {
if (mutation.type === 'childList') {
filterContent();
break;
}
}
};
observer = new MutationObserver(callback);
observer.observe(targetNode, config);
}
// 主函数
function init() {
customLog("init");
const childContents = document.querySelectorAll("div.apply_content > div.card_content > div.child_content");
if (childContents.length < 3) {
setTimeout(() => {init();}, 1500);
return;
}
customLog("init done: " + childContents.length );
const imageSources = new Set();
childContents.forEach(child => {
const img = child.querySelector("div.card_title > div.titleAppName > div > img[src]");
if (img && img.src) {
imageSources.add(img.src);
}
});
const header = document.querySelector("#app > div.oarfree-container > div.flex-header");
if (header && !header.querySelector("#userFilterMultiSelect")) {
const multiSelect = createMultiSelect(Array.from(imageSources));
multiSelect.id = 'userFilterMultiSelect';
header.appendChild(multiSelect);
}
filterContent(); // 初始调用以设置初始状态
initObserver();
}
init();
})();