// ==UserScript== // @name chatGPT tools Plus(修改版) // @namespace http://tampermonkey.net/ // @version 1.4.5 // @description Google、必应、百度、Yandex、360搜索、谷歌镜像、Fsou侧边栏Chat搜索,即刻体验AI,无需翻墙,无需注册,无需等待! // @author 夜雨 // @match https://cn.bing.com/* // @match https://www.bing.com/* // @match https://chat.openai.com/chat // @match https://www.google.com/* // @match https://www.so.com/s* // @match http*://www.baidu.com/s* // @match https://www.baidu.com* // @match https://m.baidu.com/* // @match http*://yandex.ru/search* // @match http*://yandex.com/search* // @match https://search.ecnu.cf/search* // @match https://search.aust.cf/search* // @match https://search.*.cf/search* // @match https://fsoufsou.com/search* // @match https://www.google.com.hk/* // @include /^https:\/\/www\.baidu\.com\/s\?wd.*$/ // @icon https://www.google.com/s2/favicons?sz=64&domain=openai.com // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_openInTab // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @run-at document-end // @require https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js // @require https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js // @require https://cdn.bootcdn.net/ajax/libs/marked/4.3.0/marked.min.js // @require https://cdn.bootcdn.net/ajax/libs/markdown-it/13.0.1/markdown-it.min.js // @require https://unpkg.com/axios/dist/axios.min.js // @connect api.forchange.cn // @connect wenxin110.top // @connect gpt008.com // @connect chatforai.cc // @connect api.aigcfun.com // @connect www.aiai.zone // @connect chatbot.theb.ai // @connect cbjtestapi.binjie.site // @connect ai.bo-e.com // @connect freechatgpt.xgp.one // @connect gptkey.oss-cn-hangzhou.aliyuncs.com // @connect luntianxia.uk // @connect chat.51buygpt.com // @connect chat.extkj.cn // @connect api.tdchat0.com // @connect chat6.xeasy.me // @connect chat.wuguokai.cn // @connect chat.aidutu.cn // @connect aichat.leiluan.cc // @connect chat.gptservice.xyz // @connect gpt66.cn // @license MIT // @website https://blog.yeyusmile.top/gpt.html // @require https://cdn.bootcdn.net/ajax/libs/showdown/2.1.0/showdown.min.js // @require https://cdn.bootcdn.net/ajax/libs/highlight.js/11.7.0/highlight.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js // @require https://cdn.bootcdn.net/ajax/libs/KaTeX/0.16.4/katex.min.js // @downloadURL none // ==/UserScript== (function () { 'use strict'; // grant GM_getResourceText // resource markdownCss https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.1.0/github-markdown.css // resource highlightCss https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/default.min.css // GM_addStyle(GM_getResourceText("markdownCss")); // GM_addStyle(GM_getResourceText("highlightCss")); //(prefers-color-scheme: light) $("head").append($( '' )); $("head").append($( '' )); $("head").append($( '' )); try { //禁用console 未转义警告 hljs.configure({ ignoreUnescapedHTML: true }) const menu_updateChat_id = GM_registerMenuCommand("更新Chat", function (event) { GM_openInTab("https://greasyfork.org/zh-CN/scripts/459997") }, "updateChat"); const menu_groupNum_id = GM_registerMenuCommand("交流群", function (event) { alert("交流群:177193765") }, "groupNum"); const menu_pubkey_id = GM_registerMenuCommand("更新公钥", function (event) { alert("正在更新...") setPubkey(); }, "PUBKEY"); } catch (e) { console.log(e) } //动态pubkey function setPubkey() { let GPTMODE = localStorage.getItem("GPTMODE") if (GPTMODE && GPTMODE == "CHATGPT") { //https://gptkey.oss-cn-hangzhou.aliyuncs.com/key.txt GM_xmlhttpRequest({ method: "GET", nocache:true, url: "http://gpt66.cn/gongxkey.html", headers: { //"Content-Type": "application/json", "Referer": `http://gpt66.cn/` }, onload: function (response) { let resp = response.responseText; const regex = /data-key="([^"]+)"/g; const keys = []; let match; while (match = regex.exec(resp)){ keys.push(match[1]); } if (keys.length == 0) { localStorage.removeItem("openAIkey") document.getElementById("gptAnswer").innerText = "openAI key获取失败" return } //localStorage.setItem("openAIkey", pubkey) let ht = "" keys.forEach(key=>{ ht +=`${key}
` }) document.getElementById("gptAnswer").innerHTML = ht; //document.getElementById("gptAnswer").innerText = "openAI key获取成功,请复制其中一个并点按钮添加:\n"+keys.join(",") localStorage.removeItem("openAIkey") }, onerror: (e) => { localStorage.removeItem("openAIkey") document.getElementById("gptAnswer").innerText = "openAI key获取失败" } }); return } //default: let generateRandomIP = () => { const ip = []; for (let i = 0; i < 4; i++) { ip.push(Math.floor(Math.random() * 256)); } console.log(ip.join('.')) return ip.join('.'); } GM_xmlhttpRequest({ method: "GET", url: "https://api.aigcfun.com/fc/key", headers: { "Content-Type": "application/json", "Referer": `https://aigcfun.com/`, "X-Forwarded-For": generateRandomIP() }, onload: function (response) { let resp = response.responseText; let pubkey = JSON.parse(resp).data; if (!pubkey) { document.getElementById("gptAnswer").innerText = "获取pubkey失败" return } console.log("pubkey:" + pubkey); //GM_setValue("pubkey", pubkey) localStorage.setItem("pubkey", pubkey) document.getElementById("gptAnswer").innerText = "pubkey更新成功:" + pubkey } }); } function getPubkey() { //return GM_getValue("pubkey"); return localStorage.getItem("pubkey"); } //setPubkey() //console.log("GET KEY:" + getPubkey()) //enc-start async function digestMessage(r) { const hash = CryptoJS.SHA256(r); return hash.toString(CryptoJS.enc.Hex); } const generateSignature = async r => { const { t: e, m: t } = r; //const n = {}.PUBLIC_SECRET_KEY; let n = getPubkey(); if (!n) { console.log("pubkey不存在,使用默认") n = "k6zeE77ge7XF" } console.log("CURRENT KEY:" + n) const a = `${e}:${t}:${n}`; return await digestMessage(a); }; const generateSignatureWithPkey = async r => { const { t: e, m: t, pkey: n } = r; console.log("CURRENT KEY:" + n) const a = `${e}:${t}:${n}`; return await digestMessage(a); }; //enc-end //start function addChatBtn() { let mybtn = ``; $(".bg.s_btn_wr").after(mybtn) document.getElementById("mybtn").addEventListener("click", function () { console.log("reloadPage") if (window.location.href.indexOf("https:\/\/www.baidu.com\/s") > -1) { GM_add_box_style(2) addBothStyle() keyEvent() appendBox(2).then((res) => { pivElemAddEventAndValue(2) }) } }) } function isMobile() { var userAgentInfo = navigator.userAgent.toLowerCase(); var mobileAgents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var mobile_flag = false; //根据userAgent判断是否是手机 for (let v = 0; v < mobileAgents.length; v++) { if (userAgentInfo.indexOf(mobileAgents[v].toLowerCase()) > -1) { mobile_flag = true; break; } } return mobile_flag; } //end function katexTohtml(rawHtml) { console.log("========katexTohtml start=======") let renderedHtml = rawHtml.replace(//g, "").replace(/<\/em>/g, "").replace(/\$\$(.*?)\$\$/g, (_, tex) => { //debugger return katex.renderToString(tex, {displayMode: false, throwOnError: false}); }); renderedHtml = renderedHtml.replace(/\$(.*?)\$/g, (_, tex) => { //debugger return katex.renderToString(tex, {displayMode: false, throwOnError: false}); }); console.log("========katexTohtml end=======") return renderedHtml; } //显示答案并高亮代码函数 function showAnserAndHighlightCodeStr(codeStr) { try { document.getElementById('gptAnswer').innerHTML = `${katexTohtml(mdConverter(codeStr.replace(/\\n+/g, "\n")))}` } catch (e) { document.getElementById('gptAnswer').innerHTML = `${mdConverter(codeStr.replace(/\\n+/g, "\n"))}` } for (let i = 0; i <= document.getElementsByTagName("code").length - 1; i++) { document.getElementsByTagName("code")[i].setAttribute("class", "hljs"); hljs.highlightAll() } } //高亮代码函数 function highlightCodeStr() { for (let i = 0; i <= document.getElementsByTagName("code").length - 1; i++) { document.getElementsByTagName("code")[i].setAttribute("class", "hljs"); hljs.highlightAll() } } //顶级配置 var webSessionId var convoId var your_qus var abortXml let regx = /search.*?\.cf/g; if (window.location.href.indexOf("bing.com") > -1) { GM_add_box_style(0) addBothStyle() keyEvent() appendBox(0).then((res) => { pivElemAddEventAndValue(0) }) //linkToBing_beautification_script() } if (window.location.href.indexOf("www.google.com") > -1 || window.location.href.match(regx)) { GM_add_box_style(1) addBothStyle() keyEvent() appendBox(1).then((res) => { pivElemAddEventAndValue(1) }) } if (window.location.href.indexOf("https:\/\/www.baidu.com\/s") > -1 && !isMobile()) { GM_add_box_style(2) addBothStyle() keyEvent() appendBox(2).then((res) => { pivElemAddEventAndValue(2) }) } else if (window.location.href.indexOf("https:\/\/m.baidu.com") > -1 || (window.location.href.indexOf( "baidu.com") > -1 && isMobile())) { //手机百度 GM_add_box_style(2) addBothStyle() keyEvent() appendBox(6).then((res) => { pivElemAddEventAndValue(2) }) } //俄罗斯yandex if (window.location.href.indexOf("yandex.ru\/search") > -1 || window.location.href.indexOf( "yandex.com\/search") > -1) { GM_add_box_style(1) addBothStyle() keyEvent() appendBox(3).then((res) => { pivElemAddEventAndValue(3) }) } //360so if (window.location.href.indexOf("so.com\/s") > -1) { GM_add_box_style(1) addBothStyle() keyEvent() appendBox(4).then((res) => { pivElemAddEventAndValue(4) }) } //fsoufsou if (window.location.href.indexOf("fsoufsou.com\/search") > -1) { setTimeout(() => { GM_add_box_style(1) addBothStyle() keyEvent() appendBox(5).then((res) => { pivElemAddEventAndValue(5) }) }, 3000) } //顶级函数 function uuid() { //uuid 产生 var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; } function GM_add_box_style(case_web) { switch (case_web) { case 0: //bing GM_addStyle(` #gptAnswer{ margin: 15px; border-top: solid; border-bottom: solid; } #gptInput{ width:74%; border-radius: 4px; } #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; backdrop-filter: blur(5px); display: flex; flex-direction: column; } #button_GPT{ } #button_GPT{ background: transparent; border-radius: 4px; } #gptCueBox{ translate: 3px; } p{white-space: pre-line} `) break; case 1: //google GM_addStyle(` #gptAnswer{ margin: 15px; border-top: solid; border-bottom: solid; } #gptInput{ border-radius: 4px; width: 68%; } #button_GPT:hover{ background:#dcdcdccc; } #gptDiv{ width:452px; flex: 1; display: flex; flex-direction: column; height: fit-content; } #gptInputBox{ display:flex; justify-content: space-around; } #button_GPT{ background: transparent; border-radius: 3px; font-size: 14px; } #gptStatus{ margin-left: 7px; } p{white-space: pre-line} `) break; //baidu case 2: GM_addStyle(` #gptAnswer{ margin: 15px; border-top: solid; border-bottom: solid; } #gptInput{ border-radius: 4px; width: 68%; } #button_GPT:hover{ background:#4e6ef2; } #gptDiv{ width:452px; flex: 1; display: flex; flex-direction: column; height: fit-content; } #gptInputBox{ display:flex; justify-content: space-around; } #button_GPT{ background: #4460d4; border-radius: 3px; font-size: 14px; } #gptStatus{ margin-left: 7px; } p{white-space: pre-line} `) break; default: alert("参数没设定") } } function do_it() { let finalResult let normalArray let nowResult document.getElementById('gptAnswer').innerHTML = `
加载中
`; //CHATGPT模式 let GPTMODE = localStorage.getItem("GPTMODE") if (GPTMODE && GPTMODE == "CHATGPT") { console.log("当前模式CHATGPT") if (!localStorage.getItem("openAIkey")) { let manualInput = confirm("openAIkey不存在 请更新,或者使用你自己的key"); if (manualInput) { let aikey = prompt("请输入您的openAIkey", ""); if (aikey) localStorage.setItem("openAIkey", aikey) } else { return } } abortXml = GM_xmlhttpRequest({ method: "POST", // url: "http://gpt008.com/backend-api/conversation", url: "https://freechatgpt.xgp.one/backend-api/conversation", headers: { "Content-Type": "application/json", "Authorization": "Bearer null", "Referer": "https://freechatgpt.xgp.one/", // "Host":"gpt008.com", "accept": "text/event-stream", "x-openai-api-key": localStorage.getItem("openAIkey"), }, data: JSON.stringify({//抓包conversation就可以看到这个结构 action: "next", messages: [ { id: uuid(), author: {role: "user"}, role: "user", content: { content_type: "text", parts: [your_qus], }, }, ], model: "text-davinci-002-render", parent_message_id: uuid(), }), // onprogress: function(msg){console.log(msg)}, // onreadystatechange:function(msg){log(msg)}, onloadstart: (stream) => { //肝了好久,终于找到油猴接受SSE的接受方法了 let result = ""; const reader = stream.response.getReader(); // console.log(reader.read) let charsReceived = 0; reader.read().then(function processText({done, value}) { if (done) { highlightCodeStr() return; } charsReceived += value.length; const chunk = value; result += chunk; normalArray = chunk try { // console.log(normalArray) /*old* let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); let nowResult = decoder.decode(byteArray).match(/(?<=\[).*(?=\])/g)[0]; // nowResult = String.fromCharCode.apply(null, normalArray).match(/(?<=\[).*(?=\])/g)[0] console.log(decoder.decode(byteArray)) // console.log(mdConverter(decodeUnicode(nowResult.replace(/\\n+/g,"<换行>")))) if (nowResult !== "DONE") { finalResult = nowResult document.getElementById('gptAnswer').innerHTML = `${mdConverter(finalResult.replace(/\\n+/g, "\n"))}` }else{ console.log(nowResult) document.getElementById('gptAnswer').innerHTML = `${mdConverter(finalResult.replace(/\\n+/g, "\n"))}` for (let i = 0; i <= document.getElementsByTagName("code").length -1; i++) { document.getElementsByTagName("code")[i].setAttribute("class", "hljs"); hljs.highlightAll() } } */ let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); const matchResults = decoder.decode(byteArray).match(/"parts":\s*\["(.+?)"\]/g); let nowResult = matchResults[matchResults.length - 1]; nowResult = /\[\"(.*?)\"\]/g.exec(nowResult)[1]; console.log(nowResult) if (nowResult != "DONE") {//not done finalResult = nowResult showAnserAndHighlightCodeStr(finalResult) } else { console.log(nowResult) showAnserAndHighlightCodeStr(finalResult) } } catch (e) { } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) return; } else if (GPTMODE && GPTMODE == "EXTKJ") { console.log("当前模式EXTKJ") let pt = CryptoJS.AES.encrypt(JSON.stringify(your_qus), "__CRYPTO_SECRET__").toString() console.log("aes:" + pt) abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chat.extkj.cn/api/chat-stream", headers: { "Content-Type": "application/json", // "Authorization": "Bearer null", "Referer": "https://chat.extkj.cn/", "accept": "application/json, text/plain, */*" }, data: JSON.stringify({ prompt: pt, options: {}, systemMessage: "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-04-" + new Date().getDate() < 10 ? "0" + new Date().getDate() : new Date().getDate() }), onloadstart: (stream) => { let result = ""; const reader = stream.response.getReader(); // console.log(reader.read) let charsReceived = 0; reader.read().then(function processText({done, value}) { if (done) { highlightCodeStr() return; } charsReceived += value.length; const chunk = value; result += chunk; normalArray = chunk try { // console.log(normalArray) let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); console.log(decoder.decode(byteArray)) let nowResult = decoder.decode(byteArray) if (!nowResult) { //finalResult = nowResult.text //document.getElementById('gptAnswer').innerHTML = `${mdConverter(finalResult.replace(/\\n+/g, "\n"))}` } else { let jsonLine = nowResult.split("\n"); finalResult = JSON.parse(jsonLine[jsonLine.length - 1]).text; showAnserAndHighlightCodeStr(finalResult) } } catch (e) { console.log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) return; } else if (GPTMODE && GPTMODE == "THEBAI") { console.log("当前模式THEBAI") abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chatbot.theb.ai/api/chat-process", headers: { "Content-Type": "application/json", // "Authorization": "Bearer null", "Referer": "https://chatbot.theb.ai/", //"Host":"www.aiai.zone", "accept": "application/json, text/plain, */*" }, data: JSON.stringify({ prompt: your_qus, options: {} }), onloadstart: (stream) => { let result = ""; const reader = stream.response.getReader(); // console.log(reader.read) let charsReceived = 0; reader.read().then(function processText({done, value}) { if (done) { highlightCodeStr() return; } charsReceived += value.length; const chunk = value; result += chunk; normalArray = chunk try { // console.log(normalArray) let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); let nowResult = JSON.parse(decoder.decode(byteArray)) if (!nowResult.text) { //finalResult = nowResult.text //document.getElementById('gptAnswer').innerHTML = `${mdConverter(finalResult.replace(/\\n+/g, "\n"))}` } else { console.log(nowResult) finalResult = nowResult.text showAnserAndHighlightCodeStr(finalResult) } } catch (e) { } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) //end if return; } else if (GPTMODE && GPTMODE == "YQCLOUD") { console.log("当前模式YQCLOUD") abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://cbjtestapi.binjie.site:7777/api/generateStream", headers: { "Content-Type": "application/json", // "Authorization": "Bearer null", "Referer": "https://chat8.yqcloud.top/", //"Host":"www.aiai.zone", "accept": "application/json, text/plain, */*" }, data: JSON.stringify({ prompt: your_qus, userId: "#/chat/" + Date.now(), network: true }), onloadstart: (stream) => { let result = []; const reader = stream.response.getReader(); reader.read().then(function processText({done, value}) { if (done) { finalResult = result.join("") showAnserAndHighlightCodeStr(finalResult) return; } let d = new TextDecoder("utf8").decode(new Uint8Array(value)); result.push(d) try { console.log(result.join("")) showAnserAndHighlightCodeStr(result.join("")) } catch (e) { console.log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) //end if return; } else if (GPTMODE && GPTMODE == "AIDUTU") { console.log("当前模式AIDUTU") let _iam = generateRandomString(8) GM_xmlhttpRequest({ url: "https://chat.aidutu.cn/api/cg/chatgpt/user/info?v=1.3", headers: { "accept": "*/*", "referrer": "https://aichat.leiluan.cc/", "x-iam:": _iam, "content-type": "application/json" }, data: JSON.stringify({ q: your_qus, iam:_iam }), method: "POST", onload: (resp) => { let rs = resp.responseText; console.log(rs) let xtoken = JSON.parse(rs).data.token; console.log(xtoken) abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chat.aidutu.cn/api/chat-process", headers: { "Content-Type": "application/json", "Referer": "https://chat.aidutu.cn/", "accept": "application/json, text/plain, */*", "x-token": xtoken }, data: JSON.stringify({ prompt: your_qus, temperature: 0.8, top_p: 1, options: {}, systemMessage: "You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown." }), onloadstart: (stream) => { let result = ""; const reader = stream.response.getReader(); // console.log(reader.read) let charsReceived = 0; reader.read().then(function processText({done, value}) { if (done) { highlightCodeStr() return; } charsReceived += value.length; const chunk = value; result += chunk; normalArray = chunk try { // console.log(normalArray) let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); let nowResult = JSON.parse(decoder.decode(byteArray)) console.log(nowResult) if (nowResult.text) { console.log(nowResult) finalResult = nowResult.text showAnserAndHighlightCodeStr(finalResult) } } catch (e) { console.log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) }//end onload }) //end if return; } else if (GPTMODE && GPTMODE == "LTXUK") { console.log("当前模式LTXUK") let now = Date.now() const pk = {}.PUBLIC_SECRET_KEY; generateSignatureWithPkey({ t: now, m: your_qus || "", pkey: pk }).then(sign => { console.log(sign) abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://luntianxia.uk/api/generate", headers: { "Content-Type": "application/json", "Referer": `https://luntianxia.uk/` }, data: JSON.stringify({ messages: [{ role: "user", content: your_qus }], time: now, pass: null, sign: sign //key: "", //usage: Math.floor(Math.random() * 8) + 1 }), onload: function (res) { if (res.status === 200) { console.log('成功....') console.log(res.response) let rest = res.response //console.log(rest.choices[0].text.replaceAll("\n","
")) try { log(rest) showAnserAndHighlightCodeStr(rest) } catch (e) { //TODO handle the exception console.log(e) document.getElementById('gptAnswer').innerHTML = `${rest}` } highlightCodeStr() } else { console.log('失败') console.log(res) document.getElementById('gptAnswer').innerHTML = '访问失败了' } }, responseType: "application/json;charset=UTF-8", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { document.getElementById('gptAnswer').innerHTML = `
some err happends,errinfo :
${err.messages}
` }, ontimeout: function (err) { document.getElementById('gptAnswer').innerHTML = `
Opps!TimeOut,Please try again,errinfo:
${err.messages}
` } }); }); //end if return; } else if (GPTMODE && GPTMODE == "51GPT") { console.log("当前模式51GPT") abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chat.51buygpt.com/message.php", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", // "Authorization": "Bearer null", "Referer": "https://chat.51buygpt.com/", "Host": "www.aiai.zone", "accept": "application/json, text/plain, */*" }, data: `message=${encodeURI(your_qus)}&context=%5B%5D`, onloadstart: (stream) => { let result = ""; const reader = stream.response.getReader(); // console.log(reader.read) let charsReceived = 0; reader.read().then(function processText({done, value}) { if (done) { highlightCodeStr() return; } charsReceived += value.length; const chunk = value; result += chunk; normalArray = chunk try { // console.log(normalArray) let byteArray = new Uint8Array(chunk); let decoder = new TextDecoder('utf-8'); let nowResult = JSON.parse(decoder.decode(byteArray)) if (!nowResult.raw_message) { //finalResult = nowResult.text //document.getElementById('gptAnswer').innerHTML = `${mdConverter(finalResult.replace(/\\n+/g, "\n"))}` } else { console.log(nowResult) finalResult = nowResult.raw_message showAnserAndHighlightCodeStr(finalResult) } } catch (e) { log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) //end if return; } else if (GPTMODE && GPTMODE == "TDCHAT") { console.log("当前模式TDCHAT") abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://api.tdchat0.com/", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", // "Authorization": "Bearer null", "Referer": "http://hzcy5.tdchat6.com/", //"Host":"www.aiai.zone", "accept": "application/json, text/plain, */*" }, data: `id=3.5&key=&role=&title=&text=${encodeURIComponent(your_qus).replace(/%/g, '‰')}&length=${your_qus.length}&stream=1`, onloadstart: (stream) => { let result = []; const reader = stream.response.getReader(); reader.read().then(function processText({done, value}) { if (done) { finalResult = result.join("") showAnserAndHighlightCodeStr(finalResult) return; } try { let d = new TextDecoder("utf8").decode(new Uint8Array(value)); let delta = JSON.parse(d.replace(/data: /, "")).choices[0].delta.content console.log(d) result.push(delta) showAnserAndHighlightCodeStr(result.join("")) } catch (e) { console.log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }) //end if return; } else if (GPTMODE && GPTMODE == "XEASY") { console.log("当前模式XEASY") let now = Date.now() const pk = {}.PUBLIC_SECRET_KEY; generateSignatureWithPkey({ t: now, m: your_qus || "", pkey: pk }).then(sign => { console.log(sign) abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chat6.xeasy.me/api/generate", headers: { "Content-Type": "application/json", "Referer": `https://chat6.xeasy.me/` }, data: JSON.stringify({ messages: [{ role: "user", content: your_qus }], time: now, pass: null, sign: sign //key: "", //usage: Math.floor(Math.random() * 8) + 1 }), onloadstart: (stream) => { let result = []; const reader = stream.response.getReader(); reader.read().then(function processText({done, value}) { if (done) { let finalResult = result.join("") console.log(finalResult) showAnserAndHighlightCodeStr(finalResult) return; } let d = new TextDecoder("utf8").decode(new Uint8Array(value)); result.push(d) try { showAnserAndHighlightCodeStr(result.join("")) } catch (e) { log(e) } return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { document.getElementById('gptAnswer').innerHTML = `
some err happends,errinfo :
${err.messages}
` }, ontimeout: function (err) { document.getElementById('gptAnswer').innerHTML = `
Opps!TimeOut,Please try again,errinfo:
${err.messages}
` } }); }); //end if return; } else if (GPTMODE && GPTMODE == "WGK") { console.log("当前模式WGK") wsResult = [] abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://chat.wuguokai.cn/api/v1/bots/chatgpt/mod/channel-web/messages?__ts=" + Date.now(), headers: { "Content-Type": "application/json", "Referer": `https://chat.wuguokai.cn/lite/chatgpt/?m=channel-web&v=Fullscreen&options={"hideWidget":true,"config":{"enableReset":false,"enableTranscriptDownload":true}}` }, data: JSON.stringify({ "webSessionId": webSessionId, "conversationId": convoId, "payload": { "type": "text", "text": your_qus } }), onloadstart: (stream) => { let result = []; const reader = stream.response.getReader(); reader.read().then(function processText({done, value}) { if (done) { let finalResult = result.join("") console.log(finalResult) showAnserAndHighlightCodeStr(finalResult) return; } let d = new TextDecoder("utf8").decode(new Uint8Array(value)); result.push(d) return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { document.getElementById('gptAnswer').innerHTML = `
some err happends,errinfo :
${err.messages}
` }, ontimeout: function (err) { document.getElementById('gptAnswer').innerHTML = `
Opps!TimeOut,Please try again,errinfo:
${err.messages}
` } }); //end if return; } else if (GPTMODE && GPTMODE == "LEILUAN") { console.log("LEILUAN") LEILUAN() return; //end if } console.log("defualt:") const now = Date.now(); console.log(now); generateSignature({ t: now, m: your_qus || "" }).then(sign => { console.log(sign) abortXml = GM_xmlhttpRequest({ method: "POST", url: "https://api.aigcfun.com/api/v1/text?key=" + getPubkey(), //url: "https://chatforai.cc/api/generate", headers: { "Content-Type": "application/json", "Referer": `https://aigcfun.com/` }, data: JSON.stringify({ messages: [ { role: "system", content: "请以markdown的形式返回答案" }, { role: "user", content: your_qus } ], tokensLength: your_qus.length + 10, model: "gpt-3.5-turbo" }), // data: JSON.stringify({ // prompt: "Human:"+your_qus+"\nAI:", // tokensLength: your_qus.length // }), onload: function (res) { if (res.status === 200) { console.log('成功....') console.log(res.response) let rest = JSON.parse(res.response).choices[0].text console.log(rest) try { showAnserAndHighlightCodeStr(rest); } catch (e) { //TODO handle the exception document.getElementById('gptAnswer').innerHTML = `${rest}` } highlightCodeStr() } else { console.log('失败') console.log(res) document.getElementById('gptAnswer').innerHTML = '访问失败了' } }, responseType: "application/json;charset=UTF-8", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { document.getElementById('gptAnswer').innerHTML = `
some err happends,errinfo :
${err.messages}
` }, ontimeout: function (err) { document.getElementById('gptAnswer').innerHTML = `
Opps!TimeOut,Please try again,errinfo:
${err.messages}
` } }); }); } function creatBox() { return new Promise((resolve) => { var divE = document.createElement('div'); var divId = document.createAttribute("id"); //创建属性 divId.value = 'gptDiv'; //设置属性值 divE.setAttributeNode(divId); //给div添加属性 var pE = document.createElement('p'); var pClass = document.createAttribute('class'); pClass.value = 'textClass'; pE.setAttributeNode(pClass) var pText = document.createTextNode("chatGPT tools Plus 已启动"); pE.appendChild(pText); divE.appendChild(pE); divE.innerHTML = `

 切换线路 部分线路需要科学上网

    只针对默认和CHATGPT线路:更新KEY

  =========网页版=========

