--------------------------------文末有源码链接---------------------------------
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:123456
component:
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_WATCH
protocol: ANDROID_PAD
# 是否关闭mirai的bot logger
no-bot-log: true
# 关闭mirai网络日志
no-network-log: true
# mirai bot log切换使用simbot的log
use-simbot-bot-log: true
# mirai 网络log 切换使用simbot的log
use-simbot-network-log: true
# mirai配置自定义deviceInfoSeed的时候使用的随机种子。默认为1.
device-info-seed: 1
# mirai图片缓存策略,为枚举 love.forte.simbot.component.mirai.configuration.MiraiCacheType 的元素值,
# 可选为 FILE、 MEMORY
cache-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 {
@Resource
private 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进行聊天,官网
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";
/**
* 监听私聊消息
*/
@OnPrivate
public void privateMsg(PrivateMsg privateMsg, MsgSender sender) {
// 智能聊天
sendMsg(privateMsg, sender, false);
// 恋爱话术获取
// loveChat(privateMsg, sender);
}
/**
* 监听群消息
*/
@OnGroup
public 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
本文转载自: https://blog.csdn.net/weixin_46325176/article/details/126948956
版权归原作者 小小怪呀~ 所有, 如有侵权,请联系我们删除。
版权归原作者 小小怪呀~ 所有, 如有侵权,请联系我们删除。