Skip to content

Commit 457aa8e

Browse files
committed
fix:Cloudflare cookie support
1 parent a03c597 commit 457aa8e

File tree

5 files changed

+92
-32
lines changed

5 files changed

+92
-32
lines changed

iChatGPT.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@
492492
CODE_SIGN_IDENTITY = "Apple Development";
493493
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
494494
CODE_SIGN_STYLE = Manual;
495-
CURRENT_PROJECT_VERSION = 2022.12.10;
495+
CURRENT_PROJECT_VERSION = 2022.12.13;
496496
DEVELOPMENT_ASSET_PATHS = "\"iChatGPT/Preview Content\"";
497497
DEVELOPMENT_TEAM = "";
498498
ENABLE_PREVIEWS = YES;
@@ -510,7 +510,7 @@
510510
"$(inherited)",
511511
"@executable_path/Frameworks",
512512
);
513-
MARKETING_VERSION = 1.1.0;
513+
MARKETING_VERSION = 1.1.1;
514514
PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.iChatGPT;
515515
PRODUCT_NAME = "$(TARGET_NAME)";
516516
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -532,7 +532,7 @@
532532
CODE_SIGN_IDENTITY = "Apple Development";
533533
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
534534
CODE_SIGN_STYLE = Manual;
535-
CURRENT_PROJECT_VERSION = 2022.12.10;
535+
CURRENT_PROJECT_VERSION = 2022.12.13;
536536
DEVELOPMENT_ASSET_PATHS = "\"iChatGPT/Preview Content\"";
537537
DEVELOPMENT_TEAM = "";
538538
ENABLE_PREVIEWS = YES;
@@ -550,7 +550,7 @@
550550
"$(inherited)",
551551
"@executable_path/Frameworks",
552552
);
553-
MARKETING_VERSION = 1.1.0;
553+
MARKETING_VERSION = 1.1.1;
554554
PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.iChatGPT;
555555
PRODUCT_NAME = "$(TARGET_NAME)";
556556
PROVISIONING_PROFILE_SPECIFIER = "";

iChatGPT/ChatInputView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ struct ChatInputView: View {
4444
.padding(.trailing, 8)
4545

4646
if #available(iOS 15.0, *) {
47-
serachBar.submitLabel(.search)
47+
serachBar.submitLabel(.send)
4848
} else {
4949
serachBar
5050
}

iChatGPT/Models/AIChatModel.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import Foundation
1010

11+
let ChatGPTUserAgentKey = "ChatGPTUserAgentKey"
12+
let ChatGPTCfClearanceKey = "ChatGPTCfClearanceKey"
1113
let ChatGPTSessionTokenKey = "ChatGPTSessionTokenKey"
1214

1315
// MARK: - Welcome1
@@ -54,7 +56,9 @@ class AIChatModel: ObservableObject {
5456

5557
func reloadChatbot() {
5658
isRefreshSession = false
59+
let userAgent = UserDefaults.standard.string(forKey: ChatGPTUserAgentKey) ?? ""
60+
let cfClearance = UserDefaults.standard.string(forKey: ChatGPTCfClearanceKey) ?? ""
5761
let chatGPTSessionToken = UserDefaults.standard.string(forKey: ChatGPTSessionTokenKey) ?? ""
58-
bot = Chatbot(sessionToken: chatGPTSessionToken)
62+
bot = Chatbot(sessionToken: chatGPTSessionToken, cfClearance: cfClearance, userAgent: userAgent)
5963
}
6064
}