版本:1.4.5已启动,部分需要魔法。当前线路: ${localStorage.getItem("GPTMODE") ? localStorage.getItem("GPTMODE") : "默认模式"}

` resolve(divE) }) } async function pivElemAddEventAndValue(append_case) { var search_content if (append_case === 5) { search_content = document.getElementById("search-input").value } if (append_case === 4) { search_content = document.getElementById("keyword").value } if (append_case === 3) { search_content = document.querySelectorAll("input")[0].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 if (!search_content) { search_content = document.querySelector("textarea[class='b_searchbox']").value; } } document.getElementById("gptInput").value = search_content document.getElementById('button_GPT').addEventListener('click', () => { your_qus = document.getElementById("gptInput").value do_it() }) document.getElementById('updatePubkey').addEventListener('click', () => { document.getElementById("gptAnswer").innerText = "正在更新,请稍后..." setPubkey() }) document.getElementById('changMode').addEventListener('click', () => { document.getElementById("gptAnswer").innerText = "正在切换模式..." let chatList = ["Default", "CHATGPT", "EXTKJ", "THEBAI", "YQCLOUD", "AIDUTU", "LTXUK", "51GPT", "TDCHAT", "XEASY", "WGK", "LEILUAN"] let GPTMODE = localStorage.getItem("GPTMODE") if (GPTMODE) { let idx = 0;//Default for (let i = 0; i < chatList.length; i++) { if (chatList[i] == GPTMODE) { idx = (i + 1 >= chatList.length) ? 0 : i + 1; } } localStorage.setItem("GPTMODE", chatList[idx]) document.getElementById("gptAnswer").innerText = `切换成功,当前模式:${chatList[idx]}` } else { //不存在默认CHATGPT localStorage.setItem("GPTMODE", "CHATGPT") document.getElementById("gptAnswer").innerText = "切换成功,当前模式:CHATGPT模式" } }) } async function appendBox(append_case) { return new Promise((resolve, reject) => { creatBox().then((divE) => { switch (append_case) { case 0: //bing if (divE) { document.getElementById('b_context').prepend(divE) } break; case 1: //google if (document.getElementsByClassName('TQc1id ')[0]) { document.getElementsByClassName('TQc1id ')[0].prepend(divE); } else { document.getElementById("rcnt").appendChild(divE); } break; case 2: //baidu if (document.getElementById('content_right')) { document.getElementById('content_right').prepend(divE) } break; case 3: //yandex if (document.getElementById('search-result-aside')) { document.getElementById('search-result-aside').prepend(divE) } break; case 4: //360 if (document.getElementById('side')) { document.getElementById('side').prepend(divE) } break; case 5: //fsoufsou let frow = document.querySelectorAll(".flex-row")[2] if (frow.children.length == 2) { frow.children.item(1).prepend(divE) } else { frow.innerHTML = frow.innerHTML + `
${divE.innerHTML}
` } break; case 6: //手机百度 if (document.getElementById('page-bd')) { document.getElementById('page-bd').prepend(divE) //调整css try { document.querySelector("#gptDiv").style.setProperty("width", "100%") document.querySelector("#gptInput").setAttribute("class", "se-input adjust-input") } catch (e) { //TODO handle the exception } setTimeout(() => { document.getElementById("button_GPT").click(); //自动点击 }, 1500) } break; default: if (divE) { console.log(`啥情况${divE}`) } } }).catch((err) => { throw new Error(err) }) resolve("finished") }) } //焦点函数 function isBlur() { var myInput = document.getElementById('gptInput'); if (myInput == document.activeElement) { return 1 } else { return 0 } } function keyEvent() { document.onkeydown = function (e) { var keyNum = window.event ? e.keyCode : e.which; if (13 == keyNum) { if (isBlur()) { document.getElementById('button_GPT').click() } else { console.log("失焦不执行") } } } } function addBothStyle() { GM_addStyle(` #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; } } pre{ overflow-x: scroll; overflow-y: hidden; background: #fffaec; border-radius: 4px; padding: 14px 3px; } pre::-webkit-scrollbar { } `) } function creatBox_and_addEventlis(append_case) { var divE = document.createElement('div'); var divId = document.createAttribute("id"); //创建属性 divId.value = 'gptDiv'; //设置属性值 divE.setAttributeNode(divId); //给div添加属性 var pE = document.createElement('p'); var pClass = document.createAttribute('class'); pClass.value = 'textClass'; pE.setAttributeNode(pClass) var pText = document.createTextNode("chatGPT tools Plus 已启动"); pE.appendChild(pText); divE.appendChild(pE); switch (append_case) { case 0: if (divE) { document.getElementById('b_context').prepend(divE) } break; case 1: if (document.getElementsByClassName('TQc1id ')[0]) { document.getElementsByClassName('TQc1id ')[0].prepend(divE); } else { document.getElementById("rcnt").appendChild(divE); } break; case 2: if (document.getElementById('content_right')) { document.getElementById('content_right').prepend(divE) } break; default: if (divE) { document.getElementById('b_context').prepend(divE) } } document.getElementById('gptDiv').innerHTML = `

  openAI已就绪,请输入你的问题

