【开源】利用.NET开发第一个ChatGPT聊天系统
最近ChatGPT很火,借此机会给大家推荐一个利用C开发的开源的ChatGPT聊天系统,话不多说,直接上主题。
准备第一步:注册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(stringsession_token,string cfClearance,string userAgent)Session_token = session_token;CfClearance = cfClearance;UserAgent = userAgent;headers = new Dictionarystring>();cookies = new Dictionary();Proxies = new Dictionary();
Session可以刷新自己的AccessToken和Session_token
public async Task RefreshSessionAsync()if (string.IsNullOrEmpty(Session_token))throw new exception("No tokens provided");// SetcookiesCookies.Put("__Secure-next-auth.session-token", Session_token);Cookies.Put("cf_clearance", CfClearance);string cookiesString = GetCookiesString();Dictionary map = new Dictionary();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!请重试");trystring 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(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();/// 重置Conversation,开启一个新的会话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 GetChatReplyAsync(string prompt)var conversation = new Conversation();conversation.Conversation_id = _conversationId;conversation.Parent_message_id = _parentMessageId;conversation.Messages = new Message[]new Message()Content = new ContentParts = new string []{ prompt }return await GetChatResponseAsync(conversation);/// 获取响应/// 服务器返回非200private async Task 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(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 = awaitchatbot.GetChatReplyAsync("用c++写个冒泡查询");Console.WriteLine(reply.Message.Content.Parts.FirstOrDefault());
欢迎点赞+转发+关注!大家的支持是我分享最大的动力!!!
-
上一篇
记者从天眼查App获悉,ChattGPT中文入口公众号注册于2月6日,认证主体北京艺天下文化科技有限公司成立于2015年5月,法定代表人为张晓亮;Chat2GPT聊天助手公众号于2月6日变更为现名,其认证主体深圳市超时代软件有限公司成立于2013年7月,法定代表人为钟如芳;介绍为chatGPT中文版入口的超级AI公众号注册于1月30日,认证主体深圳丰大云计算科技有限公司成立于2021年5月,法定代表人为刘飞。
其经营范围含软件开发;数据处理;组织文化艺术交流活动(不含演出);承办展览展示活动;产品设计;工艺美术设计;销售工艺品、收藏品;设计、制作、代理、发布广告;文艺创作;会议服务;收藏品鉴定服务;拍卖;第二类增值电信业务;广播电视节目制作经营;利用信息网络经营表演;出版物批发;出版物零售。
潇湘晨报综合
揭秘多个山寨ChatGPT背后公司!多款山寨公众号系近期注册
近日,AI聊天机器人ChatGPT爆火,市场上出现多款摹仿ChatGPT功能的产品,其中多个公众号注册成立不足一周。
-
下一篇
【颠覆】北京邮电大学王敬宇教授:ChatGPT正在迅速颠覆传统搜索引擎,未来或成为新一代信息入口
聊天机器人ChatGPT爆红全球,掀起AI浪潮。一时间,人工智能生产内容(AIGeneratedContent,AIGC)也再次被推上了风口浪尖,国内外科技