🥇Pandora
目前最强大的ChatGPT逆向工程
项目GitHub地址:https://github.com/pandora-next/deploy
官方文档地址:https://fakeopen.org/PandoraNext/
2024.01.26更新:
出于一些众所周知的原因,Pandora也顶不住压力最终归档了,后续会不会再维护更新不得而知,真实可惜了一个如此完美的大项目

Pandora最好用的部分就是把网页端的ChatGPT通过逆向工程转换成API的请求格式,真正实现了GPT自由,既然Pandora倒了,我们就不得不寻找其他的逆向工程了,这几天也是尝试了好多不同的项目,最终找到了一个目前来说使用体验最好的:WarpGPT:https://github.com/oliverkirk-sudo/WarpGPT,该项目基于GO语言编写,安装GO运行环境的方法在最初的初始化配置章节
部署方法非常简单,可以在本地也可以在服务器部署,先创建一个环境变量(将原.env.templete文件重命名为.env)然后修改内容,注意本地部署需要添加代理,然后里面的代理池和redis我们是不需要的:
proxy = "http://127.0.0.1:7897" #服务器端则不需要
port = 5000
host = '0.0.0.0'
verify = false
auth_key = ""
arkose_must = false
openai_host = "chat.openai.com"
openai_api_host = "api.openai.com"
log_level = "debug"
然后就可以构建并运行测试了:
git clone https://github.com/oliverkirk-sudo/WarpGPT.git
cd WarpGPT
go build && ./WarpGPT
运行后会实时输出日志,注意此时是一个命令行程序的形式,关闭终端后程序就会终止,成功运行后BaseURL就是http://ip:5000,API Key就是Access Token,测试没有问题后可以把日志等级改成info或者release,然后添加后台进程守护运行(然后建议添加反代实现https访问):
nohup ./WarpGPT &
#如果需要终止则:
ps aux | grep WarpGPT
kill -9 <进程号>
这里介绍的WarpGPT已经可以做到非常实用的ChatGPT网页版请求转API的格式,不过并不能完全取代Pandora,如果想要完全取代Pandora可以使用ninja项目:https://github.com/gngpp/ninja,ninja几乎实现了Pandora的全部功能(包括获取各种Token的接口、转API的格式、WebUI界面等等),因此对于大部分用户的需求来说我们建议直接使用ninja,不需要再考虑Pandora了,除非Pandora后期复出再来一波升级
ninja的使用方式也非常简单,官方文档:https://github.com/gngpp/ninja/blob/main/doc/readme_zh.md,别看文档有点复杂,其实简单来说只有三个步骤,第一步下载对应平台的编译文件,我们就用ubuntu平台的x86_64编译文件,解压后可以得到一个执行文件,直接在当前目录打开终端,用./ninja
命令即可运行,具体来说,一共有以下这些命令(需要注意的是在桌面系统上,比如我使用的Ubuntu22LTS上需要./
前缀才能执行编译文件,但是在某些服务平台上可能不需要,比如官方原文档就没有):
# 在线更新版本
./ninja update
# 前台运行进程
./ninja run
# 后台运行进程
./ninja start
# 停止后台进程
./ninja stop
# 重启后台进程
./ninja restart
# 查看后台进程状态
./ninja status
# 查看后台进程日志
./ninja log
但是我们其实不推荐上面这些直接运行的命令,我们推荐通过配置文件运行的命令来自定义很多东西(最关键的就是代理,如果在国内运行是必须的):
# 生成配置文件模版,serve.toml
ninja gt -o serve.toml
# 指定配置文件模版运行,绕开繁琐的cli命令(三选一,不带括号)
ninja (run/start/restart) -C serve.toml
配置文件这里大家可以参考我们的(其实我们只修改了代理部分,将其修改成了clash的7897端口)特别需要注意的是最后两个项目我们将其注释掉了,因为我们运行网页前端WebUI并不需要配置IP(无论是在本地端还是服务端,因为这个功能用于HTTPS连接,但是实际我们需要Nginx反代,真实的请求方式还是IP:Port的形式):
level = "info"
bind = "0.0.0.0:7999"
concurrent_limit = 65535
timeout = 600
connect_timeout = 60
tcp_keepalive = 60
no_keepalive = false
pool_idle_timeout = 90
enable_direct = false
cookie_store = true
fastest_dns = false
disable_webui = false
enable_file_proxy = false
enable_arkose_proxy = false
arkose_gpt3_experiment = false
arkose_gpt3_experiment_solver = false
arkose_solver = "yescaptcha"
tb_enable = false
tb_store_strategy = "mem"
tb_redis_url = "redis://127.0.0.1:6379"
tb_capacity = 60
tb_fill_rate = 1
tb_expired = 86400
pcert = "ca/cert.crt"
pkey = "ca/key.pem"
[[proxies]]
[proxies.all]
proxy = "socks5://127.0.0.1:7897"
[[proxies]]
[proxies.all]
proxy = "http://127.0.0.1:7897"
#[[proxies]]
#[proxies.api]
#interface = "192.168.1.1"
#[[proxies]]
#[proxies.api]
#ipv6subnet = "2001:db8::/32"
一般情况下直接用ninja start -C serve.toml
运行即可,如果想要开机自启,需要手动配置描述文件,新建一个ninja.service
文件,内容示例如下,可以自行修改(尤其是程序路径):
[Unit]
Description=ninja autostart
[Service]
Type=simple
ExecStart=/root/ninja start -C /root/serve.toml
Restart=always
[Install]
WantedBy=multi-user.target
然后将这个文件复制到/etc/systemd/system/
目录下,并用下面的命令创建自启动项:
sudo systemctl enable ninja.service
部署Pandora
手动部署的步骤官方文档写的很详细,这里不再赘述,我主要按照我个人最喜欢的流程部署:
使用docker-compose安装:
version: '3'
services:
pandora-next:
image: pengzhile/pandora-next
container_name: PandoraNext
network_mode: bridge
restart: always
ports:
- "8181:8181"
volumes:
- ./data:/data
- ./sessions:/root/.cache/PandoraNext
注意这里部署完成后没法直接用的,因为没有配置文件,需要进入Portainer找到PandoraNext对应的Container容器用到的Volume库在Host中的路径,然后到对应的data文件夹中放入对应的config.json和tokens.json,官方示例文件和官方说明如下:
以下是一个示例
config.json
文件
{
"bind": "127.0.0.1:8181",
"tls": {
"enabled": false,
"cert_file": "",
"key_file": ""
},
"timeout": 600,
"proxy_url": "",
"license_id": "",
"public_share": false,
"site_password": "",
"setup_password": "",
"server_tokens": true,
"proxy_api_prefix": "",
"isolated_conv_title": "*",
"disable_signup": false,
"auto_conv_arkose": false,
"proxy_file_service": false,
"custom_doh_host": "",
"captcha": {
"provider": "",
"site_key": "",
"site_secret": "",
"site_login": false,
"setup_login": false,
"oai_username": false,
"oai_password": false,
"oai_signup": false
},
"whitelist": null
}
bind
指定绑定IP和端口,在docker内,IP只能用0.0.0.0
,否则映射不出来。如果你不打算套nginx等反代,
bind
参数的IP请使用0.0.0.0
!!!tls
配置PandoraNext直接以https
启动。enabled
是否启用,true
或false
。启用时必须配置证书和密钥文件路径。cert_file
证书文件路径。key_file
密钥文件路径。
timeout
是请求的超时时间,单位为秒
。proxy_url
指定部署服务流量走代理,如:http://127.0.0.1:8888
、socks5://127.0.0.1:7980
license_id
指定你的License Id,可以在这里获取。public_share
对于GPT中创建的对话分享,是否需要登录才能查看。为true
则无需登录即可查看。site_password
设置整站密码,需要先输入这个密码,正确才能进行后续步骤。充分保障私密性。不少于8
位,且同时包含数字
和字母
!setup_password
定义一个设置密码,用于调用/setup/
开头的设置接口,为空则不可调用。不少于8
位,且同时包含数字
和字母
!server_tokens
设置是否在响应头中显示版本号,true
显示,false
则不显示。proxy_api_prefix
可以给你的proxy
模式接口地址添加前缀,让人意想不到。注意设置的字符应该是url中允许的字符。包括:a-z
A-Z
0-9
-
_
.
~
proxy_api_prefix
你必须设置一个不少于8
位,且同时包含数字
和字母
的前缀才能开启proxy
模式!/backend-api/conversation
proxy模式比例1:4
/v1/chat/completions
3.5模型比例1:4
/v1/chat/completions
4模型比例1:10
, 无需打码/api/auth/login
登录接口比例1:100
,无需打码/api/arkose/token
获取arkose_token
,比例1:10
isolated_conv_title
现在隔离会话可以设置标题了,而不再是千篇一律的*
号。disable_signup
禁用注册账号功能,true
或false
。auto_conv_arkose
在proxy
模式使用gpt-4
模型调用/backend-api/conversation
接口是否自动打码,使用消耗为4+10
。proxy_file_service
在proxy
模式是否使用PandoraNext的文件代理服务,避免官方文件服务的墙。custom_doh_host
配置自定义的DoH
主机名,建议使用IP形式。默认在+8
区使用223.6.6.6
,其余地区使用1.1.1.1
。captcha
配置一些关键页面的验证码。provider
验证码提供商,支持:recaptcha_v2
、recaptcha_enterprise
、hcaptcha
、turnstile
、friendly_captcha
。site_key
验证码供应商后台获取的网站参数,是可以公布的信息。site_secret
验证码供应商后台获取的秘密参数,不要公布出来。有些供应商也称作API Key
。site_login
是否在全站密码登录界面显示验证码,true
或false
。setup_login
是否在设置入口登录界面显示验证码,true
或false
。oai_username
是否输入用户名界面显示验证码,true
或false
。oai_password
是否在输入登录密码界面显示验证码,true
或false
。
whitelist
邮箱数组指定哪些用户可以登录使用,用户名/密码登录受限制,各种Token登录受限。内置tokens不受限。whitelist
为null
则不限制,为空数组[]
则限制所有账号,内置tokens不受限。一个
whitelist
的例子:"whitelist": ["[email protected]", "[email protected]"]
以下是一个示例
tokens.json
文件
{
"test-1": {
"token": "access token / session token / refresh token",
"shared": true,
"show_user_info": false
},
"test-2": {
"token": "access token / session token / refresh token",
"shared": true,
"show_user_info": true,
"plus": true
},
"test2": {
"token": "access token / session token / refresh token / share token / username & password",
"password": "12345"
}
}
token
支持示例文件中所写的所有类型。session token
和refresh token
可自动刷新。每个key被称为
token key
,可在登录框作用户名输入。如上:test-1
、test-2
等,随意更改。如果设置了
password
则输入完token key
进入输入密码页面输入匹配。如果设置
shared
为true
,则这个账号会出现在/shared.html
中,登录页面会出现它的链接。如果设置
shared
为true
,则这个账号不能再在用户名登录框进行登录。/shared.html
中的账号和共享站功能相同,可以自行设置隔离密码进行会话隔离。plus
用来标识/shared.html
上账号是否有金光,没有其他作用。show_user_info
表示/shared.html
共享时是否显示账号邮箱信息,GPTs建议开启。现在可以直接内置用户名密码登录,此种方法必须设置
password
且shared
不可为true
。内置账号密码的格式为:
邮箱,密码
,此种是0
额度消耗的。
遇到大部分报错信息的原因基本都是在修改这两个json文件的时候格式出错了,可以用https://www.bejson.com/检查json格式是否正确
配置好后重启对应的container容器即可通过ip:8181访问PandoraNext服务了,当然建议用上面讲过的方法进行反代来用域名访问。
这里是我搭建的服务(随时可能删除,仅供参考):https://pandora.stcdn.top/
在我搭建的服务中内置了user1,user2,user3三个默认用户,可供大家直接使用,如果要密码则是12345678
使用Pandora Proxy服务
官方吧唧吧唧说了一堆,其实就是直接用,BASE_URL是你部署的域名/<proxy_api_prefix>,API_KEY是你生成的Share-token或者Pool-token直接完事了,几乎所有的调用OpenAI API的平台都可以用这个方式替代,下面附上官方文档可以用来参考(实际上不需要看,也不需要管那些后缀,你只要知道一定要设置上并添加上<proxy_api_prefix>即可):
页面 /auth 使用账号密码,手动获取
access token
和session token
。只是给UI方便获取,1:100
的消耗依然存在。页面 /fk 使用
access token
或session token
,手动获取share token
,页面 /pk 使用
share token
,手动组pool token
。/backend-api/*
ChatGPT
网页版接口,具体F12去页面上看。/public-api/*
ChatGPT
网页版接口,具体F12去页面上看。/v1/* 所有
https://api.openai.com/v1/*
开头的接口,每次调用1:1
。/dashboard/* 所有
https://api.openai.com/dashboard/*
开头的接口,每次调用1:1
。GET /api/token/info/fk-xxx 获取share token信息,使用生成人的access token做为Authorization头,可查看各模型用量。
POST /api/auth/session 通过session token获取access token,使用urlencode form传递session_token参数。
POST /api/auth/refresh 通过refresh token获取access token,使用urlencode form传递refresh_token参数。
POST /api/auth/login 登录获取access token,使用urlencode form传递username 和 password 参数。
POST /api/token/register 生成share token
POST /api/pool/update 生成更新pool token
POST /v1/chat/completions 使用
ChatGPT
模拟API
的请求接口,支持share token和pool token。POST /api/arkose/token 获取arkose_token,目前只支持
gpt-4
类型。使用urlencode form传递type=gpt-4参数。获取后可API方式调用GPTs
POST /api/setup/reload 重载当前服务的
config.json
、tokens.json
等配置。以上地址均需在最前面增加
/<proxy_api_prefix>
,也就是你设置的前缀。
这里再推荐一个proxy的转接服务,也就是将/v1接口转发到/backend-api,以实现用api调用的方式询问真正的网页版ChatGPT(众所周知网页版的会比api版的更聪明一些),项目GitHub地址:https://github.com/Ink-Osier/PandoraToV1Api,因为此类项目更新较快,官方readme一定要好好看,很多步骤比较细节,截止到现在的操作步骤整理如下:
先把整个项目下载下来,然后修改docker-compose.yml 文件里的环境变量,注意BASE-URL地址如果套了反代可能会遇到443接口错误,修改成本地端口(注意主机IP是docker的映射IP,不是127.0.0.1)即可,下面是我的示例:
version: '3'
services:
backend-to-api:
image: wizerd/pandora-to-api:latest
restart: always
ports:
- "50011:33333"
environment:
- BASE_URL=http://192.168.160.1:8181 #- BASE_URL=<Pandora-Next的部署地址,如:https://pandoranext.com>
- PROXY_API_PREFIX=STproxy0722 #- PROXY_API_PREFIX=<Pandora-Next的PROXY_API_PREFIX>
- UPLOAD_BASE_URL=https://fakeapi.stcdn.top #- UPLOAD_BASE_URL=<50011端口在公网可以访问到的地址,如:http://1.2.3.4:50011,如果使用了反代需填入反代后的域名如:https://pandora-backend-api.com>
- KEY_FOR_GPTS_INFO=<一个仅用于获取GPTs信息的fk> # 如果不需要额外使用gpts,可以不填
- GPT_4_S_New_Name=st # gpt-4-s模型的自定义模型名称,支持同时设置多个,用英文逗号分隔
- GPT_4_MOBILE_NEW_NAME=gpt-4-mobile # gpt-4-mobile模型的自定义模型名称,支持同时设置多个,用英文逗号分隔
- GPT_3_5_NEW_NAME=gpt-3.5-turbo,gpt-3.5-turbo-1106,gpt-4,gpt-4-1106-preview # gpt-3.5-turbo模型的自定义模型名称,支持同时设置多个,用英文逗号分隔
volumes:
- ./log:/app/log
- ./images:/app/images
- ./gpts.json:/app/gpts.json
对于有PLUS账号的用户(对的就是官方20美元一月那个)可以设置GPTS的fk,没有的就不用填了,不填的需要将
gpts.json
文件中的所有内容删除,只保留一对大括号{}
然后就可以用
docker-compose up -d
命令部署了,如果跟我一样用的是Protainer的Compose插件,那就是docker compose up -d
关于 license_id
复制
License Id:
后的内容,填写在config.json
的license_id
字段。注意检查不要复制到多余的空格等不可见字符。
如果
config.json
中没有填写license_id
字段,启动会报错License ID is required
。没有固定IP的情况,IP变动后会自动尝试重新拉取。
更换
License Id
之后,通常需要手动删除license.jwt
再启动。
上面这几条是官方文档,个人使用时注意额度消耗,可以访问上面的获取地址查看额度,如果想随时随地快捷获取,可以部署下面这个docker项目(原项目Github地址:https://github.com/Ink-Osier/getPandoraLicenseUsage),注意修改下面的LICENSE_ID:
version: '3'
services:
get-pandora-next-usage:
image: wizerd/get-pandora-next-usage:latest
restart: always
ports:
- "53333:23333"
environment:
- PANDORA_LICENSE_ID=<PandoraNext License ID>
部署完成后的默认请求地址:http://ip:53333/api/getPandoraNextLicUsage
或者使用我自己编写的简易PHP页面也可以完成,注意要修改下面网址中的<license_id>,这个api查询网址后期也可能发生变化,请关注Pandora项目的相关内容;这个PHP页面需要运行在搭建Pandora服务的服务器上以确保请求IP相同,否则会被Forbidden;如何在服务器上运行PHP文件?宝塔和docker二选一即可:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pandora额度查询</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 20px;
background-color: #f4f4f4;
color: #333;
}
h2 {
color: #0056b3;
}
table {
width: 70%;
border-collapse: collapse;
margin: 20px 0;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
th, td {
border: 1px solid #ddd;
padding: 12px;
text-align: left;
}
th {
background-color: #f2f2f2;
color: #333; /* 设置表头文字颜色为深灰色 */
}
tr:nth-child(2), tr:nth-child(5) {
color: #ff6600; /* 设置第二行和第五行文字颜色为橙色 */
}
</style>
</head>
<body>
<h2>ST Pandora Server额度查询系统</h2>
<table>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
<?php
// 使用PHP进行HTTP请求
$json_data = file_get_contents("https://dash.pandoranext.com/api/SfgQWlppSc8uz4LEqfyUYdxTEpK71zLEXqAlSv1YvzM/usage");
$data = json_decode($json_data, true);
// 输出表格行
foreach ($data as $field => $value) {
// 如果值的长度超过4位,则进行打码
$masked_value = strlen($value) > 4 ? str_repeat('*', strlen($value) - 4) . substr($value, -4) : $value;
echo "<tr><td>{$field}</td><td>{$masked_value}</td></tr>";
}
?>
</table>
</body>
</html>
以上两种方法都推荐搭建反代直接用域名访问
自动获取并刷新Pool-token
在官方流程中,我们需要手动用十天就会过期一次的Access-token去获取Share-token并且组装成Pool-token,这个流程比较繁琐,可以使用下面的python脚本自动且快速实现:
脚本地址:https://raw.githubusercontent.com/bulianglin/demo/main/pandora-get-token.py
我们的备份:https://raw.githubusercontent.com/shentong0722/list/main/installsh/pandora-get-token.py
下载后修改这个这个脚本中的头部中的pool_token
和api_endpoint
两个参数,pool_token可以为空,为空则自动重新生成,填入则刷新该已有pool_token,api_endpoint是Pandora Proxy服务地址,在服务器端部署也就是http://127.0.0.1:8181/<proxy_api_prefix>
可以直接在自己电脑上运行,也可以在服务器运行,在服务器运行时使用下面的命令先抓取脚本:
wget https://raw.githubusercontent.com/bulianglin/demo/main/pandora-get-token.py
然后在同目录下新建一个名为session_tokens.txt
的文件,并且在文件中以一行一个session_token的形式填入session_token(获取方法上一节中讲过),然后运行python3 pandora-get-token.py
命令来运行脚本自动根据session_tokens获取Share-token并且自动组装成Pool-token
上面的方法需要自行获取session_token,比较麻烦,也可以通过脚本自动获取(但是需要注意的是这样每个账号的获取操作会扣除你pandora额度100条):在同目录下新建一个users.txt
的文本文件,然后在里面填入帐号密码(中间用----连接)一行一组,然后运行脚本,命令与上面相同但是末尾需要加上-a
参数,这样就可以把这些账号的session_token自动写入到session_tokens.txt
文件中了
如果想要定期自动运行脚本来实现renew可以用nohup服务实现(注意-u参数):
nohup python3 -u pandora-get-token.py > gettoken.log 2>&1 &
然后使用cat gettoken.log
命令显示日志文件查看运行状态
这边我可以给大家分享一下我自己的账号组装的token(貌似不会有什么问题,如果扣了什么额度我随时删除共享):pk-DHLxJLA2jjWXFZS3N0V3WJirB6SnglswoNlmHxc1XuE
最后分享一个由其他好心人提供的共享Pool Token:pk-this-is-a-real-free-pool-token-for-everyone
,这个Pool Token内有几千个Share-token组成,大部分可用但是也不免有些已经过期,导致在调用时报错,是正常现象
最后更新于