我做了第一个ChatGPT .net api聊天库

2023-06-09 15:24:02
最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞一个吧。 但是,等等,现在的ChatGPT项目基本都是网页逆向获取几个token,我不会啊,我都不知道

最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞一个吧。但是,等等,现在的ChatGPT项目基本都是网页逆向获取几个token,我不会啊,我都不知道哪些cookie是重要的,那我只能找一个其它语言的ChatGPT API项目,自己造(翻译)一个c#的ChatGPT API库了。

目录
  • ChatGPT是啥?
  • 准备
    • 第一步:注册OpenAI账号
  • 万事具备,直接撸代码
    • 1.网页获取所需token和cookie
    • 2.创建一个session用来表示一个会话
    • 3.创建机器人绑定一个会话
  • 效果截图(仅测试)
  • 源码(欢迎star)

ChatGPT是啥?

先了解GTP,摘自官网的一段话“A set of models that can understand and generate natural language”,其实,就是一个自然语言处理的模型。所以ChatGPT顾名思义就是基于GPT3的一个聊天AI。但是想让他做苦力帮忙写代码的话所需要的其实不是这个模型,而是Codex这个模型,按照官网所说“Most capable Codex model. Particularly good at translating natural language to code. In addition to completing code, also supports inserting completions within code.”。真的是碉堡了!

准备

第一步:注册OpenAI账号

因为对大陆以及中国香港地区不开放,所以我们需要小小的科学一下。来一个我就是参照着申请账号的园子的文章:https://www.cnblogs.com/chatgpt/p/how-to-register-chatgpt-in-china.html当然手机那里可以淘宝找,几块钱就能帮忙注册手机,账号里面默认还有18美元余额。

注意点:如果搭建了科学还是提示不对你的国家提供服务的话,尝试清空浏览器缓存或者打开浏览器的无痕窗口。Chrome默认在右上角三个点打开就能找到“打开新的无痕式窗口”。

万事具备,直接撸代码

1.网页获取所需token和cookie

我们需要三个东西:UserAgent,CfClearance,Session_token我们需要先打开ChatGPT官方网站:https://chat.openai.com/chat 然后按下F12打开浏览器的开发者模式UserAgent在网络里(只需要复制UserAgent:后面的值):CfClearance和Session_token在应用程序->cookie里面

2.创建一个session用来表示一个会话

public OpenAISession(string session_token,string cfClearance,string userAgent){    Session_token = session_token;    CfClearance = cfClearance;    UserAgent = userAgent;    Headers = new Dictionary<string, string>();    Cookies = new Dictionary<string, string>();    Proxies = new Dictionary<string, string>();}

Session可以刷新自己的AccessToken和Session_token

