.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应用。
最近这玩意很火,由于网页版本限制了ip,还得必须开代理, 用起来比较麻烦,所以我尝试用maui开发一个聊天小应用 结合 chatgpt的开放api来实现(很多客户端使用网页版本接口用cookie的方式,有很多限制(如下图)总归不是很正规)
mac端由于需要升级macos13才能开发调试,这部分我还没有完成,不过maui的控件是跨平台的,放在后续我升级系统再说
https://github.com/yuzd/maui_chatgpt
学习maui的老铁支持给个star
我是设想开发一个类似jetbrains的ToolBox应用一样,启动程序在桌面右下角出现托盘图标,点击图标弹出应用(风格在windows mac平台保持一致)
需要实现的功能一览
新建一个maui工程(vs2022)
坑一: 默认编译出来的exe是直接双击打不开的
工程文件加上这个配置
<WindowsPackageType>None</WindowsPackageType><WindowsAppSDKSelfContainedCondition="'$(IsUnpackaged)'=='true'">true</WindowsAppSDKSelfContained><SelfContainedCondition="'$(IsUnpackaged)'=='true'">true</SelfContained>
以上修改后,编译出来的exe双击就可以打开了
启动时设置窗口不能改变大小,隐藏titlebar, 让Webview控件占满整个窗口
这里要根据平台不同实现不同了,windows平台采用winAPI调用,具体看工程代码吧
在MainPage.xaml 添加控件
对应的静态html等文件放在工程的 Resource\Raw文件夹下 (整个文件夹里面默认是作为内嵌资源打包的,工程文件里面的如下配置起的作用)
<!--RawAssets(alsoremovethe"Resources\Raw"prefix)--><MauiAssetInclude="Resources\Raw\**"LogicalName="%(RecursiveDir)%(Filename)%(Extension)"/>
这部分我找了很多资料,最终参考了这个demo,然后改进了下
https://github.com/mahop-net/Maui.HybridWebView
主要原理是:
js的调用封装如下:
//调用csharp的方法封装exportdefaultclassCsharpMethod{constructor(command,data){this.RequestPrefix="request_csharp_";this.ResponsePrefix="response_csharp_";//唯一this.dataId=this.RequestPrefix+newDate().getTime();//调用csharp的命令this.command=command;//参数this.data={command:command,data:!data?'':JSON.stringify(data),key:this.dataId}}//调用csharp返回promisecall(){//把data存储到localstorage中目的是让csharp端获取参数localStorage.setItem(this.dataId,this.utf8_to_b64(JSON.stringify(this.data)));leteventKey=this.dataId.replace(this.RequestPrefix,this.ResponsePrefix);letthat=this;constpromise=newPromise(function(resolve,reject){consteventHandler=function(e){window.removeEventListener(eventKey,eventHandler);letresp=e.newValue;if(resp){//从base64转换letrealData=that.b64_to_utf8(resp);if(realData.startsWith('err:')){reject(realData.substr(4));}else{resolve(realData);}}else{reject("unknownerror:"+eventKey);}};//注册监听回调(csharp端处理完发起的)window.addEventListener(eventKey,eventHandler);});//改变location发送给csharp端window.location="/api/"+this.dataId;returnpromise;}//转成base64解决中文乱码utf8_to_b64(str){returnwindow.btoa(unescape(encodeURIComponent(str)));}//从base64转过来解决中文乱码b64_to_utf8(str){returndecodeURIComponent(escape(window.atob(str)));}}
前端的使用方式
importCsharpMethodfrom'../../services/api'//发起调用csharp的chat事件函数constmethod=newCsharpMethod("chat",{msg:message});method.call()//call返回promise.then(data=>{//拿到csharp端的返回后展示onMessageHandler({message:data,username:'Robot',type:'chat_message'});}).catch(err=>{alert(err);});
csharp端的处理:
这么封装后,js和csharp的互相调用就很方便了
注册号chatgpt后可以申请一个APIKEY
API封装:
publicstaticasyncTask<CompletionsResponse>GetResponseDataAsync(stringprompt){//SetuptheAPIURLandAPIkeystringapiUrl="https://api.openai.com/v1/completions";//GettherequestbodyJSONdecimaltemperature=decimal.Parse(Setting.Temperature,CultureInfo.InvariantCulture);intmaxTokens=int.Parse(Setting.MaxTokens,CultureInfo.InvariantCulture);stringrequestBodyJson=GetRequestBodyJson(prompt,temperature,maxTokens);//SendtheAPIrequestandgettheresponsedatareturnawaitSendApiRequestAsync(apiUrl,Setting.ApiKey,requestBodyJson);}privatestaticstringGetRequestBodyJson(stringprompt,decimaltemperature,intmaxTokens){//SetuptherequestbodyvarrequestBody=newCompletionsRequestBody{Model="text-davinci-003",Prompt=prompt,Temperature=temperature,MaxTokens=maxTokens,TopP=1.0m,FrequencyPenalty=0.0m,PresencePenalty=0.0m,N=1,Stop="[END]",};//CreateanewJsonSerializerOptionsobjectwiththeIgnoreNullValuesandIgnoreReadOnlyPropertiespropertiessettotruevarserializerOptions=newJsonSerializerOptions{IgnoreNullValues=true,IgnoreReadOnlyProperties=true,};//SerializetherequestbodytoJSONusingtheJsonSerializer.SerializemethodoverloadthattakesaJsonSerializerOptionsparameterreturnJsonSerializer.Serialize(requestBody,serializerOptions);}privatestaticasyncTask<CompletionsResponse>SendApiRequestAsync(stringapiUrl,stringapiKey,stringrequestBodyJson){//CreateanewHttpClientformakingtheAPIrequestusingHttpClientclient=newHttpClient();//SettheAPIkeyintherequestheadersclient.DefaultRequestHeaders.Add("Authorization","Bearer"+apiKey);//CreateanewStringContentobjectwiththeJSONpayloadandthecorrectcontenttypeStringContentcontent=newStringContent(requestBodyJson,Encoding.UTF8,"application/json");//SendtheAPIrequestandgettheresponseHttpResponseMessageresponse=awaitclient.PostAsync(apiUrl,content);//DeserializetheresponsevarresponseBody=awaitresponse.Content.ReadAsStringAsync();//ReturntheresponsedatareturnJsonSerializer.Deserialize<CompletionsResponse>(responseBody);}
调用方式
varreply=awaitChatService.GetResponseDataAsync('xxxxxxxxxx');
完整代码参考 https://github.com/yuzd/maui_chatgpt
在学习maui的过程中,遇到问题我在microsoft learn提问,回答的效率很快,推荐大家试试看
微软最有价值专家是微软公司授予第三方技术专业人士的一个全球奖项。27年来,世界各地的技术社区领导者,因其在线上和线下的技术社区中分享专业知识和经验而获得此奖项。
MVP是经过严格挑选的专家团队,他们代表着技术最精湛且最具智慧的人,是对社区投入极大的热情并乐于助人的专家。MVP致力于通过演讲、论坛问答、创建网站、撰写博客、分享视频、开源项目、组织会议等方式来帮助他人,并最大程度地帮助微软技术社区用户使用Microsoft技术。
更多详情请登录官方网站https://mvp.microsoft.com/zh-cn
水族网(www.323335.com),水族网是国内水族造景、观赏鱼爱好者免费交流、学习、互助、分享平台,在这里可以学习水族知识,宠物鱼,水族宠物,涵盖水草造景、水族动物、爬虫、海水鱼等!
翼宠网(www.shobe.cn),分享鸟类宠物的趣味和感人的宠物故事,交流鸟类宠物的喂养、美容、选购、品种、训练、医疗、繁育等养宠知识,并开设宠物问答方便宠友进行分享互动,为爱鸟人士提供宠物鸟的图片、习性、寿命、繁殖方式、疾病防治等知识。
咪宠网(www.189993.com),分享啮齿类宠物包括:各种鼠类、松鼠类、仓鼠类、竹鼠类、河狸类、跳鼠类、睡鼠类、豚鼠类、豪猪类。啮齿类宠物是具有一对凿状门齿的中小型哺乳动物,交流啮齿类宠物的喂养、美容、选购、品种、训练、医疗、繁育等养宠知识,并开设宠物问答方便宠友进行分享互动。
狗狗网(www.321232.com),分享宠物狗的趣味和感人的故事,交流狗狗的喂养、美容、选购、品种、训练、医疗、繁育等养宠物狗知识,以及各种宠物狗狗、猛犬品种介绍等知识,为爱狗人士带来最全面的宠物狗狗相关知识,宠物行业资讯报道。
喵宠网(www.322283.com),分享宠物猫的趣味和感人的故事,交流猫咪的喂养、美容、选购、品种、训练、医疗、繁育等养宠物猫知识,以及各种宠物猫咪品种介绍等知识,为爱猫人士带来最全面的宠物猫咪相关知识,宠物行业新闻报道。
最近,我被一款叫做 ChatGPT 的人工智能(AI)聊天机器人,刷屏了。网上有人说它是搜索引擎杀手,还有人说它将取代程序员... 最后,我还是没扛住铺天盖地的赞美,跑去注册了个账号,抱着调侃“人工智障”的心态,想要调戏 ChatGPT 一番。于是就有了下面的对话: 此时,我内心毫无波澜。 此刻,我
最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞一个吧。 但是,等等,现在的ChatGPT项目基本都是网页逆向获取几个token,我不会啊,我都不知道
昨天接到领导需求,要我搭建一个chatGPT玩玩,并给了一个链接地址:https://gitee.com/RockChin/QChatGPT 然后历经千辛万苦,熬了一宿终于搭建了,中途踩了各种大坑小坑。 1、初识项目 刚刚打开这个链接,是这样的: 往下翻,也没有多少东西,以为很好搭建,没想到这是噩梦
image 什么是maui .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应用。 image chagpt 最近这玩意很火,由于网页版本限制了ip,还得必须开代理, 用起来比较
概述 标题党了,首先声明 ChatGPT 官方没有桌面版,目前市面上很多的桌面应用也在是浏览器上包了一层,而且大多做的比较粗糙,不太好用,所以都不太推荐。 作为一名骨灰级的程序员,ChatGPT 的重度使用者,这几天看到网上充斥着各种荒唐的使用教程 有把免费的 ChatGPT 打包为付费服务的 还有