Greasy Fork is available in English.

脚本常用方法库

为其他脚本提供常用的方法集

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @require https://update.greasyfork.org/scripts/391004/880487/%E8%84%9A%E6%9C%AC%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95%E5%BA%93.js

// ==UserScript==
// @name         脚本常用方法库
// @namespace    http://www.itdomain.top/
// @version      0.3
// @description  为其他脚本提供常用的方法集
// @author       gwl
// ==/UserScript==

function GUtils() {
	let _this = this;
	this.http = new HttpUtil();
    this.addHtmlToBoty = function (html, pel) {
        pel = pel || document.body;
        let div = document.createElement("div");
        div.innerHTML = html;
        let els = [];
        for (let i = 0, length = div.children.length; i < length; i++) {
            els.push(div.children[i]);
            pel.appendChild(div.children[i]);
        }
        return els;
    };

    this.addCss = function (cssStr, pel) {
        pel = pel || document.body;
        let style = document.createElement("style");
        style.rel = "stylesheet";
        style.innerHTML = cssStr;
        pel.appendChild(style);
    };

    // {title:'', textTop:'', textBottom: '', callback: func}
    this.addBtns = function (name, btns, initX, initY) {
        if (document.getElementsByClassName('lyh-utils-wrap').length > 0) return;
		if(typeof initX == 'undefined') initX = '118px';
		if(typeof initY == 'undefined') initX = '110px';
        let btnHtml = ['<div class="lyh-utils-wrap lyh-bounceInUp lyh-animated" id="lyh-utils-wrap" style="top: '+initY+'; left: '+initX+';">'
            , '<label for="" class="lyh-menu" title="按住拖动">', name, '</label>'];
        btns.map((value, index) => {
            btnHtml.push('<a href="javascript:void(0)" title="' + value.title + '" data-cat="' +
                index + '" class="lyh-menu-item">' + value.textTop + '<br>' + value.textBottom + '</a>');
        });
        btnHtml.push('<style rel="stylesheet">body .lyh-utils-wrap{font-family:"Helvetica Neue",Helvetica,"Microsoft YaHei",Arial,sans-serif;font-size:1.6rem;color:#4e546b;position:fixed;width:70px;height:70px;top:350px;margin-top:77px;margin-left:77px;-ms-user-select:none;-moz-user-select:none;-webkit-user-select:none;user-select:none;opacity:.35;z-index:999999}.lyh-utils-wrap.lyh-show-btn{width:225px;height:225px;margin-top:0;margin-left:0}.lyh-utils-wrap .lyh-menu{position:absolute;width:70px;height:70px;-webkit-border-radius:50%;border-radius:50%;background:#1f1f1f;left:0;top:0;right:0;bottom:0;margin:auto;text-align:center;line-height:70px;color:#f7d877;font-size:20px;z-index:1;cursor:move}.lyh-utils-wrap .lyh-menu-item{position:absolute;width:60px;height:60px;background-color:black;left:0;top:0;right:0;bottom:0;margin:auto;text-align:center;-webkit-border-radius:50%;border-radius:50%;text-decoration:none;color:#f7d877;-webkit-transition:background .5s,-webkit-transform .6s;transition:background .5s,-webkit-transform .6s;-moz-transition:transform .6s,background .5s,-moz-transform .6s;transition:transform .6s,background .5s;transition:transform .6s,background .5s,-webkit-transform .6s,-moz-transform .6s;font-size:14px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:20px;padding-top:10px}.lyh-utils-wrap .lyh-menu-item:hover{background:#8e388e}.lyh-show-btn.lyh-utils-wrap,.lyh-test-body .lyh-utils-wrap{opacity:1}@-webkit-keyframes lyh-animated-jello{from,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@-moz-keyframes lyh-animated-jello{from,11.1%,to{-moz-transform:none;transform:none}22.2%{-moz-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-moz-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-moz-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-moz-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-moz-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-moz-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-moz-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes lyh-animated-jello{from,11.1%,to{-webkit-transform:none;-moz-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);-moz-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);-moz-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);-moz-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);-moz-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);-moz-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(0.390625deg) skewY(0.390625deg);-moz-transform:skewX(0.390625deg) skewY(0.390625deg);transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);-moz-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.lyh-animated{-webkit-animation-duration:1s;-moz-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes lyh-bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,800px,0);transform:translate3d(0,800px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-moz-keyframes lyh-bounceInUp{from,60%,75%,90%,to{-moz-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-moz-transform:translate3d(0,800px,0);transform:translate3d(0,800px,0)}60%{opacity:1;-moz-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-moz-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-moz-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes lyh-bounceInUp{from,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(0.215,.61,.355,1);-moz-animation-timing-function:cubic-bezier(0.215,.61,.355,1);animation-timing-function:cubic-bezier(0.215,.61,.355,1)}from{opacity:0;-webkit-transform:translate3d(0,800px,0);-moz-transform:translate3d(0,800px,0);transform:translate3d(0,800px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-moz-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);-moz-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);-moz-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.lyh-bounceInUp{-webkit-animation-name:lyh-bounceInUp;-moz-animation-name:lyh-bounceInUp;animation-name:lyh-bounceInUp;-webkit-animation-delay:1s;-moz-animation-delay:1s;animation-delay:1s}@media screen and (max-width:640px){}@media screen and (min-width:641px) and (max-width:1367px){.lyh-utils-wrap{top:50px}}.lyh-show-btn.lyh-utils-wrap .lyh-menu,.lyh-test-body .lyh-utils-wrap .lyh-menu{-webkit-animation:lyh-animated-jello 1s;-moz-animation:lyh-animated-jello 1s;animation:lyh-animated-jello 1s}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(1),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(1){-webkit-transform:translate3d(0,-135%,0);-moz-transform:translate3d(0,-135%,0);transform:translate3d(0,-135%,0)}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(2),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(2){-webkit-transform:translate3d(120%,-70%,0);-moz-transform:translate3d(120%,-70%,0);transform:translate3d(120%,-70%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(2),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(2){-webkit-transform:translate3d(120%,-135%,0);-moz-transform:translate3d(120%,-135%,0);transform:translate3d(120%,-135%,0)}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(3),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(3){-webkit-transform:translate3d(120%,70%,0);-moz-transform:translate3d(120%,70%,0);transform:translate3d(120%,70%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(3),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(3){-webkit-transform:translate3d(120%,0,0);-moz-transform:translate3d(120%,0,0);transform:translate3d(120%,0,0)}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(4),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(4){-webkit-transform:translate3d(0,135%,0);-moz-transform:translate3d(0,135%,0);transform:translate3d(0,135%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(4),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(4){-webkit-transform:translate3d(120%,135%,0);-moz-transform:translate3d(120%,135%,0);transform:translate3d(120%,135%,0)}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(5),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(5){-webkit-transform:translate3d(-120%,70%,0);-moz-transform:translate3d(-120%,70%,0);transform:translate3d(-120%,70%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(5),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(5){-webkit-transform:translate3d(0,135%,0);-moz-transform:translate3d(0,135%,0);transform:translate3d(0,135%,0)}.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(6),.lyh-test-body .lyh-utils-wrap .lyh-menu-item:nth-of-type(6){-webkit-transform:translate3d(-120%,-70%,0);-moz-transform:translate3d(-120%,-70%,0);transform:translate3d(-120%,-70%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(6),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(6){-webkit-transform:translate3d(-120%,135%,0);-moz-transform:translate3d(-120%,135%,0);transform:translate3d(-120%,135%,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(7),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(7){-webkit-transform:translate3d(-120%,0,0);-moz-transform:translate3d(-120%,0,0);transform:translate3d(-120%,0,0)}.lyh-menu-gt6.lyh-show-btn.lyh-utils-wrap .lyh-menu-item:nth-of-type(8),.lyh-test-body .lyh-menu-gt6.lyh-utils-wrap .lyh-menu-item:nth-of-type(8){-webkit-transform:translate3d(-120%,-135%,0);-moz-transform:translate3d(-120%,-135%,0);transform:translate3d(-120%,-135%,0)}</style>');
        btnHtml.push('</div>');
        let els = this.addHtmlToBoty(btnHtml.join(''));
        let asideNav = document.getElementById("lyh-utils-wrap");
        let asideMenu = asideNav.getElementsByClassName('lyh-menu')[0];
        let isLinstenerMousemove = false;

        function addMousemove() {
            if (isLinstenerMousemove) return;
            isLinstenerMousemove = true;
            asideNav.addEventListener("mousemove", mousemoveEv);
        }

        function removeMousemove() {
            if (!isLinstenerMousemove) return;
            isLinstenerMousemove = false;
            asideNav.removeEventListener("mousemove", mousemoveEv);
        }

        function mousemoveEv(ev) {
            asideNav.style.top = (ev.clientY - 112) + "px";
            asideNav.style.left = (ev.clientX - 112) + "px";
        }

        function showMenu() {
            //显示其他菜单
            if (!asideNav.classList || asideNav.classList.contains("lyh-show-btn")) return;
            asideNav.classList.add("lyh-show-btn");
        }

        function hideMenu(ev) {
            //隐藏其他菜单
            if (!ev.relatedTarget || !ev.relatedTarget.classList
                || ev.relatedTarget.classList.contains("lyh-menu-item")
                || ev.relatedTarget.classList.contains("lyh-utils-wrap")
                || ev.relatedTarget.classList.contains("lyh-menu")) {
                return;
            }
            asideNav.classList.remove("lyh-show-btn");
        }

        //lyh-menu-gt6
        asideMenu.addEventListener("mousedown", addMousemove);//当元素上按下鼠标按钮时触发。
        asideNav.addEventListener("mouseup", removeMousemove);//当在元素上释放鼠标按钮时触发。
        asideMenu.addEventListener("mouseover", showMenu);//当鼠标指针移动到元素上时触发。
        asideNav.addEventListener("mouseout", hideMenu);//当鼠标指针移出元素时触发。
        asideNav.addEventListener('click', (ev) => {
            if (!ev.srcElement || !ev.srcElement.classList
                || !ev.srcElement.classList.contains("lyh-menu-item")
                || !ev.srcElement.dataset || !ev.srcElement.dataset.cat) {
                return;
            }
            let config = btns[parseInt(ev.srcElement.dataset.cat)];
            if (!config || typeof config.callback != "function") return;
            asideNav.classList.remove("lyh-show-btn");//隐藏按钮
            setTimeout(() => {
                config.callback(ev);
            }, 100);
        });
        return els;
    };
	
	/**
	 * 创建线程
	 * */
	this.createWorker = function(jsStr){
		let tempJs = _this.http.constructor.toString();
		tempJs += _this.constructor.toString();
		tempJs += ' gUtils=new GUtils();';
		tempJs += jsStr;
		let url = URL.createObjectURL(new Blob([tempJs], {type : 'text/javascript'}));
		return new Worker(url);
	}
	
}
function HttpUtil() {
	let _this = this;
	
	this.post = async function(url, data, headers){
		let req = url;
		headers = headers || {'Content-Type': 'application/json'};
		if(typeof url != 'object') {
			req = {
				url, data
			}
		}
		req.method = 'POST';
		req.headers = req.headers || headers;
		return _this.sendAjaxByContent(req)
	}
	this.get = async function(url, data, headers){
		let req = url;
		headers = headers || {'Content-Type': 'application/x-www-form-urlencoded'};
		if(typeof url != 'object') {
			req = {
				url, data
			}
		}
		req.method = 'GET';
		req.headers = req.headers || headers;
		return _this.sendAjaxByContent(req)
	}
	
	/**
	 * 发送请求
	 * @param {Object} req {url, method, headers}
	 * */
	this.sendAjaxByContent = async function(req){
		let xhr = new XMLHttpRequest();
		req.headers = req.headers || {};
		req.headers['Content-Type'] = req.headers['Content-Type'] || req.headers['Content-type'] || req.headers['content-type'];
		if (req.files && Object.keys(req.files).length > 0) {
			req.headers['Content-Type'] = 'multipart/form-data'
		}
		xhr.timeout = req.timeout || 5000;
		req.method = req.method || 'GET';
		req.async = req.async === false ? false : true;
		if (req.method.toLowerCase()!=='get' && req.method.toLowerCase()!=='head'
			&& req.method.toLowerCase()!=='options') {
			if (!req.headers['Content-Type'] || req.headers['Content-Type'] == 'application/x-www-form-urlencoded') {
				req.headers['Content-Type'] = 'application/x-www-form-urlencoded';
				req.data = _this.formUrlencode(req.data);
			} else if (req.headers['Content-Type'] === 'multipart/form-data') {
				delete req.headers['Content-Type'];
			} else if (req.data && typeof req.data === 'object') {
				req.data = JSON.stringify(req.data);
			}
		} else {
			delete req.headers['Content-Type'];
		}
		if (req.query && typeof req.query === 'object') {
			let getUrl = _this.formUrlencode(req.query);
			if(req.url.indexOf('?') == -1) {
				req.url += '?' + getUrl;
			} else {
				req.url += '&' + getUrl;
			}
			req.query = '';
		}
		xhr.open(req.method, req.url, req.async);
		let response = {};
		if (req.headers) {
			let unsafeHeaderArr = [];
			for (let name in req.headers) {
				if(unsafeHeaderArr.indexOf(name) > -1){
					unsafeHeaderArr.push({
						name: name,
						value: req.headers[name]
					})
				}else{
					xhr.setRequestHeader(name, req.headers[name]);
				}		
			}
			if(unsafeHeaderArr.length > 0){
				xhr.setRequestHeader('cross-request-unsafe-headers-list', encode(unsafeHeaderArr));
			}
		}
		xhr.setRequestHeader('cross-request-open-sign', '1')
		return new Promise(function(resolve, reject){
			xhr.onload = function (e) {
				let headers = xhr.getAllResponseHeaders();
				headers = _this.handleHeader(headers);
				response = {
					headers: headers,
					status: xhr.status,
					statusText: xhr.statusText,
					body: xhr.responseText
				}
				if (xhr.status == 200) {
					resolve(response);
				} else {
					reject(response);
				}
			}
			xhr.onerror = function (e) {
				reject(e)
			}
			xhr.ontimeout = xhr.onerror
			xhr.upload.onprogress = function (e) {};
			try {
				xhr.send(req.data);
			} catch (error) {
				reject(error)
			}
		});
	}
	this.formUrlencode = function(data) {
	    if(!data || typeof data !== 'object') return ''
	    return Object.keys(data).map(function (key) {
	        return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]);
	    }).join('&')
	}
	this.handleHeader = function(headers) {
	    if (!headers) return;
	    if (typeof headers === 'object') {
	        return headers;
	    }
	    let newHeaders = {};
		headers = headers.split(/[\r\n]/).forEach(function (header) {
	        let index = header.indexOf(":");
	        let name = header.substr(0, index);
	        let value = header.substr(index + 2);
	        if (name) {
	            newHeaders[name] = value;
	        }
	
	    })
	    return newHeaders;
	}
}
window.gUtils = new GUtils();