-
Notifications
You must be signed in to change notification settings - Fork 17
/
gizmo_switch_script.js
140 lines (120 loc) · 5.36 KB
/
gizmo_switch_script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// ==UserScript==
// @name @GPTs
// @namespace http://tampermonkey.net/
// @version 0.2
// @description @GPTs 的自助实现方法
// @author ElfeXu (公众号:南瓜博士)
// @match https://chat.openai.com/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// 在这个列表里添加你想要用 & 唤起的 gizmo
// 每条记录一行,都用逗号分隔
// 记录的 : 前面是唤起词,不需要拘泥于原来的名字,怎么简便怎么来就好
// :后面是 gizmo id,可以通过 url 找到 gizmo id
// 例如 https://chat.openai.com/g/g-SUOFbmGvx-cool-teacher Cool taecher 的 id 是 g-SUOFbmGvx
// 如下设置后就可以用 &老师 来唤起
var nameIdMap = {
'老师': 'g-SUOFbmGvx',
'画1':'g-rzeBPKJPI',
'画2':'g-Qs1wbwJEP',
};
var gizmoId = '';
// 覆写全局的 fetch 方法
var originalFetch = window.fetch;
window.fetch = function(resource, init) {
// 检查 URL 是否匹配
if (resource === 'https://chat.openai.com/backend-api/conversation') {
console.log("原始 Fetch 请求信息:", init);
// 修改请求的 init 参数
var modifiedInit = modifyFetchRequest(init);
console.log("修改后的 Fetch 请求信息:", modifiedInit);
return originalFetch(resource, modifiedInit);
} else {
// 对于其他 URL,正常发送
return originalFetch(resource, init);
}
};
function modifyFetchRequest(init) {
if (init && init.body) {
var data = JSON.parse(init.body);
// 检查 messages 数组的最后一条内容的 content 字段的 parts[0]
var messages = data.messages;
if (messages && messages.length > 0) {
var lastMessage = messages[messages.length - 1];
var content = lastMessage.content;
if (content && content.parts && content.parts.length > 0) {
var text = content.parts[0];
// 检查是否以 & 或 @ 开头, 或者 gizmoId 变量不为空
if (text.startsWith('&') || text.startsWith('@')) {
// 读取第一个空格之前的内容
var name = text.split(' ')[0].substring(1);
// 查找 & 的 name 所对应的 id
if (name in nameIdMap) {
gizmoId = nameIdMap[name]; // 更新对话的 gizmo
} else {
if (name == '&' || name == '@') { // 用 && 或 @@ 还原到无 gizmo 的状态
gizmoId = '';
} else {
// 如果是 g-SkylzRegk 这样的形式
if (name.startsWith('g-') && name.length == 11) {
gizmoId = name;
}
}
}
} else {
//类似 https://chat.openai.com/g/g-Qhd148tN3-sui-shou-ji 这样的字符串,提取出其中 g-xxxxxx 的部分,共11个字符
if (text.startsWith('https://chat.openai.com/g/')) {
gizmoId = text.substring(26, 37);
}
}
if (gizmoId) {
// 找到 id,进行修改
data.model = 'gpt-4-gizmo';
data.conversation_mode = {
"kind": "gizmo_interaction",
"gizmo_id": gizmoId
};
}
}
}
// 将修改后的 JSON 对象转换回字符串
init.body = JSON.stringify(data);
}
return init;
}
(function(history){
var pushState = history.pushState;
var replaceState = history.replaceState;
history.pushState = function(state, title, url) {
var oriUrl = window.location.href;
var newUrl = url ? new URL(url, window.location.origin).href : oriUrl;
// 执行URL变化后的操作
onUrlChange(oriUrl, newUrl);
return pushState.apply(history, arguments);
};
history.replaceState = function(state, title, url) {
var oriUrl = window.location.href;
var newUrl = url ? new URL(url, window.location.origin).href : oriUrl;
// 执行URL变化后的操作
onUrlChange(oriUrl, newUrl);
return replaceState.apply(history, arguments);
};
})(window.history);
// 当URL变化时执行的函数
function onUrlChange(oriUrl, newUrl) {
console.log(`URL has changed from ${oriUrl} to ${newUrl}`);
// 将 oriUrl 与 '/c/' 拼接。如果 oriUrl 最后的有 '/' 要先去掉
oriUrl = (oriUrl.endsWith('/') ? oriUrl.slice(0, -1) : oriUrl) + '/c/';
if (newUrl.startsWith(oriUrl)) {
console.log('New ID generated');
// 这种情况下不重置 gizmo id
} else {
// 其他情况下重置 gizmo id
console.log('切换对话,重置 gizmo id');
gizmoId = '';
}
}
})();