Mirai3+SpringBoot3实现QQ机器人
本QQ机器人实现的功能
1.调用青云客的API进行自动聊天
2.输入关键词自动添加为好友
3.自动发送消息
技术栈
非特殊情况保持一致即可!
1.SpringBoot-3.0.3
2.JDK-17
3.Mirai-3.0.0.0-beta.6
4.Simboot-3.0.0-RC.3
GitHub讨论,有问题可以去这里提: https://github.com/orgs/simple-robot/discussions
Robot 官方文档: https://simbot.forte.love
官方交流QQ群:185375305
源码
https://gitee.com/mumangguo/qqrobot
实现步骤:
1. 新建一个springBoot项目,不选任何依赖直接创建即可
2. 引入相关依赖
<!-- simbot Spring Boot Starter --><dependency><groupId>love.forte.simbot.boot</groupId><artifactId>simboot-core-spring-boot-starter</artifactId><version>3.0.0-RC.3</version></dependency><dependency><groupId>love.forte.simbot.component</groupId><artifactId>simbot-component-mirai-core</artifactId><version>3.0.0.0-beta.6</version></dependency><!-- httpclient用来请求自动回复API --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>
3.编写application.properties配置文件
# 是否在bot注册完成后自动启动他们。
# 默认为true
simbot.auto-start-bots=true# 自定义配置bot资源文件的扫描路径。
# 默认为 classpath:simbot-bots/*.bot*
simbot.bot-configuration-resources[0]=classpath:simbot-bots/*.bot*#配置监听的QQ号,多个QQ用逗号分割
MonitorQQ=1805395628
4.根据application.properties配置文件配置得到,需要在resources目录下新建一个simbot-bots目录,在里面新建一个xxx.bot.json的文件,根据自己的实际情况对配置文件进行修改即可!
{"component": "simbot.mirai","code": 你的QQ账号,"passwordInfo": {"type": "text","text": "你的密码"},"config": {"protocol": "MACOS"}
}
5.定时发送信息类,通过配置达到自动发信息的目的,在代码中更改你自己的QQ机器人号,此功能可写可不写!
import love.forte.simbot.Identifies;
import love.forte.simbot.application.BotManagers;
import love.forte.simbot.bot.BotManager;
import love.forte.simbot.component.mirai.MiraiFriend;
import love.forte.simbot.component.mirai.bot.MiraiBot;
import love.forte.simbot.component.mirai.bot.MiraiBotManager;
import love.forte.simbot.component.mirai.message.MiraiSendOnlyImage;
import love.forte.simbot.resources.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.net.URL;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Set;@Component
public class AutoMessage {private static final Logger log = LoggerFactory.getLogger(AutoMessage.class);@Autowiredprivate BotManagers botManagers;@Value("${MonitorQQ}")private Set<String> qqSet;/*** 定义语录*/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 * * * ?* 每天晚上8点: 0 0 20 * * ?*/@Scheduled(cron = "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 SecureRandom().nextInt(content.size()));//图片URL:https://gitee.com/xxg-git/file-services/raw/master/QQ-robot/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201004212532.jpgfinal String img = images.get(new SecureRandom().nextInt(images.size()));// 获取所有的botfor (BotManager<?> manager : botManagers) {if (manager instanceof MiraiBotManager miraiBotManager) {MiraiBot bot = miraiBotManager.get(Identifies.ID("你的机器人QQ号"));// 拿到bot,怎么操作看你心情,比如往某个群发消息assert bot != null;MiraiFriend friend = bot.getFriend(Identifies.ID(qq));assert friend != null;friend.sendAsync(msg);// 构建图片MiraiSendOnlyImage offlineImage = MiraiSendOnlyImage.of(Resource.of(new URL(img)));// 上传图片到friend,然后向其发送// 得到发送回执的 FutureofflineImage.uploadAsync(friend).thenCompose(friend::sendAsync);log.info("正在发送定义语录,当前qq={}, 语录={}, img={}", qq, msg, img);break;}}} catch (Exception e) {log.error("发送定义语录异常, qq={}", qq, e);}});}
}
6.消息监听类
import love.forte.simboot.annotation.Listener;
import love.forte.simbot.ID;
import love.forte.simbot.event.FriendAddRequestEvent;
import love.forte.simbot.event.FriendMessageEvent;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.nio.charset.StandardCharsets;/*** 监听类* Author:木芒果*/
@Component
public class MessageListener {private static final Logger log = LoggerFactory.getLogger(MessageListener.class);/*** 监听好友添加请求*/@Listenerpublic void onFriendAddRequest(FriendAddRequestEvent friendAddRequestEvent) {String message = friendAddRequestEvent.getMessage();ID id = friendAddRequestEvent.getFriend().getId();log.info(id + ",添加我为好友");//触发关键词即自动同意,否则拒绝if (message.equals("木芒果")) {log.info("同意添加" + id + "为好友");friendAddRequestEvent.acceptAsync();} else {log.info("拒绝添加" + id + "为好友");friendAddRequestEvent.rejectAsync();}}/*** 监听消息*/@Listenerpublic synchronized void onMessage(FriendMessageEvent friendMessage) {String msg = friendMessage.getMessageContent().getPlainText();//把空格自动转换为逗号msg = msg.trim().replaceAll(" ", ",");log.info(friendMessage.getFriend().getId() + "提问:" + msg);//AI自动回复String reply = AiOne(msg);if (reply == null) {reply = "宝,回复失败!重新试试把!";}//异步回复消息friendMessage.replyAsync(reply);}public static String AiOne(String sendMsg) {try {HttpGet httpGet = new HttpGet("http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + sendMsg);String user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.42";httpGet.addHeader("user-agent", user_agent);CloseableHttpClient httpClient = HttpClients.createDefault();CloseableHttpResponse response = httpClient.execute(httpGet);String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);body = body.substring(body.indexOf("content") + 10, body.length() - 2);log.info("AiOne={}", body);return body;} catch (Exception e) {log.error(e.toString());return null;}}
}
7.代码部分完成,由于腾讯管理的太严需要用到一个安卓的app进行qq登录验证
下载链接:https://github.com/kagg886/Seiko/releases,下的慢的可以挂国外加速器,源码中也有
下载好以后,打开是这样的,我用的是V0.1.2版本,选择MACOS协议或者手表协议并选择使用扫码登录即可。选择好协议记得把demo.bot.json文件的协议与登录协议保持一致
{"component": "simbot.mirai","code": 你的QQ账号,"passwordInfo": {"type": "text","text": "你的密码"},"config": {"protocol": "ANDROID_WATCH"}
}
登录好以后将登录的数据打包发送到电脑上(长按头像或者名字),注意:如果是通过qq发送的,别用当前登录的账号发送,会被挤下线,建议用小号做机器人的话,那么就用大号进行数据传输
发送到电脑端以后是一个压缩包,我们只要cache目录和device.json和loginTemplate.yml文件,将这三个文件复制粘贴到项目的根目录下,用于认证
如登录还是遭遇235或45错误,可以试着多换几种协议试试,如果还是不行请更换一个新的QQ账号!可以注册一个新的QQ号!
8.编写启动类,直接启动即可!
@EnableSimbot //开启Simbot
@EnableScheduling //开启定时任务
@SpringBootApplication
public class qqRobotApplication {private static final Logger log = LoggerFactory.getLogger(qqRobotApplication.class);public static void main(String[] args) {SpringApplication.run(qqRobotApplication.class, args);log.info("木芒果机器人启动成功!");}
}
如果还没学会可以观看官方教程:https://www.bilibili.com/video/BV1vA411o7A3,有问题留言评论,我会第一时间解答!
Mirai3+SpringBoot3实现QQ机器人相关推荐
- 卷毛机器人抢大龙视频_腾讯这一措施,又砸碎了一些小企业的饭碗,QQ机器人成为历史...
腾讯最近又开始搞"骚动作",第三方QQ机器人已经停止运营,包括晨风.酷Q.契约.mpq.乾坤.oneQQ.lightQQ.miral, 没想到,我最爱的酷Q也停止了,本来还打算再做 ...
- 华景机器人怎么控制_【华景QQ机器人怎么用】华景QQ机器人好不好_使用技巧-ZOL软件百科...
发布日期:2016年02月21日 Release 2 && Release 3新增功能和优化及修复 修复严重崩溃问题. 全面支持emoji表情. 修复某些用户不能登录. 轻量级重包处理 ...
- 妖帝q群机器人_有关酷Q 晨风机器人,契约 qqlite qqlight ,mypc等QQ机器人关停一事的一点想法...
估计有不少朋友都使用过QQ机器人,因为很多网友每天都要管理很多个QQ交流群,如果一个人管理,估计都得累死,所以一般都会使用QQ机器人来帮助自己管理. 只是腾讯自身的QQ机器人实在不给力,功能太鸡肋,而 ...
- Ubuntu16.04安装QQ机器人
Ubuntu安装QQ机器人 看了看现在QQ机器人似乎只有酷Q机器人有Docker可以在linux上运行了 那就k开始装酷Q机器人,资源占用也不是很大,大概占用180M内存吧 安装酷Q HTTP 首先安 ...
- 基于WebQQ3.0协议写一个QQ机器人
最近公司需要做个qq机器人获取qq好友列表,并且能够自动向选定的qq好友定时发送消息.没有头绪,硬着头皮上 甘甜的心情瞬间变得苦涩了 哇 多捞吆 1.WEBQQ3.0登陆协议 进入WEBQQ, htt ...
- 2019pythonqq机器人_基于Python来开发一个QQ机器人, 原来这么简单!
本篇教大家如何用Python来实现QQ机器人,如有不足欢迎在评论方指出!很多小伙伴问我有没有一个可以让大家学习交流的地方,大家可以关注WX公众号:python闪充,关注之后直接获取 简单介绍 安装方法 ...
- 【Linux】使用私人服务器搭建qq机器人
继上次开发完私人服务器后,今天用服务器搭建了一个qq机器人. 第一步:下载工具 分别在Ubuntu中下载cqhttp.zerobot以及golang. 第二步:修改cqhttp和zerobot的配置文 ...
- Python专辑-QQ机器人2:智能聊天、定时执行任务实现
文章目录 前言 具体实现 1.定时发送信息 2.让机器人陪女朋友聊天 3.调用一些有趣的接口 下一篇文章实现更多功能 前言 上一篇文章地址:点击跳转 上一篇文章介绍了怎么配置机器人框架,并且实现了一些 ...
- 2023最新可用QQ机器人框架整理
排名无先后顺序,不定时更新,欢迎留言补充 1.qy机器人 官网:www.qvbot.com 稳定.高效.免费的QQ机器人框架.支持多种语言二次开发可现实群管.聊天.便民服务等多种功能.功能更强大,无限 ...
最新文章
- [网络安全自学篇] 四十五.病毒详解及批处理病毒原理分析(自启动、修改密码、定时关机、蓝屏、进程关闭)
- 万级K8s集群背后etcd稳定性及性能优化实践
- SlimYOLOv3:更窄、更快、更好的无人机目标检测算法
- JavaScript日期有效性检查
- Charles for Mac(信息抓包工具)
- 7 种 JVM 垃圾收集器,Java语言实现核心,看完我跪了
- Spring Boot 集成 RabbitMQ 升级
- 激光打标机不能刻字的处理
- html5 语音直播,一种基于HTML5浏览器的音视频直播方法与流程
- 真北方向、坐标北向以及磁北向
- oracle db studay
- Codeforces Gym 100015B Ball Painting 找规律
- Flink Window Function
- 1564_AURIX_TC275_电压监控寄存器整理
- Vue路由守卫(导航守卫)及使用场景
- 社会实践活动报告—06暑假饭店打工
- java.lang.OutOfMemoryError: GC overhead limit exceeded解决办法
- 适用于mac的科研论文高等数学公式软件
- java判断一个月连续打卡时间_java并发编程实战《五》死锁 挑战打卡60天
- OMI/Aura臭氧数据下载及绘图
热门文章
- UIFontDownLoad ----动态下载系统提供的字体
- 【单选题】为了侵入用屏蔽予网体系结构保护的内部网络,侵袭者必须要通过
- Microsoft Visual Studio 2012正式版官方下载
- unity接微信登录,eclipse打jar包,快速高效
- 干货 | 为了让携程上万员工上好网,他们做了这些
- 十代主板改win7_大神们, 大哥们 求告知WIN10原系统 , 在弄个WIN...-十代win7,十代处理器可以装win7吗...
- WebService中的WSDL详解
- 盒子模型的边框及样式
- 浅谈手机杀毒软件及手机病毒!
- 解决mmdetection显示mask的问题