本QQ机器人实现的功能

1.输入关机,进入30秒倒计时关机

2.输入锁屏,电脑自动进行锁屏操作

3.输入取消关机,即可取消关机指令

4.调用青云客的API进行自动聊天

5.输入关键词自动添加为好友

技术栈:

非特殊情况保持一致即可!

1.SpringBoot2.7.5

2.JDK1.8

3.mirai2.3.0

mirai的github:GitHub - simple-robot

mirai官方文档:mirai语雀文档

源码链接:QQ_robot.zip - 蓝奏云

实现步骤:

1. 新建一个springBoot项目,选择lombok这一个依赖即可

2. 引入相关依赖

         <!--使用mirai组件开发QQ机器人--><dependency><groupId>love.forte.simple-robot</groupId><artifactId>component-mirai-spring-boot-starter</artifactId><version>2.3.0</version></dependency><!-- httpclient用来请求自动回复API --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>

3.启动类

/*** 启动类* Author:木芒果*/
@EnableSimbot
@EnableScheduling
@SpringBootApplication
@Slf4j
public class QqRobotApplication {public static void main(String[] args) {SpringApplication.run(QqRobotApplication.class, args);log.info("木芒果机器人启动成功~~~~");}
}

4.HTTP请求工具类,需要引入httpclient依赖

/*** http工具类* Author:木芒果*/
public class HttpUtil {private static final CloseableHttpClient HTTP_CLIENT;static {PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();cm.setMaxTotal(100);cm.setDefaultMaxPerRoute(20);cm.setDefaultMaxPerRoute(50);HTTP_CLIENT = HttpClients.custom().setConnectionManager(cm).build();}/*** 发送GET请求*/public static String get(String url) {CloseableHttpResponse response = null;BufferedReader in;String result = "";try {HttpGet httpGet = new HttpGet(url);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000).setConnectionRequestTimeout(30000).setSocketTimeout(30000).build();httpGet.setConfig(requestConfig);httpGet.setConfig(requestConfig);httpGet.addHeader("Content-type", "application/json; charset=utf-8");httpGet.setHeader("Accept", "application/json");response = HTTP_CLIENT.execute(httpGet);in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));String str = null;String line;//String nL = System.getProperty("line.separator");while ((line = in.readLine()) != null) {//sb.append(line).append(nL);//解决中文乱码问题str = new String((line).getBytes(), StandardCharsets.UTF_8);}in.close();System.out.println(str);result = str;} catch (IOException e) {e.printStackTrace();} finally {try {if (null != response) {response.close();}} catch (IOException e) {e.printStackTrace();}}return result;}/*** 发送POST请求*/public static String post(String url, String jsonString) {HttpPost httpPost = new HttpPost(url);CloseableHttpClient client = HttpClients.createDefault();//解决中文乱码问题StringEntity entity = new StringEntity(jsonString, "utf-8");entity.setContentEncoding("utf-8");entity.setContentType("application/json");httpPost.setEntity(entity);HttpResponse response;try {response = client.execute(httpPost);if (response.getStatusLine().getStatusCode() == 200) {HttpEntity httpEntity = response.getEntity();return EntityUtils.toString(httpEntity, "utf-8");}} catch (IOException e) {e.printStackTrace();}return null;}}

5.定时发送信息类,通过配置达到自动发信息的目的