iChatGPT/Models/ChatGPT.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,25 @@ import Combine
1313
class Chatbot {
1414

1515
let apUrl = "https://chat.openai.com/"
16+
let cfClearanceKey = "cf_clearance"
1617
let sessionTokenKey = "__Secure-next-auth.session-token"
1718
let timeout = 20
1819
/// Code=-1001 "The request timed out."
1920
/// Code=-1017 "cannot parse response"
2021
/// Code=-1009 "The Internet connection appears to be offline."
2122
let errorCodes = [-1001, -1017, -1009]
22-
var sessionToken: String
23+
var sessionToken: String
24+
var cfClearance: String
25+
var userAgent: String?
2326
var authorization = ""
2427
var conversationId = ""
2528
var parentId = ""
2629
var userAvatarUrl = ""
2730

28-
init(sessionToken: String) {
31+
init(sessionToken: String, cfClearance: String, userAgent: String?) {
2932
self.sessionToken = sessionToken
33+
self.cfClearance = cfClearance
34+
self.userAgent = userAgent
3035
Task {
3136
await refreshSession()
3237
}
@@ -36,9 +41,10 @@ class Chatbot {
3641
return [
3742
"Host": "chat.openai.com",
3843
"Accept": "text/event-stream",
39-
"Authorization": "Bearer \(self.authorization)",
44+
"Authorization": "Bearer \(self.authorization)",
45+
"Cookie": "\(cfClearanceKey)=\(self.cfClearance)",
4046
"Content-Type": "application/json",
41-
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15",
47+
"User-Agent": self.userAgent ?? "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15",
4248
"X-Openai-Assistant-App-Id": "",
4349
"Connection": "keep-alive",
4450
"Accept-Language": "zh-CN,zh-Hans;en-US,en;q=0.9",
@@ -70,13 +76,14 @@ class Chatbot {
7076
}
7177

7278
func refreshSession(retry: Int = 1) async {
73-
let cookies = "\(sessionTokenKey)=\(self.sessionToken)"
79+
let cookies = "\(cfClearanceKey)=\(self.cfClearance); \(sessionTokenKey)=\(self.sessionToken)"
7480
let url = self.apUrl + "api/auth/session"
7581
let userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15"
7682
var request = URLRequest(url: URL(string: url)!)
7783
request.httpMethod = "GET"
78-
request.addValue(userAgent, forHTTPHeaderField: "User-Agent")
84+
request.addValue(self.userAgent ?? userAgent, forHTTPHeaderField: "User-Agent")
7985
request.addValue(cookies, forHTTPHeaderField: "Cookie")
86+
request.httpShouldHandleCookies = true
8087
do {
8188
let (data, response) = try await URLSession.shared.data(for: request)
8289
let json = try JSONSerialization.jsonObject(with: data, options: [])
@@ -117,7 +124,7 @@ class Chatbot {
117124
let url = self.apUrl + "backend-api/conversation"
118125
var request = URLRequest(url: URL(string: url)!)
119126
request.httpMethod = "POST"
120-
request.allHTTPHeaderFields = headers()
127+
request.allHTTPHeaderFields = headers()
121128
let dict = getPayload(prompt: prompt)
122129
do {
123130
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: [])

iChatGPT/TokenSettingView.swift

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ struct TokenSettingView: View {
1212

1313
@Binding var isAddPresented: Bool
1414
@StateObject var chatModel: AIChatModel
15-
@State private var text: String = ""
16-
@State private var error: String = ""
15+
@State private var sessionToken: String = ""
16+
@State private var cfClearance: String = ""
17+
@State private var userAgent: String = ""
18+
@State private var sError: String = ""
19+
@State private var cError: String = ""
20+
@State private var uError: String = ""
1721

1822
private let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
1923
private let appSubVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
@@ -39,32 +43,77 @@ struct TokenSettingView: View {
3943

4044
VStack(alignment: .leading) {
4145
Text("Session Token:")
42-
MultilineTextField("请输入 Session Token", text: $text, maxHeight: 300, onCommit: {
43-
#if DEBUG
44-
print("Final text: \(text)")
45-
#endif
46-
})
47-
.overlay(RoundedRectangle(cornerRadius: 5)
48-
.stroke(Color.secondary))
46+
let sTextField = TextField(" 请输入 session_token", text: $sessionToken)
47+
.frame(height: 40)
48+
.overlay(RoundedRectangle(cornerRadius: 5)
49+
.stroke(Color(.tertiaryLabel)))
4950

50-
if error.count > 0 && text.count == 0 {
51-
Text(error)
51+
if #available(iOS 15.0, *) {
52+
sTextField.submitLabel(.done)
53+
}
54+
55+
if sError.count > 0 && sessionToken.isEmpty {
56+
Text(sError)
57+
.foregroundColor(.red)
58+
}
59+
60+
Text("Cf Clearance:")
61+
.padding(.top, 15)
62+
let cTextField = TextField(" 请输入 cf_clearance", text: $cfClearance)
63+
.frame(height: 40)
64+
.overlay(RoundedRectangle(cornerRadius: 5)
65+
.stroke(Color.secondary))
66+
67+
if #available(iOS 15.0, *) {
68+
cTextField.submitLabel(.done)
69+
}
70+
71+
if cError.count > 0 && cfClearance.isEmpty {
72+
Text(cError)
73+
.foregroundColor(.red)
74+
}
75+
76+
Text("User Agent:")
77+
.padding(.top, 15)
78+
let uTextField = TextField(" 请输入 user_agent", text: $userAgent)
79+
.frame(height: 40)
80+
.overlay(RoundedRectangle(cornerRadius: 5)
81+
.stroke(Color.secondary))
82+
83+
if #available(iOS 15.0, *) {
84+
uTextField.submitLabel(.done)
85+
}
86+
87+
if uError.count > 0 && userAgent.isEmpty {
88+
Text(uError)
5289
.foregroundColor(.red)
90+
.padding(.bottom, 10)
5391
}
5492
}
5593
.padding([.leading, .trailing], 20)
5694

5795
Spacer()
5896
Button(action: {
59-
if text.isEmpty {
60-
error = "Session Token 不能为空!"
61-
} else {
62-
UserDefaults.standard.set(text, forKey: ChatGPTSessionTokenKey)
63-
isAddPresented = false
64-
chatModel.isRefreshSession = true
97+
guard !sessionToken.isEmpty else {
98+
sError = "Session Token 不能为空!"
99+
return
100+
}
101+
guard !cfClearance.isEmpty else {
102+
cError = "Cf Clearance 不能为空!"
103+
return
65104
}
105+
guard !userAgent.isEmpty else {
106+
uError = "User Agent 不能为空!"
107+
return
108+
}
109+
110+
UserDefaults.standard.set(sessionToken, forKey: ChatGPTSessionTokenKey)
111+
UserDefaults.standard.set(cfClearance, forKey: ChatGPTCfClearanceKey)
112+
UserDefaults.standard.set(userAgent, forKey: ChatGPTUserAgentKey)
113+
isAddPresented = false
114+
chatModel.isRefreshSession = true
66115
}) {
67-
Text("确认")
116+
Text("保存")
68117
.font(.title3)
69118
.foregroundColor(.blue)
70119
.padding([.leading, .trailing], 20)
@@ -83,7 +132,7 @@ struct TokenSettingView: View {
83132
.font(.footnote)
84133
.foregroundColor(.secondary)
85134
.multilineTextAlignment(.center)
86-
.padding(.bottom, 5)
135+
.padding(.bottom, 25)
87136
}
88137
}
89138
}

0 commit comments

Comments
 (0)