基于SpringBoot实现QQ机器人
本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机器人相关推荐
- 基于Mirai搭建QQ机器人监控B站直播
搭建自定义Mirai机器人 周末本来想继续学Vue来着,这不又搞这个了,唉,这计划赶不上变化啊. 参考文档 mamoe/mirai: 高效率 QQ 机器人支持库 Gradle 下载的依赖jar包在哪? ...
- PHP开发基于Mirai的QQ机器人
博客和更新地址:PHP开发基于Mirai的QQ机器人 前言 在完成配置开源安卓QQ协议库Mirai后,便可使用已有开源项目来部署自己的QQ机器人,但自行开发显然更符合需求.借助mirai-api-ht ...
- 基于Nonebot2搭建QQ机器人(一)机器人环境配置
目录 一.Nonebot2介绍 二.Nonebot2安装 1.bot.py文件的配置 2..env文件的配置 3.env.dev文件配置 4.env.pord配置 三.go-cqhttp介绍 四.go ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)
目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)
目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...
- 基于go-cqhttp的qq机器人
qqrobot 基于go-cqhttp的qq机器人 环境安装 安装 python3.8以上版本 安装依赖 pip install flask pip install requests 部署方法 首先打 ...
- PHP开发基于Mirai的QQ机器人(一)
基础环境的搭建 (一) 本文简介 本文讲解高效率QQ机器人框架Mirai. 本文发布于 Mirai V2 由于QQ机器人常被部署在服务器,所以我只讲解 Linux 的部署方式. 本文针对PHP开发者. ...
- 基于go-cqhttp实现QQ机器人
前言 本篇文章原文:http://www.7yue.top/rabbitbot/ 本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现. QQ机器人RabbitBot采用pyth ...
- 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学
文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...
最新文章
- Win64 驱动内核编程-34.对抗与枚举MiniFilter
- 通过踩坑带你读透虚拟机的“锁粗化”
- YunYang1994/tensorflow-yolov3 Readme 翻译
- inxtrackup mysql_雪糕 的动态 - SegmentFault 思否
- 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)
- imx6 i2c分析
- Flowable快速工作流脚手架_Jsite角色授权不显示
- 04-linux下离线安装Rserve
- centos网络隔一段时间就断_如果是中专学历,以后做网络工程师会有瓶颈吗?
- 关于 rm -rf * 你需要知道的
- bash 脚本_实用的 bash 自定义脚本,快速提效工作流程
- linux rtl8188eu ap模式 密码错误 disassoc reason code(8)
- 苹果手机上网很慢_手机信号满格,但上网速度却很慢?来听听通信专家怎么说的...
- 电脑桌面录屏软件大全,给大家推荐一波优秀的屏幕录像工具!
- 人事管理工作难开展?这几个人力资源管理软件用了没
- android自动开机慢,手机开机慢怎么回事?安卓手机开机慢的原因和解决方法图文详解...
- Matlab绘图线条颜色,线型,标记点选项参数
- 【嵌入式13】两台电脑串口通信
- win11虚拟桌面如何使用 Windows11虚拟桌面的使用方法
- 用线程加锁模拟红绿灯
热门文章
- Android解包打包system img的方法
- centos 7 dnf命令的安装
- 二进制推广者电子计算机,31-戏说计算机与二进制那点事儿
- 《项目管理知识体系指南(PMBOK)》第7版之8大绩效域
- Presto安装与使用
- 计算机时间、unix时间、linux时间、java时间为何以1970年1月1日为原点?从1970年1月1日开始计算?
- Ubuntu系统下卸载命令apt-get remove/purge/autoremove/clean/autoclean的区别
- c语言或运算怎么没起作用,C语言学不会? 这样学习, 才有效果!
- 内容即广告是最好的移动商业模式?
- 苹果手机用的linux系统,苹果最差的手机竟是它,你有用过吗?