Greasy Fork is available in English.

慕课题目搜搜搜

超星慕课题库聚合查询小工具,【快捷查询】【高级搜索模式】【OCR识别】

// ==UserScript==
// @name         慕课题目搜搜搜
// @namespace    http://tampermonkey.net/
// @version      1.5.4
// @description   超星慕课题库聚合查询小工具,【快捷查询】【高级搜索模式】【OCR识别】
// @author       Onion
// @match     https://www.icourse163.org/*
// @match     https://i.chaoxing.com/*
// @match     https://mooc2-ans.chaoxing.com/*
// @match     https://mooc1.chaoxing.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=icourse163.org
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @connect    cx.icodef.com
// @connect    huawei-cdn.lyck6.cn
// @connect    tk.enncy.cn
// @connect    web.baimiaoapp.com
// @connect    lyck6.cn
// @connect    cx.gocos.cn
// @connect    api.muketool.com
// @connect    43.143.249.139
// @run-at       document-start
// @license      MPL2.0
// ==/UserScript==
function mainTop() {

    'use strict';
    /////////全/////////局/////////变/////////量
    var ocrToken = new Object()
    var requestDst = new Array()
    var GM_abort = new Array()
    let ocrSumResults = ""
    let isCtrl=false
    let isAdvanced=false
    const document = unsafeWindow.document;
    const window = unsafeWindow

    //////////【配////////置////////区】//////////////
    var yzggToken = `ddMyyyPEhfHSzQBy`
    var enncyToken = ``
    ocrToken.cookie = ``
    ocrToken.xauthToken = ``
    ocrToken.xauthUuid = ``
    requestDst = [
        "cx.icodef.com",//yzgg
        "huawei-cdn.lyck6.cn",//万能1
        "lyck6.cn",//万能2
        "tk.enncy.cn",//enncy
        "cx.gocos.cn",//Ne-21
        "api.muketool.com",//山楂树1
        "api2.muketool.com",//山楂树2
        "43.143.249.139",//蛋炒饭
    ]
    //////【题/////////目/////////配////////置/////////区】//////
    let formedQues = ""
    let quesType = 0 //0:单选题 (必填) 1:多选题 2:判断题 (int)
    let quesWorkType = "zj" //zj:章节测验 zy:作业 ks:考试
    let quesOptions = new Array()
    let quesSrc = "https://mooc1.chaoxing.com/mycourse/studentstudy?chapterId=636516658&courseId=227751756&clazzid=61817745&cpi=169857532&enc=6431fbd689555ba100515caefc783235&mooc2=1&openc=0737a9a35dcb1f96af6ce927f5cdd739"
    quesOptions = [
        "发展生产力",
        "以经济建设为中心",
        "走向共同富裕",
        "全面建成小康社会"
    ]

    ///////////开///////////源///////////区////////////
    let namespaceURL = [
        "https://greasyfork.org/zh-CN/scripts/451356-%E4%B8%87%E8%83%BD-%E5%85%A8%E5%B9%B3%E5%8F%B0%E8%87%AA%E5%8A%A8%E7%AD%94%E9%A2%98%E8%84%9A%E6%9C%AC",
        "https://afdian.net/a/enncy",
        "https://scriptcat.org/",
        "https://scriptcat.org/script-show-page/10",
        "https://scriptcat.org/script-show-page/639",
        "https://greasyfork.org/zh-CN/scripts/450614-%E5%85%A8%E5%B9%B3%E5%8F%B0%E8%87%AA%E5%8A%A8%E7%AD%94%E9%A2%98%E8%84%9A%E6%9C%AC-%E8%B6%85%E6%98%9F%E5%AD%A6%E4%B9%A0%E9%80%9A-%E6%99%BA%E6%85%A7%E6%A0%91-%E6%89%A7%E6%95%99%E4%BA%91-%E6%9B%B4%E6%96%B02022-11-09",
        "https://greasyfork.org/zh-CN/scripts/455607-%E8%B6%85%E6%98%9F%E5%AD%A6%E4%B9%A0%E9%80%9A%E5%B0%8F%E5%8A%A9%E6%89%8B-%E7%AD%94%E9%A2%98%E4%B8%93%E7%89%88/code",

    ]
    ////////////外//////////部//////////资///////源//////区////////////
    /*
// @require    https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.production.min.js
// @require    https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js
// @require    https://unpkg.com/babel-standalone@6.26.0/babel.min.js
    @react
*/
    function importReact() {
        return new Promise((resolve) => {
            let scriptReact = document.createElement('script');
            scriptReact.setAttribute('type', 'text/javascript');
            scriptReact.src = "https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.production.min.js";
            document.documentElement.appendChild(scriptReact);
            let scriptReactDom = document.createElement('script');
            scriptReactDom.setAttribute('type', 'text/javascript');
            scriptReactDom.src = "https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js";
            document.documentElement.appendChild(scriptReactDom);
            resolve("import end")
        })
    }
    /*
    @react
    */
    /*
    babel

    let babelScript = document.createElement('script');
    babelScript.setAttribute('type', 'text/javascript');
    babelScript.src = "https://unpkg.com/babel-standalone@6.26.0/babel.min.js";
    document.documentElement.appendChild(babelScript);
    /*
    babel
    */

    ////////////////////////////////////////////////////////////////////////////


    if (window.location.href.indexOf(".") > -1) {
        addBothStyle()
    }
    if (window.location.href.indexOf("www.icourse163.org") > -1) {
        createBox()
            .then((divE) => {
            return appendBox(0, divE)
        }).then(() => {
            //do Sth
        }).then(() => {
            //babelJsxAndRun()
            //   createBoxReact()  页面重写了React和Babel原型,先暂时使用原生添加,后续再来解决React冲突
            initBox()
            addBoxEvent()
            addMoveEvent()
            appendQuesEvent()
            addSearchEvent()
            pic2WordsEvent()
            keyEvent()
        })
    }
    if (window.location.href.indexOf("i.chaoxing.com/base") > -1) {
        doItBoth()
    }
    if (window.location.href.indexOf("mooc1.chaoxing.com/mycourse/studentstudy") > -1) {
        doItBoth()
    }
    function doItBoth() {
        importReact().then(() => {
            sleep(30).then(() => {
                createBox()
                    .then((divE) => {
                    return appendBox(0, divE)
                }).then(() => {
                    //
                }).then(() => {
                    //babelJsxAndRun()
                    createBoxReact()
                    initBox()
                    addBoxEvent()
                    addMoveEvent()
                    appendQuesEvent()
                    addSearchEvent()
                    pic2WordsEvent()
                    keyEvent()
                })
            })
        })
    }
    function createBoxJsx() {
        return `
        ReactDOM.render(<div>
  <div id="gptInputBox">
    <textarea id="gptInput" type="text" defaultValue={""} />
    <button id="button_GPT">搜一下</button>
  </div>
  <div id="gptCueBox">
    <div id="gptAnswer" className="markdown-body">
      <div id="gptAnswer_inner">慕课题目搜搜搜v1.5.4已启动</div>
      <div id="loadingBox">
        加载中
        <span className="dot" />
      </div>
      <div id="loadingBoxImg">
        图片转文字中,请稍等
        <span className="dot" />
      </div>
    </div>
  </div>
  <div id="gptSettingBox">
    <div id="moveIt">
      <svg
        t={1671455942102}
        className="icon"
        viewBox="0 0 1024 1024"
        version="1.1"
        xmlns="http://www.w3.org/2000/svg"
        p-id={2728}
        width={200}
        height={200}
      >
        <path
          d="M486.4 776.533333v-213.333333H247.466667v106.666667L85.333333 512l162.133334-162.133333V512h238.933333V247.466667H349.866667L512 85.333333l162.133333 162.133334h-132.266666V512h238.933333V349.866667L938.666667 512l-162.133334 162.133333v-106.666666h-238.933333v213.333333h132.266667L512 938.666667l-162.133333-162.133334h136.533333z"
          p-id={2729}
        />
      </svg>
    </div>
    <div id="spreadOrShrink">⇥</div>
  </div>
</div>, document.getElementById('gptDiv'))
`
    }
    function babelJsxAndRun() {
        let { code } = window.Babel.transform(createBoxJsx(), { presets: ['es2015', 'react'] });
        let functionReactJsx = new Function(code)
        functionReactJsx()
    }
    function createBoxReact() {
        return new Promise((resolve) => {
            ReactDOM.render( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
                id: "gptInputBox"
            }, /*#__PURE__*/React.createElement("textarea", {
                id: "gptInput",
                type: "text",
                defaultValue: ""
            }), /*#__PURE__*/React.createElement("button", {
                id: "button_GPT"
            }, "\u641C\u4E00\u4E0B")), /*#__PURE__*/React.createElement("div", {
                id: "gptCueBox"
            }, /*#__PURE__*/React.createElement("div", {
                id: "gptAnswer",
                className: "markdown-body"
            }, /*#__PURE__*/React.createElement("div", {
                id: "gptAnswer_inner"
            }, "\u6155\u8BFE\u9898\u76EE\u641C\u641C\u641Cv1.2.1\u5DF2\u542F\u52A8"), /*#__PURE__*/React.createElement("div", {
                id: "loadingBox"
            }, "\u52A0\u8F7D\u4E2D", /*#__PURE__*/React.createElement("span", {
                className: "dot"
            })), /*#__PURE__*/React.createElement("div", {
                id: "loadingBoxImg"
            }, "\u56FE\u7247\u8F6C\u6587\u5B57\u4E2D,\u8BF7\u7A0D\u7B49", /*#__PURE__*/React.createElement("span", {
                className: "dot"
            })))), /*#__PURE__*/React.createElement("div", {
                id: "gptSettingBox"
            }, /*#__PURE__*/React.createElement("div", {
                id: "moveIt"
            }, /*#__PURE__*/React.createElement("svg", {
                t: 1671455942102,
                className: "icon",
                viewBox: "0 0 1024 1024",
                version: "1.1",
                xmlns: "http://www.w3.org/2000/svg",
                "p-id": 2728,
                width: 200,
                height: 200
            }, /*#__PURE__*/React.createElement("path", {
                d: "M486.4 776.533333v-213.333333H247.466667v106.666667L85.333333 512l162.133334-162.133333V512h238.933333V247.466667H349.866667L512 85.333333l162.133333 162.133334h-132.266666V512h238.933333V349.866667L938.666667 512l-162.133334 162.133333v-106.666666h-238.933333v213.333333h132.266667L512 938.666667l-162.133333-162.133334h136.533333z",
                "p-id": 2729
            }))), /*#__PURE__*/React.createElement("div", {
                id: "spreadOrShrink"
            }, "\u21E5"))), document.getElementById('gptDiv'));
            //ReactDOM.render( /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h2", null, "Hello World")), document.getElementById('gptDiv'));
            resolve("createEnded")
        })
    }
    /*
                <div id="gptInputBox">
                   <textarea id="gptInput" type=text></textarea>
                   <button id="button_GPT">搜一下</button>
                </div>
                <div id=gptCueBox>
                    <div id="gptAnswer" class="markdown-body">
                        <div id="gptAnswer_inner">慕课题目搜搜搜v1.2.1已启动</div>
                        <div id="loadingBox">加载中<span class="dot"></span></div>
                        <div id="loadingBoxImg">图片转文字中,请稍等<span class="dot"></span></div>
                    </div>
                </div>
                <div id="gptSettingBox">
                    <div id="moveIt"><svg t="1671455942102" class="icon" viewBox="0 0 1024 1024" version="1.1"
                            xmlns="http://www.w3.org/2000/svg" p-id="2728" width="200" height="200">
                            <path
                                d="M486.4 776.533333v-213.333333H247.466667v106.666667L85.333333 512l162.133334-162.133333V512h238.933333V247.466667H349.866667L512 85.333333l162.133333 162.133334h-132.266666V512h238.933333V349.866667L938.666667 512l-162.133334 162.133333v-106.666666h-238.933333v213.333333h132.266667L512 938.666667l-162.133333-162.133334h136.533333z"
                                p-id="2729"></path>
                        </svg></div>
                    <div id="spreadOrShrink">⇥</div>
                </div>
*/

    function createBox() {
        return new Promise((resolve) => {
            var divE = document.createElement('div');
            var divId = document.createAttribute("id"); //创建属性
            divId.value = 'gptDiv'; //设置属性值
            divE.setAttributeNode(divId); //给div添加属性
            divE.innerHTML = `
            <div id="gptInputBox">
            <textarea id="gptInput" type=text></textarea>
            <button id="button_GPT">搜一下</button>
         </div>
         <div id=gptCueBox>
             <div id="gptAnswer" class="markdown-body">
                 <div id="gptAnswer_inner">慕课题目搜搜搜v1.2.1已启动</div>
                 <div id="loadingBox">加载中<span class="dot"></span></div>
                 <div id="loadingBoxImg">图片转文字中,请稍等<span class="dot"></span></div>
             </div>
         </div>
         <div id="gptSettingBox">
             <div id="moveIt"><svg t="1671455942102" class="icon" viewBox="0 0 1024 1024" version="1.1"
                     xmlns="http://www.w3.org/2000/svg" p-id="2728" width="200" height="200">
                     <path
                         d="M486.4 776.533333v-213.333333H247.466667v106.666667L85.333333 512l162.133334-162.133333V512h238.933333V247.466667H349.866667L512 85.333333l162.133333 162.133334h-132.266666V512h238.933333V349.866667L938.666667 512l-162.133334 162.133333v-106.666666h-238.933333v213.333333h132.266667L512 938.666667l-162.133333-162.133334h136.533333z"
                         p-id="2729"></path>
                 </svg></div>
             <div id="spreadOrShrink">⇥</div>
         </div>`
            resolve(divE)
        })
    }
    async function pivElemAddEventAndValue(append_case) {
        var search_content
        if (append_case === 3) {
            search_content = document.getElementById('q').value
        }
        if (append_case === 2) {
            search_content = document.getElementById('kw').value
        }
        if (append_case === 1) {
            search_content = document.querySelector("#tsf > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input:nth-child(3)").value
        }
        if (append_case === 0) {
            search_content = document.getElementsByClassName('b_searchbox')[0].value
        }
        document.getElementById("gptInput").value = search_content
        document.getElementById('button_GPT').addEventListener('click', () => {
            your_qus = document.getElementById("gptInput").value
            do_it()

        })
    }
    async function appendBox(append_case, divE) {
        return new Promise((resolve, reject) => {
            switch (append_case) {
                case 0: //bing
                    if (divE) {
                        document.body.prepend(divE)
                    }
                    break;
                case 1://google
                    if (document.getElementsByClassName('TQc1id ')[0]) {
                        document.getElementsByClassName('TQc1id ')[0].prepend(divE);
                    }
                    else {
                        document.getElementById("rcnt").appendChild(divE);
                    }
                    break;
                default:
                    if (divE) {
                        console.log(`啥情况${divE}`)
                    }
            }
            resolve("finished")
        })
    }
    function addBothStyle() {
        GM_addStyle(`
     b{
     font-weight: bold;
     }
     #moveIt{
     justify-content: right;
     display: flex;
     cursor: move;
}
 .icon{
     width: 100%;
     height: 100%;
}
 #gptSettingBox{
     display: flex;
     flex-direction: row;
     width: 8%;
}
 #spreadOrShrink{
     justify-content: space-evenly;
     display: flex;
     align-items: center;
     border: solid;
     border-top: none;
     border-bottom: none;
     caret-color: transparent;
}
 #gptAnswer{
     margin: 4px;
     border-top: solid;
     border-bottom: solid;
    height: fit-content;
    overflow-y: auto;
    align-items: center;
      text-align: center;
}
 #gptInput{
     width: 81%;
     border-radius: 4px;
     border: solid;
     resize: vertical;
}
 #gptInputBox{
     display: flex;
     justify-content: space-around;
}
 #button_GPT:hover{
     background:#ffffffcc;
}
 #gptDiv{
     border-radius: 8px;
     padding: 10px;
     margin-bottom: 9px;
     width:452px;
     translate:-20px;
     background:#ffffffcc;
     display: flex;
     flex-direction: row;
     position: fixed;
     top: 80px;
     border: solid;
     right: 51px;
     z-index: 9999;
     background: white;
     color: black;
     transition: all 0.5s ease 0s;
}
 #button_GPT{
}
 #button_GPT{
     background: transparent;
     border-radius: 3px;
}
 #gptCueBox{
      width: 68%;
}
 #gptAnswer_inner{

 }
/*dots*/
  .dot{
    height: 4px;
    width: 4px;
    display: inline-block;
    border-radius: 2px;
    animation: dotting 2.4s  infinite step-start;
}
  @keyframes dotting {
    25%{
        box-shadow: 4px 0 0 #71777D;
    }
    50%{
        box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D;
    }
    75%{
        box-shadow: 4px 0 0 #71777D ,14px 0 0 #71777D, 24px 0 0 #71777D;
    }
}
    `)
    }
    function addBoxEvent() {
        if (getCookie("isShrink") == "") {
            setCookie("isShrink", 0, 30)
        }
        else {
            document.getElementById('spreadOrShrink').addEventListener("click", () => {
                if (getCookie("isShrink") == 0) {
                    document.getElementById('gptInputBox').style.display = "none"
                    document.getElementById('gptCueBox').style.display = "none"
                    document.getElementById('gptDiv').style.width = "1.5vh"
                    document.getElementById('spreadOrShrink').innerHTML = "\u21e4"
                    setCookie("isShrink", 1, 30)
                }
                else {
                    document.getElementById('gptInputBox').style.display = "flex"
                    document.getElementById('gptCueBox').style.display = "block"
                    document.getElementById('gptDiv').style.width = "452px"
                    document.getElementById('spreadOrShrink').innerHTML = "\u21e5"
                    setCookie("isShrink", 0, 30)
                }
            })
        }
    }
    function controlBoxDisplay(id, way) {
        document.getElementById(`${id}`).style.display = `${way}`
    }
    function initBox() {
        if (getCookie("isShrink") == 0) {
            document.getElementById('gptInputBox').style.display = "flex"
            document.getElementById('gptCueBox').style.display = "block"
            document.getElementById('gptDiv').style.width = "452px"
            document.getElementById('spreadOrShrink').innerHTML = "\u21e5"
        }
        else {
            document.getElementById('gptInputBox').style.display = "none"
            document.getElementById('gptCueBox').style.display = "none"
            document.getElementById('gptDiv').style.width = "1.5vh"
            document.getElementById('spreadOrShrink').innerHTML = "\u21e4"
        }
        controlBoxDisplay("loadingBox", "none")//默认不展示
        controlBoxDisplay("loadingBoxImg", "none")//默认不展示
    }
    function setCookie(cname, cvalue, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
        var expires = "expires=" + d.toGMTString();
        document.cookie = cname + "=" + cvalue + "; " + expires;
    }
    //原生cookie函数
    function getCookieObject() {
        let cookieString = document.cookie;
        cookieString = cookieString.substring(0, cookieString.length - 1);
        let tempCookieArray = cookieString.split('; ');

        let cookieObject = {}; // 存放 cookie 键值对

        tempCookieArray.forEach(item => {
            let name = item.substring(0, item.indexOf('='));
            let value = item.substring(item.indexOf('=') + 1);
            value = decodeURIComponent(value); // 还原字符串
            cookieObject[name] = value; // 将键值插入中这个对象中
        });

        return cookieObject // 返回包含 cookie 键值对的对象
    }
    function getCookie(cname) {
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i].trim();
            if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
        }
        return "";
    }
    function moveIt(controlEle, movedEle) {
        //var demo = document.getElementById(`${settings}`)
        var canitmove = false
        var x = 0,
            y = 0
        controlEle.onmousedown = function (e) {
            e.preventDefault()
            x = e.pageX - movedEle.offsetLeft
            y = e.pageY - movedEle.offsetTop
            canitmove = true
            document.getElementById("gptDiv").style.transition = "none"
            //  console.log(e.pageX)
        }
        controlEle.onmouseup = function (e) {
            e.preventDefault()
            x = e.pageX - movedEle.offsetLeft
            y = e.pageY - movedEle.offsetTop
            canitmove = false
            document.getElementById("gptDiv").style.transition = "all 0.5s ease 0s"
            //  console.log(movedEle.offsetLeft)
            console.log(e.pageX)
        }
        window.onmouseup = function () {
            canitmove = false
        }
        window.onmousemove = function (e) {

            if (canitmove) {
                movedEle.style.left = e.pageX - x + 'px'
                movedEle.style.top = e.pageY - y + 'px'
            }
        }
    }
    function addMoveEvent() {
        moveIt(document.getElementById('moveIt'), document.getElementById('gptDiv'))
    }

    //搜题部分
    function getRawQues(){
        return document.getElementById('gptInput').value.trim().replace(/(\s)|(\\n)/g, "")
    }
    function getQues() {
        if (getRawQues().match(/\[.+\]/g)) {
            return getRawQues().match(/(?<=\[).*?(?=\])/g)[0]
        }else{
            return getRawQues()
        }
    }
    function getFullQues() {
        if (getRawQues().match(/\[.+\]/g)) {
            formedQues = getRawQues().match(/(?<=\[).*?(?=\])/g)[0]
            quesOptions[0] = getRawQues().match(/(?<=\[).*?(?=\])/g)[1]
            quesOptions[1] = getRawQues().match(/(?<=\[).*?(?=\])/g)[2]
            quesOptions[2] = getRawQues().match(/(?<=\[).*?(?=\])/g)[3]
            quesOptions[3] = getRawQues().match(/(?<=\[).*?(?=\])/g)[4]
            return true
        }
    }
    function appendQuesEvent() {
        document.addEventListener("mouseup", () => {
            if (unsafeWindow.getSelection().toString().replace(/(\s)|(\\n)/g, "") !== "" && !isActive("gptInput")&&isCtrl) {
                document.getElementById('gptInput').value = unsafeWindow.getSelection().toString().replace(/(\s)|(\\n)/g, "")
            }
            else if(isAdvanced){
                document.getElementById('gptInput').value +=`[${unsafeWindow.getSelection().toString().replace(/(\s)|(\\n)/g, "")}]\n`
            }
        });
    }
    function getAllAnswer() {
        if (getQues() !== "") {
            controlBoxDisplay("loadingBox", "block")
            log(``)
            getAnswer(1)
                .then(() => {
                return getAnswer(0)
            })
                .then(() => {
                return getAnswer(3)
            })
                .then(() => {
                return getAnswer(4)
            })
                .then(() => {
                if (enncyToken !== "") {
                    return getAnswer(2)
                }
            })
                .then(() => {
                if (getFullQues()) {
                    getFullQues()
                    return getAnswer(5)
                }
            })
                .then(() => {
                controlBoxDisplay("loadingBox", "none")
                console.log("finished");
            })
                .catch((err) => {
                log(err)
            })
        }
        else {
            document.getElementById('gptAnswer_inner').innerHTML = `<div>搜索内容不能为空</div>`
        }
    }
    function getAnswer(chooseCase) {
        return new Promise((resolve) => {
            if (document.getElementById('gptInput').value !== "") {
                switch (chooseCase) {
                    case 0:
                        GM_abort[0] = GM_xmlhttpRequest({
                            method: "POST",
                            url: `https://${requestDst[0]}/wyn-nb`,
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                                Authorization: `${yzggToken}`,
                            },
                            data: `question=${getQues()}`,
                            onloadend: function (data) {
                                try {
                                    let parsedAnswer = JSON.parse(data.response).data
                                    resolve(data.response)
                                    if (parsedAnswer.match(/http.+/g)) {
                                        logAdd(`<br><b>一之哥哥</b>:<img src="${parsedAnswer}" alt="">`)
                                    }
                                    else if(parsedAnswer.match(/#+/g)){
                                        logAdd(`<br><b>一之哥哥(多选)</b>:<br>`)
                                        parsedAnswer.split("#").forEach((ele,index)=>{logAdd(`<b>${index+1}</b>:${ele}<br>`)})
                                    }
                                    else {
                                        logAdd(`<br><b>一之哥哥</b>:${parsedAnswer}<br>`)
                                    }
                                } catch (err) {
                                    logAdd(`<br><b>一之哥哥err</b>:${err}`)
                                }
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    case 1:
                        GM_abort[1] = GM_xmlhttpRequest({
                            method: "POST",
                            url: `http://${requestDst[1]}/api/autoFreeAnswer`,
                            headers: {
                                "Content-Type": "application/json",
                            },
                            data: `{"question": "${getQues()}"}`,
                            onloadend: function (data) {
                                try {
                                    console.log(data.response)
                                    if (JSON.parse(data.response).code !== 200) {
                                        logAdd(`<b>【万能】全平台</b>:${JSON.parse(data.response).msg}<br>`)
                                    }
                                    else {
                                        let allAns = ""
                                        for (let i = 0; i <= 2; i++) {
                                            allAns += `<b>${i}</b>:${JSON.parse(data.response).data.list[i]}\n\n`
                                        }
                                        logAdd(`<b>【万能】全平台</b>:${allAns}<br>`)
                                    }
                                } catch (err) {
                                    logAdd(`<b>【万能】全平台</b>:点的太快了gg,再试一次;<br><b>错误信息</b>:"${err}"<br>`)
                                }
                                resolve(data.response)
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    case 2:
                        GM_abort[2] = GM_xmlhttpRequest({
                            method: "GET",
                            url: `https://${requestDst[3]}/query?title=${getQues()}&token=${enncyToken}`,
                            headers: {
                                "Content-Type": "application/json",
                            },
                            onloadend: function (data) {
                                try {
                                    logAdd(`<br><b>enncy题库</b>:${JSON.parse(data.response).data.answer}<br>`)
                                } catch (err) {
                                    logAdd(`<br><b>enncyERR</b>:${err}<br>`);
                                }
                                resolve(data.response)
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    case 3:
                        GM_abort[3] = GM_xmlhttpRequest({
                            method: "POST",
                            url: `https://${requestDst[4]}/api/v1/cx?v=1.7.8`,
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                            },
                            data: `question=${getQues()}`,
                            onloadend: function (data) {
                                try {
                                    if (JSON.parse(data.response).data.answer == "") {
                                        logAdd(`<br><b>Ne-21题库</b>:${JSON.parse(data.response).msg}<br>`)
                                    }
                                    else {
                                        logAdd(`<br><b>Ne-21题库</b>:${JSON.parse(data.response).data.answer}<br>`)
                                    }
                                } catch (err) {
                                    logAdd(`<br><b>Ne-21题库ERR</b>:${err}<br>`);
                                }
                                resolve(data.response)
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    case 4:
                        GM_abort[4] = GM_xmlhttpRequest({
                            method: "POST",
                            url: `http://${requestDst[5]}/v1/cx`,
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                            },
                            data: 'question=' + encodeURIComponent(getQues()) + '&script=v1cx',
                            onloadend: function (res) {
                                try {
                                    if (JSON.parse(res.response).code) {
                                        logAdd(`<br><b>山楂树题库</b>:${JSON.parse(res.response).data}<br>`)
                                    }
                                    else {
                                        logAdd(`<br><b>山楂树题库(failed)</b>:${JSON.parse(res.response).data}<br>`)
                                    }
                                } catch (err) {
                                    logAdd(`<br><b>山楂树题库ERR</b>:${err}<br>`);
                                }
                                resolve(res.response)
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    case 5:
                        GM_abort[5] = GM_xmlhttpRequest({
                            method: "POST",
                            url: `http://${requestDst[7]}/answer?z=${quesWorkType}&t=${quesType}`,
                            headers: {
                                "Content-Type": "application/json",
                                "v": "1.4.3",
                                "referer": `${quesSrc}`
                            },
                            data: `
                            {
                                "question":"${formedQues}",
                                "options":[
                                    "${quesOptions[0]}",
                                    "${quesOptions[1]}",
                                    "${quesOptions[2]}",
                                    "${quesOptions[3]}"
                                ],
                                "type":"${quesType}",
                                "questionData":"",
                                "workType":"${quesWorkType}"
                            }
                            `,
                            onloadend: function (res) {
                                try {
                                    console.log(res.response)
                                    if (JSON.parse(res.response).code == 200) {
                                        logAdd(`<br><b>蛋炒饭</b>:${JSON.parse(res.response).data.answer[0]}<br>`)
                                    }
                                    else if (JSON.parse(res.response).code == -1) {
                                        logAdd(`<br><b>蛋炒饭</b>:${JSON.parse(res.response).msg}<br>`)
                                    }
                                } catch (err) {
                                    logAdd(`<br><b>蛋炒饭题库ERR</b>:${err}<br>`);
                                }
                                resolve(res.response)
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })
                        break;
                    default:
                        GM_abort[5] = GM_xmlhttpRequest({
                            method: "POST",
                            url: "https://cx.icodef.com/wyn-nb",
                            headers: {
                                "Content-Type": "application/x-www-form-urlencoded",
                                Authorization: `${yzggToken}`,
                            },
                            data: `question=${getQues()}`,
                            onloadend: function (data) {
                                document.getElementById('gptAnswer').innerHTML = JSON.parse(data.response).data
                            },
                            onerror: function (err) {
                                throw new Error('Error while executing the code');
                            },
                            ontimeout: function (err) {
                                throw new Error('Error while executing the code');
                            }
                        })

                }
            }
            else {
                document.getElementById('gptAnswer_inner').innerHTML = `<div>搜索内容不能为空</div>`
            }
        })




    }
    function pic2WordsEvent() {
        document.getElementById('gptInput').addEventListener('paste', (e) => {
            pic2base64(e).then((base64data) => {
                if (base64data) {
                    if (!ocrToken.xauthToken || !ocrToken.xauthUuid || !ocrToken.cookie) {
                        log(`你妹有白描cookie(悲<br><a href="https://web.baimiaoapp.com/">点我去白描官网买</a>`)
                    }
                    else {
                        console.log(base64data.toString());
                        log(`尊贵的白描黄金VIP,欢迎`)
                        controlBoxDisplay("loadingBoxImg", "block")
                        sendOcrMode()
                            .then((sendOcrModeRes) => {
                            console.log(sendOcrModeRes);
                            return sendOcrData(JSON.parse(sendOcrModeRes).data.token, base64data)
                        })
                            .then((sendOcrDataRes) => {
                            // console.log(JSON.parse(sendOcrDataRes).data.jobStatusId);
                            return JSON.parse(sendOcrDataRes).data.jobStatusId
                        })
                            .then((jobStatusId) => {
                            console.log(jobStatusId);
                            sleep(2500).then(() => {
                                getOcrResults(jobStatusId)
                                    .then((finalRes) => {
                                    console.log(finalRes)
                                    if (JSON.parse(finalRes).code === 1) {
                                        for (let i = 0; i <= JSON.parse(finalRes).data.ydResp.data.lines.length - 1; i++) {
                                            ocrSumResults += JSON.parse(finalRes).data.ydResp.data.lines[i].text
                                        }
                                    }
                                    else {
                                        logAdd(`<br>emmm,网络有点卡,再试一次吧!`)
                                        return JSON.parse(finalRes).code
                                    }
                                }).then((statusCode) => {
                                    if (ocrSumResults == "" && statusCode !== 0) {
                                        logAdd(`<br>识别的内容居然是空的(惊`)
                                    }
                                    else { document.getElementById('gptInput').value = `${ocrSumResults.trim()}` }
                                }).then(() => {
                                    ocrSumResults = ""
                                }).then(() => {
                                    controlBoxDisplay("loadingBoxImg", "none")
                                })
                            })


                        })
                    }

                }
                else {
                    console.log("原来只是正常的复制而已(*~*)");
                }

            })
        })
    }
    function pic2base64(e) {
        return new Promise((resolve) => {
            e.stopPropagation();
            // e.preventDefault();
            // 阻止粘贴
            // 获取剪贴板信息
            var clipboardData = e.clipboardData || window.clipboardData;
            var items = clipboardData.items;
            for (var i = 0; i < items.length; i++) {
                var item = items[i];
                if (item.kind == 'file') {
                    var pasteFile = item.getAsFile();
                    var reader = new FileReader();
                    reader.onload = function (event) {
                        // 将结果显示在<textarea>中
                        resolve(event.target.result)
                        //  console.log(event.target.result);
                    }
                    // 将文件读取为BASE64格式字符串
                    reader.readAsDataURL(pasteFile);
                    break;
                }
                else {
                    resolve(0)
                }
            }
        })
    }
    const sleep = (time) => {
        return new Promise(resolve => setTimeout(resolve, time))
    }
    function getOcrResults(jobStatusId) {
        return new Promise((resolve) => {
            GM_xmlhttpRequest({
                method: "GET",
                url: `https://web.baimiaoapp.com/api/ocr/image/xunfei/status?jobStatusId=${jobStatusId}`,
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    "x-auth-token": ocrToken.xauthToken,
                    "x-auth-uuid": ocrToken.xauthUuid,
                    "Cookie": ocrToken.cookie,
                    "Connection": "keep-alive",
                    "Accept": "*/*"
                },
                onloadend: function (data) {
                    try {
                        resolve(data.response)
                    } catch (err) {
                        logAdd(`err:${err}`)
                    }
                },
                onerror: function (err) {
                    logAdd(`err:${err}`)
                },
                ontimeout: function (err) {
                    logAdd(`err:${err}`)
                }
            })
        })

    }
    function sendOcrData(nextToken, base64data) {
        return new Promise((resolve) => {
            GM_xmlhttpRequest({
                method: "POST",
                url: "https://web.baimiaoapp.com/api/ocr/image/xunfei",
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    "x-auth-token": ocrToken.xauthToken,
                    "x-auth-uuid": ocrToken.xauthUuid,
                    "Cookie": ocrToken.cookie,
                    "Connection": "keep-alive",
                    "Accept": "*/*"
                },
                data: `{"token":"${nextToken}","hash":"3f9c056379f0457c564290f6e15a9c232f1e5557","name":"image.png","size":13764,"dataUrl":"${base64data}","result":{},"status":"processing","isSuccess":false}`,
                onloadend: function (data) {
                    try {
                        resolve(data.response)
                    } catch (err) {
                        logAdd(`err:${err}`)
                    }
                },
                onerror: function (err) {
                    logAdd(`err:${err}`)
                },
                ontimeout: function (err) {
                    logAdd(`err:${err}`)
                }
            })
        })

    }
    function sendOcrMode() {
        return new Promise((resolve) => {
            GM_xmlhttpRequest({
                method: "POST",
                url: "https://web.baimiaoapp.com/api/perm/single",
                headers: {
                    "Content-Type": "application/json;charset=UTF-8",
                    "x-auth-token": ocrToken.xauthToken,
                    "x-auth-uuid": ocrToken.xauthUuid,
                    cookie: ocrToken.cookie
                },
                data: `{"mode": "single"}`,
                onloadend: function (data) {
                    try {
                        resolve(data.response)
                    } catch (err) {
                        logAdd(`err:${err}`)
                    }
                },
                onerror: function (err) {
                    logAdd(`err:${err}`)
                },
                ontimeout: function (err) {
                    logAdd(`err:${err}`)
                }
            })
        })

    }
    function addSearchEvent() {
        document.getElementById('button_GPT').addEventListener("click", () => {
            getAllAnswer()
        })
    }
    function keyEvent() {
        document.onkeydown = function (e) {
        //   console.log(e)
            var keyNum = window.event ? e.keyCode : e.which;
            if (13 == keyNum && e.ctrlKey) {
                console.log(isAdvanced)
                if (isActive("gptInput")) {
                    document.getElementById('button_GPT').click()
                }
                else {
                    console.log("失焦不执行")
                }
            }
            else if(e.ctrlKey){
                isCtrl=true
            }
            else{
                isCtrl=false
            }
        }
        document.addEventListener("keydown", (e)=>{
             var keyNum = window.event ? e.keyCode : e.which;
            if(65 == keyNum && e.altKey){
                isAdvanced=true
                console.log(isAdvanced)
            }
        });
        document.onkeyup= function (e) {
            isCtrl=false
            isAdvanced=false
        }

    }
    function isActive(id) {
        var myInput = document.getElementById(id);
        if (myInput == document.activeElement) {
            return 1
        } else {
            return 0
        }
    }
    function getBase64Size(base64) {//获取base64字符串的大小
        /*
            参考:https://www.jb51.net/article/172316.htm
            并优化后代码
        */
        if (base64) { // 获取base64图片byte大小
            base64 = base64.split(",")[1].split("=")[0];
            var strLength = base64.length;
            var fileLength = strLength - (strLength / 8) * 2;
            return Math.floor(fileLength); // 向下取整
        } else {
            return null
        }
    };
    function log(temp_1) {
        document.getElementById('gptAnswer_inner').innerHTML = temp_1
    }
    function logAdd(temp_1) {
        document.getElementById('gptAnswer_inner').innerHTML += temp_1
    }

}
(function () { window.onload = mainTop })()