一、前言
关于 ChatGPT 的话题,大家都不陌生,我们直入话题,因为 ChatGPT 目前限制中国访问服务,所以如果直接使用 ChatGPT 网页进行对话,还是不太方便。通过 ChatGPT SessionToken 就可以不限制网络访问,所以大家发挥想象力实现各种的聊天机器人、小程序,而原生 app 可能体验更好!所以就有了 iChatGPT!一款用 SwiftUI 实现的开源 ChatGPT app,欢迎大家关注和提 PR。
二、iChatGPT
GitHub 开源地址:https://github.com/37iOS/iChatGPT
目前 v1.0.0,实现 ChatGPT 基本聊天功能:
- 可以直接与 ChatGPT 对话,并且保留上下文;
- 可以复制问题和回答内容;
- 可以快捷重复提问等
支持系统:
- iOS 14.0+
- iPadOS 14.0+
- macOS 11.0+
三、App 使用介绍
首先,需要点击 app 右上角图标,添加 ChatGPT SessionToken
密钥才能使用,否则无法请求。
获取 SessionToken
的方法很多,其中浏览器方法:
- 登录 https://chat.openai.com/chat
- 按 F12 打开控制台(macOS 可以用快捷键
command + option + I
) - 切换到 Application(应用) 选项卡,找到 Cookies (Safari 浏览器是
储存空间
选项卡) - 复制
__Secure-next-auth.session-token
的值,添加到 app 后确认。
操作的界面如下:
四、App 实现介绍
使用 SwiftUI 大概几个小时就完成所有的工作,方便跟苹果生态实现。实现的难点就可能就是模拟 ChatGPT 请求过程。目前是根据 A-kirami/nonebot-plugin-chatgpt 项目中的 python 实现,用 Swift 重写了一次,而 ChatGPT 登陆暂时没有实现,大家可以提 pr。
最后封装的网络请求类 ChatGPT.swift
class Chatbot {
let apUrl = "https://chat.openai.com/"
let sessionTokenKey = "__Secure-next-auth.session-token"
let timeout = 30
var sessionToken: String
var authorization = ""
var conversationId = ""
var parentId = ""
let id = ""
init(sessionToken: String) {
self.sessionToken = sessionToken
}
func headers() -> [String: String] {
return [
"Host": "chat.openai.com",
"Accept": "text/event-stream",
"Authorization": "Bearer \(self.authorization)",
"Content-Type": "application/json",
"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",
"X-Openai-Assistant-App-Id": "",
"Connection": "close",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://chat.openai.com/chat",
]
}
func getPayload(prompt: String) -> [String: Any] {
var body = [
"action": "next",
"messages": [
[
"id": "\(UUID().uuidString)",
"role": "user",
"content": ["content_type": "text", "parts": [prompt]],
]
],
"parent_message_id": "