--------------------------------文末有源码链接---------------------------------

1. 准备一个空白springBoot项目

(自行百度创建)

2. 引入simple-robot依赖

<properties><java.version>1.8</java.version><simbot.version>2.0.3</simbot.version>
</properties><dependencyManagement><dependencies><dependency><groupId>love.forte.simple-robot</groupId><artifactId>parent</artifactId><version>${simbot.version}</version><scope>import</scope><type>pom</type></dependency></dependencies>
</dependencyManagement><!--java机器人框架-->
<dependency><groupId>love.forte.simple-robot</groupId><artifactId>component-mirai-spring-boot-starter</artifactId>
</dependency>

3. 配置application.yml文件,使用ANDROID_PAD协议可以保持手机QQ和机器人同时在线

simbot:core:# 机器人的QQ账号与密码(帐号:密码)bots: 123456:123456component:mirai:# mirai心跳周期. 过长会导致被服务器断开连接. 单位毫秒。heartbeat-period-millis: 30000# 每次心跳时等待结果的时间.一旦心跳超时, 整个网络服务将会重启 (将消耗约 1s). 除正在进行的任务 (如图片上传) 会被中断外, 事件和插件均不受影响.heartbeat-timeout-millis: 5000# 心跳失败后的第一次重连前的等待时间.first-reconnect-delay-millis: 5000# 重连失败后, 继续尝试的每次等待时间reconnect-period-millis: 5000# 最多尝试多少次重连reconnection-retry-times: 2147483647# 使用协议类型。注,此值为枚举类 net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol 的元素值,# 可选值为:ANDROID_PHONE、ANDROID_PAD、ANDROID_WATCHprotocol: ANDROID_PAD# 是否关闭mirai的bot loggerno-bot-log: true# 关闭mirai网络日志no-network-log: true# mirai bot log切换使用simbot的loguse-simbot-bot-log: true# mirai 网络log 切换使用simbot的loguse-simbot-network-log: true# mirai配置自定义deviceInfoSeed的时候使用的随机种子。默认为1.device-info-seed: 1# mirai图片缓存策略,为枚举 love.forte.simbot.component.mirai.configuration.MiraiCacheType 的元素值,# 可选为 FILE、 MEMORYcache-type: MEMORY# 如果配置项 simbot.mirai.cacheType 的值为 FILE,此处为缓存文件的保存目录。为空时默认为系统临时文件夹。cache-directory:# 登录验证码处理器,当登录需要输入验证码的时候可能会用到。login-solver-type: DEFAULT# 如果不为空,此处代表指定一个 deviceInfo 的 json文件路径。dispatcher:# mirai组件中,对事件进行调度的线程池参数:最大线程数。core-pool-size: 8# mirai组件中,对事件进行调度的线程池参数:最大线程数。maximum-pool-size: 8# mirai组件中,对事件进行调度的线程池参数:线程存活时间(毫秒)keep-alive-time: 1000

4. 在springboot启动类加上@EnableSimbot注解

@EnableSimbot
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@Slf4j
public class RobotApplication {public static void main(String[] args) {SpringApplication.run(RobotApplication.class, args);log.info("机器人启动成功~~~~");}
}

5. 创建一个定时类AutoQQMessage.java类

