2023最新!QQ接入ChatGpt!!!保姆级教程

直接先上gitee!!! 基于go-cqhttp的qqbot: java实现基于cqhttp,ws连接 由于当前chatgpt热度不断,网上众多的基于chatgpt提供的api做到chat网站层出不穷,但这些网址每次都得找,有些麻烦,我就在想能不能直接QQ接入chatgpt,想法一出,开始找资料开干!

1.申请一个openai官网的key

这一步首先你得有一个翻墙梯子,去openai官网来注册一个账号,这一步不会的猿猿先去找找这种注册的教程。 注册完毕后,我们去openai官网个人首页去申请一个API keys

到此,就拿到了openai的APIkey

2.go-cqhttp的使用

使用 mirai 以及 MiraiGo 开发的 cqhttp golang 原生实现, 并在 cqhttp 原版 的基础上做了部分修改和拓展。 使用这个的目的是为了接入qq。 直接上它的git: GitHub - Mrs4s/go-cqhttp: cqhttp的golang实现,轻量、原生跨平台. 之后下载它 Releases · Mrs4s/go-cqhttp · GitHub

系统类型可执行文件压缩文件
Intel 版 MacosNot availablego-cqhttp_darwin_amd64.tar.gz
M1 版 MacosNot availablego-cqhttp_darwin_arm64.tar.gz
32 位 LinuxNot availablego-cqhttp_linux_386.tar.gz
64 位 LinuxNot availablego-cqhttp_linux_amd64.tar.gz
arm64 LinuxNot availablego-cqhttp_linux_arm64.tar.gz
armv7 LinuxNot availablego-cqhttp_linux_armv7.tar.gz
32 位 Windowsgo-cqhttp_windows_386.exego-cqhttp_windows_386.zip
64 位 Windowsgo-cqhttp_windows_amd64.exego-cqhttp_windows_amd64.zip
arm64 Windowsgo-cqhttp_windows_arm64.exego-cqhttp_windows_arm64.zip
armv7 Windowsgo-cqhttp_windows_armv7.exego-cqhttp_windows_armv7.zip

我先用window来进行讲解了:

cmd运行它,我们先使用正向websocket连接 选择完毕,我们可以看到一个config.yml配置文件 我们来进行配置: 修改device.json文件: 将这个protocol设为2(手表)或0(mac)才可以扫码登录! 修改完后,重新启动该程序,完成qq的登录验证,正常完成验证的情况下,就会出现登录成功! 注意一定要用扫码登录!由于QQ风控越来越严了,所以用密码登录会报错45或235 到此,这个go-cqhttp服务就已经启动成功了! 由于我们采用的是websocket正向连接,所以,我们就需要写一个websocket客户端来进行接收:

