关于springboot+simbot+mriai实现QQ群智能回复机器人

前言

前几天在一个在一个java的交流群上发现了一个舔狗机器人,感觉有点意思。在git上逛了一圈发现simbot这个框架封装得还不错,这是一个基于kotlin的框架但他并不仅至此。用java也是能进行编写工作,我们简单尝试一下。

前期准备

本次demo使用了jdk1.8。
以下是所需要的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.xiaoxiaoguai</groupId><artifactId>robot</artifactId><version>0.0.1-SNAPSHOT</version><name>robot</name><description>java机器人</description><properties><java.version>1.8</java.version>
<!--        <simbot.version>2.3.0</simbot.version>--></properties><dependencyManagement><dependencies><dependency><groupId>love.forte.simple-robot</groupId><artifactId>parent</artifactId><version>2.3.0</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.28</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--日志依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><!--simbot版本尽量更新到最新的稳定版,否则可能会有意料之外的bug--><dependency><groupId>love.forte.simple-robot</groupId><artifactId>component-mirai-spring-boot-starter</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

application.yml

#配置QQ号和群号,多个则用逗号分割
bello:qq: 12323213123123123
belloGroup:group: 10212329213233332simbot:core:# bot的qq账号与密码。bots: 账号:密码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_PHONEANDROID_PADANDROID_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 的元素值,# 可选为 FILEMEMORYcache-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

实体

package com.ph.robot.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** @author ph* @description 实体* @since 2022/11/15 10:15*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LoveChatDTO {private String female;private List<String> male;}

事件监听类

package com.ph.robot.listener;import com.alibaba.fastjson.JSONObject;
import com.ph.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;/*** @author ph* @description 机器人监听* @since 2022/11/15 10:15*/
@Component
@Slf4j
public class MessageListener {//青云客urlstatic final String URLqyk = "http://api.qingyunke.com/api.php";//舔狗日记urlstatic final String URLtgrj = "https://v.api.aa1.cn/api/tiangou/index.php";/*** 监听私聊消息*/@OnPrivatepublic void privateMsg(PrivateMsg privateMsg, MsgSender sender) {// 智能聊天sendMsg(privateMsg, sender, false);}/*** 监听群消息*/@OnGrouppublic ReplyAble groupMsg(GroupMsg groupMsg, MsgSender sender) {// 默认关闭群聊模式,需要的话把注释去掉return sendMsg(groupMsg, sender, true);}/*** 封装智能聊天** @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请求调用聊天接口// 判断msg是否为#舔狗日记,否则进入青云客智能回复。if(commonMsg.getMsgContent().getMsg().equals("#舔狗日记")){String result = HttpUtil.get(URLtgrj).toString();JSONObject json = JSONObject.parseObject(result);String msg = json.getJSONArray("newslist").getJSONObject(0).getString("content");log.info("智能聊天中~~~,发送消息:qq={}, msg={}", commonMsg.getAccountInfo().getAccountCode(), msg);//发送群消息if (group) {// 参数1:回复的消息 参数2:是否at当事人return Reply.reply(msg, false);}//发送私聊消息sender.SENDER.sendPrivateMsg(commonMsg, msg);}else {String result = HttpUtil.get(URLqyk.concat("?key=free&appid=0&msg=").concat(commonMsg.getMsgContent().getMsg().replaceAll(" ", "")));//@机器人,机器人才回复if (!StringUtils.isEmpty(result)&&commonMsg.getMsgContent().getMsg().contains("CAT:at,code=2033332031")) {JSONObject json = JSONObject.parseObject(result);if (json.getInteger("result") == 0 && !StringUtils.isEmpty(json.getString("content"))) {String msg = json.getString("content").replaceAll("<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;}}

http工具类

package com.ph.robot.util;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 ph* @description http工具类* @since 2022/11/15 12:11*/
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();}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()));StringBuilder sb = new StringBuilder("");String line;String nL = System.getProperty("line.separator");while ((line = in.readLine()) != null) {sb.append(line).append(nL);}in.close();result = sb.toString();} catch (IOException e) {e.printStackTrace();} finally {try {if (null != response) {response.close();}} catch (IOException e) {e.printStackTrace();}}return result;}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;}}

启动类

package com.ph.robot;import lombok.extern.slf4j.Slf4j;
import love.forte.simbot.spring.autoconfigure.EnableSimbot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;/*** @author ph* @description main* @since 2022/09/15 12:13*/
@EnableSimbot
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@Slf4j
public class RobotApplication {public static void main(String[] args) {SpringApplication.run(RobotApplication.class, args);log.info("机器人启动成功!");}
}

