QQ聊天机器人教程

文章目录

  • 关于本篇教程
  • 使用技术
  • 关于simbot
  • 所需依赖
  • 我的项目源码
    • 项目结构
    • 目前已实现的功能有
  • 可爱的猫猫码
  • 群监听及发送信息
    • 关于groupmsg
  • 发送图片,at,转发等特殊信息请使用可爱的猫猫码
  • 发送 聊天记录
  • 持续会话
  • 关于机器人启动的问题请参照我的上一篇机器人教程

关于本篇教程

我再去年的时候写过一个simbot教程 不过我对那个教程不是很满意
于是就有了本篇教程
本篇教程使用的是simbot3.0版本
相比于上一篇教程新增了一些功能
如果有问题请留言

使用技术

  • springboot
  • simbot
  • mysql
  • redis(可选)
  • mybaitsplus
  • Jsoup(写爬虫功能)

关于simbot

simbot是一款极易上手的qq机器人框架
关于这款框架在我的上一篇文章中有所介绍
框架的官网
链接: simbot
建议去看作者写的教程

所需依赖

里面我是用的有redis 不需要的可以去掉

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>QQbot</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version><simbot.version>3.0.0.preview.8.1</simbot.version><simbot-component-tcg.version>3.0.0.0.preview.3.1</simbot-component-tcg.version><simbot-component-mirai.version>3.0.0.0.preview.2.2</simbot-component-mirai.version></properties><dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.1</version><classifier>jdk13</classifier></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- simbot-spring-boot-starter 库 --><dependency><groupId>love.forte.simbot.boot</groupId><artifactId>simboot-core-spring-boot-starter</artifactId><version>${simbot.version}</version></dependency><!-- 腾讯频道组件 --><dependency><groupId>love.forte.simbot.component</groupId><artifactId>simbot-component-tencent-guild-boot</artifactId><version>${simbot-component-tcg.version}</version></dependency><!-- mirai组件 --><dependency><groupId>love.forte.simbot.component</groupId><artifactId>simbot-component-mirai-boot</artifactId><version>${simbot-component-mirai.version}</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><!-- spring2.X集成redis所需common-pool2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--mybatis-plus启动器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--lombok用于简化实体类开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!--使用mirai组件-springboot-starter --><dependency><groupId>love.forte.simple-robot</groupId><artifactId>component-mirai-spring-boot-starter</artifactId><version>2.3.4</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

我的项目源码

源码地址
如果有看不明白的建议直接去我的代码里面看

项目结构

在这里插入图片描述
listener里面存放的是一些示范代码 如下所示
在这里插入图片描述
controller里面基本上都是群聊的一些功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目前已实现的功能有

在这里插入图片描述

可爱的猫猫码

猫猫码是simbot中使用的发送特殊信息的一种格式
关于猫猫码的详细信息可以去文章开头的作者官方文档里面查看
我简单的对一些常用功能进行了封装(主要是我没找到怎么快捷使用猫猫码的方法)

package com.mybatisplus.utils;public class MakeNeko {
//发送图片public static String MakePicture(String url){return "[CAT:image,file=" +url + "]";}
//发送atpublic static String MakeAt(String qq){return "[CAT:at,code="+qq+"]";}//Voice 语音消息//[CAT:voice,id=af24eb245,file=/img/b.mp4,url=http://voice/b.mp4]public static String MakeVoice(String url){return "[CAT:voice,url="+url+"]";}//File 文件消息//[CAT:file,id=af24eb245,file=/img/b.mp4,url=http://voice/b.mp4]public static String MakeFile (String url){return "[CAT:file,url="+url+"]";}//Share 分享//[CAT:share,title=标题,content=简述,url=http://forte.love,image=http://img/a.jpg]public static String MakeShare (String title,String content, String url){return "[CAT:share,title="+title+",content="+content+",url="+url+"]";}// nudge 戳一戳public static String Makepoke (String qq){return "[CAT:nudge,code="+qq+"]";}
}

在这里插入图片描述
我们发送的猫猫码会被框架给解析成所有需要发送的图片或者其他东西

群监听及发送信息

示例:
在这里插入图片描述