package com.xiaoxiaoguai.robot.scheduling;import lombok.extern.slf4j.Slf4j;
import love.forte.simbot.bot.BotManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Random;
import java.util.Set;/*** @author 小小怪* @description 定时发送消息* @since 2022/09/15 12:11*/
@Component
@Slf4j
public class AutoQQMessage {@Resourceprivate BotManager botManager;@Value("${bello.qq}")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 * * * ?*/@Scheduled(cron = "0 0/5 * * * ?")public void handler() {Calendar calendar = Calendar.getInstance();// 获取当前小时int hour = calendar.get(Calendar.HOUR_OF_DAY);// 只在早上9点到晚上8点发送消息if (hour < 9 || hour > 20) {return;}if (null != qqSet && qqSet.size() > 0){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(content.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);}});}}}

6. 在yml文件中配置接受消息的QQ号

#配置女神们的QQ号,多个QQ用逗号分割
bello:qq: 11223344,55667788

7. 加入智能聊天功能-使用青云客的api进行聊天,官网

http://api.qingyunke.com/

8. 封装http工具类

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/*** @author xiaoxiaoguai* @description http工具类* @since 2022/09/15 12:11*/
public class HttpUtil {/*** 向指定URL发送GET方法的请求** @param url   发送请求的URL* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL 所代表远程资源的响应结果*/public static String sendGet(String url, String param) {StringBuilder result = new StringBuilder();BufferedReader in = null;try {String urlNameString = url;if (!StringUtils.isEmpty(param)) {urlNameString += "?" + param;}URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1");// 建立实际的连接connection.connect();// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result.append(line);}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result.toString();}
}

9. 创建消息监听类,支持私聊消息和群消息的智能聊天

import com.alibaba.fastjson.JSONObject;
import com.xiaoxiaoguai.robot.entity.LoveChatDTO;
import com.xiaoxiaoguai.robot.util.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import love.forte.simbot.annotation.OnGroup;
import love.forte.simbot.annotation.OnPrivate;
import love.forte.simbot.api.message.Reply;
import love.forte.simbot.api.message.ReplyAble;
import love.forte.simbot.api.message.events.GroupMsg;
import love.forte.simbot.api.message.events.MessageGet;
import love.forte.simbot.api.message.events.PrivateMsg;
import love.forte.simbot.api.sender.MsgSender;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import java.util.List;
import java.util.Objects;
import java.util.Random;/*** @author 小小怪* @description 机器人监听* @since 2022/09/15 10:15*/
@Component
@Slf4j
public class MessageListener {static final String URL = "http://api.qingyunke.com/api.php";/*** 监听私聊消息*/@OnPrivatepublic void privateMsg(PrivateMsg privateMsg, MsgSender sender) {// 智能聊天sendMsg(privateMsg, sender, false);// 恋爱话术获取
//        loveChat(privateMsg, sender);}/*** 监听群消息*/@OnGrouppublic ReplyAble groupMsg(GroupMsg groupMsg, MsgSender sender) {// 默认关闭群聊模式,需要的话把注释去掉return sendMsg(groupMsg, sender, true);
//        return null;}/*** 恋爱话术功能** @param commonMsg commonMsg* @param sender    sender*/private void loveChat(MessageGet commonMsg, MsgSender sender) {log.info("恋爱话术~~~,接收消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(),commonMsg.getMsgContent().getMsg());// 获取话术final JSONObject jsonObject = new JSONObject();jsonObject.put("page", 1);jsonObject.put("count", 5);jsonObject.put("key", commonMsg.getMsgContent().getMsg());final String resultStr = HttpUtil.post("https://yin-feng.top/open/getLoveChat", jsonObject.toJSONString());if (StringUtils.isEmpty(resultStr)) {return;}final JSONObject resultObj = JSONObject.parseObject(resultStr);if (!Objects.equals("0", resultObj.getString("code"))) {return;}final List<LoveChatDTO> loveChatList = JSONObject.parseArray(resultObj.getString("data"), LoveChatDTO.class);//发送私聊话术消息if (null != loveChatList && loveChatList.size() > 0){Random random = new Random();int size = loveChatList.size();int i = random.nextInt(size);LoveChatDTO loveChatDTO = loveChatList.get(i);String female = loveChatDTO.getFemale();sender.SENDER.sendPrivateMsg(commonMsg, female);}}/*** 通过青客云封装智能聊天** @param commonMsg commonMsg* @param sender    sender*/private ReplyAble sendMsg(MessageGet commonMsg, MsgSender sender, boolean group) {log.info("智能聊天中~~~,接收消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(),commonMsg.getMsgContent().getMsg());// MsgSender中存在三大送信器,以及非常多的重载方法。// 通过get请求调用聊天接口final 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;}}

10. 效果如图

11.  源码链接

https://gitee.com/xxg-git/xiaoxiaoguai-robot.git

java springBoot实现QQ机器人,定时发送信息,自动回复功能相关推荐

  1. 基于SpringBoot实现QQ机器人

