🥇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 是否启用,truefalse。启用时必须配置证书和密钥文件路径。

    • cert_file 证书文件路径。

    • key_file 密钥文件路径。

  • timeout是请求的超时时间,单位为

  • proxy_url指定部署服务流量走代理,如:http://127.0.0.1:8888socks5://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 禁用注册账号功能,truefalse

  • auto_conv_arkoseproxy模式使用gpt-4模型调用/backend-api/conversation接口是否自动打码,使用消耗为4+10

  • proxy_file_serviceproxy模式是否使用PandoraNext的文件代理服务,避免官方文件服务的墙。

  • custom_doh_host 配置自定义的DoH主机名,建议使用IP形式。默认在+8区使用223.6.6.6,其余地区使用1.1.1.1

  • captcha配置一些关键页面的验证码。

    • provider验证码提供商,支持:recaptcha_v2recaptcha_enterprisehcaptchaturnstilefriendly_captcha

    • site_key验证码供应商后台获取的网站参数,是可以公布的信息。

    • site_secret验证码供应商后台获取的秘密参数,不要公布出来。有些供应商也称作API Key

    • site_login是否在全站密码登录界面显示验证码,truefalse

    • setup_login是否在设置入口登录界面显示验证码,truefalse

    • oai_username是否输入用户名界面显示验证码,truefalse

    • oai_password是否在输入登录密码界面显示验证码,truefalse

  • whitelist邮箱数组指定哪些用户可以登录使用,用户名/密码登录受限制,各种Token登录受限。内置tokens不受限。

  • whitelistnull则不限制,为空数组[]则限制所有账号,内置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 tokenrefresh token可自动刷新。

  • 每个key被称为token key,可在登录框作用户名输入。如上:test-1test-2等,随意更改。

  • 如果设置了password则输入完token key进入输入密码页面输入匹配。

  • 如果设置sharedtrue,则这个账号会出现在/shared.html中,登录页面会出现它的链接。

  • 如果设置sharedtrue,则这个账号不能再在用户名登录框进行登录。

  • /shared.html中的账号和共享站功能相同,可以自行设置隔离密码进行会话隔离。

  • plus用来标识/shared.html上账号是否有金光,没有其他作用。

  • show_user_info表示/shared.html共享时是否显示账号邮箱信息,GPTs建议开启。

  • 现在可以直接内置用户名密码登录,此种方法必须设置passwordshared不可为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 tokensession token。只是给UI方便获取,1:100的消耗依然存在。

  • 页面 /fk 使用access tokensession 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.jsontokens.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.jsonlicense_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_tokenapi_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组成,大部分可用但是也不免有些已经过期,导致在调用时报错,是正常现象

最后更新于