LEORChn-Helper

DO NOT TRUST - Dynamic link library for permission elevation at leorchn.github.io

// ==UserScript==
// @name              LEORChn-Helper
// @name:zh-CN        瑞兽谷辅助脚本
// @description       DO NOT TRUST - Dynamic link library for permission elevation at leorchn.github.io
// @description:zh-CN 请 勿 安 装!- 瑞兽谷扩展功能包,用于提权实现相应功能。
// @include           https://leorchn.github.io/workshop/*
// @include           https://127.0.0.1:1101/workshop/*
// @include           https://127.0.0.1:81/workshop/*
// @namespace         https://greasyfork.org/users/159546
// @version           1.0
// @author            LEORChn
// @run-at            document-end
// @grant             GM_xmlhttpRequest

// @connect           gateway.live-a-hero.jp
// @connect           raw.githubusercontent.com
// @connect           d1itvxfdul6wxg.cloudfront.net

// @connect           baidu.com
// @connect           bilibili.com

// ==/UserScript==

unsafeWindow['http'] = http;
unsafeWindow['httpj'] = httpj;
try{
    unsafeWindow.onHelperMain();
}catch(e){}

function http(){
    var args = Array.prototype.slice.call(arguments);
    if(args.length == 1 && args[0] instanceof Array) args = args[0];
    var pointer = 0,
		method, url, headers, formdata, dofun, dofail, onprogress,
        responseType = '';
	args.forEach(function(e){
		switch(pointer){
			case 0:
				e = e.split(' ', 2); // 允许在第一个参数中用空格将 http-method 与 url 隔开,而省去 引号+逗号+引号 的麻烦
				method = e[0].toUpperCase();
				if(e.length > 1){
					pointer++; // 偏移到下一个
					e = e[1];
				}else break;
			case 1: url = e; break;
            case 2:
            case 3:
				if(e instanceof Function){ // 允许不添加 http-body 而直接撰写行为。
					pointer = 4; // 偏移到function
				}else{
                    if(pointer == 2)
                        headers = e;
                    else if(pointer == 3)
                        formdata = e;
					break;
				}
            case 4:
                if(e.name == 'ArrayBuffer'){
                    responseType = 'arraybuffer';
                    break;
                }else pointer++;
			case 5: dofun = e; break;
			case 6: dofail = e; break;
			case 7: onprogress = e;
		}
		pointer++;
	});
    console.log('%c'+method+' '+url+(headers? '\n'+headers: '')+(formdata? '\n\n'+formdata: ''), 'color:#ccc');
    GM_xmlhttpRequest({
        method: method,
        url: url,
        data: formdata,
        headers: getHeaders(headers),
        responseType: responseType,
        onload: dofun,
        onerror: dofail
    });
}
function pl(s){console.log(s);}
function httpj(){
    var args = Array.prototype.slice.call(arguments);
    var originFunction;
    for(var i=0; i<args.length; i++){
        if(!(args[i] instanceof Function)) continue;
        originFunction = args[i];
        args[i] = function(){
            var j,
				stat = this.status,
                resp = this.responseText;
            try{
                j = JSON.parse(resp || '{}');
            }catch(e){console.debug('json cannot parse?\n' + j);}
            if(Array.isArray(j)) // JSON Array
				j = { httpstat:stat, data:j }
			else if(j instanceof Object) // JSON Object
				j.httpstat = stat;
			else // Nothing, text/plain
				j = { httpstat:stat, data:resp }
            originFunction(j);
        };
        break;
    }
    http(args);
}
function getHeaders(t){
    var obj = {};
    if(!t) return obj;
    t.split('\n').forEach(function(e){
        var res, reg = /\s*(\S+)\s*:\s*(.*)/;
        if((res = reg.exec(e)) == null) return;
        obj[res[1]] = res[2];
    });
    return obj;
}