哔哩哔哩知乎增强,AI搜索增强,视频解析等🚀

AI搜索助手、B站使用增强、视频解析、知乎使用助手、引擎功能增强

当前为 2025-07-04 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name              哔哩哔哩知乎增强,AI搜索增强,视频解析等🚀
// @name:zh           哔哩哔哩知乎增强,AI搜索增强,视频解析等🚀
// @name:zh-TW		  嗶哩嗶哩知乎增強,AI搜索增強,視頻解析等🚀
// @namespace         bilibili_namespace_20250504_search
// @version           2025-07-04
// @description       AI搜索助手、B站使用增强、视频解析、知乎使用助手、引擎功能增强
// @description:zh    AI搜索助手、B站使用增强、视频解析、知乎使用助手、引擎功能增强
// @description:zh-TW  AI搜索助手、B站使用增強、視頻解析、知乎使用助手、引擎功能增強
// @author            huahuacat,CathyElla
// @icon              data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACS0lEQVRYR8WXz2oTURTGv3MnpqhNKy1UWmxRTGdaiLSQRKkKIoK4FVrRPoHu7BMYn0B3+gQquuiuiC6kaFVsAhGEZkKqG/+Vrtp0YWsyR27KlEwz0xnnT3LgwjB37vl+97tzz9whdDiow/pwBCjofN0AJohwKQgkMxYF8Dmt0bxdnhaAQoWTXMczENJBhFvGMgqk4GY6SZXmPgvAmy/cnYijGqrwvmTVHSQup2jLvG0ByJf5EYDbUQIAeJxR6U4LQHGV1VodesTijfQxBdrkaSrL6z0Hlst8i4An7QBgYDar0lMrgM45ItxrCwDjflajnC+AtR8Gvn8zGpz9xwVOjor/Zma/ANt/GIsLNWxt8p7o4IiAmlLQP+C9pvkG+FoyUPxYs52xhFDPKIh3uRviG2ClWIdsTpHoJYymFNdliQzABBsaEZg4p+DwUftliRxAggwOC0xdidma1RaAI92Ea9OHOgcwPqlANruI1AElhsa2dBKXQJEBnDglGlvxWN/BNcE3gKyCS69b64AUlMISwEv4BpDJ3778i/Xfu5XQtFtaLq+9RiCA6gZj/dcuQN8Audod6kvodYZuz9k7UOK7JPDAbXAY/WxgLjtGDy2f408VPi8MLIUh4JbDELhwNknvLQDyQNoTh87AkFuCIP0E/NzcgWYeTC0bdrkNp6Lm9bc4YM4qr/NzEGaCzNJxLONFRqMbzf22JSu/wlcphhwzpsIAIcIHriGXGadX+/MdWDPflTjRxcH+kLYJhYtj5Piz4/0gF4YVNjk6DvAPDb0aMEr8/nEAAAAASUVORK5CYII=
// @include           *://*.youku.com/v_*
// @include           *://*.iqiyi.com/v_*
// @include           *://*.iqiyi.com/w_*
// @include           *://*.iqiyi.com/a_*
// @include           *://*.iqiyi.com/resource/pcw/play/*
// @include           *://*.le.com/ptv/vplay/*
// @include           *://v.qq.com/x/cover/*
// @include           *://v.qq.com/x/page/*
// @include           *://v.qq.com/tv/*
// @include           *://*.tudou.com/listplay/*
// @include           *://*.tudou.com/albumplay/*
// @include           *://*.tudou.com/programs/view/*
// @include           *://*.mgtv.com/b/*
// @include           *://film.sohu.com/album/*
// @include           *://tv.sohu.com/v/*
// @include           *://*.baofeng.com/play/*
// @include           *://vip.pptv.com/show/*
// @include           *://v.pptv.com/show/*
// @include           *://www.le.com/ptv/vplay/*
// @include           *://www.wasu.cn/Play/show/*
// @include           *://*.1905.com/video/*
// @include           *://*.1905.com/play/*
// @include           *://*.1905.com/*/play/*
// @include           *://www.miguvideo.com/mgs/*
// @include           *://m.v.qq.com/x/cover/*
// @include           *://m.v.qq.com/x/page/*
// @include           *://m.v.qq.com/*
// @include           *://m.iqiyi.com/v_*
// @include           *://m.iqiyi.com/w_*
// @include           *://m.iqiyi.com/a_*
// @include           *://m.youku.com/alipay_video/*
// @include           *://m.youku.com/video/id_*
// @include           *://m.mgtv.com/b/*
// @include           *://m.tv.sohu.com/v/*
// @include           *://m.film.sohu.com/album/*
// @include           *://m.le.com/ptv/vplay/*
// @include           *://m.pptv.com/show/*
// @include           *://m.acfun.cn/v/*
// @include           *://m.wasu.cn/Play/show/*
// @include           *://www.baidu.com/*
// @include           *://www.so.com/s*
// @include           *://www.sogou.com/web*
// @include           *://www.sogou.com/sogou*
// @include           *://cn.bing.com/search*
// @include           *://www.bing.com/search*
// @include           *://www4.bing.com/search*
// @include           *://so.toutiao.com/search*
// @include           *://www.google.com/search*
// @include           *://www.google.com.hk/search*
// @include           *://duckduckgo.com*
// @include	   	      *://www.bilibili.com/**
// @include           *://search.bilibili.com/**
// @include           *://space.bilibili.com/**
// @include           *://www.bilibili.com/read/**
// @include      	  *://*.zhihu.com/*
// @include           *://www.douyin.com/*
// @include           *://*.douyinvod.com/*
// @include           *://www.kuaishou.com/*
// @include           *://www.youtube.com/watch**
// @include           *://www.youtube.com/shorts**
// @include           *://www.tiktok.com/@*
// @include           *://*.cloud.tencent.com/*
// @include           *://cloud.tencent.com/*
// @include           *://*.huaweicloud.com/*
// @include           *://*.aliyun.com/*
// @exclude           *://cloud.tencent.com/login*
// @exclude           *://console.cloud.tencent.com/*
// @exclude           *://market.cloud.tencent.com/*
// @exclude           *://www.aliyun.com/smarter-engine/*
// @exclude           *://account.aliyun.com/*
// @exclude           *://developer.aliyun.com/*
// @exclude           *://promotion.aliyun.com/*
// @exclude           *://free.aliyun.com/*
// @exclude           *://summit.aliyun.com/*
// @exclude           *://startup.aliyun.com/*
// @exclude           *://university.aliyun.com/*
// @exclude           *://careers.aliyun.com/*
// @exclude           *://market.aliyun.com/*
// @exclude           *://yunqi.aliyun.com/*
// @exclude           *://help.aliyun.com/*
// @exclude           *://g.alicdn.com/*
// @exclude           *://passport.aliyun.com/*
// @exclude           *://*.console.aliyun.com/*
// @exclude           *://auth.huaweicloud.com/*
// @exclude           *://support.huaweicloud.com/*
// @exclude           *://console.huaweicloud.com/*
// @exclude           *://accounts.youtube.com/*
// @include           *://kimi.moonshot.cn/*
// @include           *://www.kimi.com/*
// @include           *://yuanbao.tencent.com/*
// @include           *://chat.deepseek.com/*
// @include           *://chat.qwen.ai/*
// @include           *://www.doubao.com/*
// @exclude           *://www.youtube.com/live_chat_replay*
// @exclude           *://www.youtube.com/persist_identity*
// @require           https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
// @require           https://greasyfork.org/scripts/454236-findandreplacedomtext-huahuacat/code/findAndReplaceDOMText-huahuacat.js?version=1112990
// @connect           bilibili.com
// @connect           tikdownloader.io
// @connect           staticj.top
// @grant             unsafeWindow
// @grant             GM_openInTab
// @grant             GM.openInTab
// @grant             GM_getValue
// @grant             GM.getValue
// @grant             GM_setValue
// @grant             GM.setValue
// @grant             GM_download
// @grant             GM_xmlhttpRequest
// @grant             GM.xmlHttpRequest
// @grant             GM_addStyle
// @grant             GM_registerMenuCommand
// @license           AGPL License
// @charset		        UTF-8
// @run-at            document-idle
// ==/UserScript==
(function () {
	'use strict';
	/**
 * 脚本遵循AGPL License开源协议;在协议允许的范围类,可以自由修改
 * 开完万岁!!
 */
	//共有方法,全局共享
function CommonFunction(){
	this.GMgetValue = function (name, value=null) {
		let storageValue = value;
		if (typeof GM_getValue === "function") {
			storageValue = GM_getValue(name, value);
		} else if(typeof GM.setValue === "function"){
			storageValue = GM.getValue(name, value);
		}else{
			var arr = window.localStorage.getItem(name);
			if(arr != null){
				storageValue = arr
			}
		}
		return storageValue;
	};
	this.GMsetValue = function(name, value){
		if (typeof GM_setValue === "function") {
			GM_setValue(name, value);
		} else if(typeof GM.setValue === "function"){
			GM.setValue(name, value);
		}else{
			window.localStorage.setItem(name, value)
		}
	};
	this.GMaddStyle = function(css){
		var myStyle = document.createElement('style');
		myStyle.textContent = css;
		var doc = document.head || document.documentElement;
		doc.appendChild(myStyle);
	};
	this.GMopenInTab = function(url, options={"active":true, "insert":true, "setParent":true}){
		if (typeof GM_openInTab === "function") {
			GM_openInTab(url, options);
		} else {
			GM.openInTab(url, options);
		}
	};
	this.addScript = function(url){
		var s = document.createElement('script');
		s.setAttribute('src',url);
		document.body.appendChild(s);
	};
	this.randomNumber = function(){
		return Math.ceil(Math.random()*100000000);
	};
	this.request=function(method, url, param, headers={"Content-Type": "application/json;charset=UTF-8"}){
		return new Promise(function(resolve, reject){
			GM_xmlhttpRequest({
				url: url,
				method: method,
				data:param,
				headers:headers,
				onload: function(response) {
					var status = response.status;
					var playurl = "";
					if(status==200||status=='200'){
						var responseText = response.responseText;
						resolve({"result":"success", "data":responseText});
					}else{
						reject({"result":"error", "data":null});
					}
				}
			});
		})
	};
	this.crossRequest=function(method, url, param){
		if(!method){
			method = "get";
		}
		if(!url){
			return new Promise(function(resolve, reject){
				reject({"result":"error", "data":null});
			});
		}
		if(!param){
			param = {};
		}
		method = method.toUpperCase();
	    let config = {
	        method: method
	    };
	    if (method === 'POST') {
	        config.headers['Content-Type'] = 'application/json';
	        config.body = JSON.stringify(param);
	    }
		return new Promise(function(resolve, reject){
			fetch(url, config).then(response => response.text()).then(text => {
				resolve({"result":"success", "data":text});
			}).catch(error => {
				reject({"result":"error", "data":null});
			});
		});
	};
	this.addCommonHtmlCss = function(){
		var cssText =
			`
			@keyframes fadeIn {
				0%    {opacity: 0}
				100%  {opacity: 1}
			}
			@-webkit-keyframes fadeIn {
				0%    {opacity: 0}
				100%  {opacity: 1}
			}
			@-moz-keyframes fadeIn {
				0%    {opacity: 0}
				100%  {opacity: 1}
			}
			@-o-keyframes fadeIn {
				0%    {opacity: 0}
				100%  {opacity: 1}
			}
			@-ms-keyframes fadeIn {
				0%    {opacity: 0}
				100%  {opacity: 1}
			}
			@keyframes fadeOut {
				0%    {opacity: 1}
				100%  {opacity: 0}
			}
			@-webkit-keyframes fadeOut {
				0%    {opacity: 1}
				100%  {opacity: 0}
			}
			@-moz-keyframes fadeOut {
				0%    {opacity: 1}
				100%  {opacity: 0}
			}
			@-o-keyframes fadeOut {
				0%    {opacity: 1}
				100%  {opacity: 0}
			}
			@-ms-keyframes fadeOut {
				0%    {opacity: 1}
				100%  {opacity: 0}
			}
			.web-toast-kkli9{
				position: fixed;
				background: rgba(0, 0, 0, 0.7);
				color: #fff;
				font-size: 14px;
				line-height: 1;
				padding:10px;
				border-radius: 3px;
				left: 50%;
				transform: translateX(-50%);
				-webkit-transform: translateX(-50%);
				-moz-transform: translateX(-50%);
				-o-transform: translateX(-50%);
				-ms-transform: translateX(-50%);
				z-index: 999999999999999999999999999;
				white-space: nowrap;
			}
			.fadeOut{
				animation: fadeOut .5s;
			}
			.fadeIn{
				animation:fadeIn .5s;
			}
			`;
		this.GMaddStyle(cssText);
	};
	this.webToast = function(params) {	//小提示框
		var time = params.time;
		var background = params.background;
		var color = params.color;
		var position = params.position;  //center-top, center-bottom
		var defaultMarginValue = 50;

		if(time == undefined || time == ''){
			time = 1500;
		}

		var el = document.createElement("div");
		el.setAttribute("class", "web-toast-kkli9");
		el.innerHTML = params.message;
		//背景颜色
		if(background!=undefined && background!=''){
			el.style.backgroundColor=background;
		}
		//字体颜色
		if(color!=undefined && color!=''){
			el.style.color=color;
		}

		//显示位置
		if(position==undefined || position==''){
			position = "center-bottom";
		}

		//设置显示位置,当前有种两种形式
		if(position==="center-bottom"){
			el.style.bottom = defaultMarginValue+"px";
		}else{
			el.style.top = defaultMarginValue+"px";
		}
		el.style.zIndex=999999;

		document.body.appendChild(el);
		el.classList.add("fadeIn");
		setTimeout(function () {
			el.classList.remove("fadeIn");
			el.classList.add("fadeOut");
			/*监听动画结束,移除提示信息元素*/
			el.addEventListener("animationend", function () {
				document.body.removeChild(el);
			});
			el.addEventListener("webkitAnimationEnd", function () {
				document.body.removeChild(el);
			});
		}, time);
	};
	this.filterStr = function(str){
		if(!str) return "";
		str = str.replace(/\t/g,"");
		str = str.replace(/\r/g,"");
		return encodeURIComponent(str)
	};
	this.getParamterQueryUrl = function(text, tag) { //查询GET请求url中的参数
		if(text.indexOf("?")!=-1){ //选取?后面的字符串,兼容window.location.search,前面的?不能去掉
			var textArray = text.split("?");
			text = "?"+textArray[textArray.length-1];
		}
		var t = new RegExp("(^|&)" + tag + "=([^&]*)(&|$)");
		var a = text.substr(1).match(t);
		if (a != null){
			return a[2];
		}
		return "";
	};
	this.getEndHtmlIdByUrl = function(url) { //获得以html结束的ID
		if(url.indexOf("?")!=-1){
			url = url.split("?")[0]
		}
		if(url.indexOf("#")!=-1){
			url = url.split("#")[0]
		}
		var splitText = url.split("/");
		var idText = splitText[splitText.length-1];
		idText = idText.replace(".html","");
		return idText;
	};
	this.suningParameter=function(url){
		const regex = /product\.suning\.com\/(\d+\/\d+)\.html/;
		const match = url.match(regex);
		if(match){
			return match[1].replace(/\//g, '-');
		}
		return null;
	};
	this.getEcommercePlatform=function(host = window.location.host){
		let platform = "";
		if(host.indexOf(".taobao.")!=-1 || host.indexOf(".liangxinyao.")!=-1){
			platform = "taobao";
		}else if(host.indexOf(".tmall.")!=-1){
			platform = "tmall";
		}else if(host.indexOf(".jd.")!=-1 || host.indexOf(".yiyaojd.")!=-1 || host.indexOf(".jkcsjd.")!=-1){
			platform = "jd";
		}else if(host.indexOf(".vip.")!=-1 || host.indexOf(".vipglobal.")!=-1){
			platform = "vpinhui";
		}else if(host.indexOf(".suning.")!=-1){
			platform = "suning";
		}
		return platform;
	}
	this.isPC = function(){
		var userAgentInfo = navigator.userAgent;
		var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone", "iPad", "iPod"];
		var flag = true;
		for (var v = 0; v < Agents.length; v++) {
			if (userAgentInfo.indexOf(Agents[v]) > 0) {
				flag = false;
				break;
			}
		}
		return flag;
	};
	this.getBilibiliBV=function(){
		var pathname = window.location.pathname;
		var bv = pathname.replace("/video/","").replace("/","");
		return bv;
	};
	this.getSystemOS=function(){
		var u = navigator.userAgent;
		if (!!u.match(/compatible/i) || u.match(/Windows/i)) {
			return 'windows';
		} else if (!!u.match(/Macintosh/i) || u.match(/MacIntel/i)) {
			return 'macOS';
		} else if (!!u.match(/iphone/i) || u.match(/Ipad/i)) {
			return 'ios';
		} else if (!!u.match(/android/i)) {
			return 'android';
		} else {
			return 'other';
		}
	};
	this.RPCDownloadFile = function(fileName, url, savePath="D:/", RPCURL="ws://localhost:16800/jsonrpc", RPCToken="") {
		const self = this;
		if(!savePath){
			savePath = "D:/";
		}
		if(!RPCURL){
			RPCURL = "ws://localhost:16800/jsonrpc";
		}
		let options = { //下载配置文件
			"dir":savePath,
			"max-connection-per-server": "16",
			"header":["User-Agent:"+navigator.userAgent+"", "Cookie:"+document.cookie+"", "Referer:"+window.location.href+""]
		}
		if(!!fileName) {
			options.out = fileName;
		}
		let jsonRPC = {
			"jsonrpc": "2.0",
			"id": "huahuacat",
			"method": "aria2.addUri",
			"params": [[url], options],
		}
		if (!!RPCToken) {
			jsonRPC.params.unshift("token:" + RPCToken); // 必须要加在第一个
		}
		return new Promise(function(resolve, reject) {
			var webSocket = new WebSocket(RPCURL);
			webSocket.onerror = function(event) {
				console.log("webSocket.onerror", event);
				reject("Aria2连接错误,请打开Aria2和检查RPC设置!");
			}
			webSocket.onopen = function(){
				webSocket.send(JSON.stringify(jsonRPC));
			}
			webSocket.onmessage = function(event){
				let result = JSON.parse(event.data);
				switch (result.method) {
					case "aria2.onDownloadStart":
						resolve("Aria2 开始下载【"+fileName+"】");
						webSocket.close();
						break;
					case "aria2.onDownloadComplete":
						break;
					default:
						break;
				}
			}
		});
	};
	this.getElementObject = function(selector, target=document.body, allowEmpty = true, delay=10, maxDelay=10 * 1000){
		return new Promise((resolve,reject) =>{
			if (selector.toUpperCase() === "BODY") {
				resolve(document.body);
				return;
			}
			if (selector.toUpperCase() === "HTML") {
				resolve(document.html);
				return;
			}
			let totalDelay = 0;

			let element = target.querySelector(selector);
			let result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
			if(result){
				resolve(element);
			}

			const elementInterval = setInterval(()=>{
				if(totalDelay >= maxDelay){
					clearInterval(elementInterval);
					resolve(null);
				}
				element = target.querySelector(selector);
				result = allowEmpty ? !!element : (!!element && !!element.innerHTML);
				if(result){
					clearInterval(elementInterval);
					resolve(element);
				}else{
					totalDelay += delay;
				}
			}, delay);
		});
	};
	/**
	 * @param {Object} time
	 * @param {Object} format
	 * 时间格式化
	 * DateFormat(new Date(dateCreated), "yyyy-MM-dd hh:mm:ss")
	 */
	this.DateFormat = function(time, format) {
		var o = {
			"M+": time.getMonth() + 1, //月份
			"d+": time.getDate(), //日
			"h+": time.getHours(), //小时
			"m+": time.getMinutes(), //分
			"s+": time.getSeconds(), //秒
			"q+": Math.floor((time.getMonth() + 3) / 3), //季度
			"S": time.getMilliseconds() //毫秒
		};
		if(/(y+)/.test(format)){
			format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
		}
		for(var k in o){
			if(new RegExp("(" + k + ")").test(format)){
				format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
			}
		}
		return format;
	};
	this.decryptStr=function(str){
		let result = atob(str);
		return result.split('').reverse().join('');
	};
	this.encryptStr=function(str){
		let result = str.split('').reverse().join('');
		return btoa(result);
	};
}
//全局弹窗对象
const dialog = (function(){
	class Dialog {
		constructor() {
			this.mask = document.createElement('div');
			this.dialogStyle = document.createElement('style');

			this.setStyle(this.mask, {
				"width": '100%',
				"height": '100%',
				"backgroundColor": 'rgba(0, 0, 0, .6)',
				"position": 'fixed',
				"left": "0px",
				"top": "0px",
				"bottom":"0px",
				"right":"0px",
				"z-index":"9999999999999"
			});

			this.content = document.createElement('div');
			this.setStyle(this.content, {
				"max-width": '450px',
				"width":"100%",
				"max-height": '600px',
				"backgroundColor": '#fff',
				"boxShadow": '0 0 2px #999',
				"position": 'absolute',
				"left": '50%',
				"top": '50%',
				"transform": 'translate(-50%,-50%)',
				"borderRadius": '5px'
			})
			this.mask.appendChild(this.content);
		}
		middleBox(param) {
			// 先清空中间小div的内容 - 防止调用多次,出现混乱
			this.content.innerHTML = '';

			let title = '默认标题内容';
			if({}.toString.call(param) === '[object String]') {
				title = param;
			} else if({}.toString.call(param) === '[object Object]') {
				title = param.title;
			}

			document.body.appendChild(this.mask);
			this.title = document.createElement('div');
			this.setStyle(this.title, {
				"width": '100%',
				"height": '40px',
				"lineHeight": '40px',
				"boxSizing": 'border-box',
				"background-color":"#dedede",
				"color": '#000',
				"text-align": 'center',
				"font-weight":"700",
				"font-size":"17px",
				"border-radius": "4px 4px 0px 0px"
			});

			this.title.innerText = title;
			this.content.appendChild(this.title);

			this.closeBtn = document.createElement('div');
			this.closeBtn.innerText = '×';

			this.setStyle(this.closeBtn, {
				"textDecoration": 'none',
				"color": '#000',
				"position": 'absolute',
				"right": '10px',
				"top": '0px',
				"fontSize": '25px',
				"display":"inline-block",
				"cursor":"pointer"
			})
			this.title.appendChild(this.closeBtn);

			const self = this;
			this.closeBtn.onclick = function(){
				self.close();
				if(param.onClose && (typeof param.onClose)==="function"){
					param.onClose();
				}
			}
		}
		showMake(param) {
			//添加公用样式表
			if(param.hasOwnProperty("styleSheet")){
				this.dialogStyle.textContent = param.styleSheet;
			}
			document.querySelector("head").appendChild(this.dialogStyle);

			this.middleBox(param);
			this.dialogContent = document.createElement('div');
			this.setStyle(this.dialogContent,{
				"padding":"15px",
				"max-height":"400px"
			});
			this.dialogContent.innerHTML = param.content;
			this.content.appendChild(this.dialogContent);
			param.onContentReady(this);
		}
		close() {
			document.body.removeChild(this.mask);
			document.querySelector("head").removeChild(this.dialogStyle);
		}
		setStyle(ele, styleObj) {
			for(let attr in styleObj){
				ele.style[attr] = styleObj[attr];
			}
		}
	}
	let dialog = null;
	return (function() {
		if(!dialog) {
			dialog = new Dialog()
		}
		return dialog;
	})()
})();

//全局统一方法对象
const commonFunctionObject = new CommonFunction();
commonFunctionObject.addCommonHtmlCss();	//统一html、css元素添加
let functionController = null;
	//相关功能关闭控制
functionController = commonFunctionObject.GMgetValue("setingData");
if(!functionController){
	functionController={
		"bilibiliHelper":true,"superVideoHelper":true,
		"abroadVideoHelper":true,
		"searchEnginesNavigation":true,"zhihuHelper":true,
		"shortVideoDownload":true
	}
}
//用户功能设置函数
function usersSeting(){
	var bilibiliHelper=true, superVideoHelper=true, abroadVideoHelper=true,
	searchEnginesNavigation=true, zhihuHelper=true, shortVideoDownload=true;
	var isUpdateStorage = false;
	if(!functionController.hasOwnProperty("bilibiliHelper")){
		functionController.bilibiliHelper = true;
		isUpdateStorage = true;
	}else{
		bilibiliHelper = functionController.bilibiliHelper;
	}
	if(!functionController.hasOwnProperty("superVideoHelper")){
		functionController.superVideoHelper = true;
		isUpdateStorage = true;
	}else{
		superVideoHelper = functionController.superVideoHelper;
	}
	if(!functionController.hasOwnProperty("abroadVideoHelper")){
		functionController.abroadVideoHelper = true;
		isUpdateStorage = true;
	}else{
		abroadVideoHelper = functionController.abroadVideoHelper;
	}
	if(!functionController.hasOwnProperty("searchEnginesNavigation")){
		functionController.searchEnginesNavigation = true;
		isUpdateStorage = true;
	}else{
		searchEnginesNavigation = functionController.searchEnginesNavigation;
	}
	if(!functionController.hasOwnProperty("zhihuHelper")){
		functionController.zhihuHelper = true;
		isUpdateStorage = true;
	}else{
		zhihuHelper = functionController.zhihuHelper;
	}
	if(!functionController.hasOwnProperty("shortVideoDownload")){
		functionController.shortVideoDownload = true;
		isUpdateStorage = true;
	}else{
		shortVideoDownload = functionController.shortVideoDownload;
	}
	if(isUpdateStorage){
		commonFunctionObject.GMsetValue("setingData",functionController);
	}
	var setingData=[
		{"tag":"bilibiliHelper", "name":"B站使用加强(视频下载支持批量、浏览记录、一键三连)", "checked":bilibiliHelper},
		{"tag":"zhihuHelper", "name":"知乎使用加强(内容标识、问答显示优化、视频下载等)", "checked":zhihuHelper},
		{"tag":"superVideoHelper", "name":"全网VIP视频解析(支持爱奇艺、腾讯视频、B站番剧等)", "checked":superVideoHelper},
		{"tag":"searchEnginesNavigation", "name":"搜索引擎使用加强(适配百度、360、搜狗、必应、Google等)", "checked":searchEnginesNavigation},
		{"tag":"shortVideoDownload", "name":"短视频去水印下载(支持抖音、快手等)", "checked":shortVideoDownload},
		{"tag":"abroadVideoHelper", "name":"国外视频解析下载(支持油管、Facebook等)", "checked":abroadVideoHelper}
	]
	var content = "";
	for(var i=0; i<setingData.length;i++){
		var one = setingData[i];
		content += `
			<div style="padding: 5px 0px;">
				<input style="display:inline-block;width: 15px;height: 15px;display: inline-block;vertical-align: middle; -webkit-appearance:checkbox;margin-bottom: 3px;cursor: pointer;" name="Checkbox" type="checkbox" data-tag="`+one.tag+`" `+(one.checked ? "checked" : "")+`>
				<label style="display:inline-block;font-size: 14px;margin:3px 0;vertical-align: middle;font-weight:500;color:#000;">`+one.name+`</label>
			</div>
		`
	}
	dialog.showMake({
		"title":"功能开关",
		"content":content,
		"onClose":function(){
			location.reload();
		},
		"onContentReady":function($that){
			$that.dialogContent.querySelectorAll("input[type='checkbox']").forEach(function(checkbox){
				checkbox.addEventListener("click", function(e){
					var tag = e.target.getAttribute("data-tag");
					var checked = e.target.checked;
					functionController[tag] = checked;
					commonFunctionObject.GMsetValue("setingData",functionController);
					commonFunctionObject.webToast({"message":"操作成功", "background":"#FF4D40"});
				});
			})
		}
	});
}

// 菜单按钮弹框
if(commonFunctionObject.isPC()){
	GM_registerMenuCommand("功能开关",()=>usersSeting());
}else{
	functionController.bilibiliHelper = false;
	functionController.abroadVideoHelper = false;
	functionController.searchEnginesNavigation = false;
	functionController.zhihuHelper = false;
}
	/**
 * 超级解析助手功能
 */

//VIP视频解析接口可自定义;请严格按照格式添加
//showType=1(仅PC), showType=2(仅mobile), showType=3(同时显示)
const originalInterfaceList = [

];
function SuperVideoHelper(originalInterfaceList){
	this.originalInterfaceList = originalInterfaceList;
	this.elementId = Math.ceil(Math.random()*100000000)+"mmx";
	this.customInterfaceKey = "custom_interface_key_dddsdxxa";
	this.quicklyInterfaceKey = "custom_quickly_interface_key_dddsdxxa";
	this.defaultQuicklyInterfaceIndex = 1;
	this.isRun = function(){ //判断是否运行
		const host = window.location.host;
		const urls = ["www.iqiyi.com","v.qq.com","youku.com", "www.le.com","mgtv.com","sohu.com", "acfun.cn","bilibili.com",
			"baofeng.com","pptv.com","1905.com","miguvideo.com","sports.iqiyi.com"];
		var result = false;
		if(!host.startsWith("m.")){ //不是移动端执行
			for(var i=0; i<urls.length;i++){ //不是B站直接判断
				if(window.location.host.indexOf("bilibili.com")==-1){
					if(window.location.host.indexOf(urls[i])!=-1){
						result = true;
						break;
					}
				}else{
					if(window.location.href.indexOf("www.bilibili.com/bangumi/play")!=-1){ //是B站只有番剧才开启VIP解析
						result = true;
						break;
					}
				}
			}
		}
		return result;
	};
	this.showPlayerWindow = function(playObject){	//显示播放窗口
		var url = playObject.url + window.location.href;
		commonFunctionObject.GMopenInTab(url);
	};
	this.analysisCustomInterface = function(){ //自定义接口解析
		var customInterface = commonFunctionObject.GMgetValue(this.customInterfaceKey,"");
		if(!!customInterface){
			try{
				var customizeInterfaceList = new Array();
				var analysisArray = customInterface.split("\n");
				for(var i=0;i<analysisArray.length;i++){
					var onePiece = analysisArray[i];
					if(!!onePiece && onePiece.indexOf(",")!=-1){
						var onePieceArray = onePiece.split(",");

						if(onePieceArray.length==2 && !!onePieceArray[0] && /(http|https):\/\/\S*/.test(onePieceArray[1])){
							customizeInterfaceList.push({"name":""+onePieceArray[0]+"","url":""+onePieceArray[1]+"", "showType":1});
						}
					}
				}
				this.originalInterfaceList = customizeInterfaceList.concat(this.originalInterfaceList);
			}catch(e){}
		}
	};
	this.getQuicklyInterfaceIndex = function(){
		var quicklyInterfaceIndexString = commonFunctionObject.GMgetValue(this.quicklyInterfaceKey,"")+"";
		var quicklyInterfaceIndex = this.defaultQuicklyInterfaceIndex;
		if(!!quicklyInterfaceIndexString){
			quicklyInterfaceIndex = parseInt(quicklyInterfaceIndexString);
		}
		if(this.originalInterfaceList.length-1<quicklyInterfaceIndex){
			quicklyInterfaceIndex = this.defaultQuicklyInterfaceIndex;
		}
		return quicklyInterfaceIndex;
	};
	this.addHtmlElements = function(){  //添加HTML
		const vipVideoImageBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAC9klEQVRoQ+2ZPWgVQRDH/7/CWqOIYOFHFbRSjJhGMGDpByoIago70cqvUtQgdipWFqawMWghGIidhcHKQAJqEURBRfED1CCCjc3IPu4em31775J7d3m8cAtX3O7szP7nPzszx6EeH/T4+VUD6DaDTQbMbE+3D7MY+8Ckkw8BPFuMki7KDtUAuuh9Z3oZMtBljxY2X9eBwq4raWPNQEmOLKxm+TBgZqsknQ1dAVzNco+ZhWsm6ZakHZLC1mQyrZ5OX2RvzMxnSa8lzQJ/YwLzGDCze5JOeoI/gbVtAMxJ6vPW7wKnkr4qbEuaxccDcGWBsfNV0mjMmSGAg5LGA6XbgFehITPbLel5MN84ZAUAUjMPgWO+zZY7YGbvJW0OvRoB8EjSEW9+BhhIvOvCp0wGfPPbgZfpRAzATUnn56GEmJyLd39cBNxeF99FADTa42BskuQef4wDh9oB2CXpRbDpMPA4nTOz05LuBDLrgW+dAACGIkxfkHTDm/8DrMwEkBxgOskkqdwEcMAD4GLf3YF0PACOe+uFGMgA4Bj4EAAbAGbcXLQOmNklSdeCTRuBT2bWL+lNsLYfeFIRgH2SJgJ7GwCXYjMBrJb0K9jUiHEzG5F02VubA9b4skXvQMiAmW2VdFSSn24/As0kk1mJzeyppL3ewaaBnWY2K2mLNz8S5ueCAMLwz3q/DZxreweSe3BC0v1Ai7tkYXrsB96WwMBCAfQBv3MBJCD+SVrhaXaZ54z3PgUMhpYrZKCF7bbNnJk5BhwT6fghyW8thoGxigE4my6tXwemQlt5AGI1oamDSIFLmCuURiW5BOGPL8C7drGV206b2XdJ6yJKxoDhmPKCIeS61ZZClncxFgLAtcyxrnEwRmknDFQFIFYTWnJ/CVmoGgYSj7Z81OR86Lg7sOgPmnY6s0IpN4TyYrDb6zWAmoEOPVCHUIcO7Hh7/YemYxcWU7AMf3BkNGDF/FP9rkwGqjddkoWWv5Ql6V1yNXUdWHKXBwZ7noH/dP+HQNqheToAAAAASUVORK5CYII=";
		const quicklyBase64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAv1JREFUWEfFl02IVWUYx39/EDdKoCiCGYquxNw404QL+wA/wIUfA5luMotk0jGoiDQFv1oMqCCOFkYQtopczKxMGsUUF2bNKsWFKBroJtLI2qjwl+dy7uV47jnnnntnygcOF97nfd7/777nfZ7nPeIZm8Zb3/ZsYBEwE5gFzAGmAX8lz9/AA0l7QnvcAGwvBd4E1gOTK/yxvQExZgDbbwHvAq9UEE1POSzpwzEB2D4KbG1TuD79G0nvdAxg+2egp0PxCBuS1NsRgG2PQbgeelbS0rYBbJ8DXisAuAdcB2Ykp7+M8ztJGyoD2H4J+AxYU7DqoKQP6j7b24AjJQQDknaUAtieDvQmz/KSxUYkNfltx07FjuVZv6RjhQC21wIHgHkV3vc2SZERTWb7d+CFHFevpKFcANvvA19UEK5PWSnphwKAS8DLGd8/wIuSbjcB2I4SubsN8Zj6iaSDBQB/AlMzvq8lvRdjTwEk5XSkTfHadEl5fyYOYRzGrC2TdOYpANvdwC+diKditgNXkxRcBSzLWe+CpFfr4w1q21eABZmAx8DFkrzvhHejpG/zAPqSbhaCtUfSv7YHgE87UcqJOSapPz1eqRDZ/h54Y4wQlyVls6H6fcD2r0BXpxB5h7QpC1otbjtq/ZRW8zL+nyS9XhTTqhR3SRpNB9u+k1y3qnAMS4qKWmhFlXAlsC/Z8lvAifodLlayPQysrkDQI6k0tfOKx0TgGjA3I7BO0sn6mO1DwEclED9KWtEKMg/gOLA5J/CupOczryN2aUlBneiTFGuVWrYUR6pFyhVZd86ZeARMyATcABZL+qMygO043eeBhQVBo5KiXDfM9iQgOlvWaq22lXj406X4c2BnQdDNaCqSTmUA4h2fzsRskfRlFfEGgO35QPTt53ICv0rEH2Z9tvcDu1LjtY+NquJpgLh8xCUkbb8B+9MnPwcgfUFttNhOANILxbfbIHBI0v2yxWx/DGwC3pYUpbptq52B5BYUPTryP2638fu/WKVu+F+SPAG7l/wh4NsJOQAAAABJRU5ErkJggg==";
		const currentHost = window.location.host;

		const quicklyInterfaceIndex = this.getQuicklyInterfaceIndex();
		var currentQuicklyInterfaceObject = null;

		var category_1_html = "";
		this.originalInterfaceList.forEach((item, index) => {
			if(item.showType != 2){
				var selected = ""
				if(index==quicklyInterfaceIndex){
					selected = "selected";
					currentQuicklyInterfaceObject =  item;
				}
				category_1_html += "<span title='"+item.name+"' data-index='"+index+"' class='"+selected+"'>" + item.name + "</span>";
			}
		});

		//获得自定义位置
		var left = 0;
		var top = 120;
		var Position = commonFunctionObject.GMgetValue("Position_" + currentHost);
		if(!!Position){
			left = Position.left;
			top = Position.top;
		}
		var color = "#FF4D40";
		var hoverColor = "#000000";
		if(currentHost.indexOf("bilibili.com")!=-1){ //自定义主题
			color = "#fb7299";
			hoverColor = "#00B0E1";
		}
		var cssMould = `#vip_movie_box`+this.elementId+`{cursor:pointer; position:fixed; top:` + top + `px; left:` + left + `px; width:0px; z-index:99999999; font-size:16px; text-align:left;}
						#vip_movie_box`+this.elementId+` .img_box`+this.elementId+`{width:24px; height:32px;line-height:32px;text-align:center;background-color:`+color+`;}
						#vip_movie_box`+this.elementId+` .img_box`+this.elementId+`:hover{
							background: linear-gradient(30deg, #2a66ff 40%, `+color+`);
						}
						#vip_movie_box`+this.elementId+` .img_box`+this.elementId+`>img {width:20px; display:inline-block; vertical-align:middle;}

						#vip_movie_box`+this.elementId+` .showhide_box`+this.elementId+`{display:none;padding-left:5px;position: absolute;left: 24px;top: 0;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii{width:380px; max-height:400px; overflow-y:auto;background-color:rgba(241,241,241);}
						#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar{width:5px; height:1px;}
						#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#A8A8A8;}
						#vip_movie_box`+this.elementId+` .default-scrollbar-55678::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#F1F1F1;}

						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+`{margin-bottom:10px;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+`:last-child{margin-bottom:0px;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.title`+this.elementId+`{font-size:14px; text-align:left;color:#000000;font-weight:600;margin:5px 3px;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.interface_box`+this.elementId+`{}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.interface_box`+this.elementId+`>span{border-radius:3px;border-top:3px solid `+color+`; border-bottom:3px solid `+color+`;display:inline-block;width:calc(25% - 6px);width:-moz-calc(25% - 6px);width: -webkit-calc(25% - 6px);height:20px;line-height:20px;background-color:`+color+`;color:#FFF;cursor:pointer;margin:3px;text-align:center;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;font-size:12px!important;box-sizing:content-box!important;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.interface_box`+this.elementId+`>span:hover{border-top:3px solid `+hoverColor+`; border-bottom:3px solid `+hoverColor+`;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.interface_box`+this.elementId+`>span.selected{border-top:3px solid `+hoverColor+`; border-bottom:3px solid `+hoverColor+`;}
						#vip_movie_box`+this.elementId+` .vip_mod_box_action_687ii> .item_box`+this.elementId+` >.content`+this.elementId+`{font-size:12px;color:#000000;margin-left:3px;}
						`
		commonFunctionObject.GMaddStyle(cssMould);

		//加入HTML
		var htmlMould = `<div id='vip_movie_box`+this.elementId+`'>
							<div class='plugin_inner_`+this.elementId+`'>
								<div class="img_box`+this.elementId+`" id="img_box_jump_6667897iio"><img src='`+ vipVideoImageBase64 +`' title='选择解析线路'/></div>
								<div class='showhide_box`+this.elementId+`'>
									<div class='vip_mod_box_action_687ii default-scrollbar-55678'>
										<div class='item_box`+this.elementId+`'>
											<div class='title`+this.elementId+`'><b>接口添加</b></div>
											<div class='content`+this.elementId+`'>
												对现有接口不满意?可添加自定义接口哟~<span id="img_set_6667897iio" style="display:inline-block;border-radius:2px;margin-left:5px;padding:3px 5px;background-color:#CCC;cursor:pointer;">添加接口</span>
											</div>
											<div class='title`+this.elementId+`'>
												<a style="font-size:13px;color:blue;" href="javascript:void(0);" target="_blank">接口请自行添加~</a>
											</div>
										</div>
										<div class='item_box`+this.elementId+`' style='min-height:80px;border:1px dashed #000;'>
											<div class='interface_box`+this.elementId+`'>
												` + category_1_html + `
											</div>
										</div>
										<div class='item_box`+this.elementId+`' style="padding:10px 0px;">
											<div class='title`+this.elementId+`'><b>免责声明:</b></div>
											<div class='content`+this.elementId+`'>
												1、<b style='color:red;'>需要使用VIP视频解析的,请自行添加接口</b>,版权问题请联系相关解析接口所有者,脚本不承担相关责任!"<br>
												2、为创造良好的创作氛围,请大家支持正版!<br>
												3、脚本仅限个人学习交流,使用即已代表您已经充分了解相关问题,否则后果自负,特此声明!<br>
											</div>
										</div>
									</div>
								</div>
							</div>
							<div class="img_box`+this.elementId+`" id="img_quickly_6667897iio"><img src='`+quicklyBase64+`' title='快速开始(当前所选接口:`+(currentQuicklyInterfaceObject==null ? '无' : currentQuicklyInterfaceObject.name)+`)'/></div>
						</div>
						`;
		$("body").append(htmlMould);
	};
	this.runEvent = function(){	 //事件运行
		var that = this;
		$("#vip_movie_box"+this.elementId+" >.plugin_inner_"+this.elementId).on("mouseover", () => {
			$(".showhide_box"+this.elementId).show();
		});
		$("#vip_movie_box"+this.elementId+" >.plugin_inner_"+this.elementId).on("mouseout", () => {
			$(".showhide_box"+this.elementId).hide();
		});
		$("body").on("click","#vip_movie_box"+this.elementId+" .vip_mod_box_action_687ii>.item_box"+this.elementId+">.interface_box"+this.elementId+">span",function(){
			var index = parseInt($(this).attr("data-index"));
			var playObject = that.originalInterfaceList[index];
			that.showPlayerWindow(playObject);

			$("#vip_movie_box"+that.elementId+" .vip_mod_box_action_687ii> .item_box"+that.elementId+">.interface_box"+that.elementId+">span").removeClass("selected");
			$(this).addClass("selected");
			commonFunctionObject.GMsetValue(that.quicklyInterfaceKey, index);

			$("#img_quickly_6667897iio").find("img").attr("title","快速开始(当前所选接口:"+playObject.name+")");
		});

		//点击弹出设置框
		$("#img_set_6667897iio").on("click", function(){
			that.showSetingDialog();
		});

		$("#img_quickly_6667897iio").on("click", function(){
			const quicklyInterfaceIndex = that.getQuicklyInterfaceIndex();
			var playObject = that.originalInterfaceList[quicklyInterfaceIndex];
			that.showPlayerWindow(playObject);
		});

		//右键移动位置
		var movie_box = $("#vip_movie_box"+this.elementId);
		movie_box.mousedown(function(e) {
			if (e.which == 3) {
				e.preventDefault()
				movie_box.css("cursor", "move");
				var positionDiv = $(this).offset();
				var distenceX = e.pageX - positionDiv.left;
				var distenceY = e.pageY - positionDiv.top;

				$(document).mousemove(function(e) {
					var x = e.pageX - distenceX;
					var y = e.pageY - distenceY;
					var windowWidth = $(window).width();
					var windowHeight = $(window).height();

					if (x < 0) {
						x = 0;
					} else if (x >  windowWidth- movie_box.outerWidth(true) - 100) {
						x = windowWidth - movie_box.outerWidth(true) - 100;
					}

					if (y < 0) {
						y = 0;
					} else if (y > windowHeight - movie_box.outerHeight(true)) {
						y = windowHeight - movie_box.outerHeight(true);
					}
					movie_box.css("left", x);
					movie_box.css("top", y);
					commonFunctionObject.GMsetValue("Position_" + window.location.host,{ "left":x, "top":y});
				});
				$(document).mouseup(function() {
					$(document).off('mousemove');
					movie_box.css("cursor", "pointer");
				});
				$(document).contextmenu(function(e) {
					e.preventDefault();
				})
			}
		});
	};
	this.removeVideoAdBlock_iqiyi = function(){

	},
	this.removeVideoAdBlock_vqq = function(){

	},
	this.removeVideoAdBlock_youku = function(){

	},
	this.removeVideoAdBlock_mgtv = function(){

	},
	this.removeVideoAdBlock_sohu = function(){

	},
	this.removeVideoAdBlock = function(){
		const currentHost = window.location.host;
		if(currentHost.indexOf("www.iqiyi.com")!=-1){
			this.removeVideoAdBlock_iqiyi();
		}else if(currentHost.indexOf("v.qq.com")!=-1){
			this.removeVideoAdBlock_vqq();
		}else if(currentHost.indexOf("v.youku.com")!=-1){
			this.removeVideoAdBlock_youku();
		}else if(currentHost.indexOf("www.mgtv.com")!=-1){
			this.removeVideoAdBlock_mgtv();
		}else if(currentHost.indexOf("tv.sohu.com")!=-1){
			this.removeVideoAdBlock_sohu();
		}
	};
	this.showSetingDialog = function(){
		const that = this;
		var customInterfaceKey = that.customInterfaceKey;
		var customInterface = commonFunctionObject.GMgetValue(customInterfaceKey, "");

		var content = `
			<div>
				<div style="font-size:14px;font-weight:700;color:#000;">自定义解析接口</div>
				<div style="font-size:13px;color:red;">
					数据格式:[名字] + [,] + [接口地址]<br>
					例如:就是名字而已,https://xxxxxx?url=<br>
					注:一行一个
				</div>
				<div style="margin-top:5px;height:200px;width:100%;">
					<textarea
						placeholder="请严格按照格式填写,否则不生效"
						class="custom-interface-textarea"
						style="color:#000;font-size:14px;box-sizing: border-box;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;padding:5px;height:100%;width:100%;Overflow:auto;border:1px solid #ccc;resize:none;background-color:#FFF;outline:none;">`+customInterface+`</textarea>
				</div>
				<div style="text-align:center;margin-top:15px;">
					<button class="save-custom-interface-btn" style="color:#000;cursor:pointer;">保存自定义接口</button>
				</div>
			</div>
		`;
		dialog.showMake({
			"title":"解析接口添加",
			"content":content,
			"onContentReady":function($that){
				var $saveCustomInterfaceBtn = $that.dialogContent.querySelector(".save-custom-interface-btn");
				$saveCustomInterfaceBtn.addEventListener("click", function(){
					var $customInterfaceTextarea = $that.dialogContent.querySelector(".custom-interface-textarea");
					var content = $customInterfaceTextarea.value;
					commonFunctionObject.GMsetValue(customInterfaceKey, content);
					commonFunctionObject.webToast({"message":"自定义接口保存成功", "background":"#FF4D40"});
				});
			}
		})
	}
	this.start = function(){
		let delayTimeMs = 0;
		if(window.location.host.indexOf("www.bilibili.com")!=-1){
			delayTimeMs = 2200;
		}
		setTimeout(()=>{
			try{
				this.removeVideoAdBlock();
			}catch(e){}
			try{
				this.analysisCustomInterface();
				this.addHtmlElements();
				this.runEvent();
			}catch(e){}
		}, delayTimeMs);
	};
};

/**
 * 移动端VIP解析
 * @param {Object} originalInterfaceList
 */
function SuperVideoHelperMobile(originalInterfaceList){
	this.originalInterfaceList = originalInterfaceList;
	this.elementId = Math.ceil(Math.random()*100000000)+"mmx";
	this.quicklyInterfaceKey = "custom_mobile_quickly_interface_key_dddsdxxa";
	this.defaultQuicklyInterfaceIndex = 2;
	this.playerNodes=[
		{"url":"m.iqiyi.com", "showNode":".m-video-player-wrap", "color":"#05B03B"},
		{"url":"m.v.qq.com", "showNode":".mod_player", "color":"#F99D39"},
		{"url":"m.youku.com", "showNode":".h5-detail-player", "color":"#08BAFD"},
		{"url":"m.mgtv.com", "showNode":".video-area", "color":"#E95904"}
	];
	this.isRun = function(){ //判断是否运行
		const host = window.location.host;
		const urls = ["m.iqiyi.com","m.v.qq.com","m.youku.com", "m.mgtv.com", "m.bilibili.com"];
		var result = false;
		if(host.startsWith("m.")){ //是移动端执行
			for(var i=0; i<urls.length; i++){
				if(host.indexOf(urls[i]) != -1){
					result = true;
					break;
				}
			}
		}
		return result;
	};
	this.getwindowElement = function(){
		var nodeObject = null;
		for(var i in this.playerNodes) { //获得窗口ID
			if (this.playerNodes[i].url == window.location.host) {
				nodeObject = this.playerNodes[i];
				break;
			}
		}
		return nodeObject;
	};
	this.getQuicklyInterfaceIndex = function(){
		var quicklyInterfaceIndexString = commonFunctionObject.GMgetValue(this.quicklyInterfaceKey,"")+"";
		var quicklyInterfaceIndex = this.defaultQuicklyInterfaceIndex;
		if(!!quicklyInterfaceIndexString){
			quicklyInterfaceIndex = parseInt(quicklyInterfaceIndexString);
		}
		if(this.originalInterfaceList.length-1<quicklyInterfaceIndex){
			quicklyInterfaceIndex = this.defaultQuicklyInterfaceIndex;
		}
		return quicklyInterfaceIndex;
	};
	this.addHtmlElements = function(){
		let nodeObject = this.getwindowElement();
		const quicklyInterfaceIndex = this.getQuicklyInterfaceIndex();
		if(!nodeObject) return;
		return new Promise((resolve, reject)=>{
			const elementInterval = setInterval(()=>{
				const nodeElementObject = $(nodeObject.showNode), themeColor = nodeObject.color;

				if(nodeElementObject.length == 0) return;
				clearInterval(elementInterval);

				//添加HTML
				let category_1_html = "";
				this.originalInterfaceList.forEach((item, index) => {
					if (item.showType != 1) {
						var selected = "";
						if(index==quicklyInterfaceIndex){
							selected = "selected";
						}
						category_1_html += "<option value='"+item.url+"' index='"+index+"' "+selected+">"+item.name+"</option>";
					}
				});
				var htmlMould = `
					<div style="margin:15px 15px 50px 15px;padding:10px;background-color:`+themeColor+`;border-radius:4px;cursor:pointer;z-index: 999999999999999999999;color:#FFF;">
							<div style="font-weight:700;font-size:14px;text-align:center;">
								<span>选择解析接口</span>
								<select id="interface_selection_`+this.elementId+`" style="background-color:#FFF;padding: 0px 10px;">
									`+category_1_html+`
								</select>
							</div>
							<div style="text-align:center;">
								<a href="javascript:void(0);" id="start_analysis_outer_`+this.elementId+`" style="box-sizing:border-box;margin:10px 0px;display:inline-block;padding:10px 0px;width:100%;border-radius:4px;color:#FFF;background-color:#F2503F;font-size:14px;">站外解析</a>
							</div>
							<div style="text-align:left;font-size:10px;">
								<div>
									免责申明:1、VIP视频解析中所用到的解析接口全部收集自互联网(源码可见),版权问题请联系相关解析接口所有者!
									2、为创造良好的创作氛围,请大家支持正版!
									3、脚本仅限个人学习交流,切勿用于任何商业等其它用途!
									4、继续使用,即表明你已经明确使用脚本可能带来的风险,且愿意自行承担相关风险,对于风险脚本不承担任何责任!
								</div>
							</div>
					</div>
				`;
				nodeElementObject.after(htmlMould);
				resolve("ok");
			}, 100);
		});
	};
	this.getPlayObjectBySelect = function(){

		var indexString = $("#interface_selection_"+this.elementId).find("option:selected").attr("index");
		var index = 0;
		if(!!indexString){
			index = parseInt(indexString);
		}
		return this.originalInterfaceList[index];
	};
	this.runEvent = function(){	 //事件运行
		const self = this;

		//初始化
		var playObject = self.getPlayObjectBySelect();
		$('#start_analysis_outer_'+self.elementId).attr("href", playObject.url + window.location.href);
		$('#start_analysis_outer_'+self.elementId).on('click', function (e) {
			if(commonFunctionObject.GMgetValue("copyright_video_remind_mobile_outer",null)==="true"){

			}else{
				var r=confirm(
					"脚本运行提醒!!!\u000d"+
					"使用站外解析功能,视频解析时脚本跳出本页面,如不同意此脚本行为,请点击【取消】按钮!!"
				);
				if(r==false){
					e.preventDefault();
				}else{
					commonFunctionObject.GMsetValue("copyright_video_remind_mobile_outer","true");
				}
			}
		});
		//接口切换
		$('#interface_selection_'+self.elementId).on('change', function () {
			var $option = $(this).find("option:selected");
			var value = $option.val();
			var index = parseInt($option.attr("index"));
			$('#start_analysis_outer_'+self.elementId).attr("href", value+window.location.href);
			commonFunctionObject.GMsetValue(self.quicklyInterfaceKey, index);
		});
	};
	this.start = function(){
		const self = this;
		if(this.isRun()){
			this.addHtmlElements().then(()=>{
				self.runEvent();
			});
		}
	}
}
try{
	let newOriginalInterfaceList = originalInterfaceList;
	if(!functionController || functionController.superVideoHelper){
		const superVideoHelperObject = new SuperVideoHelper(newOriginalInterfaceList);
		if(superVideoHelperObject.isRun()){
			if(commonFunctionObject.GMgetValue("copyright_video_remind",null)==="true"){
				superVideoHelperObject.start();
			}else{
				var r=confirm(
					"脚本运行提醒!!!\u000d"+
					"1、VIP视频解析中所用到的解析接口全部收集自互联网(源码可见),版权问题请联系相关解析接口所有者!\u000d"+
					"2、为创造良好的创作氛围,请大家支持正版!\u000d"+
					"3、脚本仅限个人学习交流,切勿用于任何商业等其它用途!\u000d"+
					"4、继续使用,即表明你已经明确使用脚本可能带来的风险,且愿意自行承担相关风险,对于风险脚本不承担任何责任!\u000d"+
					"5、此提醒只弹出一次,确认后,后续将不在弹出,请知悉!"
				);
				if(r==true){
					commonFunctionObject.GMsetValue("copyright_video_remind","true");
					superVideoHelperObject.start();
				}
			}
		}
		(new SuperVideoHelperMobile(newOriginalInterfaceList)).start();
	}
}catch(e){
	console.log("全网VIP解析:error:"+e);
}

	/**
 * B站相关功能:视频多P下载,一键三联,浏览记录等
 */
function BilibiliHelper(){

	this.isRun = function(){
		return window.location.host.indexOf("bilibili.com") != -1
	}
	this.baseFunction = function(){
		/**
		 * b站基本功能,一件三连、视频解析、视频下载
		 */
		function baseFunctionObject(){
			this.elementId = Math.ceil(Math.random()*100000000)+"mmx";
			this.downloadSettingKey = "download_setting_key";
			this.downloadResutError=function(btnElement){
				btnElement.text("下载视频");
				btnElement.removeAttr("disabled");
			};
			this.downloadResutSuccess=function(btnElement){
				btnElement.text("下载视频");
				btnElement.removeAttr("disabled");
			};
			this.getDownloadPages = function(){
				return new Promise(function(resolve, reject) {
					var pathname = window.location.pathname, bv = null;
					if (pathname.indexOf("/medialist/play/watchlater/") != -1) { // 在下载视频的时候针对稍后再看页面的链接找BV号
						bv = pathname.replace("/medialist/play/watchlater/","").replace("/","");
					}else{
						bv = pathname.replace("/video/","").replace("/","");
					}
					if(!bv){
						resolve({"status":"bv_null"});
						return;
					}
					//bv转av
					commonFunctionObject.request("get", "https://api.bilibili.com/x/web-interface/view?bvid="+bv, null).then((resultData)=>{
						let dataJson = JSON.parse(resultData.data);
						if(!dataJson || dataJson.code!==0 || !dataJson.data){
							resolve({"status":"request_error"});
							return;
						}

						let data = dataJson.data;
						if(!data){
							resolve({"status":"aid_null"});
							return;
						}

						let aid = data.aid;
						let pic = data.pic;
						let title = data.title
						if(!aid){
							resolve({"status":"aid_null"});
							return;
						}

						//获取cid
						commonFunctionObject.request("get", "https://api.bilibili.com/x/web-interface/view?aid="+aid, null).then((resultData2)=>{
							let dataJson2 = JSON.parse(resultData2.data);
							if(!dataJson2 || dataJson2.code!==0 || !dataJson2.data){
								resolve({"status":"request_error"});
								return;
							}
							const downloadData = dataJson2.data;
							const {aid,  bvid} = downloadData,
								items = new Array();
							//这是下载集合
							if(downloadData.hasOwnProperty("ugc_season") && downloadData.ugc_season.hasOwnProperty("sections")){
								let sections = downloadData.ugc_season.sections;
								let page = 1;
								for(var i=0; i<sections.length; i++){
									let section = sections[i];
									if(section.hasOwnProperty("episodes")){
										for(var j=0; j<section.episodes.length; j++){
											let episode = section.episodes[j];
											items.push({
												"cover":"",
												"page":page,
												"title":episode.title,
												"cid":episode.cid,
												"aid":episode.aid
											});
											page++;
										}
									}
								}
							}else{ //这是多P下载
								for(var i=0; i<downloadData.pages.length; i++){
									let pageData = downloadData.pages[i];
									items.push({
										"cover":pageData.first_frame,
										"page":pageData.page,
										"title":pageData.part,
										"cid":pageData.cid,
										"aid":aid
									});
								}
							}
							resolve({"status":"success", "downloadData":{
								"items":items,
								"pic":pic,
								"title":title
							}});
						}).catch((errorData)=>{
							resolve({"status":"request_error"});
						});
					}).catch((errorData)=>{
						resolve({"status":"request_error"});
					});
				});
			};
			this.startDownloadFile = function(options){
				let aid = options.aid, cid = options.cid, fileName = options.fileName,
					savePath = options.savePath, RPCURL = options.RPCURL, RPCToken = options.RPCToken;
				let isByPRC = options.isByPRC;

				commonFunctionObject.request("get", "https://api.bilibili.com/x/player/playurl?avid="+aid+"&cid="+cid+"&qn=112", null).then((resultData3)=>{

					if(!fileName){
						fileName = (new Date()).getTime() + "";
					}
					fileName = fileName.replace(/[\ |\~|\`|\=|\||\\|\;|\:|\"|\'|\,|\.|\>|\/]/g,"");
					fileName = fileName.substring(0,50); //可能有异常,标题最多50字符
					fileName = fileName + ".mp4";

					let dataJson3 = JSON.parse(resultData3.data);
					if(!!dataJson3 && dataJson3.code===0 && !!dataJson3.data){
						let downloadUrl = dataJson3.data.durl[0].url;
						if(isByPRC){
							commonFunctionObject.RPCDownloadFile(fileName, downloadUrl, savePath, RPCURL).then((data)=>{
								commonFunctionObject.webToast({"message":data, "time":3000});
							}).catch((data)=>{
								commonFunctionObject.webToast({"message":data, "time":3000});
							});
						}else{
							window.open(downloadUrl);
						}
					}else{
						commonFunctionObject.webToast({"message":"获取下载链接失败", "background":"#FF4D40"});
					}
				}).catch((errorData)=>{
					commonFunctionObject.webToast({"message":"获取下载链接失败", "background":"#FF4D40"});
				});
			};
			this.createModals = function(){
				var css = `
					.modal-mask-`+this.elementId+`{
						position:fixed;
						top:0;
						left:0;
						z-index:999;
						width:100%;
						height:100%;
						display:none;
						background-color:#000;
						opacity:0.3;
						overflow:hidden;
					}
					.modal-body-`+this.elementId+`{
						position:fixed;
						border-radius:5px;
						background-color: #FFFFFF;
						top:10%;
						width:600px;
						max-width:90%;
						max-height:80%;
						z-index:1000;
						left: 50%;
						transform: translateX(-50%);
						display:none;
						padding: 10px;
						overflow-y: auto;
					}
					.modal-body-`+this.elementId+` >.page-header{
						height:30px;
						line-height:30px;
						position:relative;
					}
					.modal-body-`+this.elementId+` >.page-header >span{
						display:inline-block;
					}
					.modal-body-`+this.elementId+` >.page-header >span:nth-child(1) {
						font-size:18px;
						font-weight:bold;
						position:absolute;
						left:10px;
					}
					.modal-body-`+this.elementId+` >.page-header >span:nth-child(2) {
						font-size:28px;
						font-weight:bold;
						position:absolute;
						right:10px;
						cursor:pointer;
					}
					.modal-body-`+this.elementId+` >.page-container{
						max-height: 500px;
						overflow-y: auto;
					}
					.modal-body-`+this.elementId+` .page-wrap{
						display: flex;
						flex-wrap: wrap;
						margin-top:5px;
					}
					.modal-body-`+this.elementId+` .page-wrap >.board-item{
						display: block;
						width: calc(50% - 10px);
						background-color: #6A5F60;
						margin: 5px;
						background-color:#FB7299;
						color:#FFFFFF;
						cursor: pointer;
						overflow:hidden;
						white-space:nowrap;
						text-overflow:ellipsis;
					}
					.modal-body-`+this.elementId+` .page-wrap >.board-item >input{
						width: 14px;
						height: 14px;
						vertical-align: middle;
						margin-right:5px;
					}
					.modal-body-`+this.elementId+` .page-wrap >.board-item >span{
						vertical-align: middle;
					}
					.modal-body-`+this.elementId+` .modal-btn-wrap{
						text-align: center;
						margin-top: 10px;
						cursor: pointer;
					}
					.modal-body-`+this.elementId+` .aria2-setting{
						border:1px dashed #F1F1F1;
						border-radius:4px;
						margin-top:10px;
					}
					.modal-body-`+this.elementId+` .aria2-setting >.setting-item{
						text-align: center;
						font-size:14px;
						margin:10px 0px;
					}
					.modal-body-`+this.elementId+` .aria2-setting >.setting-item .topic-name{
						display:inline-block;
						width:80px;
						text-align:left;
					}
					.modal-body-`+this.elementId+` .aria2-setting >.setting-item> input{
						width:300px;
						padding-left:10px;
						border:1px solid #888;
						outline:none;
						border-radius:3px;
					}
					.modal-body-`+this.elementId+` .modal-btn-wrap >span{
						border:1px solid #ccc;
						display:inline-block;
						padding:3px 5px;
						margin:0px 5px;
						border-radius:3px;
					}
					.modal-body-`+this.elementId+` .tip-wrap{
						margin-top: 10px;
						font-size:12px;
					}
					.modal-body-`+this.elementId+` .tip-wrap >.title{
						font-size:16px;
						font-weight:bold;
					}
					.modal-body-`+this.elementId+` .tip-wrap >.content >ul >li{
						margin-top:5px;
					}
				`;

				var html = `
					<div class='modal-mask-`+this.elementId+`'></div>
					<div class='modal-body-`+this.elementId+`'>
						<div class="page-header">
							<span>视频下载(可批量)</span>
							<span class="close">×</span>
						</div>
						<div class="page-container">
							<label style="color:red;">注:此功能会调用bilibili的API,脚本仅用于个人交流,切勿用于商业用途,否则后果自负,特此申明!</label>
							<div class="page-wrap">
							</div>
							<div class="aria2-setting">
								<div class="setting-item">
									<span><input type="radio" name="downloadWay" value="Motrix">Motrix下载</span>&nbsp;&nbsp;&nbsp;
									<span><input type="radio" name="downloadWay" value="AriaNgGUI">AriaNgGUI下载</span>
								</div>
								<div class="setting-item">
									<label class="topic-name">配置RPC:</label><input type="text" name="RPCURL" value="" placeholder="请准确输入RPC对应软件的地址,默认:Motrix">
								</div>
								<div class="setting-item">
									<label class="topic-name">配置Token:</label><input type="text" name="RPCToken" value="" placeholder="默认无需填写">
								</div>
								<div class="setting-item">
									<label class="topic-name">保存路径:</label><input type="text" name="savePath" value="" placeholder="请准确输入文件保存路径">
									<div style="font-size:12px;color:#888;">最好自定义下载地址,默认地址可能不满足需要</div>
								</div>
							</div>
							<div class="modal-btn-wrap">
								<span name="selectall">全选</span>
								<span name="removeSelect">取消选择</span>
								<span name="downloadAll">批量下载</span>
							</div>
							<div class="tip-wrap">
								<div class="title">关于单P下载:</div>
								<div class="content"><span>点击弹框单个选集,即可下载单集视频!PS:单P下载,推荐大家使用BBDown下载,此工具功能很强大,具体查看:<a target="_blank" href="https://github.com/nilaoda/BBDown">https://github.com/nilaoda/BBDown</a></span></div>
							</div>
							<div class="tip-wrap">
								<div class="title">关于批量下载:</div>
								<div class="content">
									<ul>
										<li>
											<b>1、批量下载需要第三方软件的支持,脚本推荐使用:Motrix</b>
											<ul>
												<li>Motrix下载地址:<a href="https://motrix.app/zh-CN/" target="_blank">https://motrix.app/zh-CN/</a></li>
												<li>AriaNgGUI下载地址:<a href="https://github.com/Xmader/aria-ng-gui" target="_blank">https://github.com/Xmader/aria-ng-gui</a></li>
											</ul>
										</li>
										<li>
											<b>2、在批量下载前需要提前打开软件,本教程以Motrix为准</b>
											<ul>
												<li>(1)、如果全部按照默认配置,只需要打开软件即可</li>
												<li>(2)、如果想自定义RPC地址和文件保存路径,可更改上面输入框的内容(此数据非常重要,请准确填写)</li>
												<li>
												(3)、Motrix运行图片
												<img src="https://pic.rmb.bdstatic.com/bjh/8912582c0416119405ec37ea27d12376.jpeg" width="100%" />
												</li>
											</ui>
										</li>
										<li>
											<b>3、默认RPC默认地址</b>
											<ul>
												<li>(1)、Motrix RPC默认地址:ws://localhost:16800/jsonrpc</li>
												<li>(2)、Aria2 RPC默认地址:ws://localhost:6800/jsonrpc</li>
												<li>(3)点击“批量下载会自动保存当前下载设置”</li>
											</ul>
										</li>
										<li>
											<b>4、如使用AriaNgGUI,使用方式类似,大家可以自行研究</b>
										</li>
									</ul>
								</div>
							</div>
							<div class="tip-wrap">
								<div class="title">必要说明:</div>
								<div class="content">
									申明:本功能仅能作为学习交流使用,且不可用于其它用途,否则后果自负。请大家重视版权,尊重创作者,切勿搬运抄袭。请大家多用[一键三连]为创作者投币~,小破站牛掰!
								</div>
							</div>
						</div>
					</div>
				`;
				commonFunctionObject.GMaddStyle(css);
				$("body").append(html);
			};
			this.hideModals = function(){
				$(".modal-body-"+this.elementId+"").css('display','none');
				$(".modal-mask-"+this.elementId+"").css('display','none');
			};
			this.showModals = function(pageHtml){
				const self = this;
				const downloadSettingKey = self.downloadSettingKey;
				$(".modal-body-"+self.elementId+"").css('display','block');
				$(".modal-mask-"+self.elementId+"").css('display','block');
				$(".modal-body-"+self.elementId+" .page-wrap").html(pageHtml);

				//初始化设置的数据
				var savePath = "D:/";
				if("macOS"===commonFunctionObject.getSystemOS()){
					savePath = ""
				}
				const downloadSetting = commonFunctionObject.GMgetValue(this.downloadSettingKey,
					{"RPCURL":"ws://localhost:16800/jsonrpc",
					"savePath":savePath,
					"RPCToken":'', "downloadWay":"Motrix"});
				const isMotrix = downloadSetting.downloadWay=="Motrix";
				$(".modal-body-"+self.elementId+" input[name='RPCURL']").val(downloadSetting.RPCURL);
				$(".modal-body-"+self.elementId+" input[name='savePath']").val(downloadSetting.savePath);
				$(".modal-body-"+self.elementId+" input[name='RPCToken']").val(downloadSetting.RPCToken);
				$(".modal-body-"+self.elementId+" input[name='downloadWay']").removeAttr("checked");
				if(isMotrix){
					$(".modal-body-"+self.elementId+" input:radio[value='Motrix']").attr('checked','true');
				}else{
					$(".modal-body-"+self.elementId+" input:radio[value='AriaNgGUI']").attr('checked','true');
				}

				$(".modal-body-"+self.elementId+" .page-wrap >.board-item >span").off("click").on("click", function(){
					$(this).css("background-color","#ccc");
					let downloadOptions={
						"aid":$(this).data("aid"),
						"cid":$(this).data("cid"),
						"isByPRC":false
					}
					self.startDownloadFile(downloadOptions);
				});
				$(".modal-body-"+self.elementId+" .page-header >span.close").off("click").on("click", function(){
					self.hideModals();
				});
				$(".modal-body-"+self.elementId+" .modal-btn-wrap >span[name='selectall']").off("click").on("click", function(){
					$(".modal-body-"+self.elementId+" .page-wrap").find("input[type='checkbox']").each(function(){
						$(this).prop('checked', true);
					});
				});
				$(".modal-body-"+self.elementId+" input[name='downloadWay']").off("change").on("change", function(){
					if($(this).val()=="Motrix"){
						$(".modal-body-"+self.elementId+" input[name='RPCURL']").val("ws://localhost:16800/jsonrpc");
					}else{
						$(".modal-body-"+self.elementId+" input[name='RPCURL']").val("ws://localhost:6800/jsonrpc");
					}
				});
				$(".modal-body-"+self.elementId+" .modal-btn-wrap >span[name='removeSelect']").off("click").on("click", function(){
					$(".modal-body-"+self.elementId+" .page-wrap").find("input[type='checkbox']").each(function(){
						$(this).prop('checked', false);
					});
				});
				$(".modal-body-"+self.elementId+" .modal-btn-wrap >span[name='downloadAll']").off("click").on("click", function(){
					let RPCURL = $(".modal-body-"+self.elementId+" input[name='RPCURL']").val();
					let savePath = $(".modal-body-"+self.elementId+" input[name='savePath']").val();
					let RPCToken = $(".modal-body-"+self.elementId+" input[name='RPCToken']").val();
					let downloadWay = $(".modal-body-"+self.elementId+" input[name='downloadWay']:checked").val();
					commonFunctionObject.GMsetValue(downloadSettingKey,{"RPCURL":RPCURL, "savePath":savePath,
						"RPCToken":RPCToken, "downloadWay":downloadWay});

					let inputElements = $(".modal-body-"+self.elementId+" .page-wrap input[type='checkbox']:checked");
					if(inputElements.length == 0){
						commonFunctionObject.webToast({"message":"至少需要选中1P", "background":"#FF4D40"});
						return;
					}

					if(!savePath){
						commonFunctionObject.webToast({"message":"保存路径不能为空", "background":"#FF4D40"});
						return;
					}
					if(!RPCURL){
						commonFunctionObject.webToast({"message":"PRC地址不能为空", "background":"#FF4D40"});
						return;
					}
					RPCToken = !RPCToken ? "" : RPCToken;
					let downloadOptions = {
						"aid":"",
						"cid":"",
						"isByPRC":true,
						"fileName":"",
						"savePath":savePath,
						"RPCURL":RPCURL,
						"RPCToken":RPCToken
					}
					inputElements.each(function(){
						setTimeout(()=>{
							let aid=$(this).data("aid"), cid = $(this).data("cid"), fileName = $(this).attr("title");
							downloadOptions.aid = aid;
							downloadOptions.cid = cid;
							downloadOptions.fileName = fileName;
							self.startDownloadFile(downloadOptions);
						}, 1000);
					})
				});
			};
			this.createElementHtml = async function(){
				$("#bilibili_exti_9787fjfh12j").remove();

				const randomNumber = this.elementId, self = this;
				let cssText = `
					#bilibili_exti_9787fjfh12j{
						position:fixed;
						left:-30px;
						top:250px;
						opacity:0.6;
						transition: 0.3s;
					}
					#bilibili_exti_9787fjfh12j >.self_s_btn{
						background-color:#FB7299;
						color:#FFF;
						font-size:10px;
						border-radius:3px;
						cursor:pointer;
						margin:10px 0px;
						width:60px;
						height:20px;
						text-align:center;
						line-height:20px;
					}
				`;
				let htmlText=`
					<div id="bilibili_exti_9787fjfh12j">
						<div class="self_s_btn" id="download_s_`+randomNumber+`">下载视频</div>
						<div class="self_s_btn" id="focus_s_`+randomNumber+`">一键三连</div>
					</div>
				`;

				//添加下载等操作按钮
				commonFunctionObject.GMaddStyle(cssText);
				$("body").append(htmlText);

				//创建弹框
				this.createModals();

				//移入移除操作
				$("#bilibili_exti_9787fjfh12j").hover(function(){
					$(this).css({
						"left":"0px", "opacity":1
					});
				},function(){
					$(this).css({
						"left":(0-$(this).width())/2+"px", "opacity":0.6
					});
				});

				//下载操作函数
				$("body").on("click", "#download_s_"+randomNumber, function(){
					const btnElement = $(this);
					btnElement.attr("disabled", "disabled");
					btnElement.text("准备中~");
					//开始准备下载数据
					self.getDownloadPages().then((resule)=>{
						if(resule.status==="success"){
							const {items, pic, title} = resule.downloadData;
							let itemHtml = "";
							itemHtml += "<div style='width:100%;'><a href='"+pic+"' target='_blank'>标题:"+title+"(点我跳转封面)</a></div>";
							for(var i=0; i<items.length; i++){
								var currentTitle = "【P"+items[i].page+"】"+items[i].title+"";
								itemHtml += "<div class='board-item'>";
								itemHtml += "<input data-aid='"+items[i].aid+"' data-cid='"+items[i].cid+"' title='"+currentTitle+"' type='checkbox'>"
								itemHtml += "<span data-aid='"+items[i].aid+"' data-cid='"+items[i].cid+"' title='"+currentTitle+"'>"+currentTitle+"</span>";
								itemHtml += "</div>";
							}
							self.showModals(itemHtml);
							self.downloadResutSuccess(btnElement);
						}else{
							self.downloadResutError(btnElement);
						}
					}).catch((error)=>{
						self.downloadResutError(btnElement);
					});
				});
				$("body").on("click", "#focus_s_"+randomNumber, function(){
					$("#arc_toolbar_report .video-like").click(); // 点赞
					$("#arc_toolbar_report .video-coin").click(); // 投币
					// $("#arc_toolbar_report .video-fav").click(); // 收藏
				});
			}
			this.start = function(){
				let locationHost = window.location.host, locationPathname = window.location.pathname;
				if(locationHost==="www.bilibili.com" && (locationPathname.indexOf("/video")!=-1 || locationPathname.indexOf("/watchlater")!=-1)){
					this.createElementHtml();
				}
			}
		}
		try{
			(new baseFunctionObject()).start();
		}catch(e){
			console.log("baseFunctionObject new error", e);
		}
	};
	/**
	 * 浏览历史记录提醒
	 */
	this.recordViewFunction = function(){
		function recordViewObject(){
			this.localCacheName = "bilibili_video_record";
			this.recordOneVideo = function(){
				let promise = new Promise((resolve, reject)=>{
					let bv = commonFunctionObject.getBilibiliBV();
					let cacheText = commonFunctionObject.GMgetValue(this.localCacheName);
					cacheText = !cacheText ? "" : cacheText
					let maxLength = 12*500;
					let currentLength = cacheText.length;
					if(currentLength > maxLength){
						cacheText = cacheText.substring(12*100, currentLength);
					}

					if(cacheText.indexOf(bv)==-1){
						cacheText += bv;
						commonFunctionObject.GMsetValue(this.localCacheName, cacheText);
					}
					resolve({"result":"success"});
				});
			};
			this.searchPageRemindHtml = function($ele, top=8, right=8){
				if($ele.find("div[name='marklooked']").length==0){
					$ele.css("position","relative");
					$ele.append("<div name='marklooked' style='z-index: 100;position:absolute; top:"+top+"px; right:"+right+"px; background-color: rgba(251,123,159,1); border-radius:3px; font-size:10px; color:#FFF;padding:0px 2px;'>已看</div>");
				}
			};
			this.searchPageRemind = function(){
				let $that = this;
				var elementArray = [
					{"node":".bili-video-card", "top":8, "right":12},  //兼容 MAC M1搜索结果
					{"node":"#page-index .small-item", "top":12, "right":12},  //用户投稿
					{"node":"#submit-video-list .small-item", "top":12, "right":12}, //用户主页
					{"node":"#page-series-detail .small-item.fakeDanmu-item", "top":12, "right":12}, //用户主页投稿
				];
				setInterval(function(){
					let cacheText = commonFunctionObject.GMgetValue($that.localCacheName);
					cacheText = !cacheText ? "" : cacheText;
					for(var i=0; i<elementArray.length; i++){
						var elementobj = elementArray[i];
						$(elementobj.node).each(function(){
							if($(this).attr("dealxll")!=="true"){
								var videourl = $(this).find("a[href^='//www.bilibili.com/video']").attr("href");
								if(!!videourl){
									var bvs = videourl.match(/(\/BV(.*?)\/)/g)
									if(bvs.length==1){
										var bv = bvs[0].replace(/\//g,"");
										if(cacheText.indexOf(bv) != -1){
											$that.searchPageRemindHtml($(this), elementobj.top, elementobj.right);
										}
										$(this).unbind("click").bind("click", ()=>{  //循环操作,单独绑定
											$that.searchPageRemindHtml($(this), elementobj.top, elementobj.right);
										})
									}
									$(this).attr("dealxll","true");
								}
							}
						});
					}
				}, 500);
			}
			this.start=function(){
				let $that = this;
				if(window.location.pathname.indexOf("/video")!=-1 && window.location.host==="www.bilibili.com"){
					let currentHref = "";
					setInterval(()=>{ //需要循环存储
						if(window.location.href !== currentHref){
							this.recordOneVideo();
							currentHref = window.location.href;
						}
					}, 500);
				}
				//搜索结果和用户主页已经看过的视频提醒
				if(window.location.host.indexOf("bilibili.com")!=-1){
					this.searchPageRemind();
					GM_registerMenuCommand("清空B站浏览记录",function(){
						if(confirm('是否要清空B站浏览记录?清空后将不可恢复...')){
							commonFunctionObject.GMsetValue($that.localCacheName, "");
						}
					});
				}
			};
		}
		try{
			(new recordViewObject()).start();
		}catch(e){
			console.log("recordViewObject new error", e);
		}
	};
	/**
	 * 视频描述文本转链接
	 */
	this.textToLinkFunction = function() {
		function textToLinkObject(){
			this.link = function(selector){
				const current_href = window.location.href;
				const textToLinkArea = document.querySelector(selector);

				if(!textToLinkArea){
					return;
				}
				findAndReplaceDOMText(textToLinkArea, {
					find: /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/g,
					replace: function (e, t) {
						let text = e.text;
						let element = null;
						if(text.indexOf("bilibili.com")==-1 && /^(http|ftp|https)/i.test(text)){
							element = document.createElement("a");
							element.setAttribute("href", text)
							element.setAttribute("target", "_blank");
							element.style.color="#00AEEC";
						}else{
							element = document.createElement("span");
						}
						element.innerText = text;
						return element;
					},
					preset: "prose"
				});

			}
			this.start = function(){
				const selector = "#v_desc";
				this.link(selector);

				const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver
				const bodyMutationObserver = new MutationObserver(()=>{
					this.link(selector);
				});

				const element = document.querySelector(selector);
				if(element){
					bodyMutationObserver.observe(element,
						{"characterData":true, "attributes":true, "childList":true},
					);
				}
			}
		}
		try{
			(new textToLinkObject()).start();
		}catch(e){
			console.log("textToLinkObject new error", e);
		}
	}
	this.signIn = async function(){ //签到下线,2024年7月2日

	}
	this.start = function(){
		if(this.isRun()){
			this.baseFunction();
			this.recordViewFunction();
			this.textToLinkFunction();
			this.signIn();
		}
	}
}

try{
	if(!functionController || functionController.bilibiliHelper){
		new BilibiliHelper().start();
	}
}catch(e){
	console.log("B站视频下载:error:"+e);
}
	/**
 * 知乎助手开始
 */
function ZhihuHelper(){
	this.markArticleOrQuestion = function(){
		var questionsCss = `
			.AnswerItem .ContentItem-title a::before {
				content: '问题';
				color: #f68b83;
				background-color: #f68b8333;
				font-weight: bold;
				font-size: 13px;
				padding: 1px 4px 0px;
				border-radius: 2px;
				display: inline-block;
				vertical-align: middle;
				margin: 0px 4px 0px 0px;
			}
			.ArticleItem .ContentItem-title a::before {
				content: '文章';
				color: #0066FF;
				background-color: #E5EFFF;
				font-weight: bold;
				font-size: 13px;
				padding: 1px 4px 0;
				border-radius: 2px;
				display: inline-block;
				vertical-align: middle;
				margin: 0px 4px 0px 0px;
			}
			.ZvideoItem .ContentItem-title a::before {
				content:'视频';
				color: #00BCD4;
				background-color: #00BCD433;
				font-weight: bold;
				font-size: 13px;
				padding: 1px 4px 0;
				border-radius: 2px;
				display: inline-block;
				vertical-align: middle;
				margin: 0px 4px 0px 0px;
			}
			.TopstoryItem--advertCard{
				text-decoration:line-through;
			}
		`;
		commonFunctionObject.GMaddStyle(questionsCss);
	}
	this.autoJumpTarget = function(){
		var regexResult = location.search.match(/target=(.+?)(&|$)/);
		if(regexResult && regexResult.length==3){
			location.href = decodeURIComponent(regexResult[1]);
		}
	};
	// 为问题本身添加时间
	this.addDateQuestion = function(){
		var title = document.querySelector(".QuestionPage");
		if(!!title){
			var dateCreated = title.querySelector("[itemprop~=dateCreated][content]").content;
			var dateModified = title.querySelector("[itemprop~=dateModified][content]").content;
			var createDate = commonFunctionObject.DateFormat(new Date(dateCreated), "yyyy-MM-dd hh:mm:ss");
			var editDate = commonFunctionObject.DateFormat(new Date(dateModified), "yyyy-MM-dd hh:mm:ss");

			var side = title.querySelector(".QuestionHeader-side");
			var timeDiv = document.createElement('div');
			timeDiv.innerHTML = `<p>创建于:&nbsp;${createDate}</p><p>编辑于:&nbsp;${editDate}</p>`;
			timeDiv.style.cssText = 'color:#6f6f6f;font-size:13px;';
			side.appendChild(timeDiv);
		}
	};
	// 为回答添加时间
	this.addTimeAnswerItems = function(){
		var list = document.querySelectorAll(".AnswerItem:not(div[zh_date_mk='true'])");
		var item = null;
		for (var i = 0; i < list.length; i++) {
			item = list[i];
			if (item.getAttribute('zh_date_mk') === 'true') {
				continue;
			}
			item.setAttribute("zh_date_mk", "true");
			try{
				var dateCreated = item.querySelector("[itemprop~=dateCreated][content]").content;
				var dateModified = item.querySelector("[itemprop~=dateModified][content]").content;
				var createDate = commonFunctionObject.DateFormat(new Date(dateCreated), "yyyy-MM-dd hh:mm:ss");
				var editDate = commonFunctionObject.DateFormat(new Date(dateModified), "yyyy-MM-dd hh:mm:ss");

				var sideItem = item.querySelector(".ContentItem-meta");
				var timeDiv = document.createElement('div');
				timeDiv.innerHTML = `创建于:&nbsp;${createDate}&nbsp;&nbsp;&nbsp;修改于:&nbsp;${editDate}`;
				timeDiv.class = "Voters";
				timeDiv.style.cssText = 'color:#6f6f6f;font-size:13px;display:block;padding:5px 0px;';
				sideItem.appendChild(timeDiv);
			}catch(e){}
		}
		return true;
	};
	// 提问者标识出来
	this.showQuestionAuthor = function(){
		//此处代码借鉴自 - 知乎增强
		//原作者:X.I.U
		//https://greasyfork.org/zh-CN/scripts/419081-%E7%9F%A5%E4%B9%8E%E5%A2%9E%E5%BC%BA
		if (document.querySelector('.SpecialQuestionAuthor-Wrapper, .SpecialQuestionAuthor')){
			return;
		}
		let qJson = JSON.parse(document.querySelector('#js-initialData').textContent).initialState.entities.questions[/\d+/.exec(location.pathname)[0]].author,
			html = `<div class="BrandQuestionSymbol"><a class="BrandQuestionSymbol-brandLink" href="/people/${qJson.urlToken}"><img role="presentation" src="${qJson.avatarUrl}" class="BrandQuestionSymbol-logo" alt=""><span class="BrandQuestionSymbol-name">${qJson.name}</span></a><div class="BrandQuestionSymbol-divider" style="margin-left: 5px;margin-right: 10px;"></div></div>`;
		document.querySelector('.QuestionHeader-topics').insertAdjacentHTML('beforebegin', html);
	};
	this.startDealwithQuestion = function(){
		let isMarkComplete = true;
		setInterval(()=>{
			if(isMarkComplete){
				isMarkComplete = false;
				isMarkComplete = this.addTimeAnswerItems();
			}
		}, 2500);
		this.showQuestionAuthor();
		this.addDateQuestion();
	};
	this.downloadVideo = function(){
		let isMarkComplete = true;
		function addDownloadButton(){
			if(!isMarkComplete) return;
			isMarkComplete = false;

			var itemArray = document.querySelectorAll("._1tg8oir:not(span[zh_date_mk='true'])");
			var item = null;
			// console.log("知乎视频下载循坏监听次数:", itemArray.length);
			for(var i=0; i<itemArray.length; i++){
				item = itemArray[i];
				if (item.getAttribute('zh_date_mk') === 'true') {
					continue;
				}
				item.setAttribute("zh_date_mk", "true");

				if(item.innerText != "倍速"){
					continue;
				}

				var playButLi = item.parentNode.parentNode;
				var downloadBut = playButLi.cloneNode(true)
				if(!downloadBut.querySelector('._1tg8oir')) return;

				// 删除其它元素
				var downloadButChildren = downloadBut.children;
				for(var j=0; j<downloadButChildren.length; j++){
					if(downloadButChildren[j].nodeName !== "BUTTON"){
						downloadBut.removeChild(downloadButChildren[j]);
					}
				}

				downloadBut.setAttribute("zh_date_mk", "true");
				downloadBut.querySelector('._1tg8oir').innerText='下载';

				playButLi.before(downloadBut);
				downloadBut.addEventListener("click",function(){
					let href = window.location.href;
					let findClassName = ".ZVideoItem-video"; // 首页
					if(href.indexOf("www.zhihu.com/search")!=-1){ //搜索界面
						findClassName = ".List-item";
					}else if(href.indexOf("www.zhihu.com/zvideo/")!=-1){ //单独视频播放界面
						findClassName = ".ZVideo-player";
					}else if(href.indexOf("https://video.zhihu.com/video")!=-1){ //视频播放iframe
						findClassName = "#player"
					}
					if(!findClassName) return;
					let playUrl = $(item).parents(findClassName).find("video").attr("src");
					if(!!playUrl){
						commonFunctionObject.GMopenInTab(playUrl);
					}
				});
			}
			isMarkComplete = true;
		}

		setInterval(()=>{
			addDownloadButton();
		}, 1499);
	};
	this.start = function(){
		const host = window.location.host;
		const self = this;
		if(host == "link.zhihu.com"){
			this.autoJumpTarget();
		}
		if(host.indexOf("zhihu.com")!=-1){
			this.markArticleOrQuestion();
			if(window.location.href.indexOf("www.zhihu.com/question/")!=-1){
				this.startDealwithQuestion();
			}
			//this.downloadVideo();
		}
	};
}
try{
	if(!functionController || functionController.zhihuHelper){
		(new ZhihuHelper()).start();
	}
}catch(e){
	console.log("知乎助手:error:"+e);
}

	/**
 * 搜索引擎资源提醒
 */
function SearchEnginesNavigation(){

	this.customNavigationkey = "custom-navigation-key-8898";
	this.serverNavigationkey = "server-navigation-key-8898";
	this.searchEnginesData=[
		{"host":"www.baidu.com", "element":"#content_right","elementInput":"#kw"},
		{"host":"www.so.com", "element":"#side","elementInput":"#keyword"},
		{"host":"www.sogou.com", "element":"#right","elementInput":"#upquery"},
		{"host":"cn.bing.com", "element":"#b_context","elementInput":"#sb_form_q"},
		{"host":"www.bing.com", "element":"#b_context","elementInput":"#sb_form_q"},
		{"host":"www4.bing.com", "element":"#b_context","elementInput":"#sb_form_q"},
		{"host":"so.toutiao.com", "element":".s-side-list","elementInput":"input[type='search']"},
		{"host":"www.google.com", "element":"#rhs","elementInput":"textarea[name='q']"},
		{"host":"www.google.com.hk","element":"#rhs","elementInput":"textarea[name='q']"},
		{"host":"duckduckgo.com","element":".react-results--sidebar","elementInput":"#search_form_input"}
	];
	this.defaultNavigationData =  [
		{"name":"资源搜索","list":[

            {
                "name": "百度",
                "url": "https://www.baidu.com/s?wd=@@"
            },
            {
                "name": "必应",
                "url": "https://cn.bing.com/search?q=@@"
            },
            {
                "name": "360搜索",
                "url": "https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&nlpv=basest&q=@@"
            },
            {
                "name": "搜狗",
                "url": "https://www.sogou.com/web?query=@@"
            },
            {
                "name": "搜狗|公众号",
                "url": "https://weixin.sogou.com/weixin?type=2&query=@@"
            },
            {
                "name": "头条搜索",
                "url": "https://so.toutiao.com/search?dvpf=pc&source=input&keyword=@@"
            },
            {
                "name": "高德地图",
                "url": "https://ditu.amap.com/search?query=@@"
            },
            {
                "name": "网易云搜索",
                "url": "https://music.163.com/#/search/m/?s=@@"
            },
            {
                "name": "百度百科",
                "url": "https://baike.baidu.com/item/@@"
            },
            {
                "name": "知乎搜索",
                "url": "https://www.zhihu.com/search?type=content&q=@@"
            },
            {
                "name": "抖音搜索",
                "url": "https://www.douyin.com/search/@@"
            },
            {
                "name": "Bilibili",
                "url": "https://search.bilibili.com/all?keyword=@@&from_source=webtop_search&spm_id_from=333.851"
            },
            {
                "name": "Github",
                "url": "https://github.com/search?q=@@"
            },
            {
                "name": "YouTube",
                "url": "https://www.youtube.com/results?search_query=@@&page={startPage?}&utm_source=opensearch"
            },
            {
                "name": "推特搜索",
                "url": "https://x.com/search?q=@@"
            },
            {
                "name": "图标搜索",
                "url": "https://www.iconfont.cn/search/index?searchType=icon&q=@@"
            },
            {
                "name": "维基百科",
                "url": "https://en.wikipedia.org/w/index.php?search=@@"
            },
            {
                "name": "ChatGPT",
                "url": "http://chatgpt.com/?q=@@"
            },
            {
                "name": "MetaSo",
                "url": "https://metaso.cn/?q=@@"
            },
            {
                "name": "Qwen",
                "url": "https://chat.qwen.ai/?q=@@"
            },
            {
                "name": "DeepSeek🐳",
                "url": "http://chat.deepseek.com/?q=@@"
            },
            {
                "name": "Kimi🌙",
                "url": "https://kimi.moonshot.cn?q=@@"
            },
            {
                "name": "元宝🌕️",
                "url": "https://yuanbao.tencent.com/?q=@@"
            },
            {
                "name": "豆包🍭",
                "url": "https://www.doubao.com/chat/?q=@@"
            }
		]}
	];
	this.getNavigationData = async function(element, elementInput){
		const self = this;
		let navigationData = self.defaultNavigationData;
		let finalNavigationData = null;
		try{
			let customNavigationData = commonFunctionObject.GMgetValue(self.customNavigationkey, null); //自定义的数据
			if(!!customNavigationData){
				finalNavigationData = [].concat(customNavigationData);
				// console.log("使用本地");
			}else{
				let currentMS = (new Date()).getTime();
				let delayMS = 1000 * 60 * 5;
				let serverNavigationData = commonFunctionObject.GMgetValue(self.serverNavigationkey, null);
				if(!serverNavigationData || (currentMS - serverNavigationData.ms) > delayMS){
					//拉取服务器本次不用,下次再使用
					commonFunctionObject.request("get", "https://sct.staticj.top/script/api/nav?t="+currentMS, null).then((serverJson)=>{
						let data = JSON.parse(serverJson.data);  //获取本地data
						data.ms = currentMS;                     //添加时间戳保存到本地区
						commonFunctionObject.GMsetValue(self.serverNavigationkey, data);
						//console.log("拉取服务器");
					}).catch((error)=>{});
				}

				if(!!serverNavigationData){
					finalNavigationData = JSON.parse(serverNavigationData.list);
				}else{
					finalNavigationData = navigationData;
				}
			}
		}catch(e){
			finalNavigationData = navigationData;
		}
		self.createHtml(element, elementInput, finalNavigationData);
	};
	this.createCss = function(elementNum){
		var innnerCss = `
			#dsdsd99mmmjj7760011{
				margin-bottom:20px;
			}
			.tab`+elementNum+`{
				margin-bottom:8px;
			}
			.tab-c-titles`+elementNum+`{
				margin-bottom:8px;
			}
			.tab-c-links`+elementNum+`{

			}

			.tabs-t`+elementNum+`{
				display: inline-block;
				width: 80px;
				height: 28px;
				line-height: 28px;
				font-size: 15px;
				letter-spacing: 0;
				text-align: center;
				font-weight: 400;
				border-radius: 6px;
				cursor: pointer;
				background: #f8f8f8;
				color: #333;
			}
			.tabs-t-selected-ddsds1idddx90{
			    color: #315EFB;
			    font-weight: 500;
			    background: rgba(49, 94, 251, 0.1);
			}
			.tabs-t-small-ddsds1idddx90{
			    margin-left: 8px;
			}

			.tab-c-links`+elementNum+` a[name='navigation']{
				display:inline-block;
				text-align:center;
				margin-right:12px;
				margin-top:5px;
				overflow: hidden;
				white-space: nowrap;
				text-overflow:ellipsis;
				box-sizing:border-box;
				line-height:20px;
				font-size:14px!important;
				text-decoration: none;
				color:#1a0dab;
			}
			.tab-c-links`+elementNum+` a[name='navigation']:hover{
				text-decoration: underline;
			}

			.bookmarks`+elementNum+`{
				min-height:50px;
			}
		`;
		if($("#plugin_css_style_dddsoo").length==0){
			$("body").prepend("<style id='plugin_css_style_dddsoo'>"+innnerCss+"</style>");
		}
	};
	this.showSetingDialog = function(){
		const self = this;

		var customNavigationData = "";
		const customNavigation = commonFunctionObject.GMgetValue(self.customNavigationkey, null);
		if(!!customNavigation){
			customNavigationData = JSON.stringify(customNavigation, null, 4);
		}
		const content = `
			<div>
				<div style="font-size:13px;color:red;">
					注意事项如下:
					<br>1、请严格按照格式添加,否则不生效
					<br>2、数据为json格式,请确保json格式正确,必要时请到<a target="_blank" href="https://www.json.cn/">https://www.json.cn/</a>校验
					<br>3、点击下面”示例“按钮,查看具体格式情况
					<br>4、链接中的搜索关键词请用”@@“代替,脚本会自动替换成当前搜索词。例如:https://www.baidu.com/s?wd=@@
					<br>5、大家可以自定义导航数据,<b>但是必须要注意数据格式,发现出现错误,可点“初始化”</b>
				</div>
				<div style="margin-top:5px;height:200px;width:100%;">
					<textarea
						placeholder="请严格按照格式填写,否则不生效"
						class="navigation-textarea"
						style="color:#000;font-size:14px;box-sizing: border-box;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;padding:5px;height:100%;width:100%;Overflow:auto;border:1px solid #ccc;resize:none;background-color:#FFF;outline:none;">`+customNavigationData+`</textarea>
				</div>
				<div style="text-align:center;margin-top:15px;">
					<button class="navigation-init" style="color:#000;cursor:pointer;">初始化</button>
					<button class="navigation-example" style="color:#000;cursor:pointer;">示例</button>
					<button class="navigation-clear" style="color:#000;cursor:pointer;">清空</button>
					<button class="navigation-save" style="color:#000;cursor:pointer;">保存自定义导航</button>
				</div>
			</div>
		`;
		dialog.showMake({
			"title":"自定义添加导航",
			"content":content,
			"onClose":function(){
				location.reload();
			},
			"onContentReady":function($that){
				var $navigationExample = $that.dialogContent.querySelector(".navigation-example");
				var $navigationClear = $that.dialogContent.querySelector(".navigation-clear");
				var $navigationSave = $that.dialogContent.querySelector(".navigation-save");
				var $navigationInit = $that.dialogContent.querySelector(".navigation-init");

				var $textarea = $that.dialogContent.querySelector(".navigation-textarea");
				$navigationExample.addEventListener("click", function(){
					$textarea.value = JSON.stringify(self.defaultNavigationData, null, 4);
				});
				$navigationClear.addEventListener("click", function(){
					$textarea.value = "";
				});
				$navigationInit.addEventListener("click", function(){
					$textarea.value = "";
					commonFunctionObject.GMsetValue(self.customNavigationkey, null);
				});
				$navigationSave.addEventListener("click", function(){
					var content = $textarea.value;
					if(!content){
						commonFunctionObject.GMsetValue(self.customNavigationkey, null);
						commonFunctionObject.webToast({"message":"保存成功:数据为空", "background":"#FF4D40"});
						return;
					}
					if(content.length==0 || content.indexOf("{")==-1 || content.indexOf("[")==-1){
						commonFunctionObject.webToast({"message":"格式错误,请更正", "background":"#FF4D40"});
						return;
					}
					try{
						var contentJson = JSON.parse(content);
						if(Array.isArray(contentJson)){ //开始必须是数组
							var isOK = true;
							for(var i=0; i<contentJson.length; i++) {
								if(Array.isArray(contentJson[i])){ //此处必须是对象
									isOK = false;
									break;
								}
								if(!contentJson[i].hasOwnProperty("name") || !contentJson[i].hasOwnProperty("list")){
									isOK = false;
									break;
								}
								if(typeof(contentJson[i]["name"])!="string"){
									isOK = false;
									break;
								}
								if(!Array.isArray(contentJson[i]["list"])){ //此处必须是数组
									isOK = false;
									break;
								}
								for(var j=0; j<contentJson[i]["list"].length; j++){
									if(!contentJson[i]["list"][j].hasOwnProperty("name") || !contentJson[i]["list"][j].hasOwnProperty("url")){
										isOK = false;
										break;
									}
									if(typeof(contentJson[i]["list"][j]["name"])!="string" || typeof(contentJson[i]["list"][j]["url"])!="string"){
										isOK = false;
										break;
									}
								}
								if(!isOK){
									break;
								}
							}
							if(isOK){
								commonFunctionObject.GMsetValue(self.customNavigationkey, contentJson);
								commonFunctionObject.webToast({"message":"保存成功", "background":"#FF4D40"});
							}else{
								commonFunctionObject.webToast({"message":"格式错误,请更正", "background":"#FF4D40"});
							}
						}else{
							commonFunctionObject.webToast({"message":"格式错误,请更正", "background":"#FF4D40"});
						}
					}catch(e){
						commonFunctionObject.webToast({"message":"格式错误,请更正", "background":"#FF4D40"});
					}
				});
			}
		})
	}
	this.createHtml = function(element, elementInput, navigationData){
		$("#dsdsd99mmmjj7760011").remove();

		var isComplate = true;
		const host = window.location.host;
		const self = this;
		const elementNum = commonFunctionObject.randomNumber();
		const elementInterval = setInterval(function(){
			if(isComplate){
				var $element = $(element);
				var $box = $("#dsdsd99mmmjj7760011");
				isComplate = false;
				if($element.length!=0 && $box.length==0){
					var nameArray = [];
					var linkArray = [];
					for(var i=0; i<navigationData.length; i++){
						var name = "";
						if(i==0){
							name += '<span class="tabs-t'+elementNum+' tabs-t-selected-ddsds1idddx90" name="tab-list-xxsddddssd-'+i+'">'+navigationData[i].name+'</span>';
						}else{
							name += '<span class="tabs-t'+elementNum+' tabs-t-small-ddsds1idddx90" name="tab-list-xxsddddssd-'+i+'">'+navigationData[i].name+'</span>';
						}
						nameArray.push(name);

						var links = "";
						if(i==0){
							links = '<div id="tab-list-xxsddddssd-'+i+'">';
						}else{
							links = '<div id="tab-list-xxsddddssd-'+i+'" style="display:none;">';
						}
						for(var j=0;j<navigationData[i].list.length;j++){
							let url = navigationData[i].list[j].url;
							url = url.replace("${t}",(new Date()).getTime());
							let name = navigationData[i].list[j].name;
							links += "<a target='_blank' name='navigation' data-url='"+url+"' href='javascript:void(0);'>"+name+"</a>"
						}
						links += "</div>";
						linkArray.push(links);
					}

					var html = `
						<div id="dsdsd99mmmjj7760011" style="position:relative!important;left:0px!important;">
							<div class="tab`+elementNum+`">
								<div class="tab-c-titles`+elementNum+`">`+nameArray.join("")+`</div>
								<div class="tab-c-links`+elementNum+`">`+linkArray.join("")+`</div>
							</div>
							<div style='margin-bottom:10px;margin-top:5px;font-size:12px;'>
								<a target='_blank' href='https://greasyfork.org/zh-CN/scripts/469407' style="color: #000;background-color: #efefef;padding: 2px 5px; border-radius: 2px;">*该数据由油猴脚本提供</a>
								&nbsp;&nbsp;
								<a href="javascript:void(0);" name="customNavigation" style="color: #000;background-color: #efefef;padding: 2px 5px; border-radius: 2px;">🔧自定义网址</a>
							</div>
						<div>
					`;

					// //添加css 添加html
					self.createCss(elementNum);
					$element.prepend(html);


					//点击切换tab
					$("#dsdsd99mmmjj7760011 .tabs-t"+elementNum).on("click", function(e){
						$("div[id^='tab-list-xxsddddssd-']").hide();
						$(".tabs-t"+elementNum).removeClass("tabs-t-selected-ddsds1idddx90");

						$("#"+$(this).attr("name")).show();
						$(this).addClass("tabs-t-selected-ddsds1idddx90");
					});

					//点击链接
					$("#dsdsd99mmmjj7760011 a[name='navigation']").on("click", function(e){
						commonFunctionObject.GMopenInTab($(this).data("url").replace("@@",$(elementInput).val()));
						e.preventDefault()
					});

					//弹出自定义导航弹窗
					$("#dsdsd99mmmjj7760011 a[name='customNavigation']").on("click", function(e){
						self.showSetingDialog();
						e.preventDefault()
					});
				}
				isComplate = true;
			}
		}, 100);
	};
	this.hookBaidu = function(){
		let items = document.querySelectorAll("#content_left>div");
		for(let item of items){
			//给处理完成的做一个标识
			if(!!item.getAttribute("baidu_dealxx")){
				continue;
			}
			item.setAttribute("baidu_dealxx","--");

			let a = item.querySelector("a");
			if(!a || !a.href){
				continue;
			}

			//标注了html网址的忽略
			let OP_LOG_LINK = item.querySelector(".OP_LOG_LINK");
			if(!!OP_LOG_LINK && OP_LOG_LINK.innerText.search("http")!=-1){
				continue;
			}

			//有多个点击点的忽略
			let cGapBottomSmall = item.querySelector(".c-gap-bottom-small");
			if(!!cGapBottomSmall){
				continue;
			}

			//https://www.baidu.com/s?wd=一夜醒来欠地铁600多万?官方回应
			if (a.href.includes("www.baidu.com/link?url=")) {
				let url = item.getAttribute("mu");
				if (url && url.indexOf("http")!=-1 && !url.includes("nourl.ubs.baidu.com")) {
					a.href = url;
					item.innerHTML += `<div style="color:#ccc;font-size:12px;display:flex;align-items:center;width:100%;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;">
										<img style="width:15px;height:15px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAKhJREFUOE+9k9ENwjAMBc8RA7AR7UhMQDsBszBBw0YMAAmKrBS3pM1HpOb/ne9ZjtD4pDHPEYBTB2FSU9fD21vrisEcHsF5BS0hFYCLwAhh0KkZGOZcBSATyAM4K8QNEC8Q+1yjAEhTPjeQ50+bq0KW4QRZAWxnXsBdO4euFC4AbOe1fvlijEGebrecOqeXl/gP2aiwr125g2wSvd321skfccr7363Z4Asklz4RHmdA1gAAAABJRU5ErkJggg=="/>
										<a style="color:#626675;" href="`+url+`" target="_blank">`+url+`</a>
									</div>`;
				}
			}

			let itemNews = item.querySelectorAll("[class^=single-card-wrapper] div,[class^=group-wrapper] div");
			if(!itemNews){
				continue;
			}
			//single-card-wrapper: https://www.baidu.com/s?ie=UTF-8&wd=es6                          xxx的最新相关信息
			//group-wrapper:       https://www.baidu.com/s?ie=UTF-8&wd=五一消费成绩单折射市场活力     资讯
			for(let itemNew of itemNews){
				let dataUrl = null;
				let divs = itemNew.querySelectorAll("div");
				for (let div of divs) {
					dataUrl = div.getAttribute("data-url")
					if (dataUrl) {
						let a = itemNew.querySelector("a");
						a.setAttribute("href", dataUrl);
					}
				}
			}
		}
	};
	this.hookGoogle = function(){
		let items = document.querySelectorAll("#center_col a");
		for(let a of items){
			if(!a.getAttribute("target")) a.setAttribute("target","_blank");
		}
	};
	this.hooks = function(){
		const host = window.location.host;
		const href = window.location.href;
		const search = window.location.search;
		const self = this;
		setInterval(function(){
			if(host==="www.baidu.com"){
				self.hookBaidu();
			}else if(host==="www.google.com" || host==="www.google.com.hk"){
				self.hookGoogle();
			}
		}, 300);
	};
	this.show = function(){
		const self = this;
		const host = window.location.host;
		const href = window.location.href;
		if((host==="www.baidu.com")
			|| (host==="www.so.com" && href.indexOf("www.so.com/s")!=-1)
			|| (host==="www.sogou.com" && (href.indexOf("www.sogou.com/web")!=-1 || href.indexOf("www.sogou.com/sogou")!=-1))
			|| (host==="cn.bing.com" && href.indexOf("cn.bing.com/search")!=-1)
			|| (host==="www.bing.com" && href.indexOf("www.bing.com/search")!=-1)
			|| (host==="www4.bing.com" && href.indexOf("www4.bing.com/search")!=-1)
			|| (host==="so.toutiao.com" && href.indexOf("so.toutiao.com/search")!=-1)
			|| (host==="www.google.com" && href.indexOf("www.google.com/search")!=-1)
			|| (host==="www.google.com.hk" && href.indexOf("www.google.com.hk/search")!=-1)
			|| (host==="duckduckgo.com" && href.indexOf("duckduckgo.com")!=-1)){
			let currentSearchEnginesData = null;
			for(var i=0; i<self.searchEnginesData.length; i++){
				if(host===self.searchEnginesData[i].host){
					currentSearchEnginesData = self.searchEnginesData[i];
				}
			}
			if(currentSearchEnginesData!=null){
				self.getNavigationData(currentSearchEnginesData.element, currentSearchEnginesData.elementInput);
			}
			self.hooks();
		}
	};
	this.start = function(){
		this.show();
	};
}
try{
	if(!functionController || functionController.searchEnginesNavigation){
		(new SearchEnginesNavigation()).start();
	}
}catch(e){
	console.log("搜索引擎导航:error:"+e);
}

/**
 * 给kimi网站添加q查询参数
*/

async function addKimiQueryParam() {
    const query = new URLSearchParams(window.location.search).get('q');
    if (!query) return;

    const waitForElement = (selector) => {
        return new Promise((resolve) => {
            const elem = document.querySelector(selector);
            if (elem) {
                return resolve(elem);
            }

            const observer = new MutationObserver(() => {
                const elem = document.querySelector(selector);
                if (elem) {
                    observer.disconnect();
                    resolve(elem);
                }
            });
            observer.observe(document.body, { childList: true, subtree: true });
        });
    };
    const delay = (ms) => new Promise(res => setTimeout(res, ms));


    const chat = await waitForElement('.chat-input-editor');
    chat.value = query;
    chat.dispatchEvent(new InputEvent('input', { data: query, bubbles: true }));

    await delay(500);
    chat.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', keyCode: 13, bubbles: true }));
}

try {
    //如果匹配到kimi.moonshot.cn,就执行addKimiQueryParam函数
    if (window.location.host === 'kimi.moonshot.cn' || window.location.host === 'www.kimi.com') {
        addKimiQueryParam();
    }
} catch (e) {
    console.log("给kimi网站添加q查询参数:error:" + e);
}


/*
 * 给元宝添加查询参数
*/
async function addYuanbaoQueryParam() {


    const params = new URLSearchParams(window.location.search);
    const query = params.has('q') ? decodeURIComponent(params.get('q')) : null;
    // console.log("查询参数:"+query)
    if (!query?.trim()) return;



    // 增强版元素等待器
    function waitForElement(selector, timeout = 8000) {
        return new Promise((resolve, reject) => {
            let retry = 0;
            const check = () => {
                const elem = document.querySelector(selector);
                if (elem) {
                    console.log(`[加载跟踪] 元素${selector}在第${Date.now() - start}ms加载完成`);
                    resolve(elem);
                } else if (Date.now() - start > timeout) {
                    reject(`元素加载超时: ${selector}`);
                } else {
                    setTimeout(check, 500);
                }
            };
            const start = Date.now();
            check();
        });
    }

    try {
        // 等待富文本编辑器
        const inputBox = await waitForElement('.ql-editor[contenteditable="true"]');

        // 模拟真实输入
        inputBox.focus();
        await new Promise(r => setTimeout(r, 300));
        inputBox.innerHTML = `<p>${query}</p>`; // 富文本特殊处理

        // 触发React状态更新
        inputBox.dispatchEvent(new InputEvent('input', {
            bubbles: true,
            composed: true
        }));

        // 提交优化(增加延迟确保渲染完成)
        setTimeout(() => {
            inputBox.dispatchEvent(new KeyboardEvent('keydown', {
                key: 'Enter',
                code: 'Enter',
                bubbles: true
            }));
        }, 1200);

    } catch (error) {
        console.error('[最终错误处理]', error);
    }
}

try {
    //如果匹配到yuanbao.tencent.com,就执行addYuanbaoQueryParam函数
    if (window.location.host === 'yuanbao.tencent.com') {
        addYuanbaoQueryParam();
    }
} catch (e) {
    console.log("给元宝添加q查询参数:error:" + e);
}

/*
 * 给DeepSeek添加q查询参数
*/
async function addDeepSeekQueryParam() {
    const query = new URLSearchParams(window.location.search).get('q');
    if (!query) return;

    const waitForElement = (selector) => {
        return new Promise((resolve) => {
            const elem = document.querySelector(selector);
            if (elem) {
                return resolve(elem);
            }

            const observer = new MutationObserver(() => {
                const elem = document.querySelector(selector);
                if (elem) {
                    observer.disconnect();
                    resolve(elem);
                }
            });
            observer.observe(document.body, { childList: true, subtree: true });
        });
    };
    const getReactProps = el => el[Object.keys(el).find(k => k.startsWith('__reactProps$'))];
    const delay = (ms) => new Promise(res => setTimeout(res, ms));


    const chat = await waitForElement("#chat-input");
    chat.value = query;
    getReactProps(chat)?.onChange?.({
        target: { value: query },
        currentTarget: { value: query },
        preventDefault: () => { },
        stopPropagation: () => { }
    });

    await delay(500);
    getReactProps(chat)?.onKeyDown?.({
        key: 'Enter',
        keyCode: 13,
        shiftKey: false,
        target: chat,
        currentTarget: chat,
        preventDefault: () => { },
        stopPropagation: () => { },
    });
}


try {
    //如果匹配到deepseek.com,就执行addDeepSeekQueryParam函数
    if (window.location.host === 'chat.deepseek.com') {
        addDeepSeekQueryParam();
    }
} catch (e) {
    console.log("给DeepSeek添加q查询参数:error:" + e);
}



async function addQwenQueryParam() {
    // 获取URL查询参数
    const getQueryParam = () => {
        const q = new URLSearchParams(window.location.search).get('q');
        return q;
    };

    // 等待元素加载
    const waitForElement = async (selector, timeout = 20000) => {
        const start = Date.now();
        return new Promise((resolve, reject) => {
            const check = () => {
                const el = document.querySelector(selector);
                if (el) {
                    return resolve(el);
                }
                if (Date.now() - start > timeout) {
                    return reject(new Error(`Element timeout: ${selector}`));
                }
                setTimeout(check, 100);
            };
            check();
        });
    };

    // 模拟完整用户输入流程
    const simulateInput = async (text) => {
        try {
            const chatBox = await waitForElement('#chat-input');

            // 模拟点击聚焦
            chatBox.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
            chatBox.focus();

            // 设置输入值并触发事件(兼容React)
            const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
                window.HTMLTextAreaElement.prototype,
                "value"
            ).set;

            nativeInputValueSetter.call(chatBox, text);

            // 触发输入事件链
            ['input', 'change', 'keydown', 'keyup'].forEach(eventType => {
                chatBox.dispatchEvent(new Event(eventType, {
                    bubbles: true,
                    cancelable: true
                }));
            });

            // 等待内容处理完成
            await new Promise(resolve => setTimeout(resolve, 300));

            // 模拟回车发送
            ['keydown', 'keypress', 'keyup'].forEach(eventType => {
                const event = new KeyboardEvent(eventType, {
                    key: 'Enter',
                    code: 'Enter',
                    keyCode: 13,
                    bubbles: true
                });
                chatBox.dispatchEvent(event);
            });



        } catch (error) {
            console.error('[QwenAutoInput] 错误详情:', error);
        }
    };
    const query = getQueryParam();
    if (!query) return;

    // 确保页面完全加载
    await waitForElement('#chat-input');
    await new Promise(resolve => setTimeout(resolve, 1000));

    // 执行自动输入
    await simulateInput(query);
}

try {
    if (window.location.host === 'chat.qwen.ai') {
        addQwenQueryParam();
    }
} catch (e) {
    console.log("给qwen添加q查询参数:error:" + e);
}





// 豆包搜索添加q参数
async function addDoubaoQueryParam() {
    const query = new URLSearchParams(window.location.search).get('q');
    if (!query) {
        console.log('URL中未检测到q参数,脚本终止');
        return;
    }

    console.log(`检测到查询参数:${query}`);

    // 元素等待函数(优化版)
    const waitForElement = async (selectors, timeout = 10000) => {
        const selectorList = Array.isArray(selectors) ? selectors : [selectors];
        const startTime = Date.now();

        while (Date.now() - startTime < timeout) {
            for (const selector of selectorList) {
                const element = document.querySelector(selector);
                if (element) {
                    console.log(`通过选择器 "${selector}" 定位到元素`);
                    return element;
                }
            }
            await delay(300);
        }

        console.error(`元素定位超时:${selectorList.join(' / ')}`);
        throw new Error(`元素定位超时:${selectorList.join(' / ')}`);
    };

    // 延时函数
    function delay(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // 注入式输入内容(保留核心逻辑)
    async function injectText(element, text) {
        console.log(`开始注入内容,长度:${text.length} 字符`);
        const chunks = splitTextIntoChunks(text);

        for (let i = 0; i < chunks.length; i++) {
            const chunk = chunks[i];
            setNativeValue(element, chunk.content);
            triggerInputEvents(element);
            await delay(150 + Math.random() * 100);
        }

        element.dispatchEvent(new Event('change', { bubbles: true }));
        element.dispatchEvent(new Event('blur', { bubbles: true }));
        console.log(`内容注入完成:${text}`);
    }

    // 简化的文本分块函数
    function splitTextIntoChunks(text) {
        const chunks = [];
        const maxChunkSize = 20;
        for (let i = 0; i < text.length; i += maxChunkSize) {
            chunks.push({ content: text.substring(i, i + maxChunkSize) });
        }
        return chunks;
    }

    // 设置原生值(保留必要逻辑)
    function setNativeValue(element, value) {
        const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
        const prototype = Object.getPrototypeOf(element);
        const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;

        if (valueSetter && valueSetter !== prototypeValueSetter) {
            prototypeValueSetter.call(element, value);
        } else {
            valueSetter.call(element, value);
        }
    }

    // 触发输入事件(简化版)
    function triggerInputEvents(element) {
        ['focus', 'input', 'change'].forEach(eventName => {
            const event = new Event(eventName, { bubbles: true, cancelable: true, composed: true });
            element.dispatchEvent(event);
        });
    }

    // 优化的点击函数
    async function realisticClick(element) {
        try {
            const rect = element.getBoundingClientRect();
            const clickX = rect.left + rect.width / 2;
            const clickY = rect.top + rect.height / 2;

            // 基础鼠标事件序列
            element.dispatchEvent(new MouseEvent('mouseenter', { clientX: clickX, clientY: clickY, bubbles: true }));
            await delay(100);

            element.dispatchEvent(new MouseEvent('mousedown', { clientX: clickX, clientY: clickY, bubbles: true, buttons: 1 }));
            await delay(50);

            element.dispatchEvent(new MouseEvent('mouseup', { clientX: clickX, clientY: clickY, bubbles: true, buttons: 0 }));
            element.dispatchEvent(new MouseEvent('click', { clientX: clickX, clientY: clickY, bubbles: true }));

            await delay(150);
        } catch (error) {
            console.log('鼠标模拟失败,尝试直接点击', error);
            element.click();
        }
    }

    try {
        // 定位输入框
        const textarea = await waitForElement([
            '[data-testid="chat_input_input"]',
            '.semi-input-textarea.semi-input-textarea-autosize'
        ]);

        textarea.focus();
        await delay(600);
        textarea.value = '';
        triggerInputEvents(textarea);
        await delay(200);

        // 注入内容
        await injectText(textarea, query);

        // 验证内容
        if (textarea.value.trim() !== query.trim()) {
            setNativeValue(textarea, query);
            triggerInputEvents(textarea);
            await delay(300);
        }

        console.log(`内容已成功设置:${query}`);
        await delay(500);

        // 定位发送按钮
        const sendButton = await waitForElement([
            '[data-testid="chat_input_send_button"]',
            '.semi-button-primary:not([disabled])'
        ]);

        console.log('准备发送消息...');
        textarea.focus();
        await delay(200);

        // 点击发送按钮(优化版)
        await realisticClick(sendButton);

        // 等待发送结果
        await delay(1000);

        if (textarea.value.trim() !== '') {
            console.warn('警告:尝试使用Enter键发送');
            const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', bubbles: true });
            textarea.dispatchEvent(enterEvent);
            await delay(150);
            textarea.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter', code: 'Enter', bubbles: true }));
            await delay(1000);
        }

        console.log('消息已成功发送!');

    } catch (error) {
        console.error('脚本执行失败:', error.message);
    }
}

if (window.location.host === 'www.doubao.com' && window.location.pathname.startsWith('/chat')) {
    addDoubaoQueryParam();
}



function Tiktok(){
	this.extractHref=function(html){
		const regex = /<a\s+(?:[^>]*?\s+)?href=(['"])(.*?)\1/gi;
		const hrefs = [];
		let match;

		while ((match = regex.exec(html)) !== null) {
			hrefs.push(match[2]);
		}
		return hrefs.filter((href) => href.indexOf("snapcdn.app")!=-1);
	};
	this.download=async function(url, element){
		commonFunctionObject.webToast({"message":"正在下载中...", "background":"#000"});
		element.classList.add("download-loadding");
		const data = await commonFunctionObject.request("POST", "https://tikdownloader.io/api/ajaxSearch",
			"q="+url+"&lang=en", {"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"});
		if(data.result==="success"){
			const result = JSON.parse(data.data);
			if(result.status=="ok" && result.hasOwnProperty("data")){
				const data = result.data;
				const downloadUrls = this.extractHref(data);
				if(downloadUrls.length>=2){
					commonFunctionObject.GMopenInTab(downloadUrls.at(-2));
				}
			}
		}
		element.classList.remove("download-loadding");
	};
	this.start=async function(){
		if(!/www\.tiktok\.com/.test(window.location.host)){
			return;
		}
		commonFunctionObject.GMaddStyle(`
			@keyframes scriptspin {0% {transform: rotate(0deg);} 100% {transform: rotate(360deg);}}
			.download-loadding{
				animation: scriptspin 1s linear infinite;
			}
		`);
		setInterval(()=>{
			if(!document.querySelector("#tiktok-download-990i")){
				const container = document.querySelector('#main-content-video_detail') || document.body;
				if(!container){
					return;
				}

				const divs = container.querySelectorAll("div");
				const regex = /-DivRightControlsWrapper|-DivMiniPlayerContainer/;
				const matchedDiv = Array.from(divs).find(div => {
					return div.classList.value.split(' ').some(className => {
						return regex.test(className);
					});
				});
				if(matchedDiv){
					let cloneNode =  null;
					let isDetail = matchedDiv.children.length!=1;
					if(isDetail){
						cloneNode = matchedDiv.children[0].cloneNode(true);
					}else{
						cloneNode = matchedDiv.cloneNode(true);
					}
					cloneNode.id = "tiktok-download-990i";
					cloneNode.querySelector("div").innerHTML=`<svg t="1724300009050" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5307" width="35" height="35"><path d="M298.666667 554.666667v85.333333H256v128h512v-128h-42.666667v-85.333333h128v213.333333a85.333333 85.333333 0 0 1-78.933333 85.077333L768 853.333333H256a85.333333 85.333333 0 0 1-85.12-78.933333L170.666667 768v-213.333333h128z" fill="#ffffff" p-id="5308"></path><path d="M512 627.498667l219.477333-219.477334h-120.704L512 506.88 413.141333 408.021333H292.522667L512 627.498667z" fill="#ffffff" p-id="5309"></path><path d="M554.666667 528V167.978667h-85.333334v360.021333h85.333334z" fill="#ffffff" p-id="5310"></path></svg>`;
					if(isDetail){
						matchedDiv.insertBefore(cloneNode, matchedDiv.children[0]);
					}else{
						cloneNode.style.right=(166)+"px";
						matchedDiv.parentNode.insertBefore(cloneNode, matchedDiv);
					}
					cloneNode.title = "点击下载视频(高清无水印)";
					cloneNode.addEventListener("click",()=>{
						this.download(window.location.href,cloneNode);
					});
				}
			}
		}, 2000);
	}
}

try{
	if(!functionController || functionController.abroadVideoHelper){
		(new Tiktok()).start();
	}
}catch(e){
	console.log("国外视频解析:error:"+e);
}
	function ShortVideoDownloader(){
	this.douyinVideoDownloader = function(){
		/**
		 * 此处代码有借鉴lazyfrog的代码,在原来代码的基础上修改了部分功能和bug修复
		 * 脚本地址:https://greasyfork.org/zh-CN/scripts/469521
		 * 特此注明
		 */
		const _self = this;
		function run(){
			if(window.location.host !== "www.douyin.com"){
				return;
			}
			let downloadOption = [{name:'',id:'toServer'}, {name:'打开视频(可下载)',id:'toLink'}];
			let videoElements = document.querySelectorAll('video');
			if(videoElements.length == 0) return;

			//把自动播放的video标签选择出来
			let playVideoElements=[];
			videoElements.forEach(function(element){
				let autoplay = element.getAttribute('autoplay');
				if(autoplay !== null){
					playVideoElements.push(element);
				}
			})

			let videoContainer=location.href.indexOf('modal_id') != -1
				? playVideoElements[0]
				: playVideoElements[playVideoElements.length-1];
			if(!videoContainer) return;

			//获取视频播放地址
		   let url = videoContainer && videoContainer.children.length>0 && videoContainer.children[0].src
						? videoContainer.children[0].src
						: videoContainer.src;

			//获取视频ID,配合自定义id使用
			let videoId;
			let resp = url.match(/^(https:)?\/\/.+\.com\/([a-zA-Z0-9]+)\/[a-zA-Z0-9]+\/video/);
			let res = url.match(/blob:https:\/\/www.douyin.com\/(.*)/);
			if(resp && resp[2]){
				videoId=resp[2];
			}else if(res && res[1]){
				videoId=res[1]
			}else{
				videoId = videoContainer.getAttribute('data-xgplayerid')
			}

			let playContainer = videoContainer.parentNode.parentNode.querySelector('.xg-right-grid');
			if(!playContainer) return;

			//在对主页就行视频浏览时会出现多个按钮,删除不需要的,只保留当前对应的
			let videoDownloadDom = playContainer.querySelector('#scriptVideoDownload'+videoId);
			if(videoDownloadDom){
				let dom = playContainer.querySelectorAll('.xgplayer-playclarity-setting');
				dom.forEach(function(d){
					let btn = d.querySelector('.btn');
					if(d.id != 'scriptVideoDownload'+videoId && btn.innerText=='下载'){
						d.parentNode.removeChild(d);
					}
				});
				return;
			}

			if(videoContainer && playContainer){
				let playClarityDom = playContainer.querySelector('.xgplayer-playclarity-setting');
				if(!playClarityDom) return;

				let palyClarityBtn = playClarityDom.querySelector('.btn');
				if(!palyClarityBtn) return;

				let downloadDom = playClarityDom.cloneNode(true);
				downloadDom.setAttribute('id','scriptVideoDownload'+videoId);

				if(location.href.indexOf('search') == -1){
					downloadDom.style='margin-top:-68px;padding-top:100px;padding-left:20px;padding-right:20px;';
				}else{
					downloadDom.style='margin-top:0px;padding-top:100px;';
				}

				let downloadText = downloadDom.querySelector('.btn');
				downloadText.innerText='下载';
				downloadText.style = 'font-size:14px;font-weight:600;';
				downloadText.setAttribute('id','zhmDouyinDownload'+videoId);

				let detail = playContainer.querySelector('xg-icon:nth-of-type(1)').children[0];
				let linkUrl = detail.getAttribute('href') ? detail.getAttribute('href') : location.href;

				if(linkUrl.indexOf('www.douyin.com')==-1){
					linkUrl='//www.douyin.com'+linkUrl;
				}

				downloadText.setAttribute('data-url',linkUrl);
				downloadText.removeAttribute('target');
				downloadText.setAttribute('href','javascript:void(0);');

				let virtualDom = downloadDom.querySelector('.virtual');
				downloadDom.onmouseover=function(){
					if(location.href.indexOf('search') == -1){
						virtualDom.style='display:block !important';
					}else{
						virtualDom.style='display:block !important;margin-bottom:37px;';
					}
				}

				downloadDom.onmouseout=function(){
					virtualDom.style='display:none !important';
				}

				let downloadHtml = '';
				downloadOption.forEach(function(item){
					if(item.id=="toServer"){
						downloadHtml += `<div style="text-align:center;width:100px;" class="item ${item.id}" id="${item.id}${videoId}">AI视频分析<span style="color:red;">(热门)</span></div>`;
					}else{
						downloadHtml += `<div style="text-align:center;width:100px;" class="item ${item.id}" id="${item.id}${videoId}">${item.name}</div>`;
					}

				})

				if(downloadDom.querySelector('.virtual')){
					downloadDom.querySelector('.virtual').innerHTML = downloadHtml;
				}

				playClarityDom.after(downloadDom);

				//直接打开
				let toLinkDom = playContainer.querySelector('#toLink'+videoId);
				if(toLinkDom){
					toLinkDom.addEventListener('click',function(){
						if(url.match(/^blob/)){
							commonFunctionObject.webToast({"message":"加密视频无法直接打开。可复制分享链,重新打开页面使用“下载”", "background":"#141414"});
						}else{
							window.open(url);
						}
					})
				}

				let toAi = playContainer.querySelector('#toServer'+videoId);
				if(toAi){
					toAi.addEventListener('click',function(){
						window.open("https://www.quzhuanpan.com/redirect/d?t="+(new Date()).getTime()+"&url="+window.location.href);
					})
				}
			}
		}
		//抖音视频下载需要鼠标右键保存
		function player(){
			if(window.location.host.indexOf(".douyinvod.com")!=-1){
				var html=`<div style="position:fixed;left:15px;bottom:300px;background-color:#ccc;width:200px;font-size:14px;padding:5px;">
					<div style="color:red;font-weight:bold;">直接下载已经失效,需要在视频框点击:鼠标右键 ->视频另存为,然后保存视频</div>
					<div style="margin-top:15px;"># 纯纯的资源分享,需要的自取:<a target="_blank" href="https://www.quzhuanpan.com/redirect/pan?t=`+(new Date()).getTime()+`&url=`+window.location.href+`">点我查看【建议保存】</a></div>
					<div style="margin-top:15px;"># 效率工具,免费AI总结/摘要/改写/翻译,支持搜索学术文献一键阅读:<a target="_blank" href="https://www.quzhuanpan.com/redirect/d?t=`+(new Date()).getTime()+`&url=`+window.location.href+`">点我查看</a></div>
				</div>`;
				$("body").append(html);
			}
		}
		setInterval(function(){
			run();
		}, 500);
		player();
	};
	this.kuaishouVideoDownloader = function(){
		if(window.location.host !== "www.kuaishou.com"){
			return;
		}
		window.addEventListener('load',function(){
			async function downloader(){
				let kuaishouVideoDownloder = document.querySelector("#kuaishou-video-downloder");
				if(!kuaishouVideoDownloder){
					let downloadDIV = document.createElement("div");
					downloadDIV.style = "cursor:pointer;width:50px;height:40px;line-height:40px;text-align:center;background-color:#FFF;color:#000;position:fixed;top:200px;left:0px;z-index:999;";
					downloadDIV.innerText = "下载";
					downloadDIV.setAttribute('id','kuaishou-video-downloder');
					document.body.appendChild(downloadDIV);

					downloadDIV.addEventListener("click", function(e){
						let videoDom = document.querySelector('.player-video');
						if(!videoDom){
							console.log('没有找到DOM');
							return;
						}
						let videoSrc = videoDom.getAttribute('src');
						if(videoSrc.match(/^blob/)){
							console.log('blob视频无法下载');
							return;
						}
						commonFunctionObject.GMopenInTab(videoSrc);
					});
				}
			}
			document.querySelectorAll(".switch-item").forEach(function(value){
				value.addEventListener("click", function(){
					downloader();
				});
			})
			downloader();
			setInterval(function(){
				let kuaishouVideoDownloder = document.querySelector("#kuaishou-video-downloder");
				if(kuaishouVideoDownloder){
					if(window.location.href.match(/https:\/\/www\.kuaishou\.com\/short-video\/.*?/)){
						kuaishouVideoDownloder.style.display = "block";
					}else{
						kuaishouVideoDownloder.style.display = "none";
					}
				}
			}, 800);
		});
	};
	this.start = function(){
		this.douyinVideoDownloader();
		this.kuaishouVideoDownloader();
	};
};
try{
	if(!functionController || functionController.shortVideoDownload){
		(new ShortVideoDownloader()).start();
	}
}catch(e){
	console.log("短视频去水印下载:error:"+e);
}

})();