GPT3(intumu.com)

持续对话文字加载!

  1. // ==UserScript==
  2. // @name GPT3(intumu.com)
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.0.3
  5. // @description 持续对话文字加载!
  6. // @author yeayee
  7. // @match https://*.intumu.com/chatgpt
  8. // @icon https://intumu.com/static/images/favicon.ico
  9. // @grant GM_xmlhttpRequest
  10. // @grant GM_addStyle
  11. // @grant GM_openInTab
  12. // @grant GM_registerMenuCommand
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @run-at document-end
  16. // @require https://cdn.staticfile.org/jquery/3.4.0/jquery.min.js
  17. // @require https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js
  18. // @require https://unpkg.com/axios/dist/axios.min.js
  19. // @connect intumu.com
  20. // @connect anfans.cn
  21. // @license MIT
  22. // @require https://intumu.com/static/js/marked.min.js
  23. // @require https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js
  24. // @require https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/extensions/MathZoom.js
  25. // @require https://cdn.staticfile.org/clipboard.js/2.0.4/clipboard.min.js
  26. // @require https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.0/highlight.min.js
  27. // @require https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.0/languages/go.min.js
  28. // @require https://cdn.bootcdn.net/ajax/libs/KaTeX/0.16.4/katex.min.js
  29.  
  30. // ==/UserScript==
  31.  
  32. (function () {
  33. 'use strict';
  34.  
  35. $("head").append($(
  36. '<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/github-markdown-css/5.2.0/github-markdown.css" media="(prefers-color-scheme: dark)">'
  37. ));
  38. $("head").append($(
  39. '<link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.7.0/styles/base16/default-dark.min.css">'
  40. ));
  41. $("head").append($(
  42. '<link href="https://cdn.bootcss.com/github-markdown-css/2.10.0/github-markdown.min.css" rel="stylesheet">'
  43. ));
  44. $("head").append($(
  45. '<link href="https://cdn.bootcdn.net/ajax/libs/KaTeX/0.16.4/katex.css" rel="stylesheet">'
  46. ));
  47. $("head").append($(
  48. '<script src="https://intumu.com/static/js/marked.min.js"></script>'
  49. ));
  50. $("head").append($(
  51. '<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/MathJax.js"></script>'
  52. ));
  53. $("head").append($(
  54. '<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.6/extensions/MathZoom.js"></script>'
  55. ));
  56. if(!document.getElementById("katex-link")){
  57. $("head").append($(
  58. '<link id="katex-link" href="https://cdn.bootcdn.net/ajax/libs/KaTeX/0.16.4/katex.css" rel="stylesheet">'
  59. ));
  60. }
  61.  
  62. //封装GM_xmlhttpRequest ---start---
  63. async function GM_fetch(details) {
  64. return new Promise((resolve, reject) => {
  65. switch (details.responseType) {
  66. case "stream":
  67. details.onloadstart = (res) => {
  68. resolve(res)
  69. }
  70. break;
  71. default:
  72. details.onload = (res) => {
  73. resolve(res)
  74. };
  75. }
  76.  
  77. details.onerror = (res) => {
  78. reject(res)
  79. };
  80. details.ontimeout = (res) => {
  81. reject(res)
  82. };
  83. details.onabort = (res) => {
  84. reject(res)
  85. };
  86. GM_xmlhttpRequest(details)
  87. });
  88. }
  89.  
  90. function GM_httpRequest(details, callBack, errorCallback, timeoutCallback, abortCallback) {
  91. if (callBack) {
  92. switch (details.responseType) {
  93. case "stream":
  94. details.onloadstart = callBack;
  95. break;
  96. default:
  97. details.onload = callBack
  98. }
  99. }
  100. if (errorCallback) {
  101. details.onerror = errorCallback;
  102. }
  103. if (timeoutCallback) {
  104. details.ontimeout = timeoutCallback;
  105. }
  106. if (abortCallback) {
  107. details.onabort = abortCallback;
  108. }
  109. console.log(details)
  110. GM_xmlhttpRequest(details);
  111. };
  112.  
  113. //封装GM_xmlhttpRequest ---end---
  114.  
  115. // 通过class定位button
  116. const button = document.getElementById('send-btn');
  117.  
  118.  
  119. // 创建新的button元素
  120. const newButton = document.createElement('button');
  121. newButton.setAttribute('id', 'newbutton');
  122. newButton.innerHTML = 'ChatGPT3';
  123.  
  124. // 将新的button插入到button后面
  125. button.parentNode.insertBefore(newButton, button.nextSibling);
  126. const newbutton = document.getElementById('newbutton');
  127. newbutton.setAttribute("class", "btn btn-danger margin");
  128. document.getElementById('newbutton').addEventListener('click', () => {
  129.  
  130. let text = '';
  131. text = document.getElementById("textarea").value;
  132. if (text == "") {
  133. alert("请输入内容");
  134. return;
  135. };
  136. let html = '';
  137. let send_time = new Date();
  138. let send_time_str = '';
  139. if (send_time.getTime() - last_time > 1000 * 60 * 5) {
  140. // 以'%Y年%#m月%#d日 %H:%M'格式显示时间
  141. html += '<div class="item item-center"><span>' + get_time_str(send_time) + '</span></div>';
  142. last_time = send_time.getTime();
  143. send_time_str = get_time_str(send_time);
  144. }
  145. html += '<div class="item item-right"><div class="bubble bubble-right markdown">' + marked.marked(text) + '</div><div class="avatar"><img src="./static/people.jpg" /></div></div>';
  146. $(".content").append(html);
  147. $("#textarea").val("");
  148. $(".content").scrollTop($(".content")[0].scrollHeight);
  149. if (text.startsWith('new:')) send_time_str = get_time_str(send_time)
  150. LEMURCHAT(text);
  151.  
  152. });
  153. // 请求接口
  154. function LEMURCHAT(your_qus) {
  155.  
  156. let baseURL = "http://lemurchat.anfans.cn/";
  157. let chat_item = $('<div class="item item-left"><div class="avatar"><img src="./static/chatgpt.png" /></div><div class="bubble bubble-left markdown">正在等待回复</div></div>')
  158. $(".content").append(chat_item);
  159. $(".box-body").scrollTop($(".box-body")[0].scrollHeight);
  160. GM_fetch({
  161. method: "POST",
  162. url: baseURL + "api/chat/conversation-trial",
  163. headers: {
  164. "Content-Type": "application/json",
  165. "User-Agent": "Mozilla/5.0 (Linux; Android 9; Redmi 4 Prime) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36"
  166. },
  167. data: `{"messages":"[{\\"content\\":\\"\\",\\"id\\":\\"LEMUR_AI_SYSTEM_SETTING\\",\\"isSensitive\\":false,\\"needCheck\\":false,\\"role\\":\\"system\\"},{\\"content\\":\\"${your_qus}\\",\\"isSensitive\\":false,\\"needCheck\\":true,\\"role\\":\\"user\\"}]"}`,
  168. responseType: "stream"
  169. }).then((stream) => {
  170. const reader = stream.response.getReader();
  171. let result = [];
  172. reader.read().then(function processText({done, value}) {
  173. if (done) {
  174. return;
  175. }
  176. try {
  177. let d = new TextDecoder("utf8").decode(new Uint8Array(value));
  178. console.log("raw:", d)
  179. let dd = d.replace(/data: /g, "").split("\n\n")
  180. console.log("dd:", dd)
  181. dd.forEach(item => {
  182. try {
  183. let delta = /content\\":\\"(.*?)\\"/gi.exec(item)[1]
  184. result.push(delta.replace(/\\\\n/g, "\n"))
  185. let response = result.join("");
  186. console.log("response:", response)
  187. let div = document.createElement('div');
  188. div.innerHTML = marked.marked(response);
  189. MathJax.Hub.Typeset(div);
  190. chat_item.find(".bubble").empty();
  191. chat_item.find(".bubble").append(div);
  192. $(".box-body").scrollTop($(".box-body")[0].scrollHeight);
  193. } catch (e) {
  194. }
  195. })
  196.  
  197. } catch (e) {
  198. console.log(e)
  199. }
  200.  
  201. return reader.read().then(processText);
  202. });
  203. }, function (err) {
  204. console.log(err)
  205. }).catch((ex) => {
  206. console.log(ex)
  207. });
  208.  
  209. };
  210.  
  211.  
  212.  
  213.  
  214. })();