chatGPT tools Plus 免费版已启动

` var search_content 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() }) } function log(a) { console.log(a) } function Uint8ArrayToString(fileData) { var dataString = ""; for (var i = 0; i < fileData.length; i++) { dataString += String.fromCharCode(fileData[i]); } return dataString } function decodeUnicode(str) { str = str.replace(/\\/g, "%"); //转换中文 str = unescape(str); //将其他受影响的转换回原来 str = str.replace(/%/g, "\\"); //对网址的链接进行处理 str = str.replace(/\\/g, ""); return str; } function mdConverter(rawData) { var converter = new showdown.Converter(); //增加拓展table converter.setOption('tables', true); //启用表格选项。从showdown 1.2.0版开始,表支持已作为可选功能移入核心拓展,showdown.table.min.js扩展已被弃用 var view = converter.makeHtml(rawData); return view; } //实时监控百度,360按钮消失 setInterval(() => { //百度 if (window.location.href.indexOf("https:\/\/www.baidu.com\/s") > -1 && !isMobile()) { if (!document.getElementById("gptDiv") && document.getElementById("mybtn")) { document.getElementById("mybtn").click() } if (!document.getElementById("gptDiv") && !document.getElementById("mybtn")) { addChatBtn(); document.getElementById("mybtn").click() } } //360 注意请如果你在360相关浏览器上使用插件。360搜索将不会生效,因为已被浏览器禁用在so.com网址上使用 if (window.location.href.indexOf("so.com\/s") > -1 && !document.getElementById("gptDiv")) { GM_add_box_style(1) addBothStyle() keyEvent() appendBox(4).then((res) => { pivElemAddEventAndValue(4) }) } }, 2000) function initCvID() { GM_xmlhttpRequest({ method: "POST", url: "https://chat.wuguokai.cn/api/v1/bots/chatgpt/mod/channel-web/conversations/new?__ts=" + Date.now(), headers: { "Content-Type": "application/json", "Referer": `https://chat.wuguokai.cn/lite/chatgpt/?m=channel-web&v=Fullscreen&options={"hideWidget":true,"config":{"enableReset":false,"enableTranscriptDownload":true}}` }, data: JSON.stringify({"webSessionId": webSessionId}), onloadstart: (stream) => { let result = []; const reader = stream.response.getReader(); reader.read().then(function processText({done, value}) { if (done) { let finalResult = result.join("") console.log(finalResult) convoId = JSON.parse(finalResult).convoId console.log("convoId: ", convoId) return; } let d = new TextDecoder("utf8").decode(new Uint8Array(value)); result.push(d) return reader.read().then(processText); }); }, responseType: "stream", onprogress: function (msg) { //console.log(msg) //Todo }, onerror: function (err) { console.log(err) }, ontimeout: function (err) { console.log(err) } }); } function generateRandomString(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for (var i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } var wsResult = [] var initSocket = function () { // 创建WebSocket连接 const socket = new WebSocket(`wss://chat.wuguokai.cn/socket.io/?visitorId=${generateRandomString(24)}&EIO=4&transport=websocket`); // 监听连接成功事件 socket.addEventListener('open', (event) => { console.log('连接成功'); showAnserAndHighlightCodeStr("websocket已经连接") }); let isFirst = false; // 监听接收消息事件 socket.addEventListener('message', (event) => { console.log('接收到消息:', event.data); let revData = event.data; if (!isFirst) { socket.send("40/guest,") isFirst = true setTimeout(() => socket.send("3"), 3000) } if (revData == "3") { socket.send("2"); } if (revData == "2") { socket.send("3"); } if (revData.match(/40\/guest/)) { try { webSessionId = JSON.parse(revData.replace(/40\/guest,/, "").trim()).sid; console.log("webSessionId ", webSessionId) initCvID(); } catch (e) { console.log(e) } } if (revData.match(/42\/guest/)) { //收信 try { let chunk = JSON.parse(revData.replace(/42\/guest,/, "").trim())[1].data.payload.text; console.log(chunk) wsResult.push(chunk) showAnserAndHighlightCodeStr(wsResult.join("")) } catch (e) { console.log(e) } } }); } function LEILUAN() { console.log(CryptoJS.MD5(your_qus).toString().toLowerCase()) //这里填你的cookie里面的token 地址:https://aichat.leiluan.cc/static/html/pc.html let leiluanToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwd2QiOiJkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZSIsImlzcyI6ImFpY2hhdC5sZWlsdWFuLmNjIiwiYXVkIjoiYWljaGF0LmxlaWx1YW4uY2MiLCJpYXQiOjE2ODAyNDY1MTgsIm5iZiI6MTY4MDI0NjUxOCwiZXhwIjoxNjgyODM4NTE4LCJqdGkiOnsiaWQiOjg0LCJ0eXBlIjoiYXBpIn19.1Z3oNWp0mi-GJALHdonBwnm4-jiOHRfu3edj4hH6Evs"; GM_xmlhttpRequest({ url: "https://aichat.leiluan.cc/api/user/openchat", headers: { "accept": "*/*", "authori-zation": `Bearer ${leiluanToken}`, "referrer": "https://aichat.leiluan.cc/pages/lei_luan/content/talk?content=%E4%BD%A0%E6%98%AF%E4%BB%80%E4%B9%88%E5%9E%83%E5%9C%BE", "content-type": "application/json" }, data: JSON.stringify({ prompt: your_qus, chatlogid: CryptoJS.MD5(your_qus).toString().toLowerCase() }), method: "POST", onload: (resp) => { let rs = resp.responseText; let tk = JSON.parse(rs).data.token; GM_xmlhttpRequest({ url: "https://chat.gptservice.xyz/indext.php?token=" + tk, method: "GET", headers: { "accept": "text/event-stream", "content-type": "text/event-stream", "referrer": "https://aichat.leiluan.cc/" }, onloadstart: (stream) => { const reader = stream.response.getReader(); let chunks = []; reader.read().then(function processText({done, value}) { if (done) { // 数据已经被完全消耗 const targetString = chunks.join(""); const regExp = /"content":"(.+?)"/gi; const matchResult = targetString.match(regExp); let finalAns = [] matchResult.forEach(item=>{ try { console.log("===="+/"content":"(.+?)"/g.exec(item)[1]+"=====") finalAns.push(/"content":"(.+?)"/g.exec(item)[1]) }catch (e) { console.error(e,item) } }) // console.log(finalAns.join("")) showAnserAndHighlightCodeStr(finalAns.join("")) return; } try { let d = new TextDecoder("utf8").decode(new Uint8Array(value)); //console.log(d) chunks.push(d) }catch (e) { console.error(e) } return reader.read().then(processText); }); }, responseType: "stream", onerror: function (err) { console.log(err) } }) } }) } setTimeout(() => { initSocket(); }, 1500) })();