关于groupmsg

 @OnGrouppublic void onGroupMsg(GroupMsg groupMsg) {// 打印此次消息中的 纯文本消息内容。// 纯文本消息中,不会包含任何特殊消息(例如图片、表情等)。System.out.println(groupMsg.getText());// 打印此次消息中的 消息内容。// 消息内容会包含所有的消息内容,也包括特殊消息。特殊消息使用CAT码进行表示。// 需要注意的是,绝大多数情况下,getMsg() 的效率低于甚至远低于 getText()System.out.println(groupMsg.getMsg());// 获取此次消息中的 消息主体。// messageContent代表消息主体,其中通过可以获得 msg, 以及特殊消息列表。// 特殊消息列表为 List<Neko>, 其中,Neko是CAT码的封装类型。MessageContent msgContent = groupMsg.getMsgContent();// 打印消息主体System.out.println(msgContent);// 打印消息主体中的所有图片的链接(如果有的话)List<Neko> imageCats = msgContent.getCats("image");System.out.println("img counts: " + imageCats.size());for (Neko image : imageCats) {System.out.println("Img url: " + image.get("url"));}// 获取发消息的人。GroupAccountInfo accountInfo = groupMsg.getAccountInfo();// 打印发消息者的账号与昵称。System.out.println(accountInfo.getAccountCode());System.out.println(accountInfo.getAccountNickname());// 获取群信息GroupInfo groupInfo = groupMsg.getGroupInfo();// 打印群号与名称System.out.println(groupInfo.getGroupCode());System.out.println(groupInfo.getGroupName());}

发送图片,at,转发等特殊信息请使用可爱的猫猫码

示例:
在这里插入图片描述

只需要对url进行一下拼装就可以发送图片了
at之类的就不在演示了
在这里插入图片描述

发送 聊天记录

有的时候要发送的信息比较多
如果一次性发送就会导致刷屏所以需要以转发聊天记录的方式发送

在这里插入图片描述

    @Autowiredprivate MessageContentBuilderFactory factory;
    @OnGroup@Filter(value="nana模块管理",trim=true,matchType = MatchType.CONTAINS)public void helpmk(GroupMsg groupMsg, Sender sender) {if (!(factory instanceof MiraiMessageContentBuilderFactory)) {throw new RuntimeException("不支持mirai组件");}MiraiMessageContentBuilder builder = ((MiraiMessageContentBuilderFactory) factory).getMessageContentBuilder();builder.forwardMessage(forwardBuilder -> {forwardBuilder.add(groupMsg.getBotInfo(),"nana启动学习模块\n" +"nana关闭学习模块\n " +"nana关闭回复模块\n " +"nana启动回复模块\n" +"nana关闭定时模块\n" +"nana启动定时模块\n" +"nana关闭天气模块\n" +"nana启动天气模块 (超级管理员使用)\n"+"nana添加群定时\n"+"nana取消群定时\n"+"nana添加群回复\n"+"nana取消群回复\n"+"nana开启聊天模块 \n"+"nana关闭聊天模块\n"+"nana添加群今天吃什么\n"+"nana取消群今天吃什么");});final MiraiMessageContent messageContent = builder.build();// 发送消息sender.sendGroupMsg(groupMsg, messageContent);}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
当然一次也可以发送多条信息例如在这里插入图片描述

在这里插入图片描述

持续会话

示例:
在这里插入图片描述
关于对某个人的持续会话建议去看框架作者所写的教程
https://simbot.forte.love/docs/basic/continuous-session
建议直接去看我的代码
在这里插入图片描述

    private static final String AREA1_GROUP = "Area1";private static final String AREA2_GROUP = "Area2";private static final String AREA3_GROUP = "Area3";private static final String AREA4_GROUP = "Area4";@OnGroup@Filter(value = "nana删除", matchType = MatchType.STARTS_WITH)@ListenBreakpublic void testConversationDomain(GroupMsg msg, ListenerContext context, Sender sender) {if(  Delete_flag ) {ContinuousSessionScopeContext sessionContext = (ContinuousSessionScopeContext) context.getContext(ListenerContext.Scope.CONTINUOUS_SESSION);assert sessionContext != null;String accountCode = msg.getAccountInfo().getAccountCode();String groupCode = msg.getGroupInfo().getGroupCode();// 通过账号拼接一个此人在此群中的唯一keyString key = accountCode + "-" + groupCode;hashMap.put(key,new Message());// 发送提示信息sender.sendGroupMsg(msg, "请问您要删除的关键词是什么?");SessionCallback<String> callback = SessionCallback.<String>builder().onResume(text -> {sender.sendGroupMsg(msg, text);}).onError(e -> {// 这里是第一个会话,此处通过 onError 来处理出现了异常的情况,例如超时if (e instanceof TimeoutException) {// 超时事件是 waiting的第三个参数,可以省略,默认下,超时时间为 1分钟// 这个默认的超时时间可以通过配置 simbot.core.continuousSession.defaultTimeout 进行指定。如果小于等于0,则没有超时,但是不推荐不设置超时。System.out.println("onError: 超时啦: " + e);sender.sendGroupMsg(msg, "超时啦");} else {System.out.println("onError: 出错啦: " + e);sender.sendGroupMsg(msg, "出错啦");}}).onCancel(e -> {// 这里是第一个会话,此处通过 onCancel 来处理会话被手动关闭、超时关闭的情况的处理,有些时候会与 orError 同时被触发(例如超时的时候)System.out.println("onCancel 关闭啦: " + e);}).build(); // build 构建// 这里开始等待第一个会话。sessionContext.waiting(AREA1_GROUP, key, callback);}else{sender.sendGroupMsg(msg, "删除模块没有开启");}}/*** 针对上述第一个会话的监听。* 通过 @OnlySession来限制,当且仅当由 AREA1_GROUP 这个组的会话的时候,此监听函数才会生效。*/@OnGroup@OnlySession(group = AREA1_GROUP)public void listenArea1(GroupMsg msg, ListenerContext context){// 得到session上下文。ContinuousSessionScopeContext session = (ContinuousSessionScopeContext) context.getContext(ListenerContext.Scope.CONTINUOUS_SESSION);assert session != null;String accountCode = msg.getAccountInfo().getAccountCode();String groupCode = msg.getGroupInfo().getGroupCode();// 通过账号拼接一个此人在此群中的唯一keyString key = accountCode + "-" + groupCode;String text = msg.getMsg();Message message1 = hashMap.get(key);if(message1!=null){// message1 = new  Message();message1.setKeymessage(text);List<String> strings = service.Get_QQ_by_key(text); //根据要删除的内容返回这个key所有的qq号int size = strings.size();if(size!=0) {for (String string : strings) {//如果这个qq号和触发这个函数的QQ号相同并且权限满足//  if (string.contains(accountCode) || Integer.parseInt(adminService.get_Admin_permission(accountCode).getPermission()) < 2) {if(true){int i = 0;int b = 0;i = service.DeleteMessage(text);//     b = service.DeleteMessage_By_QQ(text, accountCode);if (b+i == 0) {session.push(AREA1_GROUP, key, "删除失败");} else {session.push(AREA1_GROUP, key, "删除成功");}break;} else {session.push(AREA1_GROUP, key, "您的权限不足 只能管理员或者本人才能删除");}}hashMap.remove(key);}else{session.push(AREA1_GROUP, key, "在数据库中未检索到删除的key");hashMap.remove(key);}}}/*** 针对上述第二个会话的监听。* 通过 @OnlySession来限制,当且仅当由 AREA2_GROUP 这个组的会话的时候,此监听函数才会生效。*/@OnGroup@OnlySession(group = AREA2_GROUP)public void listenArea2(GroupMsg msg, ListenerContext context){// 得到session上下文。ContinuousSessionScopeContext session = (ContinuousSessionScopeContext) context.getContext(ListenerContext.Scope.CONTINUOUS_SESSION);assert session != null;String accountCode = msg.getAccountInfo().getAccountCode();String groupCode = msg.getGroupInfo().getGroupCode();// 通过账号拼接一个此人在此群中的唯一keyString key = accountCode + "-" + groupCode;String text = msg.getText();MessageContent msgContent = msg.getMsgContent();List<Neko> image = msgContent.getCats("image");String url="";if(image.size()!=0){Neko neko = image.get(0);url = neko.get("url");message.setUrl(url);}if(url.equals("")){try{String value = text;message.setValuemessage(value);}catch(ArrayIndexOutOfBoundsException e){if(message.getValuemessage().equals("")&&message.getUrl().equals("")){session.push(AREA2_GROUP, key, "0");message=null;}}}message.setValuemessage(text);message.setQq(accountCode);int study = service.InsertMessage(message);session.push(AREA2_GROUP, key, study);message=null;}

在这里插入图片描述

在这里插入图片描述

关于机器人启动的问题请参照我的上一篇机器人教程

https://blog.csdn.net/qq_47431361/article/details/123312806

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

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

相关文章

别再用Ctrl+C来复制内容了,赶紧试试这一款快捷回复工具

电脑上复制内容你会选择的方法是什么&#xff1f;相信很多人会说使用CtrlC来复制&#xff0c;CtrlV来粘贴&#xff0c;用电脑快捷键复制内容固然是比较快捷的&#xff0c;但是在复制的时候容易误选导致粘贴错误&#xff0c;而且经常使用键盘CtrlC也容易让手部感觉比较劳累&…

鸿蒙OS已开源(内有Huawei_LiteOS下载地址)

华为的Harmony OS 昨天发布&#xff0c;来得比预计的早一些。 特点&#xff1a; 1、开源。 2、鸿蒙系统是基于微内核的全场景分布式OS 3、实现模块化耦合&#xff0c;对应不同设备可弹性部署&#xff0c;鸿蒙OS有三层架构。 4、底层由鸿蒙微内核、Linux 内核、lite os 组成…

鸿蒙os3.0beta,鸿蒙OS系统下载-鸿蒙OS beta版 v2.0下载-955游戏网

鸿蒙OS beta版简介&#xff1a; 鸿蒙系统os2.0是由华为带来的最炫酷的最新的系统软件&#xff0c;这个新的操作系统给大家更专业的系统服务。 鸿蒙操作系统专注于内核安全&#xff0c;而且自主开发的系统应用于手机和其他可穿戴设备,不仅使用方便&#xff0c;而且功能强大&…

鸿蒙系统在哪里下载,鸿蒙操作系统开源在哪下载 华为鸿蒙OS操作系统开源下载...

鸿蒙操作系统开源在哪下载?华为自研操作系统鸿蒙OS是一个开源系统&#xff0c;对鸿蒙OS操作系统感兴趣的朋友是不是想下载鸿蒙OS操作系统开源呢?下面小编为大家带来了鸿蒙OS操作系统开源下载&#xff0c;供参考。 鸿蒙OS操作系统开源下载 华为自有操作系统鸿蒙在8月9日正式发…

华为鸿蒙os手机系统下载,华为鸿蒙os系统手机正版下载|华为鸿蒙os手机Beta版正式版-520下载站...

华为鸿蒙os手机Beta版正式版是一款面向所有手机移动端用户所研发的操作系统软件&#xff0c;华为鸿蒙os手机可以在手机&#xff0c;电脑各种上进行开端代码的下载&#xff0c;查看系统的详细框架内容&#xff0c;可以进行相关的实验操作&#xff0c;目前所有的华为手机以及智能…

ubuntu 安装微信(微信官方版本)

ubuntu 安装微信 1-环境说明&#xff1a; 首先&#xff0c;说明一下我在ubuntu20.04LTS上安装微信的经历&#xff0c;我在网上&#xff08;主要是csdn&#xff09;看了很多安装方法&#xff0c;包括直接安装wechat&#xff0c;安装deepin版本的wechat&#xff0c;要么是不能运…

如何获取鸿蒙系统的源码下载

如何获取鸿蒙系统的下载 源码地址仓库说明规则仓库根据规则仓库下载源码说明 源码地址 https://gitee.com/openharmony 仓库说明 该项目总共有119个仓库&#xff0c;他的鸿蒙系统&#xff0c;结构类似于安卓&#xff0c;并不是由一个仓库维护&#xff0c;也就是说&#xff0…

华为手机鸿蒙系统官方下载入口,华为鸿蒙系统官方下载入口v.20

华为鸿蒙系统官方下载入口v.20是一款非常好用的国产手机程序。华为鸿蒙系统官方下载入口v.20为您带来了华为方面提供的权威下载地址。在这款国产手机系统里您可以收获到相比于各种老牌外国手机系统更好的体验&#xff0c;享受更好的智能手机服务。想要试试看的朋友赶紧来下载吧…

华为v3鸿蒙系统_华为鸿蒙系统下载

最近的华为鸿蒙系统非常的火爆&#xff0c;在这里小编为大家带来了华为鸿蒙系统试用版下载&#xff0c;为用户创造了一个安全、简单、易用、美观的桌面操作系统&#xff01; 华为鸿蒙系统介绍 华为鸿蒙系统试用版是基于Linux内核研发的操作系统&#xff0c;内置各种安全机制&am…

傻瓜式鸿蒙3.0使用Google(无需电脑)

首先声明&#xff1a; 此文仅做交流学术及为出国用户提供微不足道的帮助用&#xff01;&#xff01;&#xff01; 请遵守我国相关法律法规&#xff01;&#xff01;&#xff01; 此文仅做交流学术及为出国用户提供微不足道的帮助用&#xff01;&#xff01;&#xff01; 请遵守…

最新鸿蒙3.0/3.1/4.0安卓服务使用教程

工具箱 接着申请认证&#xff1a;认证传送门

如何通过Windows下载鸿蒙源码?

目录 第一步&#xff1a;下载准备 第二步&#xff1a;进入https://gitee.com/openharmony找到下载说明 第三步&#xff1a;找到下载git clone https://gitee.com/openharmony/manifest.git -b master 第四步&#xff1a;编写python脚本 第五步&#xff1a;执行python脚本&a…

鸿蒙linux软件开源,鸿蒙系统Linux版下载

鸿蒙os2.0Linux最新版(harmonyos)是最近华为郑重推出的全新鸿蒙系统&#xff0c;华为已经放出这套测试系统的开源代码&#xff0c;大家可以通过源码进行创作&#xff0c;源码内容非常丰富且强大&#xff0c;能够实现全智联&#xff0c;欢迎大家到站内下载&#xff01; 鸿蒙系统…

鸿蒙系统官网电脑版,华为鸿蒙系统官方pc版下载-华为鸿蒙系统官方电脑pc版 -优盘手机站...

华为鸿蒙系统官方pc版是一款华为官方打造的pc端鸿蒙系统工具&#xff0c;大家可以轻松的进行体验一番哦&#xff0c;在电脑上也可以体验到非常便利的玩法&#xff0c;可以发现许多的精彩哦&#xff0c;支持适配不同的机型&#xff0c;使用起来也相当的轻便好用&#xff0c;感兴…

鸿蒙OS 2.0内测版,鸿蒙系统2.0安装包下载地址

鸿蒙OS系统是一款备受瞩目华为开发的全新手机系统&#xff0c;目前已经开始了开发者测试HarmonyOS 2.0版本&#xff0c;已经有很多开发者收到了推送&#xff0c;那么具体如何参与和下载安装包呢&#xff1f;这里为大家带来步骤。 12月26日&#xff0c;华为已经向参与HarmonyOS …

ubuntu-18.0.04 鸿蒙OpenHarmony系统源码(OHSP)下载

如果想下载HarmonyOS中 api7里面的java 源码的&#xff0c;可以止步了。因为这一块并没有开源&#xff0c;api 7里面java的部分属于HarmonyOS&#xff0c;不是openharmony的部分… 怪不得网上找不到任何一个介绍Ability.java AbilitySlice.java这种源代码的文章。java应该只是鸿…

华为手机鸿蒙系统官方下载入口,华为鸿蒙系统官方下载入口

华为鸿蒙系统官方下载入口是华为鸿蒙系统的升级版。新版本功能更加强大&#xff0c;主要体现在对关键分布式软总线、分布式数据管理、分布式安全等分布式功能的全面升级。它不仅将改变和提高安全性和速度质量&#xff0c;而且将从智能屏幕扩展到更多的智能设备&#xff0c;包括…

鸿蒙系统的软件怎么下载,怎么下载鸿蒙系统?

电梯直达 huafen257355088 新学乍练 发表于 2020-12-23 08:53:26 来自&#xff1a;HUAWEI Mate 30 Pro 5G 最新回复 2021-4-28 12:38:58 Screenshot_20201223_085118_com.tencent.mm.jpg (596.86 KB, 下载次数: 1) 2020-12-23 08:53 上传 huafen684234989 新学乍练 发表于 2020…

鸿蒙OS下载地址

HarmonyOS 是“第一个适用于所有场景的基于微内核的分布式操作系统”&#xff0c;它可以运行在智能手机、智能扬声器、计算机、智能手表、无线耳塞、汽车与平板电脑上&#xff0c;其支持的 RAM 大小从千字节到千兆字节不等。奈何很多人不知道&#xff0c;鸿蒙OS的下载地址&…

第一台存储程序计算机 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 21 日&#xff0c;在 23 年前的今天&#xff0c;中国联通公司在香港、纽约成功上市&#xff0c;筹资 56.5 亿美元&#xff0c;进入全球首次股票公开发行史…