public async Task RefreshSessionAsync(){    if (string.IsNullOrEmpty(Session_token))    {        throw new Exception("No tokens provided");    }    // Set cookies    Cookies.Put("__Secure-next-auth.session-token", Session_token);    Cookies.Put("cf_clearance", CfClearance);    string cookiesString = GetCookiesString();    Dictionary<string, string> map = new Dictionary<string, string>();    Headers.Put("User-Agent", UserAgent);    Headers.Put("cookie", cookiesString);    Headers.Put("Cookie", cookiesString);    var response = await GetAsync("https://chat.openai.com/api/auth/session");    if (!response.IsSuccessStatusCode)    {        Console.WriteLine("err code: " + response.StatusCode);        Console.WriteLine("cf_clearance: " + CfClearance);        Console.WriteLine("token: " + Session_token);        Console.WriteLine("userAgent: " + UserAgent);        Console.WriteLine("请检查以上参数是否正确,是否过期。");        throw new Exception("无法获取token!请重试");    }    try    {        string name = "__Secure-next-auth.session-token=";        var cookies = response.Headers.GetValues("Set-Cookie");        var stoken = cookies.FirstOrDefault(x => x.StartsWith(name));        Session_token = stoken == null ? Session_token : stoken.Substring(name.Length, stoken.IndexOf(";") - name.Length);        Cookies.Put("__Secure-next-auth.session-token", Session_token);        var result = await response.Content.ReadAsStringAsync();        AccessToken = JsonSerializer.Deserialize<Profile>(result, _jsonSerializerOptions)?.AccessToken;        RefreshHeaders();    }    catch (Exception ex)    {        Console.WriteLine($"Error {nameof(RefreshSessionAsync)}:{ex}");        throw new Exception($"Error {nameof(RefreshSessionAsync)}", ex);    }}

获取到的最新的AccessToken更新到header里,Session_token更新到cookie里

private void RefreshHeaders(){    Headers.Put("Host", "chat.openai.com");    Headers.Put("Accept", "text/event-stream");    Headers.Put("Authorization", $"Bearer {AccessToken}");    Headers.Put("User-Agent", UserAgent);    Headers.Put("X-Openai-Assistant-App-Id", string.Empty);    Headers.Put("Connection", "close");    Headers.Put("Accept-Language", "en-US,en;q=0.9");    Headers.Put("Referer", "https://chat.openai.com/chat");}string name = "__Secure-next-auth.session-token=";var cookies = response.Headers.GetValues("Set-Cookie");var stoken = cookies.FirstOrDefault(x => x.StartsWith(name));Session_token = stoken == null ? Session_token : stoken.Substring(name.Length, stoken.IndexOf(";") - name.Length);Cookies.Put("__Secure-next-auth.session-token", Session_token);

3.创建机器人绑定一个会话

public Chatbot(OpenAISession openAISession){    OpenAISession = openAISession;    ResetConversation();}/// <summary>/// 重置Conversation,开启一个新的会话/// </summary>public void ResetConversation() {    _conversationId = null;    _parentMessageId = Guid.NewGuid().ToString();}

如何保持上下文聊天以及多用户隔离?上下文聊天已经内置,会自动与机器人的回复进行关联,当需要重新开启一个对话的时候,可以调用ResetConversation,这样对应的机器人对象发过去就是开启了一个新的对话。

如何多用户隔离?比如联合微信机器人使用,可以将一个人或者一个群对应一个Chatbot对象,并且利用id与机器人做关联。当然这个_clientID需要使用者做唯一性管理

//可以作为隔离不同客户端聊天上下文的凭据,即一个机器人绑定一个客户端//客户端编号可以是,微信id,qq id,飞书id,亦或者自己开发的软件的用户idprivate readonly string _clientID; public Chatbot(OpenAISession openAISession, string clientID){    OpenAISession = openAISession;    _clientID = clientID == null ? Guid.NewGuid().ToString() : clientID;    ResetConversation();}

最后构造对话对象,发送到对应api

public async Task<Reply> GetChatReplyAsync(string prompt){    var conversation = new Conversation();    conversation.Conversation_id = _conversationId;    conversation.Parent_message_id = _parentMessageId;    conversation.Messages = new Message[]    {        new Message()        {            Content = new Content            {                Parts = new string []{ prompt }            }        }    };    return await GetChatResponseAsync(conversation);}/// <summary>/// 获取响应/// </summary>/// <param name="conversation"></param>/// <returns></returns>/// <exception cref="Exception">服务器返回非200</exception>private async Task<Reply> GetChatResponseAsync(Conversation conversation){    using (var client = new HttpClient())    {        var response = await OpenAISession.PostAsync(_conversation, JsonSerializer.Serialize(conversation, _jsonSerializerOptions));        if (!response.IsSuccessStatusCode)        {            throw new Exception($"Faild to request.StatusCode:{response.StatusCode}");        }        var msg = await response.Content.ReadAsStringAsync();        var data = msg.Split("\n")?.ToList().Where(x => !string.IsNullOrEmpty(x) && !x.Contains("data: [DONE]")).LastOrDefault()?.Substring(5);        var reply = JsonSerializer.Deserialize<Reply>(data, _jsonSerializerOptions);        _conversationId = reply.Conversation_id;        return reply;    }}

效果截图(仅测试)

OpenAISession openAIOptions = new OpenAISession(Session_token, CfClearance, UserAgent);await openAIOptions.RefreshSessionAsync();Chatbot chatbot = new Chatbot(openAIOptions);Console.WriteLine("用c++写个冒泡查询");var reply = await chatbot.GetChatReplyAsync("用c++写个冒泡查询");Console.WriteLine(reply.Message.Content.Parts.FirstOrDefault());

源码(欢迎star)

https://github.com/BruceQiu1996/NChatGPTRev

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。
本文链接:http://ai.ibashu.cn/news/show_414341.html

推荐资讯

玩转ChatPT
本文数据均来源网络,仅供个人学习使用,请勿用于商业用途,如有侵权请联系删除 一、学习手册 ChatGTP学习手册 ChatGPT学习工具包 AIGC学习手册 AI实用工具导航 AI事件每日大纪实 ChatGPT学习导航 ChatGPT学习指南 ChatGPT指令大全 二、在线体验 共享ChatGPT
ChatGPT能非常好地模拟人类聊天行为
“ChatGPT能非常好地模拟人类聊天行为,在理解能力和交互性方面表现也更强,重塑众多行业或场景,为AI行业带来了一种全新的商业形态和商业模式,并有望形成万亿级市场规模。”天使投资人、知名互联网专家郭涛告诉21世纪经济报道记者。 近期,美国数字媒体公司BuzzFeed宣布与OpenAI合作,使用Ch
千人联名呼吁:AI发展太快,紧急“喊停”!
3月14日,美国研发公司OpenAI正式发布人工智能语言模型的最新产品GPT-4,震动全球。两周时间过去,一封包括SpaceX首席执行官马斯克以及1000多名行业高管和专家签署的公开信在网上发布,他们呼吁,在至少6个月内,暂停
CHATGPT插件在哪
CHATGPT插件是一种基于人工智能技术的聊天机器人插件。该插件可以在多种平台上运行,比如浏览器、手机应用程序、社交媒体平台等。以下是一个更详细的介绍。1.浏览器插件:CHATGPT插件可以
ChatGPT 可以联网了!浏览器插件下载
注册看这里:https://www.cnblogs.com/ranxi169/p/16954797.html Twitter 用户 An Qu 开发了一款新的 Chrome 插件帮助 ChatGPT 上网,安装插件以后 ChatGPT 就可以联!网!了! 简单来说开启插件后,他可以从网上搜索信息,并
CHATGPT学习资料
CHATGPT是一个多功能平台,它主要提供优质的学习资料和知识分享。这个平台已经形成了一个庞大的学习社区,为那些渴望学习和不断提高自己的人们提供了一个非常好的机会。CHATGPT的学习资料
CHATGPT设计问卷
CHATGPT设计问卷是一种针对社交媒体用户使用的智能问卷设计工具。它使用了人工智能技术,能够自动化生成问卷内容,支持多种问卷类型,例如选择题、开放性问题等。该工具还能分析用户回
开发私有chatGPT(二)openai前景展望
使用 OpenAI 的强大模型构建下一代应用程序。 GPT-3可以执行各种自然语言任务、Codex 可以将自然语言转换为代码的 ,DALL&#183;E,用于创建和编辑原始图像。 DALL&#183;E 开发人员现在可以开始使用,已经有超过3万人已经在使用DALL&#183;E来扩展他们的创造力并加

最新上架

最新资讯