目录结构

在这里插入图片描述

现在项目就可以正常启动了
首次启动项目可能会需要一些设备验证和滑块验证,不用紧张,mriai帮我们都做好了!
通过控制台给我们的链接就可以进入验证页面,按F12进入调试模式,在网络里可以得到qq验证成功给的ticket,将ticket输入控制台就可以完成验证。

如果遇到启动失败,qq版本过低bug请转隔壁
mriai启动发现qq版本过低问题

源码链接QQ智能机器人
如有问题,欢迎在评论区讨论。
要是喜欢的话帮忙点个赞再走吧!(●’◡’●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四. IEC 61499开源项目4diac配置modbus

开源的4diac运行时只支持modbus主站&#xff08;modbus客户端&#xff09;&#xff0c;配置forte运行时支持modbus主站可以通过运行时操作支持modbus从站的远程IO模块&#xff0c;此处讲解的是modbus tcp。从4diac官网下载的forte运行时默认是不支持modbus协议的&#xff0c;要…

PDF Forte Pro(PDF转换器)v3.1.2免费版

PDF Forte Pro是一款优秀的PDF转换器&#xff0c;它支持将超过10种常用文件格式转换为PDF&#xff0c;包括word&#xff0c;Excle&#xff0c;PPT&#xff0c;PSD&#xff0c;Image和Dwg。所有Windows平台完美兼容&#xff0c;转换后的PDF文档无质量损失&#xff0c;而且拥有超…

FORTE和RIPPLE(瑞波)出资一亿美元成立基金,帮助游戏开发者应用区块链技术

a16z被投企业Forte向游戏开发者提供区块链技术平台和资金支持。 为游戏行业提供区块链技术平台的Forte和Ripple&#xff08;瑞波&#xff09;的开发者生态基金Xpring出资一亿美元成立基金帮助游戏开发者更好的利用区块链技术。该笔资金将与Forte的技术平台一起运作&#xff0c;…

关于MS Access替代方案 低代码神器 nuBuilder Forte:基于PHP和MySQL开源工具

很久很久以前用MS Access 写了几个程序&#xff0c;一直想把它们换掉&#xff0c;但始终没有找到一个工作量适度的工具&#xff0c;近来有点时间于是在网上查询&#xff0c;终于有了新发现nuBuilder Forte&#xff0c;这是需要服务器和PHP的软件包&#xff0c;一般来说花一到两…

4diac forte 1.12.0 版本modbus 的修改

问题 4diac 项目的更新真的是个问题。没有对所有的模块完成测试。在forte 1.12.0 版本上编译就出现了问题。4diac 的论坛上讨论的比较少&#xff0c;而且大多数是早几年的内容。没办法&#xff0c;只能自己啃源代码。 编译的问题。 &#xff11;&#xff0e;modbustimedeve…

Kabam创始人团队成立FORTE,打造区块链游戏平台

上海,2019年2月22日- 今日,数位资深游戏行业人士组成的创始人团队正式宣布成立Forte(发音为FOR-TAY)。他们来自Kabam、GarageGames、 Unity和Linden Lab等公司,团队累积拥有超过百年的游戏与技术平台开发经验。Forte旨在为游戏开发者打造加速区块链技术落地的应用平台,以…

4diac.forte 支持 OPC UA、MQTT、Modbus的方法

forte是基于c的第三方开源IEC 61499运行环境&#xff0c;默认可以不启用opcua&#xff0c;如果要启用opcua则需要在编译时指定opcua的参数。 1.OPCUA 1.在编译opcua时&#xff0c;即open62541, 需要定义 UA_ENABLE_AMALGAMATIONON 2.cmake forte时&#xff0c;需要FORTE_COM…

IEC61499开源项目FORTE部分源码分析

一、IEC 61499简介 IEC 61499 作为工业自动化领域分布式控制系统级建模语言的标准&#xff0c;其第一&#xff08;体系结构&#xff09;、二&#xff08;软件工具要求&#xff09;、四&#xff08;兼容文件的规则&#xff09;部分的第一版于 2005 年正式发布&#xff0c;并在 …

2023搜狐科技峰会结束 白春礼刘韵洁武向平等院士解读科技新格局

雷递网 乐天 5月18日 正值“517世界电信日”&#xff0c;搜狐于北京如期举办“2023搜狐科技峰会”。 走入第五个年头的峰会继续在内容深度和广度上实现新突破&#xff0c;从宇宙文明、天文卫星、人类永生&#xff0c;到核聚变、6G通信、脑机接口&#xff0c;再到通用人工智能时…

安卓版ChatGPT要来了!

千呼万唤始出来&#xff01; OpenAI并没有给出发布的具体日期&#xff0c;官宣中只是提供了一个“预订”&#xff08;预注册&#xff09;入口。 但安卓党们在得知这事后&#xff0c;纷纷搓起了激动的小手&#xff1a; 终于可以换回去用安卓手机了&#xff01; 不过这次OpenAI也…

关于嵌入式开发

写在前面 嵌入式是一个具有深度和广度的概念&#xff0c;设计的知识面非常广阔&#xff0c;如数字、电子、编程语言和通讯网络等。嵌入式开发就是指在嵌入式操作系统下进行开发。对于嵌入式系统的定义&#xff0c;目前一种普遍被认同的定义是&#xff1a;以应用为中心&#xff…

万字长文说清大模型在自动驾驶领域的应用

交流群 | 进“传感器群/滑板底盘群/汽车基础软件群/域控制器群”请扫描文末二维码&#xff0c;添加九章小助手&#xff0c;务必备注交流群名称 真实姓名 公司 职位&#xff08;不备注无法通过好友验证&#xff09; 作者 | 张萌宇 随着ChatGPT的火爆&#xff0c;大模型受到的…

Android开发成功转行车载开发之后,并没有想象中的那么简单,我承认,是我小瞧了它

前言 近几年的Android开发岗位就业环境想必大家也都有所耳闻&#xff0c;许多Android开发工程师都找不到自己满意的工作&#xff0c;于是纷纷另谋出路… 刚好这几年随着Android车载开发的兴起&#xff0c;令人眼睛一亮的是车载开发工程师的工资普遍偏高&#xff0c;这高昂的工…

2023年,Android程序员就业方向是怎样的?

一转眼&#xff0c;2023年一半就要过去了&#xff0c;各位Android程序员的工作还顺利吗&#xff1f; 今年以来各大厂纷纷爆出裁员的新闻&#xff0c;Chat GPT等人工智能工具的爆火也让今年IT行业的就业状况雪上加霜。 不少人觉得近几年的打工人普遍又卷又焦虑&#xff0c;岗位…

如何定义一款好的自动驾驶芯片?

导读 自动驾驶领域&#xff0c;传统处理器的竞争规则正发生急速的变化。 一般来说&#xff0c;人工智能的发展主要取决于两大基本要素&#xff1a;算力和算法。自动驾驶作为目前技术投入较大、商业落地较早、市场前景广阔的人工智能应用&#xff0c;其主控芯片的算力也被业内拿…

星火认知大模型发布,科大讯飞入场科技巨头AI大战?

自从ChatGPT横空出世&#xff0c;一个更美好的世界开始向我们招手。为了推开新时代的大门&#xff0c;几乎所有人工智能厂商都投入了最大的热情逐浪AIGC。 5月6日&#xff0c;科大讯飞召开了“讯飞星火认知大模型”成果发布会。发布会现场&#xff0c;科大讯飞董事长刘庆峰展示…

浪潮之巅 OpenAI有可能是历史上第一个10万亿美元的公司

淘金时代很像 如果你那个时候去加州淘金&#xff0c;一大堆人会死掉&#xff0c;但是卖勺子的人、卖铲子的人永远可以赚钱。所谓的shove and pick business。 大模型是平台型机会。按照我们几天的判断&#xff0c;以模型为先的平台&#xff0c;将比以信息为先的平台体量更大。…

ChatGPT告诉你智能制造

ChatGPT自上线以来&#xff0c;几乎得到了外界的一致好评&#xff0c;上线两个月&#xff0c;获得1亿月活跃用户&#xff0c;成为增长最快的面向消费者的应用。 面对ChatGPT拟人一般的问答能力&#xff0c;很多人认为它代表着AlphaGo之后&#xff0c;人工智能应用的第二次浪潮…

这一次AI应该是真正的已经到来

渐渐感觉这一次AI的变革能真正的突破迷雾&#xff0c;迎来真正的人工智能时代的到来。所以写篇博文学习一下。经过半年的发酵与发展&#xff0c;不得不说AI已经成为了不可逆转的趋势。之所以说这一次AI应该是真正的已经到来&#xff0c;是因为人工智能的发展其实已经经历了几十…

chatgpt赋能python:Python在电气行业中的应用——从数据分析到自动化控制

Python在电气行业中的应用——从数据分析到自动化控制 介绍 Python语言作为一种高级编程语言&#xff0c;越来越受到电气行业的关注。随着互联网、物联网以及大数据时代的到来&#xff0c;电气行业需要将传统的工业控制与现代化的数据分析、智能决策等技术相结合&#xff0c;…