@ClientEndpoint
@Slf4j
public class BotClient {private Session session;public static BotClient instance;public static boolean isOpen = false;/** 提供一个spring context上下文(解决方案)*/private static ApplicationContext applicationContext;public static Count count;//    单例模式,只生成一个客户端连接对象private BotClient(String url) {try {session = ContainerProvider.getWebSocketContainer().connectToServer(this, URI.create(url));} catch (Exception e) {e.printStackTrace();}}public static void setApplicationContext(ApplicationContext applicationContext) {BotClient.applicationContext = applicationContext;count = applicationContext.getBean(Count.class);}
​/*** 创建连接* @param url* @return*/public synchronized static boolean connect(String url) {instance = new  BotClient(url);return true;}
​/*** 连接前处理* @param session*/@OnOpenpublic void onOpen(Session session) {isOpen = true;log.info("连接成功!");}
​/*** 连接关闭处理* @param session*/@OnClosepublic void onClose(Session session) {isOpen = false;log.info("连接关闭!");}
​/*** 错误时处理* @param session* @param throwable*/@OnErrorpublic void onError(Session session, Throwable throwable) {log.info("连接错误!");}
​/*** 接收到消息时处理* @param message*/@OnMessagepublic void onMessage(String message) {
//        加好友if (message.contains("\"request_type\":\"friend\"")) {sendFriend(message);}
//        私信if (message.contains("\"post_type\":\"message\"") && message.contains("\"message_type\":\"private\"")) {sendMsg(message);}
//        群消息if (message.contains("\"post_type\":\"message\"")&& message.contains("\"message_type\":\"group\""))  {sendGroupMsg(message);}}
​/*** 好友请求*/private synchronized void sendFriend(String msg) {Friend parseObject = JSONObject.parseObject(msg, Friend.class);log.info("收到好友请求:" + parseObject.getUser_id() + ",验证消息:" + parseObject.getComment());Request<Object> paramsRequest = new Request<>();paramsRequest.setAction(BotActionEnum.ADD_FRIEND_ACTION.getAction());Map<String, Object> params = new HashMap<>();params.put("flag", parseObject.getFlag());if (parseObject.getComment().equals(count.getAuthor())) {params.put("approve", true);log.info("已同意好友请求:" + parseObject.getUser_id());} else {params.put("approve", false);log.info("已拒绝好友请求:" + parseObject.getUser_id());}paramsRequest.setParams(params);instance.session.getAsyncRemote().sendText(JSONObject.toJSONString(paramsRequest));}/*** 群消息*/public synchronized  void sendGroupMsg(String msg) {System.out.println(msg);Message parseObject = JSONObject.parseObject(msg, Message.class);log.info("收到群消息" + parseObject.getGroupId() + "的消息,发送者"+parseObject.getUserId()+"消息:"+ parseObject.getMessage()+"消息id:"+parseObject.getMessageId());System.out.println(parseObject.getMessage());String mes = parseObject.getMessage();if(mes.contains("[CQ:at,qq="+count.getBot_count()+"]")) {Request<Object> paramsRequest = new Request<>();paramsRequest.setAction(BotActionEnum.SEND_GROUP_MESSAGE.getAction());Map<String, Object> params = new HashMap<>();params.put("group_id", parseObject.getGroupId());String ai = AiOne(parseObject.getMessage(),parseObject.getMessageId());if (ai == null) {ai = "宝,回复失败!重新试试吧!";}params.put("message", ai);params.put("message_type", "group");params.put("auto_escape", false);paramsRequest.setParams(params);msg = JSONObject.toJSONString(paramsRequest);//        回复instance.session.getAsyncRemote().sendText(msg);}
​}/*** 私信好友消息*/public synchronized void sendMsg(String msg) {Message parseObject = JSONObject.parseObject(msg, Message.class);log.info("收到好友" + parseObject.getUserId() + "的消息:" + parseObject.getMessage());System.out.println("消息:"+parseObject.getMessage());Request<Object> paramsRequest = new Request<>();paramsRequest.setAction(BotActionEnum.SEND_PRIVATE_MESSAGE.getAction());Map<String, Object> params = new HashMap<>();params.put("user_id", parseObject.getUserId());String ai = AiOne(parseObject.getMessage(),null);if (ai == null) {ai = "宝,回复失败!重新试试吧!";}params.put("message", ai);params.put("message_type", "private");params.put("auto_escape", false);paramsRequest.setParams(params);msg = JSONObject.toJSONString(paramsRequest);
//        回复instance.session.getAsyncRemote().sendText(msg);}public  String AiOne(String sendMsg,String mes_id) {CloseableHttpClient httpClient = null;try {httpClient= HttpClientBuilder.create().build();GptUtils gptUtils = applicationContext.getBean(GptUtils.class);if(sendMsg.contains("画一幅图:")){log.info("进入到绘图......");String initBody = gptUtils.getImageURl(httpClient,sendMsg);if(Objects.isNull(mes_id)){String body =initBody;log.info("body:"+body);return body;}String body = "[CQ:reply,id="+mes_id+"]"+initBody;log.info("body:"+body);return body;}String initBody = gptUtils.getAnswer(httpClient,sendMsg);String body = null;if(Objects.isNull(mes_id)){body=initBody;log.info("body:"+body);return body;}body = "[CQ:reply,id="+mes_id+"]"+initBody;log.info("body:"+body);return body;} catch (Exception e) {log.error(e.toString());return null;}finally {try {httpClient.close();} catch (IOException e) {log.error("httpclient关闭失败");}}}
​
}

对于ws连接,我们也可以根据go-cqhttp的api文档来自行定制 api文档:API | go-cqhttp 帮助中心 目前我实现的是群聊,私信的聊天,及生成图片,以及好友请求同意。 项目的技术栈: websocket:连接go-cqhttp httpclient: 请求chatgptapi fastjson:进行序列化/反序列化 oss:图片存储

​<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>​<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--           websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!--        fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><!--       httpclient用来请求自动回复API --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><!--         阿里云 OSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency></dependencies>

3.openAIAPI的使用

这里重点来说说使用openai提供的API的使用: 先到openai官网上,我们先看看官方给的api文档:

请求:

curl https://api.openai.com/v1/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello!"}]}'

参数:

{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello!"}]
}

响应:

{"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"choices": [{"index": 0,"message": {"role": "assistant","content": "\n\nHello there, how may I assist you today?",},"finish_reason": "stop"}],"usage": {"prompt_tokens": 9,"completion_tokens": 12,"total_tokens": 21}
}

请求:

curl https://api.openai.com/v1/images/generations \-H "Content-Type: application/json" \-H "Authorization: Bearer $OPENAI_API_KEY" \-d '{"prompt": "A cute baby sea otter","n": 2,"size": "1024x1024"}'

参数:

{"prompt": "A cute baby sea otter","n": 2,"size": "1024x1024"
}

响应:

{"created": 1589478378,"data": [{"url": "https://..."},{"url": "https://..."}]
}

根据上面的请求响应,第一步肯定是编写VO,之后我们使用httpclient来进行请求的发送,和接收响应 VO类代码就不放这了,直接git上下载源码查看 由于 OpenAI 及 GFW 的双重限制,国内开发者无法访问 OpenAI 的 API,现提供代理服务地址供开发者免费使用. 教程:OpenAI API 代理 完毕,之后就能正常请求该接口了。 编写请求chat聊天的方法:

/*** 创建一个ChatGptRequestParameter,用于携带请求参数*/private static ChatGptRequestParameter chatGptRequestParameter = new ChatGptRequestParameter();public String getAnswer(CloseableHttpClient client, String question) {// 创建一个HttpPostHttpPost httpPost = new HttpPost(chatUrl);// 设置请求参数chatGptRequestParameter.addMessages(new ChatGptMessage(role, question));chatGptRequestParameter.setModel(model);HttpEntity httpEntity = null;try {// 对象转换为json字符串httpEntity = new StringEntity(JSON.toJSONString(chatGptRequestParameter), charset);} catch (Exception e) {log.info(question + "->json转换异常");return null;}httpPost.setEntity(httpEntity);// 设置请求头httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");// 设置登录凭证httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey);// 用于设置超时时间RequestConfig config = RequestConfig.custom().setConnectTimeout(responseTimeout).build();httpPost.setConfig(config);
//        接收返回值CloseableHttpResponse response = null;HttpEntity entity = null;try {response = client.execute(httpPost);entity = response.getEntity();
//            反序列化String responseMes = EntityUtils.toString(entity);
//            转为对象ChatGptResponseParameter responseParameter = JSON.parseObject(responseMes, ChatGptResponseParameter.class);// 遍历所有的Choices(一般都只有一个)String ans = "";for (Choices choice : responseParameter.getChoices()) {log.info("size:" + responseParameter.getChoices().size());ChatGptMessage message = choice.getMessage();chatGptRequestParameter.addMessages(new ChatGptMessage(message.getRole(), message.getContent()));String s = message.getContent().replaceAll("\n+", "\n");ans += s;}return ans;} catch (Exception e) {e.printStackTrace();}finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}
//        发生异常重置会话chatGptRequestParameter = new ChatGptRequestParameter();;return "您当前的网络无法访问,会话已重置";}

编写按描述生成图片接口:

public String getImageURl(CloseableHttpClient client, String describe) {HttpPost httpPost = new HttpPost(imageGPTUrl);ImageGptMessage imageGptMessage = new ImageGptMessage(describe, size, num);String jsonString = JSON.toJSONString(imageGptMessage);HttpEntity httpEntity = new StringEntity(jsonString,charset);//        设置请求参数httpPost.setEntity(httpEntity);// 设置请求头httpPost.setHeader(org.apache.http.HttpHeaders.CONTENT_TYPE, "application/json");// 设置登录凭证httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey);//        设置请求超时时间RequestConfig timeOut = RequestConfig.custom().setConnectTimeout(responseTimeout).build();httpPost.setConfig(timeOut);//        发送请求CloseableHttpResponse response = null;InputStream stream = null;try{response = client.execute(httpPost);HttpEntity entity = response.getEntity();
//            反序列化String responseMes = EntityUtils.toString(entity);
//            转为对象ImageGptResponseParameter responseParameter = JSON.parseObject(responseMes, ImageGptResponseParameter.class);// 遍历所有的image(一般都只有一个)for (Image image : responseParameter.getData()) {HttpGet httpGet = new HttpGet(image.getUrl());response = client.execute(httpGet);HttpEntity en = response.getEntity();stream= en.getContent();String fileName = UUID.randomUUID()+".png";String lastUrl = uploadStrategyContext.executeUploadStrategy(fileName, stream, FilePathEnum.GPTIMG.getPath());String url = "[CQ:image,file="+lastUrl+"]";
//                String url = "[CQ:image,file=https://leyasuzhou-blog.oss-cn-beijing.aliyuncs.com/img/test.png]";
//                String url = image.getUrl();System.out.println(url);return url;}}catch (Exception e){log.info("图片生成出错了");}finally {try {stream.close();response.close();} catch (IOException e) {e.printStackTrace();}}return null;}}

这里原本可以直接使用cq码来进行url封装,但直接用该接口生成图片的url会报错cq码解析超时,最后我想了个办法是先将图片放到oss上,之后再从oss上拿。但这样该方法就执行的很慢,如果有人知道这个cq码解析超时咋解决私信博主!

4.lunix部署

  1. 通过 SSH 连接到服务器

  2. cd到解压目录

  3. 输入 ./go-cqhttp, Enter运行 , 此时将提示

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在
[INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

之后继续像windows一样修改config.xml和device.json文件。 这里会有一个小问题,就是在扫码登录时,会出现风控,不让你登录,这时候怎么办呢? 首先,我们先在windows上扫码登录账号,登录成功后我们发现出现了一个session.token文件

这个文件保存了我们的登录信息,这时候,我们将这个文件页上传到lunix服务器上同样位置,就不用扫码登录了 到此,整个项目就跑起来了。 本项目是一个client单会话的,如果一个回复错误,我这边采取的是重置会话。 欢迎交流技术问题 来体验你的qqbot吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/1164.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ida接入chatgpt——WPeChatGPT

ida接入chatgpt——WPeChatGPT ida接入chatgpt——WPeChatGPT 0x00 来源 https://www.52pojie.cn/thread-1752088-1-1.html 感谢Hcho 0x01 安装 一开始git clone 不太管用&#xff0c;选择直接这样下载 安装所需包 按照README文档&#xff0c;首先在解压后的文件夹内运行…

PHP - ChatGpt 学习 仅供参考

由于最近ChatGpt 大火&#xff0c;但是门槛来说是对于大家最头疼的环节&#xff0c; 由此ChatGpt 有一个API 可以仅供大伙对接 让我来说下资质&#xff1a; 1&#xff1a;首先要搞得到一个 ChatGpt 的账户&#xff0c; 会获得一个KEY&#xff0c;该key为访问API核心&#xff0…

Python如何接入ChatGPT

文章目录 前言一、什么是ChatGPT&#xff1f;二、下载安装步骤1.安装Pycharm2.安装ChatGPT 总结 前言 ChatGPT现在越来越火&#xff0c;许多小伙伴都不知道如何去使用&#xff0c;或者没有梯子/国外手机号注册&#xff0c;Pycharm中可以安装nexchatgpt来使用&#xff0c;给有需…

OpenAI最新官方ChatGPT聊天插件接口《接入插件快速开始》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(二)(附源码)

Getting started 快速开始 前言Introduction 导言Plugin manifest 插件清单OpenAPI definition OpenAPI定义Running a plugin 运行插件Setup a local proxy of your public API 设置公共API的本地代理 Writing descriptions 书写描述Best practices Debugging 排除故障其它资料…

十分钟教你搭建ChatGPT 图片生成的安卓应用

十分钟教你搭建ChatGPT 图片生成的安卓应用 大家好&#xff0c;我是易安&#xff01; 今天&#xff0c;我们将集成 OpenAI API (ChatGPT)来构建一个简单的类似 ChatGPT 的 android 应用程序&#xff0c;让它返回我们想要的图片&#xff0c;本文是上一篇的姊妹篇。 详细步骤 第…

ChatGpt学习辅助挑战网络工程师001

ChatGpt学习辅助挑战网络工程师001 书接上回,询问ChatGpt后,来点亮第一个技能树 成为一个网络工程师ChatGpt提出的的第一步,需要熟悉网络架构. Network Architecture: You should have a good understanding of network architectures and how different components of a net…

VisualChatGPT: 微软发布可发送和接收图片的 ChatGPT

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; ​ Visual ChatGPT 连接了 ChatGPT 和一系列的 Visual Foundation 模型&#xff0c;以便在聊天过程中发送和接收图像。 下图为演示效果&#xff1a; 对该应用实现感兴趣的可以查看其…

调用chatgpt官方api实现聊天和绘图

首先要学会科学上网 1官方api文档 https://platform.openai.com/docs/api-reference/chat/create 2 获取key https://platform.openai.com/ 登录账号 之后点击右上角的头像&#xff0c;再点击View API keys 3 http调用聊天接口 调用地址https://api.openai.com/v1/chat/com…

解决chatgpt网络错误,频繁掉线的问题,那就使用KeepChatGPT

文章目录 解决chatgpt出现An error occurred. If this issue persists please contact us through our help center at help.openai.com问题起因对比原作者github地址安装步骤浏览器要求安装油猴安装KeepChatGPT插件使用方法功能栏说明功能说明如下关于 取消审计 功能关于 调整…

ChatGPT 速通手册——让 ChatGPT 来写正则表达式

regex 生成 正则表达式可谓是一门让广大程序员们又爱又恨的技术。它易学难精&#xff0c;而且可维护性又差&#xff0c;别说交接给其他同事&#xff0c;同一个人写的正则表达式&#xff0c;三个月后回头再看&#xff0c;也可能完全不知所云。 因此&#xff0c;让 ChatGPT 来写…

轻松解决ChatGPT网络报错,畅享沟通

ChatGPT的确很不错&#xff0c;无论是在什么岗位&#xff0c;使用它都可以让工作的你提升效率&#xff0c;可是我们经常会遇到一个神奇的网络报错&#xff08;当我们一会不使用就来个这样的效果提示&#xff09;&#xff0c;是不是头大&#xff1f; 好了&#xff0c;开始进入正…

完美解决ChatGPT网络错误,不再频繁地刷新网页(分享好用的插件KeepChatGPT)

最近发现一个好用的浏览器插件KeepChatGPT&#xff01;完美解决ChatGPT网络错误&#xff0c;不再频繁地刷新网页&#xff0c;敲好用&#xff01;&#xff01;&#xff01; 废话不多说上链接&#xff01; 安装渠道如下 1 Github&#xff1a;https://github.com/xcanwin/KeepCh…

ChatGPT报错“network Error“?

文章目录 问题一、为什么ChatGPT会报错"network Error"?二、ChatGPT Plus -GPT4如何开通&#xff1f;结尾 问题一、为什么ChatGPT会报错"network Error"? ChatGPT报错“Network Error”&#xff0c;通常意味着它无法连接到服务器或API服务不可用。以下是…

chatgpt api极简入门(参考官网教程)

写在前面 心血来潮&#xff0c;复试完结束很摆&#xff0c;研究点东西玩玩&#xff0c;之前之知道nonebot搭建qq机器人的方法和步骤&#xff0c;这次记录下自己使用openai&#xff0c;gpt3.5的api的代码&#xff0c;参考自openai的官网。 环境 要求 python 版本 >3.8 &…

解决ChatGPT网络总是掉线问题

解决ChatGPT网络总是掉线问题 问题描述 1.我们在使用ChatGPT时&#xff0c;总是会遇到如下图网络掉线问题&#xff0c;是什么原因呢&#xff1f;简而言之&#xff0c;服务器检测到1-2分钟内你没有与之发生数据交互&#xff0c;认为你已经掉线了&#xff0c;就主动断开了链接&…

在 1 分钟内使用 ChatGPT 构建一个完整的网站

欢迎来到令人兴奋的自然语言处理和机器学习世界&#xff01;今天&#xff0c;我们将探索 ChatGPT 的功能&#xff0c;这是一种由 OpenAI 开发的最先进的语言模型。ChatGPT 最令人印象深刻的功能之一是它能够根据简单的描述生成源代码。想象一下&#xff0c;无需自己编写一行代码…

ChatGPT,真香!谷歌顶级AI人才组团叛逃OpenAI

【导读】据The Information爆料&#xff0c;OpenAI在最近几个月里挖了至少十几名谷歌AI的员工&#xff0c;而这些工程师都在ChatGPT的研究中发挥了至关重要的作用。 如今已经没人能否认&#xff0c;OpenAI凭ChatGPT火遍了全球。 所有AI从业者和投资人都想知道&#xff0c;一家…

ChatGPT通过谷歌L3入职测试,人类码农危矣?

一条消息最近在硅谷热传&#xff1a;“ChatGPT成功通过了谷歌的面试&#xff0c;拿到了年薪18万美元的L3工程师offer&#xff01;” 既给科学论文当共同作者&#xff0c;又能替代人类码农&#xff0c;还能给总统讲话写稿子&#xff0c;这个ChatGPT&#xff0c;怕是真要通天了。…

为什么 ChatGPT 会引起 Google 的恐慌?

在 ChatGPT 尚未全面开放使用之际&#xff0c;它散发的巨大威力&#xff0c;似乎已经让行业内的竞争对手感到了威胁。 整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 距离 ChatGPT 上线不足一个月的时间&#xff0c;其已经成为各行各业智囊团中的“网…

chatGPT的谷歌浏览器Monica插件的使用

前提说明&#xff1a; 我们使用Monica插件&#xff0c;可以在使用谷歌浏览器的时候使用ChatGPT&#xff0c;平常可以和快速地解决我们遇到的开发问题。 1、需要使用的的插件百度云盘连接如下&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1IWiDS19U9qSlBcQzFrznMA 提取…