Beibei.js

IMPORTANT: This function requires your script to have loaded jQuery.

Этот скрипт недоступен для установки пользователем. Он является библиотекой, которая подключается к другим скриптам мета-ключом // @require https://update.greasyfork.org/scripts/448161/1362731/Beibeijs.js

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         beibei.js
// @namespace    https://github.com/iibeibei
// @version      0.0.7
// @description  IMPORTANT: This function requires your script to have loaded jQuery.
// @author       Beibei
// @license      GPLv3
// @match        *://*/*
// ==/UserScript==

/**
 * @description: 一个实用程序函数,用于 Greasemonkey 脚本, 检测和处理 AJAXed 内容
 * @param {*} selector_txt 元素选择器
 * @param {*} active_host 激活的域名
 * @param {*} active_url 激活的页面URL
 * @param {*} b_wait_once 是否只扫描一次
 * @param {*} iframe_selector 是否扫描Frame框架
 * @param {*} action_function 找到元素时运行的方法,传送 node, selector_txt, active_host, active_url 四个变量
 */
function waitForKeyElements(selector_txt, active_host, active_url, b_wait_once, iframe_selector, js_code, action_function) {
	if (active_host != '*' && document.domain.split('.').slice(-2).join('.') != active_host) return;

	var active_url_type = false;
	if (typeof active_url == 'object') {
		for (let index = 0; index < active_url.length; index++) {
			if (window.location.href.indexOf(active_url[index]) > -1) {
				active_url_type = true;
				break;
			}
		}
	} else if (typeof active_url == 'string') {
		if (window.location.href.indexOf(active_url) > -1) active_url_type = true;
	}

	if (active_url_type) {
		var target_nodes, b_targets_found;
		if (iframe_selector) {
			target_nodes = $(iframe_selector).contents().find(selector_txt);
		} else {
			target_nodes = $(selector_txt);
		}

		if (target_nodes && target_nodes.length > 0) {
			b_targets_found = true;
			target_nodes.each(function () {
				var j_this = $(this);
				var already_found = j_this.data('alreadyFound') || false;

				if (!already_found) {
					logPrint(`selector_txt > ${selector_txt} active_host > ${active_host} active_url > ${active_url} b_wait_once > ${b_wait_once} iframe_selector > ${iframe_selector}`);
					console.log(j_this);

					var cancel_found = false;
					if (typeof action_function == 'object') {
						action_function.forEach((element) => {
							cancel_found = element(j_this, selector_txt, active_host, active_url, js_code);
						});
					} else if (typeof action_function == 'function') {
						cancel_found = action_function(j_this, selector_txt, active_host, active_url, js_code);
					}

					if (cancel_found) {
						b_targets_found = false;
					} else {
						j_this.data('alreadyFound', true);
					}
				}
			});
		} else {
			b_targets_found = false;
		}

		var control_obj = waitForKeyElements.control_obj || {};
		var control_key = selector_txt.replace(/[^\w]/g, '_');
		var time_control = control_obj[control_key];

		if (b_targets_found && b_wait_once && time_control) {
			clearInterval(time_control);
			delete control_obj[control_key];
		} else {
			if (!time_control) {
				time_control = setInterval(function () {
					waitForKeyElements(selector_txt, active_host, active_url, b_wait_once, iframe_selector, js_code, action_function);
				}, 300);
				control_obj[control_key] = time_control;
			}
		}
		waitForKeyElements.control_obj = control_obj;
	}
}
function makeGetRequest(url, method = 'GET', data = null) {
	logPrint(`${method} -> ${url}`);
	return new Promise((resolve, reject) => {
		GM_xmlhttpRequest({
			url: url,
			method: method,
			data: data,
			onload: function (response) {
				resolve(response);
			},
			onerror: function (error) {
				reject(error);
			},
		});
	});
}
function logPrint(params) {
	var date_time = $.trim(new Date(new Date().setHours(new Date().getHours() + 8)).toISOString().replace('Z', ' ').replace('T', ' '));
	var function_name = new Error().stack.split('\n')[2].trim().split(' ')[1];
	console.log(`[${date_time}][DEBUG] ${function_name} - ${params}`);
}
function sleep(interval) {
	return new Promise((resolve) => {
		setTimeout(resolve, interval);
	});
}
function loadMenu(menu_ALL, version_url) {
	var menu_ID = [];

	// 如果读取到的值为 null 就写入默认值
	for (let i = 0; i < menu_ALL.length; i++) {
		if (GM_getValue(menu_ALL[i][0]) == null) {
			GM_setValue(menu_ALL[i][0], menu_ALL[i][3]);
		}
	}

	registerMenuCommand();

	// 注册脚本菜单
	function registerMenuCommand() {
		// 如果菜单ID数组多于菜单数组,说明不是首次添加菜单,需要卸载所有脚本菜单
		if (menu_ID.length > menu_ALL.length) {
			for (let i = 0; i < menu_ID.length; i++) {
				GM_unregisterMenuCommand(menu_ID[i]);
			}
		}

		// 循环注册脚本菜单
		for (let i = 0; i < menu_ALL.length; i++) {
			menu_ALL[i][3] = GM_getValue(menu_ALL[i][0]);
			menu_ID[i] = GM_registerMenuCommand(`${menu_ALL[i][3] ? '✅' : '❌'} ${menu_ALL[i][2]}`, function () {
				menu_switch(`${menu_ALL[i][0]}`, `${menu_ALL[i][1]}`, `${menu_ALL[i][2]}`, `${menu_ALL[i][3]}`);
			});
		}

		// 加入版本信息
		menu_ID[menu_ID.length] = GM_registerMenuCommand(`🏁 当前版本 ${GM_info['script']['version']}`, function () {
			window.GM_openInTab(version_url, { active: true, insert: true, setParent: true });
		});
	}

	//切换选项
	function menu_switch(name, ename, cname, value) {
		if (value == 'false') {
			// 重新注册脚本菜单,刷新网页
			GM_setValue(`${name}`, true);
			registerMenuCommand();
			location.reload();
			GM_notification({ text: `「${cname}」已开启\n`, timeout: 3500 });
		} else {
			// 重新注册脚本菜单,刷新网页
			GM_setValue(`${name}`, false);
			registerMenuCommand();
			location.reload();
			GM_notification({ text: `「${cname}」已关闭\n`, timeout: 3500 });
		}
		// 重新注册脚本菜单
		registerMenuCommand();
	}
}
/**
 * 获取指定的cookie
 * @param {String} key cookie的key
 * @returns {String}
 */
function get_cookie(key) {
	const cookie = document.cookie.split(';');
	for (let i = 0, len = cookie.length; i < len; i++) {
		const cur = cookie[i].split('=');
		if (key === cur[0]) {
			return cur[1];
		}
	}

	return '';
}
function initializationScript() {
	var $ = window.$;
	var VueCDN = 'https://lib.baomitu.com/vue/3.2.36/vue.global.prod.min.js';
	var ElementPlusCDN = 'https://lib.baomitu.com/element-plus/2.2.2/index.full.min.js';
	GM_addStyle(GM_getResourceText('element-plus'));
	$.getScript(VueCDN, function () {
		console.log('[' + VueCDN + '] Vue 加载成功');
		$.getScript(ElementPlusCDN, function () {
			console.log('[' + ElementPlusCDN + '] ElementPlus 加载成功');
			var ElementPlus = unsafeWindow.ElementPlus;
			var Vue = unsafeWindow.Vue;
		});
	});
}