/*** 定时发送消息* Author:木芒果*/
@Component
@Slf4j
public class AutoMessage {@Resourceprivate BotManager botManager;@Value("${bello.qq}")private Set<String> qqSet;@Value("${belloGroup.group}")private Set<String> qqGroupSet;/*** 定义语录*/static List<String> content;/*** 定义图片*/static List<String> images;static {content = new ArrayList<>();images = new ArrayList<>();log.info("开始加载定义语录~~~");// 定义语录content.add("遇见你之前,我没想过结婚,遇见你之后,结婚我没想过别人。");content.add("你走向我,我觉得一日不见如隔三秋,你朝我笑,我又觉得三秋未见不过一日。");content.add("如果可以和你在一起,我宁愿让天空所有的星光全部损落,因为你的眼睛,是我生命里最亮的光芒。");content.add("我一直喜欢温暖的东西,而世界上最温暖的,无非阳光和你。");content.add("我不要短暂的温存,只要你一世的陪伴。");content.add("我没有特别喜欢的零食,没有特别喜欢的电影,没有特别喜欢听的歌,但我就是特别喜欢你。");content.add("一年四季想陪你度过,世间琐事都想与你做,此生也只想同你尝尽烟火。");content.add("我还是很喜欢你,像七月的风和八月的雨,毫无交集。");content.add("你在我身边也好,在天边也罢,想到世界的角落有一个你,觉得整个世界也变得温柔安定了。");content.add("我的人生理念是活十成,一成不变的是爱你,剩下九成是加倍爱你。");log.info("开始加载表情图片~~~");// 表情图片images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/112ab4dd77ba5919bd830a75cf8973c.png");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20200623142757.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201002220953.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201002221329.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201002221441.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201002221545.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201004212459.jpg");images.add("https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201004212532.jpg");}/*** 每一小时发送一次: 0 0 0/1 * * ?* 每五分钟发送一次: 0 0/5 * * * ?*/@Scheduled(cron = "0 0 0/1 * * ?")public void handler() {Calendar calendar = Calendar.getInstance();// 获取当前小时int hour = calendar.get(Calendar.HOUR_OF_DAY);// 只在早上8点到晚上22点发送消息if (hour < 8 || hour > 22) {return;}//发送QQ私信qqSet.forEach(qq -> {try {final String msg = content.get(new Random().nextInt(content.size()));final String img = String.format("[CAT:image,url=%s,flash=false]", images.get(new Random().nextInt(images.size())));// 发送随机定义语录botManager.getDefaultBot().getSender().SENDER.sendPrivateMsg(qq, msg);// 发送随机定义图片botManager.getDefaultBot().getSender().SENDER.sendPrivateMsg(qq, img);log.info("正在发送定义语录,当前qq={}, 语录={}, img={}", qq, msg, img);} catch (Exception e) {log.error("发送定义语录异常, qq={}", qq, e);}});//发送QQ群if (null != qqGroupSet && qqGroupSet.size() > 0) {qqGroupSet.forEach(qq -> {try {final String msg = content.get(new Random().nextInt(content.size()));final String img = String.format("[CAT:image,url=%s,flash=false]", images.get(new Random().nextInt(images.size())));// 发送随机定义语录botManager.getDefaultBot().getSender().SENDER.sendGroupMsg(qq, msg);// 发送随机定义图片botManager.getDefaultBot().getSender().SENDER.sendGroupMsg(qq, img);log.info("正在发送定义语录,当前qq={}, 语录={}, img={}", qq, msg, img);} catch (Exception e) {log.error("发送定义语录异常, qq={}", qq, e);}});}}
}

6.消息监听类,你可以在这个类对QQ消息进行监听,并实现你的目的

/*** 消息监听类* Author:木芒果*/
@Component
@Slf4j
public class MessageListener {static final String URL = "http://api.qingyunke.com/api.php";/*** 监听好友添加请求*/@OnFriendAddRequestpublic void friendAddRequest(MiraiFriendRequest miraiFriendRequest) {long fromId = miraiFriendRequest.getEvent().getFromId();log.info(fromId + ",添加我为好友");//触发关键词即自动同意,否则拒绝if (miraiFriendRequest.getEvent().getMessage().equals("我爱你")) {log.info("同意添加" + fromId + "为好友");miraiFriendRequest.getEvent().accept();} else {log.info("拒绝添加" + fromId + "为好友");miraiFriendRequest.getEvent().reject(false);}}    /*** 监听私聊消息*/@OnPrivatepublic void privateMsg(PrivateMsg privateMsg, MsgSender sender) {// 智能聊天sendMsg(privateMsg, sender, false);}/*** 监听群消息*/@OnGrouppublic ReplyAble groupMsg(GroupMsg groupMsg, MsgSender sender) {// 默认关闭群聊模式,需要的话把注释去掉//return sendMsg(groupMsg, sender, true);return null;}/*** 通过青客云封装智能聊天*/private ReplyAble sendMsg(MessageGet commonMsg, MsgSender sender, boolean group) {log.info("智能聊天中~~~,接收消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(),commonMsg.getMsgContent().getMsg());Runtime run = Runtime.getRuntime();//锁屏if (commonMsg.getMsgContent().getMsg().equals("锁屏")) {try {run.exec("cmd /c start rundll32.exe user32.dll,LockWorkStation");sender.SENDER.sendPrivateMsg(commonMsg, "宝!已经为您的电脑进行锁屏了哦!");return null;} catch (Exception e) {e.printStackTrace();}}//关机if (commonMsg.getMsgContent().getMsg().equals("关机")) {try {run.exec("cmd /c shutdown -t 30 -s");sender.SENDER.sendPrivateMsg(commonMsg, "宝!已经为您的电脑进行30秒倒计时关机了哦!");return null;} catch (Exception e) {e.printStackTrace();}}//取消关机if (commonMsg.getMsgContent().getMsg().equals("取消关机")) {try {run.exec("cmd /c shutdown -a");sender.SENDER.sendPrivateMsg(commonMsg, "宝!已经为您取消关机了哦!");return null;} catch (Exception e) {e.printStackTrace();}}// MsgSender中存在三大送信器,以及非常多的重载方法。// 通过get请求调用聊天接口String result = HttpUtil.get(URL.concat("?key=free&appid=0&msg=").concat(commonMsg.getMsgContent().getMsg()));if (!StringUtils.isEmpty(result)) {final JSONObject json = JSONObject.parseObject(result);if (json.getInteger("result") == 0 && !StringUtils.isEmpty(json.getString("content"))) {final String msg = json.getString("content").replace("{br}", "\n");log.info("智能聊天中~~~,发送消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(), msg);//发送群消息if (group) {// 参数1:回复的消息 参数2:是否at当事人return Reply.reply(msg, true);}//发送私聊消息sender.SENDER.sendPrivateMsg(commonMsg, msg);}}return null;}}

7.修改配置文件application.properties

#配置监听的QQ号,多个QQ用逗号分割
bello.qq=1805395628
#配置监听的qq群
belloGroup.group=
#机器人的qq账号与密码,格式:QQ号:密码
simbot.core.bots=123456:123456.# mirai心跳周期. 过长会导致被服务器断开连接. 单位毫秒
simbot.component.mirai.heartbeat-period-millis=30000
# 每次心跳时等待结果的时间.一旦心跳超时, 整个网络服务将会重启 (将消耗约 1s). 除正在进行的任务 (如图片上传) 会被中断外, 事件和插件均不受影响
simbot.component.mirai.heartbeat-timeout-millis=5000
# 最多尝试多少次重连
simbot.component.mirai.reconnection-retry-times=2147483647
# 使用协议类型。注,此值为枚举类 net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol 的元素值,
# 可选值为:ANDROID_PHONE、ANDROID_PAD、ANDROID_WATCH
simbot.component.mirai.protocol=ANDROID_PAD
# 是否关闭mirai的bot logger
simbot.component.mirai.no-bot-log=true
# 关闭mirai网络日志
simbot.component.mirai.no-network-log=true
# mirai bot log切换使用simbot的log
simbot.component.mirai.use-simbot-bot-log=true
# mirai 网络log 切换使用simbot的log
simbot.component.mirai.use-simbot-network-log=true
# mirai配置自定义deviceInfoSeed的时候使用的随机种子。默认为1.
simbot.component.mirai.device-info-seed=1

8.启动SpringBoot项目

值得注意的是:因为涉及到登录QQ,你的机器人QQ小号必须关闭设备锁,启动项目以后会让你进行滑块验证,你复制控制台中链接(千万别漏有好长一段,你直接点可能不对要手动复制)然后打开浏览器进行验证,将获取到的ticket码发送至控制台即可,如果还是验证失败,可以多重启几次项目,然后就会给你扫描登录链接让你进行扫码登录,全部完成后,会显示"木芒果机器人启动成功"字样,代表成功,就可以进行了哦!虽然很麻烦,但是只要验证一次,他会在你项目目录下生成一个cache文件保存账号信息别删就不用重复验证!如果还是不行可以去官方文档找找具体解决方法!

图解:

 大概需要3-5次,可以成功了!

 9.效果图

感谢各位观看!如果对你有帮助,点个赞把!

如果还是没看懂,这边给一个mirai作者在b站录得教程视频链接,你可以看看:[simbot] 如何用Java写QQ机器人 V2.1.0 贴心女友级教程_哔哩哔哩_bilibili

基于SpringBoot实现QQ机器人相关推荐

  1. 基于Mirai搭建QQ机器人监控B站直播

    搭建自定义Mirai机器人 周末本来想继续学Vue来着,这不又搞这个了,唉,这计划赶不上变化啊. 参考文档 mamoe/mirai: 高效率 QQ 机器人支持库 Gradle 下载的依赖jar包在哪? ...

  2. PHP开发基于Mirai的QQ机器人

    博客和更新地址:PHP开发基于Mirai的QQ机器人 前言 在完成配置开源安卓QQ协议库Mirai后,便可使用已有开源项目来部署自己的QQ机器人,但自行开发显然更符合需求.借助mirai-api-ht ...

  3. 基于Nonebot2搭建QQ机器人(一)机器人环境配置

    目录 一.Nonebot2介绍 二.Nonebot2安装 1.bot.py文件的配置 2..env文件的配置 3.env.dev文件配置 4.env.pord配置 三.go-cqhttp介绍 四.go ...

