【原创】搭建一个Chat-GPT Proxy

由于众所周知的原因,Chat-GPT在国内无法使用。如果要使用的话,需要一定的科技含量。

账号获取

目前主流两种方式:
1、按照教程,自己注册。
2、直接购买一个账号。

直接注册的话,还需要一个开放国的手机号码,一个邮箱。没有手机号码的话,可以使用虚拟手机号,但这里会遇到运气的问题。比较折腾。

直接购买,则相对简单,但要防骗。简单来说,也是一个运气问题。如果购买账号,则要注意:卖方需要提供两个账号:1)一个可以登录邮箱的邮箱账号密码,可用于OpenAi密码重置。2)OpenAi登录账号密码。

购买到账号之后,首先登录邮箱,更改邮箱密码,接下来登录OpenAi,重置密码(不可修改密码,只可重置)。

注意:登录OpenAi,不可用国内地址,或者被大量共享的地址。

访问环境

由于使用被大量共享的地址容易导致封号的问题。因此,推荐你自己使用一个独享的IP地址来访问,因此,首选“美国”云主机。(注意不要贪便宜选个国内的,用不了)
比如 微软的Azure(实测),阿里云,亚马逊云(实测,Web已封,但Api可用) 等。
主机配置无需太高,1核、1G,Win11英文版即可满足需求。不建议使用Win7,实测远程桌面界面太模糊,而且还要升级浏览器,乱七八糟的事情太多。

使用这个云主机,就可以直接访问Chat.OpenAi.com。

问题

云主机,在美国,访问起来比较卡,你只有耐心等待了。就算升级云主机也没啥用,因为瓶颈在网络,而不是系统。我自己的虚拟机,CPU利用率不到10%,内存大概950M左右。也就是说,Win11,1核,1G就可以满足需求,多了也浪费。

如果每次通过远程桌面的浏览器访问OpenAi的话,卡的厉害。因此,我们可以考虑将这台云主机作为一个Proxy,然后通过Web Api的方式来访问。

开发服务器

目前有很多方案,本人擅长C#。本来打算自己做一个,但发现目前已经有人做好了,那就直接用。
首先以最小化模式创建一个ASP.NET Core Web Api,.NET版本选6.0即可。
接下来,添加nuget包:OpenAI-DotNet-Proxy

修改Program.cs代码

 public class Program
 {
    
    
     private const string UserToken = "sess-";
     private class AuthenticationFilter : AbstractAuthenticationFilter
     {
    
    
         public override void ValidateAuthentication(IHeaderDictionary request)
         {
    
    
             if (!request.Authorization.ToString().Contains(UserToken))
             {
    
    
                 throw new AuthenticationException("User is not authorized");
             }
         }
     }

     public static void Main(string[] args)
     {
    
    
         var auth = OpenAIAuthentication.LoadFromEnv();
         var settings = new OpenAIClientSettings();
         var openAIClient = new OpenAIClient(auth, settings);
         var proxy = OpenAIProxyStartup.CreateDefaultHost<AuthenticationFilter>(args, openAIClient);
         proxy.Run();
     }
 }

接下来编译,发布即可。
将编译好的程序,复制到云主机上。

申请免费证书

如果你的域名在阿里申请,则可向阿里申请一个免费证书。腾讯,同理。
下载那个IIS证书,即可。

添加SSL证书

修改 appsettings.json

{
    
    
  "Logging": {
    
    
    "LogLevel": {
    
    
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "AllowInvalid ": true,
  "Kestrel": {
    
    
    "Endpoints": {
    
    
      "Https": {
    
    
        "Url": "https://*:443",
        "Certificate": {
    
    
          "Path": "C:\\Users\\Zmrbak\\Desktop\\publish\\www.abc.com.pfx",
          "Password": "123465n"
        }
      }
    },
    "Certificates": {
    
    
      "Default": {
    
    
        "Path": "C:\\Users\\Zmrbak\\Desktop\\publish\\www.chatgpt.abc.com.pfx",
        "Password": "123465n"
      }
    }
  }
}

环境配置

在云主机上,设置环境配置(中文:此电脑\属性\高级系统设置\环境变量\系统变量),添加如下变量:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxx
来自于:https://platform.openai.com/account/api-keys
OPENAI_ORGANIZATION_ID=org-xxxxxxxxxxxxxxxxxxxxx
来自于:https://platform.openai.com/account/org-settings

执行如下脚本(请替换正确的OPENAI_API_KEY、OPENAI_ORGANIZATION_ID)

setx OPENAI_API_KEY sk-xxxxxxxxxxxxxxxxxxxxxxxxxx
setx OPENAI_ORGANIZATION_ID org-xxxxxxxxxxxxxxxxxxxxx

在Azure控制面板中,发布443端口,允许访问。

启动Web Api程序。

测试

在你的计算机上执行如下指令

curl -k https://云主机/health

如果能够返回 ok,则表明云主机端Web Api工作正常。

客户端开发

创建一个.NET的控制台程序。
添加nuget程序包:OpenAI-DotNet
编写如下代码:

        static async Task Main(string[] args)
        {
    
    
            HttpClientHandler clientHandler = new HttpClientHandler();
            clientHandler.ServerCertificateCustomValidationCallback += (sender, cert, chain, sslPolicyErrors) => {
    
     return true; };
            clientHandler.SslProtocols = SslProtocols.None;
            var httpClient = new HttpClient(clientHandler);

            var auth = new OpenAIAuthentication($"sess-aAbBcCdDeE123456789");
            var settings = new OpenAIClientSettings(domain: "云主机IP地址");
            var api = new OpenAIClient(auth, settings, httpClient);

            var messages = new List<Message>
            {
    
    
                new Message(Role.System, "特朗普什么时候当选美国总统的?"),
            };
            var chatRequest = new ChatRequest(messages);
            await api.ChatEndpoint.StreamCompletionAsync(chatRequest, result =>
            {
    
    
                Console.Write(result.FirstChoice);
            });
         }

输出:

 特朗普当选美国总统是在2016年11月8日的美国总统选举中获胜的。

则表明:客户端<—>代理端<—>openAi端工作正常。
注意:HttpClientHandler相关代码,不可缺少,否则会报SSL相关错误。

OpenAI-DotNet官网资料:
https://github.com/RageAgainstThePixel/OpenAI-DotNet

求支持

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013667796/article/details/130442795