    本QQ机器人实现的功能 1.输入关机,进入30秒倒计时关机 2.输入锁屏,电脑自动进行锁屏操作 3.输入取消关机,即可取消关机指令 4.调用青云客的API进行自动聊天 5.输入关键词自动添加为好友 技 ...

  2. python 给QQ好友定时发送消息

    python 给QQ好友定时发送消息 前言 初衷 代码 效果 后记 前言 在小编的上一篇python文章中提到了关于微信或者QQ的消息"轰炸"(其实我是想你也去看看,23333 [ ...

  3. Windows下企业微信机器人定时发送消息

    Windows下企业微信机器人定时发送消息提醒(小白篇) - 简书 Windows terminal使用curl出现错误 - 简书 $url = "https://qyapi.weixin. ...

  4. 如何实现企微群机器人定时发送消息提醒?

    一.首先添加群机器人 二.创建完成的机器人是这样的,会有一个唯一标识:Webhook地址 三.设置 机器人发消息文本 以下是用curl工具往群组推送文本消息的示例(注意要将url替换成你的机器人web ...

  5. Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件

    Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件. 想法的来源:每天需要在部门群中发送工作日报,有时候想早点休息但是又不想太早发送日报到群里(原因你懂得. ...

  6. QQRobot一款基于Java的娱乐qq机器人

    QQRobot一款基于Java的娱乐qq机器人 git地址:https://gitee.com/tysong1/QQRobot/tree/master AD:上QQ群214580864购买服务器享优惠 ...

  7. Python 钉钉机器人定时发送笑话到钉钉群里 并@所有人

    先上效果图: 代码实现: 注意:不可直接复制代码运行,需填入api网站的key.及钉钉机器人的token地址 from dingtalkchatbot.chatbot import DingtalkC ...

  8. java代码控制qq、微信发送消息

    对于程序QQ.微信的程序控制,本人并不是直操纵他官方提供的接口,而且直接借用github大佬开发的第三方辅助程序,开放出来接口供java代码调用,实现java代码控制qq.微信发消息的功能. 一.代码 ...

  9. 情人节福利,用JAVA做个QQ机器人,帮我提醒女神按时喝水和陪她聊天~(开源)

    微信机器人会有几率封号,暂时不开教程 1.前言 正常人每天平均耗水量为2000-2500毫升,体内物质氧化可生水300毫升,故每日应补充水分2200毫升,包括饮食中的含水量.夏天每日补充水分在3000 ...

最新文章

  1. Navicat Premium 数据库设计器和报表有什么作用
  2. Oracle数据库基础知识点汇总
  3. LeetCode-剑指 Offer 28. 对称的二叉树
  4. PHP 设计模式之装饰器模式
  5. 多线程之死锁就是这么简单
  6. android图片保存形式,Android应用开发之Android ScrollView截图和图片保存到相册的方式...
  7. 在anaconda中安装tensorflow-GPU版本
  8. GridView中使用CheckBox
  9. 迷你sql profile,给缺少sql跟踪的朋友们
  10. .NET Framework框架的介绍
  11. java 如何执行dig 命令_linux dig 命令使用方法
  12. golang设计模式(第二版)
  13. 数字时钟word clock Mac设置教程
  14. 使用阿里云国际版创建外贸网站,需要注意什么?-Unirech
  15. 短信验证码收不到了怎么办?
  16. 【干货】BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?
  17. 辗转相除法的时间复杂度
  18. 联想的“智慧城市群落”
  19. 项目实训(三)unity游戏场景的搭建
  20. 淘宝api是指什么意思,我可以为你解答

热门文章

  1. Java process.waitfor 返回1的原因
  2. 电话查询佛山居住证真伪——佛山市、区、镇(街)流管办(局)服务咨询电话一览表...
  3. JavaCV的摄像头实战之四:抓图
  4. log4cplus基础
  5. 空间三维三角形的内切圆和外接圆绘制
  6. 从万达上市看CRM客户关系管理
  7. java 调和级数,Java实现蓝桥杯调和级数
  8. 代码保护软件 VMProtect 用户手册之使用VMProtect: 准备项目
  9. 软件保护工具VMProtect将许可系统集成到应用程序(7)——黑名单中的序列号
  10. 武汉关于二套房的定义