# Pandora

项目GitHub地址：<https://github.com/pandora-next/deploy>

官方文档地址：<https://fakeopen.org/PandoraNext/>

### 2024.01.26更新：

出于一些众所周知的原因，Pandora也顶不住压力最终归档了，后续会不会再维护更新不得而知，真实可惜了一个如此完美的大项目

<figure><img src="/files/hwrfJVestcQKjXqmnoYX" alt=""><figcaption></figcaption></figure>

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"
```

然后就可以构建并运行测试了：

```bash
git clone https://github.com/oliverkirk-sudo/WarpGPT.git
cd WarpGPT
go build && ./WarpGPT
```

运行后会实时输出日志，注意此时是一个命令行程序的形式，关闭终端后程序就会终止，成功运行后BaseURL就是[http://ip:5000，API](https://docs.st0722.top/ai/http:/ip:5000，API) Key就是Access Token，测试没有问题后可以把日志等级改成info或者release，然后添加后台进程守护运行（然后建议添加反代实现https访问）：

```bash
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上需要`./`前缀才能执行编译文件，但是在某些服务平台上可能不需要，比如官方原文档就没有）：

```bash
# 在线更新版本
./ninja update
# 前台运行进程
./ninja run
# 后台运行进程
./ninja start
# 停止后台进程
./ninja stop
# 重启后台进程
./ninja restart
# 查看后台进程状态
./ninja status
# 查看后台进程日志
./ninja log
```

但是我们其实不推荐上面这些直接运行的命令，我们推荐通过配置文件运行的命令来自定义很多东西（最关键的就是代理，如果在国内运行是必须的）：

```bash
# 生成配置文件模版，serve.toml
ninja gt -o serve.toml
# 指定配置文件模版运行，绕开繁琐的cli命令（三选一，不带括号）
ninja (run/start/restart) -C serve.toml
```

配置文件这里大家可以参考我们的（其实我们只修改了代理部分，将其修改成了clash的7897端口）特别需要注意的是最后两个项目我们将其注释掉了，因为我们运行网页前端WebUI并不需要配置IP（无论是在本地端还是服务端，因为这个功能用于HTTPS连接，但是实际我们需要Nginx反代，真实的请求方式还是IP:Port的形式）：

```toml
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/`目录下，并用下面的命令创建自启动项：

```bash
sudo systemctl enable ninja.service
```

### 部署Pandora

手动部署的步骤官方文档写的很详细，这里不再赘述，我主要按照我个人最喜欢的流程部署：

使用docker-compose安装：

```docker
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
```

<mark style="color:orange;">注意</mark>这里部署完成后没法直接用的，因为没有配置文件，需要进入Portainer找到PandoraNext对应的Container容器用到的Volume库在Host中的路径，然后到对应的data文件夹中放入对应的config.json和tokens.json，官方示例文件和官方说明如下：

* 以下是一个示例`config.json`文件

```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，可以在[这里获取](https://github.com/pandora-next/deploy#%E5%85%B3%E4%BA%8E-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": ["mail2@test.com", "mail2@test.com"]`

* 以下是一个示例`tokens.json`文件

```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）即可，下面是我的示例：

```docker
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

* 在这里获取：[https://dash.pandoranext.com](https://dash.pandoranext.com/)
* 复制`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：

```docker
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二选一即可：

```php
<!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/](https://raw.githubusercontent.com/shentong0722/list/main/installsh/x2ray.sh)[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组成，大部分可用但是也不免有些已经过期，导致在调用时报错，是正常现象


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.st0722.top/ai/pandora.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
