最近ChatGPT很火,借此机会给大家推荐一个利用C开发的开源的ChatGPT聊天系统,话不多说,直接上主题。准备第一步:注册OpenAI账号 因为对大陆以及中国香港地区不开放,所以我们需要小小的科学一下。 来一个我就是参照着申请账号的园子的文章: https:www。cnblogs。comchatgptphowtoregisterchatgptinchina。html 当然手机那里可以淘宝找,几块钱就能帮忙注册手机,账号里面默认还有18美元余额。 注意点:如果搭建了科学还是提示不对你的国家提供服务的话,尝试清空浏览器缓存或者打开浏览器的无痕窗口。Chrome默认在右上角三个点打开就能找到打开新的无痕式窗口。万事具备,直接撸代码1。网页获取所需token和cookie 我们需要三个东西:UserAgent,CfClearance,Sessiontoken 我们需要先打开ChatGPT官方网站:https:chat。openai。comchat然后按下F12打开浏览器的开发者模式 UserAgent在网络里(只需要复制UserAgent:后面的值): CfClearance和Sessiontoken在应用程序cookie里面 2。创建一个session用来表示一个会话publicOpenAISession(stringsessiontoken,stringcfClearance,stringuserAgent){Sessiontokensessiontoken;CfClearancecfClearance;UserAgentuserAgent;HeadersnewDictionarystring,string();CookiesnewDictionarystring,string();ProxiesnewDictionarystring,string();} Session可以刷新自己的AccessToken和SessiontokenpublicasyncTaskRefreshSessionAsync(){if(string。IsNullOrEmpty(Sessiontoken)){thrownewException(Notokensprovided);}SetcookiesCookies。Put(Securenextauth。sessiontoken,Sessiontoken);Cookies。Put(cfclearance,CfClearance);stringcookiesStringGetCookiesString();Dictionarystring,stringmapnewDictionarystring,string();Headers。Put(UserAgent,UserAgent);Headers。Put(cookie,cookiesString);Headers。Put(Cookie,cookiesString);varresponseawaitGetAsync(https:chat。openai。comapiauthsession);if(!response。IsSuccessStatusCode){Console。WriteLine(errcode:response。StatusCode);Console。WriteLine(cfclearance:CfClearance);Console。WriteLine(token:Sessiontoken);Console。WriteLine(userAgent:UserAgent);Console。WriteLine(请检查以上参数是否正确,是否过期。);thrownewException(无法获取token!请重试);}try{stringnameSecurenextauth。sessiontoken;varcookiesresponse。Headers。GetValues(SetCookie);varstokencookies。FirstOrDefault(xx。StartsWith(name));Sessiontokenstokennull?Sessiontoken:stoken。Substring(name。Length,stoken。IndexOf(;)name。Length);Cookies。Put(Securenextauth。sessiontoken,Sessiontoken);varresultawaitresponse。Content。ReadAsStringAsync();AccessTokenJsonSerializer。DeserializeProfile(result,jsonSerializerOptions)?。AccessToken;RefreshHeaders();}catch(Exceptionex){Console。WriteLine(34;Error{nameof(RefreshSessionAsync)}:{ex});thrownewException(34;Error{nameof(RefreshSessionAsync)},ex);}} 获取到的最新的AccessToken更新到header里,Sessiontoken更新到cookie里privatevoidRefreshHeaders(){Headers。Put(Host,chat。openai。com);Headers。Put(Accept,texteventstream);Headers。Put(Authorization,34;Bearer{AccessToken});Headers。Put(UserAgent,UserAgent);Headers。Put(XOpenaiAssistantAppId,string。Empty);Headers。Put(Connection,close);Headers。Put(AcceptLanguage,enUS,en;q0。9);Headers。Put(Referer,https:chat。openai。comchat);}stringnameSecurenextauth。sessiontoken;varcookiesresponse。Headers。GetValues(SetCookie);varstokencookies。FirstOrDefault(xx。StartsWith(name));Sessiontokenstokennull?Sessiontoken:stoken。Substring(name。Length,stoken。IndexOf(;)name。Length);Cookies。Put(Securenextauth。sessiontoken,Sessiontoken);3。创建机器人绑定一个会话publicChatbot(OpenAISessionopenAISession){OpenAISessionopenAISession;ResetConversation();}summary重置Conversation,开启一个新的会话summarypublicvoidResetConversation(){conversationIdnull;parentMessageIdGuid。NewGuid()。ToString();} 如何保持上下文聊天以及多用户隔离? 上下文聊天已经内置,会自动与机器人的回复进行关联,当需要重新开启一个对话的时候,可以调用ResetConversation,这样对应的机器人对象发过去就是开启了一个新的对话。 如何多用户隔离?比如联合微信机器人使用,可以将一个人或者一个群对应一个Chatbot对象,并且利用id与机器人做关联。 当然这个clientID需要使用者做唯一性管理可以作为隔离不同客户端聊天上下文的凭据,即一个机器人绑定一个客户端客户端编号可以是,微信id,qqid,飞书id,亦或者自己开发的软件的用户idprivatereadonlystringclientID;publicChatbot(OpenAISessionopenAISession,stringclientID){OpenAISessionopenAISession;clientIDclientIDnull?Guid。NewGuid()。ToString():clientID;ResetConversation();} 最后构造对话对象,发送到对应apipublicasyncTaskReplyGetChatReplyAsync(stringprompt){varconversationnewConversation();conversation。ConversationidconversationId;conversation。ParentmessageidparentMessageId;conversation。MessagesnewMessage〔〕{newMessage(){ContentnewContent{Partsnewstring〔〕{prompt}}}};returnawaitGetChatResponseAsync(conversation);}summary获取响应summaryparamnameconversationparamreturnsreturnsexceptioncrefException服务器返回非200exceptionprivateasyncTaskReplyGetChatResponseAsync(Conversationconversation){using(varclientnewHttpClient()){varresponseawaitOpenAISession。PostAsync(conversation,JsonSerializer。Serialize(conversation,jsonSerializerOptions));if(!response。IsSuccessStatusCode){thrownewException(34;Faildtorequest。StatusCode:{response。StatusCode});}varmsgawaitresponse。Content。ReadAsStringAsync();vardatamsg。Split()?。ToList()。Where(x!string。IsNullOrEmpty(x)!x。Contains(data:〔DONE〕))。LastOrDefault()?。Substring(5);varreplyJsonSerializer。DeserializeReply(data,jsonSerializerOptions);conversationIdreply。Conversationid;returnreply;}}效果截图(仅测试)OpenAISessionopenAIOptionsnewOpenAISession(Sessiontoken,CfClearance,UserAgent);awaitopenAIOptions。RefreshSessionAsync();ChatbotchatbotnewChatbot(openAIOptions);Console。WriteLine(用c写个冒泡查询);varreplyawaitchatbot。GetChatReplyAsync(用c写个冒泡查询);Console。WriteLine(reply。Message。Content。Parts。FirstOrDefault()); 获取源码:关注我并私信回复:ChatGPT聊天。 欢迎点赞转发关注!大家的支持是我分享最大的动力!!!