Skip to content

Commit 0b4ea16

Browse files
authored
Enhance dynamic model support and optimize user agent handling (#266)
* feat: 更新 ConvertToString 函数以支持动态模型,并添加相关测试用例 * feat: 更新 HandlerTTS 函数以支持流式数据解析,并添加相关单元测试 * fix: 移除不再需要的 funcaptcha 依赖 * refactor: 替换固定UA为随机浏览器UA,优化指纹多样性 - 新增util包的RandomUserAgent函数,生成主流桌面浏览器随机UA - 替换所有硬编码userAgent为defaultUserAgent()调用 - 为客户端状态加入UserAgent字段并初始化随机UA - 重构prooftoken模块,适配新的随机UA和POW逻辑
1 parent 7fdc14a commit 0b4ea16

13 files changed

Lines changed: 306 additions & 62 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ tools/authenticator/.proxies.txt.swp
1414
/target/
1515
/bin/
1616
.claude
17-
.gocache
17+
.gocache
18+
.atomcode
19+
CLAUDE.md

conversion/response/chatgpt/convert.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,22 @@ import (
99
)
1010

1111
func ConvertToString(chatgpt_response *chatgpt_types.ChatGPTResponse, previous_text *typings.StringStruct, role bool, model string) string {
12-
translated_response := official_types.NewChatCompletionChunk(strings.Replace(chatgpt_response.Message.Content.Parts[0].(string), previous_text.Text, "", 1), model)
12+
currentText := firstTextPart(chatgpt_response.Message.Content.Parts)
13+
deltaText := strings.Replace(currentText, previous_text.Text, "", 1)
14+
translated_response := official_types.NewChatCompletionChunk(deltaText, model)
1315
if role {
1416
translated_response.Choices[0].Delta.Role = chatgpt_response.Message.Author.Role
15-
} else if translated_response.Choices[0].Delta.Content == "" || (strings.HasPrefix(chatgpt_response.Message.Metadata.ModelSlug, "gpt-4") && translated_response.Choices[0].Delta.Content == "【") {
17+
} else if translated_response.Choices[0].Delta.Content == "" || translated_response.Choices[0].Delta.Content == "【" {
1618
return translated_response.Choices[0].Delta.Content
1719
}
18-
previous_text.Text = chatgpt_response.Message.Content.Parts[0].(string)
20+
previous_text.Text = currentText
1921
return "data: " + translated_response.String() + "\n\n"
2022
}
23+
24+
func firstTextPart(parts []interface{}) string {
25+
if len(parts) == 0 {
26+
return ""
27+
}
28+
text, _ := parts[0].(string)
29+
return text
30+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package chatgpt
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"aurora/typings"
8+
chatgpt_types "aurora/typings/chatgpt"
9+
)
10+
11+
func TestConvertToStringUsesRequestModel(t *testing.T) {
12+
previous := &typings.StringStruct{}
13+
response := chatgpt_types.ChatGPTResponse{
14+
Message: chatgpt_types.Message{
15+
Author: chatgpt_types.Author{Role: "assistant"},
16+
Content: chatgpt_types.Content{
17+
Parts: []interface{}{"hello"},
18+
},
19+
},
20+
}
21+
22+
data := ConvertToString(&response, previous, true, "gpt-5-5-pro")
23+
24+
var event struct {
25+
Model string `json:"model"`
26+
}
27+
if err := json.Unmarshal([]byte(data[len("data: "):len(data)-2]), &event); err != nil {
28+
t.Fatalf("invalid SSE JSON: %v", err)
29+
}
30+
if event.Model != "gpt-5-5-pro" {
31+
t.Fatalf("model = %q, want request model", event.Model)
32+
}
33+
}
34+
35+
func TestConvertToStringWaitsSourceMarkerForAnyModel(t *testing.T) {
36+
previous := &typings.StringStruct{Text: "answer"}
37+
response := chatgpt_types.ChatGPTResponse{
38+
Message: chatgpt_types.Message{
39+
Author: chatgpt_types.Author{Role: "assistant"},
40+
Content: chatgpt_types.Content{
41+
Parts: []interface{}{"answer【"},
42+
},
43+
Metadata: chatgpt_types.Metadata{ModelSlug: "gpt-5-5-pro"},
44+
},
45+
}
46+
47+
data := ConvertToString(&response, previous, false, "gpt-5-5-pro")
48+
49+
if data != "【" {
50+
t.Fatalf("data = %q, want source marker only", data)
51+
}
52+
}

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ require (
1414
github.com/gorilla/websocket v1.5.3
1515
github.com/joho/godotenv v1.5.1
1616
github.com/pkoukk/tiktoken-go v0.1.7
17-
github.com/xqdoo00o/funcaptcha v0.0.0-20240403090732-1b604d808f6c
1817
golang.org/x/crypto v0.52.0
1918
)
2019

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
113113
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
114114
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
115115
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
116-
github.com/xqdoo00o/funcaptcha v0.0.0-20240403090732-1b604d808f6c h1:nj17XsSTwprsZUDXLldOUZmqz7VlHsLCeXXFOE6Q+Mk=
117-
github.com/xqdoo00o/funcaptcha v0.0.0-20240403090732-1b604d808f6c/go.mod h1:7aCyoW5MHDUsoooMVLqKe0F7W9HMPUvDG3bXqw++8XA=
118116
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
119117
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
120118
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=

initialize/handlers.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -951,29 +951,29 @@ func (h *Handler) tts(c *gin.Context) {
951951
}
952952

953953
client := bogdanfinn.NewStdClient()
954-
turnStile, status, err := h.initTurnStileWithRetry(&client, &secret, proxyUrl)
955-
if err != nil {
956-
c.JSON(status, gin.H{
957-
"message": err.Error(),
958-
"type": "InitTurnStile_request_error",
959-
"param": err,
960-
"code": status,
961-
})
962-
return
963-
}
964954

965955
// Convert the chat request to a ChatGPT request
966956
translated_request := chatgptrequestconverter.ConvertTTSAPIRequest(original_request.Input)
957+
clientState := chatgpt.NewChatClientState()
958+
clientState.ConversationID = translated_request.ConversationID
959+
clientState.ParentMessageID = translated_request.ParentMessageID
967960

968-
response, err := chatgpt.POSTconversation(client, translated_request, secret, turnStile, proxyUrl)
961+
response, wsConn, status, err := h.postConversationGptClientOrder(&client, &secret, translated_request, proxyUrl, false, clientState)
969962
if err != nil {
970-
c.JSON(500, gin.H{
971-
"error": "error sending request",
972-
})
963+
c.JSON(status, gin.H{"error": gin.H{
964+
"message": err.Error(),
965+
"type": "request_conversion_error",
966+
"param": "model",
967+
"code": "request_conversion_error",
968+
}})
973969
return
974970
}
975971
defer response.Body.Close()
976972
if chatgpt.Handle_request_error(c, response) {
973+
if wsConn != nil {
974+
wsConn.Close()
975+
wsConn = nil
976+
}
977977
return
978978
}
979979
msgId, convId := chatgpt.HandlerTTS(response, original_request.Input)

internal/chatgpt/artifact_delivery.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func DownloadURLBytes(client httpclient.AuroraHttpClient, url string, secret *to
238238
if secret != nil && secret.PUID != "" {
239239
header.Set("Cookie", "_puid="+secret.PUID+";")
240240
}
241-
header.Set("User-Agent", userAgent)
241+
header.Set("User-Agent", defaultUserAgent())
242242
if accept == "" {
243243
accept = "*/*"
244244
}

internal/chatgpt/client_state.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import (
44
"math"
55
"time"
66

7-
chatgpt_types "aurora/typings/chatgpt"
8-
7+
browser "github.com/EDDYCJY/fake-useragent"
98
"github.com/google/uuid"
9+
10+
chatgpt_types "aurora/typings/chatgpt"
1011
)
1112

1213
type ChatClientState struct {
@@ -16,6 +17,7 @@ type ChatClientState struct {
1617
ConversationID string
1718
ParentMessageID string
1819
TurnCount int
20+
UserAgent string
1921
}
2022

2123
func NewChatClientState() *ChatClientState {
@@ -24,6 +26,7 @@ func NewChatClientState() *ChatClientState {
2426
SessionID: uuid.NewString(),
2527
StartTime: time.Now(),
2628
ParentMessageID: "client-created-root",
29+
UserAgent: browser.Random(),
2730
}
2831
}
2932

internal/chatgpt/files.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func putUpload(client httpclient.AuroraHttpClient, uploadURL, contentType string
152152
header.Set("x-ms-version", "2020-04-08")
153153
header.Set("Origin", "https://chatgpt.com")
154154
header.Set("Referer", "https://chatgpt.com/")
155-
header.Set("User-Agent", userAgent)
155+
header.Set("User-Agent", defaultUserAgent())
156156
header.Set("Accept", "application/json, text/plain, */*")
157157
header.Set("Accept-Language", "en-US,en;q=0.8")
158158
response, err := client.Request(http.MethodPut, uploadURL, header, nil, bytes.NewReader(data))

0 commit comments

Comments
 (0)