通过 Access Token 无需使用梯子(VPN)访问 ChatGPT

  1. Please stand by, while we are checking your browser.
  2. Access denied. Sorry, you have been blocked.
  3. ChatGPT is at capacity right now.
  4. This content may violate our content policy.
  5. 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 项目地址

https://github.com/pengzhile/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:pass@ip:port
  • -t--token_file 指定一个存放Access Token的文件,使用Access Token登录。
  • -s--serverhttp服务方式启动,格式:ip:port
  • -a--api 使用gpt-3.5-turboAPI请求,你可能需要向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:pass@ip:port
  • PANDORA_SERVERhttp服务方式启动,格式:ip:port
  • PANDORA_API 使用gpt-3.5-turboAPI请求,你可能需要向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当前回答不满意,可以让它重新回答。
  • /continueChatGPT继续输出回复的剩余部分。
  • /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
  • 如果你想持久存储DockerPandora产生的数据,你可以挂载宿主机目录至/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:pass@localhost/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。