- Please stand by, while we are checking your browser.
- Access denied. Sorry, you have been blocked.
- ChatGPT is at capacity right now.
- This content may violate our content policy.
- Something went wrong.
拥有 ChatGPT 账号并使用科学上网工具访问官方服务的同学可能都遇到过很多以上这些问题。其中第二条最令人感到无助,出现这样的提示,并不代表账户被封了,而在于梯子 IP 被列入了黑名单,所以,只能到处找可用VPN,费时费力,更费钱。移动端访问更难。痛!
今天笔者就来给大家介绍一个新方法和工具,通过这个方法和工具,我们可以拿到 Access Token,通过 Access Token 你可以无需VPN 直接访问 ChatGPT 服务。当然,前提你需要具备一个 ChatGPT 账号。 Access Token 有效期 14 天,期间访问不需要梯子,这意味着你在手机上也可随意使用。没有 ChatGPT 账号的同学也不要着急,依然有方法可以帮助到你。
Pandora 项目
潘多拉实现了网页版 ChatGPT 的主要操作,除了能够帮助你不使用 VPN 访问 ChatGPT 服务以外,还能够通过后端优化的方法绕过 Cloudflare,速度喜人。
- 不想自己折腾的同学可以直接点击这里直接使用,这个页面上还包含一个共享账号的链接,没有账号的可以点进去体验一下。
- 通过这里拿到 Access Token。
- 或者使用账号在 ChatGPT 官网登录以后,到这里拿到 Access Token。 打开的内容是一组 json 格式数据,其中
accessToken
字段的那一长串内容即是Access Token
想自己搭建服务的同学继续往下看。
Pandora 项目地址
安装及使用方法
如何运行
-
Python版本目测起码要
3.7
-
pip安装运行
pip install pandora-chatgpt pandora
-
如果你想支持
gpt-3.5-turbo
模式:pip install 'pandora-chatgpt[api]' // 或者 pip install pandora-chatgpt[api] pandora
-
如果你想启用
cloud
模式:pip install 'pandora-chatgpt[cloud]' // 或者 pip install pandora-chatgpt[cloud] pandora-cloud
-
-
编译运行
pip install . pandora
-
如果你想支持
gpt-3.5-turbo
模式:pip install '.[api]' // 或者 pip install .[api] pandora
-
如果你想启用
cloud
模式:pip install '.[cloud]' // 或者 pip install .[cloud] pandora-cloud
-
-
Docker Hub运行
docker pull pengzhile/pandora docker run -it --rm pengzhile/pandora
-
Docker编译运行
docker build -t pandora . docker run -it --rm pandora
-
输入用户名密码登录即可,登录密码理论上不显示出来,莫慌。
-
简单而粗暴,不失优雅。
程序参数
- 可通过
pandora --help
查看。 -
-p
或--proxy
指定代理,格式:protocol://user:[email protected]:port
。 -
-t
或--token_file
指定一个存放Access Token
的文件,使用Access Token
登录。 -
-s
或--server
以http
服务方式启动,格式:ip:port
。 -
-a
或--api
使用gpt-3.5-turbo
API请求,你可能需要向OpenAI
支付费用。 -
--tokens_file
指定一个存放多Access Token
的文件,内容为{"key": "token"}
的形式。 -
--threads
指定服务启动的线程数,默认为8
,Cloud模式为4
。 -
--sentry
启用sentry
框架来发送错误报告供作者查错,敏感信息不会被发送。 -
-v
或--verbose
显示调试信息,且出错时打印异常堆栈信息,供查错使用。
Docker环境变量
-
PANDORA_ACCESS_TOKEN
指定Access Token
字符串。 -
PANDORA_TOKENS_FILE
指定一个存放多Access Token
的文件路径。 -
PANDORA_PROXY
指定代理,格式:protocol://user:[email protected]:port
。 -
PANDORA_SERVER
以http
服务方式启动,格式:ip:port
。 -
PANDORA_API
使用gpt-3.5-turbo
API请求,你可能需要向OpenAI
支付费用。 -
PANDORA_SENTRY
启用sentry
框架来发送错误报告供作者查错,敏感信息不会被发送。 -
PANDORA_VERBOSE
显示调试信息,且出错时打印异常堆栈信息,供查错使用。 - 使用Docker方式,设置环境变量即可,无视上述
程序参数
。
关于 Access Token
- 使用
Access Token
方式登录,可以无代理直连。 -
这个服务 可以帮你安全有效拿到
Access Token
,无论是否第三方登录。 - 其中
accessToken
字段的那一长串内容即是Access Token
。 -
Access Token
可以复制保存,其有效期目前为14天
。 - 不要泄露你的
Access Token
,使用它可以操纵你的账号。
HTTP服务文档
- 如果你以
http
服务方式启动,现在你可以打开一个极简版的ChatGPT
了。通过你指定的http://ip:port
来访问。 - 通过
http://ip:port/?token=xxx
,传递一个Token的名字,可以切换到对应的Access Token
。 - API文档见:doc/HTTP-API.md
操作命令
- 对话界面连敲两次
Enter
发送你的输入给ChatGPT
。 - 对话界面使用
/?
可以打印支持的操作命令。 -
/title
重新设置当前对话的标题。 -
/select
回到选择会话界面。 -
/reload
重新加载当前会话所有内容,F5
你能懂吧。 -
/regen
如果对ChatGPT
当前回答不满意,可以让它重新回答。 -
/continue
让ChatGPT
继续输出回复的剩余部分。 -
/edit
编辑你之前的一个提问。 -
/new
直接开启一个新会话。 -
/del
删除当前会话,回到会话选择界面。 -
/token
打印当前的Access Token
,也许你用得上,但不要泄露。 -
/copy
复制ChatGPT
上一次回复的内容到剪贴板。 -
/copy_code
复制ChatGPT
上一次回复的代码到剪贴板 -
/clear
清屏,应该不用解释。 -
/version
打印Pandora
的版本信息。 -
/exit
退出潘多拉
。
高阶设置
- 本部分内容不理解的朋友,请勿擅动!
- 环境变量
OPENAI_API_PREFIX
可以替换OpenAI Api的前缀https://api.openai.com
。 - 环境变量
CHATGPT_API_PREFIX
可以替换ChatGPT Api的前缀https://ai.fakeopen.com
。 - 如果你想持久存储
Docker
中Pandora
产生的数据,你可以挂载宿主机目录至/data
。 - 如果你在国内使用
pip
安装缓慢,可以考虑切换至腾讯的源:pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple
- 镜像同步版本可能不及时,如果出现这种情况建议切换至官方源:
pip config set global.index-url https://pypi.org/simple
- 默认使用
sqlite3
存储会话数据,如果你希望更换至mysql
,可以这么做:- 执行
pip install PyMySQL
安装驱动。 - 设置环境变量:
DATABASE_URI
为类似mysql+pymysql://user:[email protected]/dbname
的连接字符串。
- 执行
- 环境变量指定
OPENAI_EMAIL
可以替代登录输入用户名,OPENAI_PASSWORD
则可以替代输入密码,OPENAI_MFA_CODE
则可以替代输入二次验证。 - 环境变量
API_SYSTEM_PROMPT
可以替换api
模式下的系统prompt
。
Cloud模式
- 搭建一个跟官方很像的
ChatGPT
服务,不能说很像,只能说一样。 - 该模式使用
pandora-cloud
启动,前提是你如前面所说安装好了。 - Docker环境变量:
PANDORA_CLOUD
启动cloud
模式。 - 该模式参数含义与普通模式相同,可
--help
查看。
使用Cloudflare Workers代理
-
如果你感觉默认的
https://ai.fakeopen.com
在你那里可能被墙了,可以使用如下方法自行代理。 -
你需要一个
Cloudflare
账号,如果没有,可以注册一个。 -
登录后,点击
Workers
,然后点击Create a Worker
,填入服务名称后点击创建服务
。 -
点开你刚才创建的服务,点击
快速编辑
按钮,贴入下面的代码,然后点击保存并部署
。export default { async fetch(request, env) { const url = new URL(request.url); url.host = 'ai.fakeopen.com'; return fetch(new Request(url, request)) } }
-
点击
触发器
选项卡,可以添加自定义访问域名。 -
参考
高阶设置
中的环境变量使用你的服务地址进行替换。
另外,想将本项目快速部署到 vercel
以及 Zeabur
的同学可以看这里。
通过 PKCE 获取 ChatGPT AccessToken 方法
如果你只是想突破官方严厉的限制,方便 ChatGPT 的使用,那么上文提供的信息就已经足够。如果您是一位开发人员,或者对如何拿到 ChatGPT AccessToken 很感兴趣,可以看看本段落。主要思路是,借助 OpenAI 公布的iOS版本的ChaGPT,通过PKCE拿到AccessToken。
https://auth0.openai.com/authorize?client_id=pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh&audience=https%3A%2F%2Fapi.openai.com%2Fv1&redirect_uri=com.openai.chat%3A%2F%2Fauth0.openai.com%2Fios%2Fcom.openai.chat%2Fcallback&scope=openid%20email%20profile%20offline_access%20model.request%20model.read%20organization.read%20offline&response_type=code&code_challenge=w6n3Ix420Xhhu-Q5-mOOEyuPZmAsJHUbBpO8Ub7xBCY&code_challenge_method=S256
以上这个链接,就是一个标准的Oauth里登录链接。通过这个方法这里的scope是可以换的。上面的登录链接会直接使用你浏览器里已登录的账号,直接跳转。如果你希望每次都登录则使用这个地址:
https://auth0.openai.com/authorize?client_id=pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh&audience=https%3A%2F%2Fapi.openai.com%2Fv1&redirect_uri=com.openai.chat%3A%2F%2Fauth0.openai.com%2Fios%2Fcom.openai.chat%2Fcallback&scope=openid%20email%20profile%20offline_access%20model.request%20model.read%20organization.read%20offline&response_type=code&code_challenge=w6n3Ix420Xhhu-Q5-mOOEyuPZmAsJHUbBpO8Ub7xBCY&code_challenge_method=S256&prompt=login
其实很简单,就是加了个prompt=login
参数。
链接里的code_challenge
可以通过如下代码生成(这段代码GPT帮我写的,跟我说:谢谢OpenAI):
import os
import base64
import hashlib
def generate_code_verifier():
# 随机生成一个长度为 32 的 code_verifier
token = os.urandom(32)
code_verifier = base64.urlsafe_b64encode(token).rstrip(b'=')
return code_verifier.decode('utf-8')
def generate_code_challenge(code_verifier):
# 对 code_verifier 进行哈希处理,然后再进行 base64url 编码,生成 code_challenge
m = hashlib.sha256()
m.update(code_verifier.encode('utf-8'))
code_challenge = base64.urlsafe_b64encode(m.digest()).rstrip(b'=')
return code_challenge.decode('utf-8')
code_verifier = generate_code_verifier()
code_challenge = generate_code_challenge(code_verifier)
print("code_verifier: ", code_verifier)
print("code_challenge: ", code_challenge)
对,就是用这里生成的code_challenge
来替换链接里的,同时你需要记下这里的 code_verifier
,后面要用。
我这里给一对例子,可以直接用:
code_verifier: IkrrBD89CBmwwzM-csfBnWKLMan5uE7laCMd2YTcPWE
code_challenge: t1RM5eR6dToh4VAe85qAf4ANdsnob6ANiuyl_z67mr4
现在请求拼装好的链接,登录成功后会跳转到 com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback?code=dbzSm1K578wMZ26GXXUri18a5_e024Dew123kzuiZ_Kq9
这里的code每次不同。
现在我们收集到这里的信息之后,POST
请求:https://auth0.openai.com/oauth/token
,请求内容为json
{
"redirect_uri": "com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback",
"grant_type": "authorization_code",
"client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh",
"code": "替换成你拿到的code",
"code_verifier": "替换成你前面生成的code_verifier"
}
请求了就能拿到 access token了,这个token可以使用ChatGPT。也可以在 Pandora 中使用。
补一下Refresh Token
的内容:在我们上步骤POST
拿到access token之后,同时也会拿到一个refresh token,这个是用来刷新access token的(反正看OAuth就懂了)。
我们可以这么使用:还是 POST
请求: https://auth0.openai.com/oauth/token
,同样请求内容为json
{
"redirect_uri": "com.openai.chat://auth0.openai.com/ios/com.openai.chat/callback",
"grant_type": "refresh_token",
"client_id": "pdlLIX2Y72MIl2rhLhTE9VV9bN905kBh",
"refresh_token": "上步获取的refresh token"
}
你可以看到这里请求,只需要refresh token就能刷新并获取到新的access token!所以你万万不可以泄露refresh token!!
先简单写这么多,相关利用代码更新在这里。对了,登录要开支持国家的梯子,不然你拿不到code
。最大好处就是不跟cloudflare接触,并且可以改scope。