ChatGPT /s => /search alias
// ==UserScript==
// @name ChatGPT /s => /search
// @namespace https://greasyfork.org/en/users/1337417-mevanlc
// @version 1.0
// @description ChatGPT /s => /search alias
// @author https://greasyfork.org/en/users/1337417-mevanlc
// @match https://chatgpt.com/*
// @grant unsafeWindow
// @license MIT
// @run-at document-start
// ==/UserScript==
(function () {
const TARGET_URL = 'https://chatgpt.com/backend-api/system_hints';
const realFetch = window.fetch.bind(window);
unsafeWindow.fetch = async function (input, init) {
const url = (typeof input === 'string') ? input : (input && input.url) || '';
if (url !== TARGET_URL) {
return realFetch(input, init);
}
let response;
try {
response = await realFetch(input, init);
} catch (err) {
throw err;
}
if (!response.ok) return response;
const originalText = await response.text();
function modifyResponse() {
// { "system_hints": [ { "system_hint": "search", "aliases": [] }, ... ] }
// ===> transform to ===>
// { "system_hints": [ { "system_hint": "search", "aliases": ["search", "s"] }, ... ] }
try {
if (!originalText) {
console.warn('Empty response text');
return originalText;
}
const data = JSON.parse(originalText);
if (!data) { throw new Error('Parse failed: ' + originalText); }
if (!data.system_hints || !Array.isArray(data.system_hints)) {
throw new Error('No system_hints array: ' + originalText);
}
for (const hintObj of data.system_hints) {
if (hintObj.system_hint === 'search') {
if (!Array.isArray(hintObj.aliases)) {
hintObj.aliases = [];
}
if (!hintObj.aliases.includes('search')) {
hintObj.aliases.push('search');
}
if (!hintObj.aliases.includes('s')) {
hintObj.aliases.push('s');
}
}
}
return JSON.stringify(data);
} catch (err) {
console.error('Error modifying response text:', err);
}
return originalText;
}
let modifiedText = modifyResponse();
const headers = new Headers(response.headers);
headers.delete('content-length');
headers.delete('transfer-encoding');
headers.delete('content-encoding');
return new Response(modifiedText, {
status: response.status,
statusText: response.statusText,
headers
});
};
})();