  4. 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)

    目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...

  5. 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)

    目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...

  6. 基于go-cqhttp的qq机器人

    qqrobot 基于go-cqhttp的qq机器人 环境安装 安装 python3.8以上版本 安装依赖 pip install flask pip install requests 部署方法 首先打 ...

  7. PHP开发基于Mirai的QQ机器人(一)

    基础环境的搭建 (一) 本文简介 本文讲解高效率QQ机器人框架Mirai. 本文发布于 Mirai V2 由于QQ机器人常被部署在服务器,所以我只讲解 Linux 的部署方式. 本文针对PHP开发者. ...

  8. 基于go-cqhttp实现QQ机器人

    前言 本篇文章原文:http://www.7yue.top/rabbitbot/ 本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现. QQ机器人RabbitBot采用pyth ...

  9. 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

    文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...

最新文章

  1. Win64 驱动内核编程-34.对抗与枚举MiniFilter
  2. 通过踩坑带你读透虚拟机的“锁粗化”
  3. YunYang1994/tensorflow-yolov3 Readme 翻译
  4. inxtrackup mysql_雪糕 的动态 - SegmentFault 思否
  5. 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)
  6. imx6 i2c分析
  7. Flowable快速工作流脚手架_Jsite角色授权不显示
  8. 04-linux下离线安装Rserve
  9. centos网络隔一段时间就断_如果是中专学历,以后做网络工程师会有瓶颈吗?
  10. 关于 rm -rf * 你需要知道的
  11. bash 脚本_实用的 bash 自定义脚本,快速提效工作流程
  12. linux rtl8188eu ap模式 密码错误 disassoc reason code(8)
  13. 苹果手机上网很慢_手机信号满格,但上网速度却很慢?来听听通信专家怎么说的...
  14. 电脑桌面录屏软件大全,给大家推荐一波优秀的屏幕录像工具!
  15. 人事管理工作难开展?这几个人力资源管理软件用了没
  16. android自动开机慢,手机开机慢怎么回事?安卓手机开机慢的原因和解决方法图文详解...
  17. Matlab绘图线条颜色,线型,标记点选项参数
  18. 【嵌入式13】两台电脑串口通信
  19. win11虚拟桌面如何使用 Windows11虚拟桌面的使用方法
  20. 用线程加锁模拟红绿灯

热门文章

  1. Android解包打包system img的方法
  2. centos 7 dnf命令的安装
  3. 二进制推广者电子计算机,31-戏说计算机与二进制那点事儿
  4. 《项目管理知识体系指南(PMBOK)》第7版之8大绩效域
  5. Presto安装与使用
  6. 计算机时间、unix时间、linux时间、java时间为何以1970年1月1日为原点?从1970年1月1日开始计算?
  7. Ubuntu系统下卸载命令apt-get remove/purge/autoremove/clean/autoclean的区别
  8. c语言或运算怎么没起作用,C语言学不会? 这样学习, 才有效果!
  9. 内容即广告是最好的移动商业模式?
  10. 苹果手机用的linux系统,苹果最差的手机竟是它,你有用过吗?