ChatGPT 模型切换器(支持 GPT-4 Mobile 及所有可用模型)

通过启用 GPT-4 Mobile 模型,解除 ChatGPT 网页端对 GPT-4 模型使用次数的限制。同时还可启用其他模型进行切换,提供更多的灵活性。一般来说,该脚本不会与其他流行的 ChatGPT 脚本产生冲突。

目前为 2023-06-23 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name ChatGPT Model Switcher (Supports GPT-4 Mobile and All Available Models)
  3. // @name:zh-CN ChatGPT 模型切换器(支持 GPT-4 Mobile 及所有可用模型)
  4. // @name:zh-TW ChatGPT 模型切换器(支持 GPT-4 Mobile 及所有可用模型)
  5. // @namespace https://github.com/hydrotho/ChatGPT_Model_Switcher
  6. // @copyright 2023, Hydrotho (https://github.com/hydrotho)
  7. // @version 1.0.1
  8. // @description Override GPT-4 usage limits in the ChatGPT web interface by enabling the GPT-4 Mobile model. Additional models can also be enabled for switching, providing more flexibility. Generally, this script does not conflict with other popular ChatGPT scripts.
  9. // @description:zh-CN 通过启用 GPT-4 Mobile 模型,解除 ChatGPT 网页端对 GPT-4 模型使用次数的限制。同时还可启用其他模型进行切换,提供更多的灵活性。一般来说,该脚本不会与其他流行的 ChatGPT 脚本产生冲突。
  10. // @description:zh-TW 通过启用 GPT-4 Mobile 模型,解除 ChatGPT 网页端对 GPT-4 模型使用次数的限制。同时还可启用其他模型进行切换,提供更多的灵活性。一般来说,该脚本不会与其他流行的 ChatGPT 脚本产生冲突。
  11. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAH1UExURUxpcXeqn3WqnHWonHSpnHWonHWpnG22knWpnHWpnHSmm3apm3SpnHWonHWpnHSonHWpnHWpm3apnXWpnHWpm3WpnP///8fc19fm43mrn67Nxf7///r8+6HFvNPk4JS8ssXb1XirnsDY0sPa1Pj7+qbHv5i/tXeqnvz9/X6uoo65roq2q+Tu7P3+/qrKwqDEu9bm4vP39qfIwPv9/NXl4ezz8Xqsn+nx73msn5/Dusnd2N7q59zp5pC6r4CwpKLFvIOxpszf2oSypsTa1fn7+/P49t/r6JrAt8LZ1L/X0d3q53aqnczf287h3Ie0qc7g3Pr8/LTQybDOxpvBuObv7c/h3PX5+Ory8ODr6OPt65G7sLnTzYWzp/n7+oi1qv7+/tTk4J7Cucve2Z3Cub7X0H+vo8LZ053CuKnJwff6+tnn4/3+/fD29XytoYWzqJe+tJa+tHapnHeqnaHEu8vf2oGxpazLw3utoMre2ZW9s7XRyu/19H2uou/186XHv6jJwNDi3sjd2OLt6u308ufw7tfm4rjTzK3MxOjw7tvp5dHi3sjd15m/tvL39q/Nxvb5+OPu64y3rIOyptnn5LbSy+Ds6eHs6tbl4cHZ0/v8/H6vo4GwpZ7Dus/h3fb6+ZK7sfT49/f6+aLFvavLw6zLxM3g28bc1pQLf2QAAAAVdFJOUwAtv5bz1PQH/dUuj5WQ/CyYwJHykqKEGP8AAAAJcEhZcwAAAHYAAAB2AU57JggAAAIcSURBVDjLhdNle9swEABgFdK0Kw7uHMfp6iTeAksaThpoUmZuV1x5zMxbx8wM7Xj7nZNjx/L2rNl9kXR6H51snwmhsWFTWQn8FSWGygKihLGmFP4ZpUXG7P5GWDcKZVEDeaKC1mfnHxUvoSV19YQOVFWTLdpiUfJ2POx/jOEzAy4tWU7KctPG95FpOjT0IA2PT80aSHEOpKQ5mSUxIA7bD2OzI5vdTNTt1QXBDvAxMT/7qkE+h8PdyoYC+DX0YgYyX4W+FwBunqYOhpp0YAl/1eN22Or5DPD8Jd6sBTiOZgYa8SfUysAMH+wWW/AK3ndbUWRADKUVMGIex1YrRGcs3uvYxcCzKVCAJTb66FZsFGDXTgHPMjD2WgWcFeCkHd/uoOshj0MD16QoLOI2+Q406ifpPXh4gisaOIXD4JiZXUoqwARx/Ab80zB7TJMzmK17nr4BK2eCOnocJGMMBBH9tO6FqYhveUJSwZsxBrpRDDltl6G3G7/8+K6AtLOZARu65hYwcLfL8s4l30EGCTzGwH6MA3Tew9u0Tp1HBmYOT+u+xZ62nl4AB91uGRQ+ZWAZ53HQqgMwgn3n6BC90+bl0nLJB51qH+QaphUD3EWuHVNuuhiQwlrPaS3n6zhEW+2G3I3TkSE3A5XalG860o/j/sSkcGAf62tS8MdvFfe3Oyf2tugyhBRB3qC/XuF/ADFWVOUHhFSXG4rXA78BYbiLJDUXqsMAAABXelRYdFJhdyBwcm9maWxlIHR5cGUgaXB0YwAAeJzj8gwIcVYoKMpPy8xJ5VIAAyMLLmMLEyMTS5MUAxMgRIA0w2QDI7NUIMvY1MjEzMQcxAfLgEigSi4A6hcRdPJCNZUAAAAASUVORK5CYII=
  12. // @grant none
  13. // @author Hydrotho
  14. // @match http*://chat.openai.com/*
  15. // @supportURL https://github.com/hydrotho/ChatGPT_Model_Switcher/issues
  16. // @license MIT
  17. // ==/UserScript==
  18.  
  19. (function () {
  20. "use strict";
  21.  
  22. let useModelSwitcher = localStorage.getItem("useModelSwitcher") !== "false";
  23. let selectedModel = localStorage.getItem("selectedModel") || "GPT-4 (Mobile)";
  24.  
  25. const modelMapping = {
  26. "GPT-3.5": "text-davinci-002-render-sha",
  27. "GPT-4": "gpt-4",
  28. "GPT-4 Web Browsing": "gpt-4-browsing",
  29. "GPT-4 Plugins": "gpt-4-plugins",
  30. "GPT-3.5 (Mobile)": "text-davinci-002-render-sha-mobile",
  31. "GPT-4 (Mobile)": "gpt-4-mobile",
  32. };
  33.  
  34. const arkoseTokenBda = btoa(JSON.stringify({ ct: "", iv: "", s: "" }));
  35. const arkoseTokenPublicKey = "35536E1E-65B4-4D96-9D97-6ADB7EFF8147";
  36. const arkoseTokenSite = "https://chat.openai.com";
  37. const arkoseTokenUserBrowser =
  38. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43";
  39. const arkoseTokenCapiVersion = "1.5.2";
  40. const arkoseTokenCapiMode = "lightbox";
  41. const arkoseTokenStyleTheme = "default";
  42. const arkoseTokenRnd = Math.random().toFixed(17);
  43. const arkoseTokenUrl =
  44. "https://tcr9i.chat.openai.com/fc/gt2/public_key/" + arkoseTokenPublicKey;
  45.  
  46. window.fetch = new Proxy(window.fetch, {
  47. apply: async function (target, that, args) {
  48. let resource = args[0];
  49. let options = args[1];
  50.  
  51. if (
  52. useModelSwitcher &&
  53. resource === "https://chat.openai.com/backend-api/conversation"
  54. ) {
  55. const requestBody = JSON.parse(options.body);
  56. requestBody.model = modelMapping[selectedModel];
  57.  
  58. if (
  59. requestBody.model.startsWith("gpt-4") &&
  60. requestBody.arkose_token === null
  61. ) {
  62. const formParams = new URLSearchParams();
  63. formParams.append("bda", arkoseTokenBda);
  64. formParams.append("public_key", arkoseTokenPublicKey);
  65. formParams.append("site", arkoseTokenSite);
  66. formParams.append("userbrowser", arkoseTokenUserBrowser);
  67. formParams.append("capi_version", arkoseTokenCapiVersion);
  68. formParams.append("capi_mode", arkoseTokenCapiMode);
  69. formParams.append("style_theme", arkoseTokenStyleTheme);
  70. formParams.append("rnd", arkoseTokenRnd);
  71.  
  72. try {
  73. const response = await fetch(arkoseTokenUrl, {
  74. method: "POST",
  75. headers: {
  76. "Content-Type":
  77. "application/x-www-form-urlencoded; charset=UTF-8",
  78. },
  79. body: formParams,
  80. });
  81. if (response.ok) {
  82. const data = await response.json();
  83. requestBody.arkose_token = data.token;
  84. }
  85. } catch (error) {
  86. console.error("Error occurred when fetching ArkoseToken.", error);
  87. return Promise.reject(error);
  88. }
  89. }
  90.  
  91. options = { ...options, body: JSON.stringify(requestBody) };
  92. args[0] = resource;
  93. args[1] = options;
  94. }
  95.  
  96. const fetchPromise = Reflect.apply(target, that, args);
  97.  
  98. if (
  99. resource.includes(
  100. "https://chat.openai.com/backend-api/models?history_and_training_disabled=false"
  101. )
  102. ) {
  103. return fetchPromise.then((response) => {
  104. if (response.ok) {
  105. response
  106. .clone()
  107. .json()
  108. .then((data) => {
  109. const accessibleModels = data.models.map((model) => model.slug);
  110. Object.keys(modelMapping).forEach((model) => {
  111. const mappedSlug = modelMapping[model];
  112. const selectOption = document.querySelector(
  113. `#modelSelect option[value="${model}"]`
  114. );
  115. if (selectOption && !accessibleModels.includes(mappedSlug)) {
  116. selectOption.disabled = true;
  117. if (selectedModel === model) {
  118. selectedModel = "GPT-3.5";
  119. localStorage.setItem("selectedModel", selectedModel);
  120. document.querySelector("#modelSelect").value =
  121. selectedModel;
  122. }
  123. }
  124. });
  125. });
  126. }
  127. return response;
  128. });
  129. }
  130. return fetchPromise;
  131. },
  132. });
  133.  
  134. function createSwitchElement() {
  135. const switchLabel = document.createElement("label");
  136. switchLabel.className = "switch";
  137. switchLabel.title = "Check to enable the model switcher";
  138.  
  139. const switchCheckbox = document.createElement("input");
  140. switchCheckbox.type = "checkbox";
  141. switchCheckbox.id = "useModelSwitcherCheckbox";
  142. switchCheckbox.checked = useModelSwitcher;
  143. switchCheckbox.addEventListener("change", (event) => {
  144. useModelSwitcher = event.target.checked;
  145. localStorage.setItem("useModelSwitcher", useModelSwitcher);
  146. });
  147.  
  148. const switchSlider = document.createElement("span");
  149. switchSlider.className = "slider round";
  150.  
  151. switchLabel.appendChild(switchCheckbox);
  152. switchLabel.appendChild(switchSlider);
  153.  
  154. return switchLabel;
  155. }
  156.  
  157. function createModelSelectElement() {
  158. const selectContainer = document.createElement("div");
  159. selectContainer.style.position = "relative";
  160.  
  161. const select = document.createElement("select");
  162. select.id = "modelSelect";
  163. select.addEventListener("change", (event) => {
  164. selectedModel = event.target.value;
  165. localStorage.setItem("selectedModel", selectedModel);
  166. });
  167.  
  168. for (const model in modelMapping) {
  169. const option = document.createElement("option");
  170. option.text = model;
  171. option.value = model;
  172. select.appendChild(option);
  173. }
  174.  
  175. select.value = selectedModel;
  176.  
  177. const selectArrow = document.createElement("div");
  178. selectArrow.style.cssText = `
  179. position: absolute;
  180. top: 50%;
  181. right: 8px;
  182. transform: translateY(-50%);
  183. width: 12px;
  184. height: 12px;
  185. background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23333" width="18px" height="18px"%3E%3Cpath d="M7 10l5 5 5-5z"/%3E%3Cpath d="M0 0h24v24H0z" fill="none"/%3E%3C/svg%3E');
  186. background-repeat: no-repeat;
  187. background-position: center;
  188. pointer-events: none;
  189. `;
  190.  
  191. selectContainer.appendChild(select);
  192. selectContainer.appendChild(selectArrow);
  193.  
  194. return selectContainer;
  195. }
  196.  
  197. function createModelSwitcherContainer() {
  198. const container = document.createElement("div");
  199. container.style.cssText = `
  200. position: fixed;
  201. top: 10px;
  202. right: 18px;
  203. background-color: rgb(32, 33, 35);
  204. border: 1px solid #ddd;
  205. padding: 10px;
  206. border-radius: 5px;
  207. z-index: 9999;
  208. transition: 0.3s;
  209. box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  210. display: flex;
  211. align-items: center;
  212. opacity: 0.5;
  213. `;
  214.  
  215. container.addEventListener("mouseenter", () => {
  216. container.style.opacity = "1";
  217. });
  218.  
  219. container.addEventListener("mouseleave", () => {
  220. container.style.opacity = "0.5";
  221. });
  222.  
  223. const switchElement = createSwitchElement();
  224. const modelSelectElement = createModelSelectElement();
  225.  
  226. container.appendChild(switchElement);
  227. container.appendChild(modelSelectElement);
  228.  
  229. return container;
  230. }
  231.  
  232. const container = createModelSwitcherContainer();
  233. document.body.appendChild(container);
  234.  
  235. const style = document.createElement("style");
  236. style.textContent = `
  237. .switch {
  238. position: relative;
  239. display: inline-block;
  240. width: 40px;
  241. height: 20px;
  242. margin-right: 10px;
  243. }
  244.  
  245. .switch input {
  246. opacity: 0;
  247. width: 0;
  248. height: 0;
  249. }
  250.  
  251. .slider {
  252. position: absolute;
  253. cursor: pointer;
  254. top: 0;
  255. left: 0;
  256. right: 0;
  257. bottom: 0;
  258. background-color: #ccc;
  259. transition: .5s;
  260. border-radius: 35px;
  261. }
  262.  
  263. .slider:before {
  264. position: absolute;
  265. content: "";
  266. height: 16px;
  267. width: 16px;
  268. left: 2px;
  269. bottom: 2px;
  270. background-color: white;
  271. transition: .5s;
  272. border-radius: 50%;
  273. }
  274.  
  275. input:checked + .slider {
  276. background-color: #2196F3;
  277. }
  278.  
  279. input:focus + .slider {
  280. box-shadow: 0 0 1px #2196F3;
  281. }
  282.  
  283. input:checked + .slider:before {
  284. transform: translateX(20px);
  285. }
  286.  
  287. .slider.round {
  288. border-radius: 35px;
  289. }
  290.  
  291. .slider.round:before {
  292. border-radius: 50%;
  293. }
  294.  
  295. select {
  296. color: #000000;
  297. background-color: #ffffff;
  298. padding: 5px;
  299. border: none;
  300. border-radius: 5px;
  301. appearance: none;
  302. -webkit-appearance: none;
  303. -moz-appearance: none;
  304. background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23333" width="18px" height="18px"%3E%3Cpath d="M7 10l5 5 5-5z"/%3E%3Cpath d="M0 0h24v24H0z" fill="none"/%3E%3C/svg%3E');
  305. background-repeat: no-repeat;
  306. background-position: right center;
  307. padding-right: 20px;
  308. text-overflow: ellipsis;
  309. white-space: nowrap;
  310. overflow: hidden;
  311. }
  312. `;
  313.  
  314. document.head.appendChild(style);
  315. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址