利用ChatGPT开源api开发一个聊天库

准备工作

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

ChatGPT聊天库代码示例

1.网页获取所需token和Cookie

我们需要三个东西:UserAgent,CfClearance,Session_token

我们需要先打开ChatGPT官方网站:https://chat.openai.com/chat 然后按下F12打开浏览器的开发者模式

UserAgent在网络里(只需要复制UserAgent:后面的值):

CfClearance和Session_token在应用程序->cookie里面

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

publicOpenAISession(stringsession_token,stringcfClearance,stringuserAgent){Session_token=session_token;CfClearance=cfClearance;UserAgent=userAgent;Headers=newDictionary<string,string>();Cookies=newDictionary<string,string>();Proxies=newDictionary<string,string>();}Session可以刷新自己的AccessToken和Session_tokenpublicasyncTaskRefreshSessionAsync(){if(string.IsNullOrEmpty(Session_token)){thrownewException("Notokensprovided");}//SetcookiesCookies.Put("__Secure-next-auth.session-token",Session_token);Cookies.Put("cf_clearance",CfClearance);stringcookiesString=GetCookiesString();Dictionary<string,string>map=newDictionary<string,string>();Headers.Put("User-Agent",UserAgent);Headers.Put("cookie",cookiesString);Headers.Put("Cookie",cookiesString);varresponse=awaitGetAsync("https://chat.openai.com/api/auth/session");if(!response.IsSuccessStatusCode){Console.WriteLine("errcode:"+response.StatusCode);Console.WriteLine("cf_clearance:"+CfClearance);Console.WriteLine("token:"+Session_token);Console.WriteLine("userAgent:"+UserAgent);Console.WriteLine("请检查以上参数是否正确,是否过期。");thrownewException("无法获取token!请重试");}try{stringname="__Secure-next-auth.session-token=";varcookies=response.Headers.GetValues("Set-Cookie");varstoken=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);varresult=awaitresponse.Content.ReadAsStringAsync();AccessToken=JsonSerializer.Deserialize<Profile>(result,_jsonSerializerOptions)?.AccessToken;RefreshHeaders();}catch(Exceptionex){Console.WriteLine($"Error{nameof(RefreshSessionAsync)}:{ex}");thrownewException($"Error{nameof(RefreshSessionAsync)}",ex);}}

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

privatevoidRefreshHeaders(){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");}stringname="__Secure-next-auth.session-token=";varcookies=response.Headers.GetValues("Set-Cookie");varstoken=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.创建机器人绑定一个会话

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

如何保持上下文聊天以及多用户隔离?

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

如何多用户隔离?比如联合微信机器人使用,可以将一个人或者一个群对应一个Chatbot对象,并且利用id与机器人做关联。

当然这个_clientID需要使用者做唯一性管理

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

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

publicasyncTask<Reply>GetChatReplyAsync(stringprompt){varconversation=newConversation();conversation.Conversation_id=_conversationId;conversation.Parent_message_id=_parentMessageId;conversation.Messages=newMessage[]{newMessage(){Content=newContent{Parts=newstring[]{prompt}}}};returnawaitGetChatResponseAsync(conversation);}///<summary>///获取响应///</summary>///<paramname="conversation"></param>///<returns></returns>///<exceptioncref="Exception">服务器返回非200</exception>privateasyncTask<Reply>GetChatResponseAsync(Conversationconversation){using(varclient=newHttpClient()){varresponse=awaitOpenAISession.PostAsync(_conversation,JsonSerializer.Serialize(conversation,_jsonSerializerOptions));if(!response.IsSuccessStatusCode){thrownewException($"Faildtorequest.StatusCode:{response.StatusCode}");}varmsg=awaitresponse.Content.ReadAsStringAsync();vardata=msg.Split("\\n")?.ToList().Where(x=>!string.IsNullOrEmpty(x)&&!x.Contains("data:[DONE]")).LastOrDefault()?.Substring(5);varreply=JsonSerializer.Deserialize<Reply>(data,_jsonSerializerOptions);_conversationId=reply.Conversation_id;returnreply;}}

本文收集自网络,由本站搜集发布,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。如需转载,请注明文章来源。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享