SpringBoot搭建go-cqhttp机器人的方法实现

目录
  • 参考文档:
  • 一、搭建go-cqhttp机器人
  • 二、搭建SpringBoot环境
    • 1、HTTP通信
    • 2、WebScoket 通信
  • 三、补充

百度一下搭建go-cqhttp,千篇一律都是采用python搭建的,Java搭建根本没有。导致自己在搭建的时候可折磨了,出现了许多的问题。唯一能参考就只有官方文档。文档对小白也不是太友好,所以出这篇博客弥补一下Java 的搭建版本。

搭建环境: winndows 系统 + Java + Idea 2020.2

注意:本博客写的比较简单,存在很多不完善的地方,如需符合自己需求请参考官方文档

参考文档:

官方文档

一、搭建go-cqhttp机器人

请 参考go-cqhttp 视频:https://www.bilibili.com/video/av247603841/

测试

给自己好友发送一条私聊消息(user_id:好友的QQ号)

# cmd
crul '127.0.0.1:5700/send_private_msg?user_id=xxxxxx&message=你好~'

#postMan
GET http://127.0.0.1:5700/send_private_msg?user_id=xxxxx&message=你好~

响应

二、搭建SpringBoot环境

基本环境

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.46</version>
    </dependency>

    <!--httpUtils-->
    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.4.1</version>
    </dependency>

    <!--websocket作为客户端-->
    <dependency>
        <groupId>org.java-websocket</groupId>
        <artifactId>Java-WebSocket</artifactId>
        <version>1.3.5</version>
    </dependency>

</dependencies>

1、HTTP通信

修改go-cqhhtp 配置文件 config.yml

post:
  # 这里一定要填成这样的http://{host}:{ip}
  - url: 'http://127.0.0.1:8400'
   secret: ''

Java 代码

测试案例:https://docs.go-cqhttp.org/api/#%E5%8F%91%E9%80%81%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF 发送私聊消息

QqRobotController.java

@RestController
@Slf4j
public class QqRobotController {

    @Resource
    private QqRobotService robotService;

    @PostMapping
    public void QqRobotEven(HttpServletRequest request){
        robotService.QqRobotEvenHandle(request);
    }
}

QqRobotService.java

public interface QqRobotService {
    void QqRobotEvenHandle(HttpServletRequest request);
}

QqRobotServiceImpl.java

@Service
@Slf4j
public class QqRobotServiceImpl implements QqRobotService {

    @Override
    public void QqRobotEvenHandle(HttpServletRequest request) {
        //JSONObject
        JSONObject jsonParam = this.getJSONParam(request);
        log.info("接收参数为:{}",jsonParam.toString() !=null ? "SUCCESS" : "FALSE");
        if("message".equals(jsonParam.getString("post_type"))){
            String message = jsonParam.getString("message");
            if("你好".equals(message)){
                // user_id 为QQ好友QQ号
                String url = "http://127.0.0.1:5700/send_private_msg?user_id=xxxxx&message=你好~";
                String result = HttpRequestUtil.doGet(url);
                log.info("发送成功:==>{}",result);
            }
        }
    }

    public JSONObject getJSONParam(HttpServletRequest request){
        JSONObject jsonParam = null;
        try {
            // 获取输入流
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));

            // 数据写入Stringbuilder
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = streamReader.readLine()) != null) {
                sb.append(line);
            }
            jsonParam = JSONObject.parseObject(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonParam;
    }

}

HttpUtils 工具类

public class HttpRequestUtil {
    /**
     * @Description: 发送get请求
     */
    public static String doGet(String url) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader("Content-type", "application/json");
        httpGet.setHeader("DataEncoding", "UTF-8");
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000).setConnectionRequestTimeout(35000).setSocketTimeout(60000).build();
        httpGet.setConfig(requestConfig);
        CloseableHttpResponse httpResponse = null;
        try {
            httpResponse = httpClient.execute(httpGet);
            HttpEntity entity = httpResponse.getEntity();
            if(httpResponse.getStatusLine().getStatusCode() != 200){
                return null;
            }
            return EntityUtils.toString(entity);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (httpResponse != null) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * @Description: 发送http post请求
     */
    public static String doPost(String url, String jsonStr) {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000).setConnectionRequestTimeout(35000).setSocketTimeout(60000).build();
        httpPost.setConfig(requestConfig);
        httpPost.setHeader("Content-type", "application/json");
        httpPost.setHeader("DataEncoding", "UTF-8");
        CloseableHttpResponse httpResponse = null;
        try {
            httpPost.setEntity(new StringEntity(jsonStr));
            httpResponse = httpClient.execute(httpPost);
            if(httpResponse.getStatusLine().getStatusCode() != 200){
                return null;
            }
            HttpEntity entity = httpResponse.getEntity();
            String result = EntityUtils.toString(entity);
            return result;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (httpResponse != null) {
                try {
                    httpResponse.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

响应:

发送成功:==>{"data":{"message_id":2113266863},"retcode":0,"status":"ok"}

2、WebScoket 通信

一般WebScoket的客户端都是H5, 但是为了测试本篇博客使用Java作为客户端

修改go-cqhhtp 配置文件 config.yml

  - ws:
      # 正向WS服务器监听地址
      host: 127.0.0.1
      # 正向WS服务器监听端口
      port: 5701

Java 代码

需要导入pom包

WebsocketClient.java

@Slf4j
@Component
public class WebSocketConfig {

    @Bean
    public WebSocketClient webSocketClient() {
        try {
            WebSocketClient webSocketClient = new WebSocketClient(new URI("ws://127.0.0.1:5701"),new Draft_6455()) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    log.info("[websocket] 连接成功");
                }

                @Override
                public void onMessage(String message) {
                    log.info("[websocket] 收到消息={}",message);

                }

                @Override
                public void onClose(int code, String reason, boolean remote) {
                    log.info("[websocket] 退出连接");
                }

                @Override
                public void onError(Exception ex) {
                    log.info("[websocket] 连接错误={}",ex.getMessage());
                }
            };
            webSocketClient.connect();
            return webSocketClient;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

测试(具体需求实现就根据官方API实现,参考本篇博客HTTP通信的逻辑)

[websocket] 收到消息={"interval":5000,"meta_event_type":"heartbeat","post_type":"meta_event","self_id":2878522414,"status":{"app_enabled":true,"app_good":true,"app_initialized":true,"good":true,"online":true,"plugins_good":null,"stat":{"packet_received":29,"packet_sent":21,"packet_lost":0,"message_received":0,"message_sent":0,"disconnect_times":0,"lost_times":0,"last_message_time":0}},"time":1639797397}

三、补充

具体详细需求请参考实现:https://docs.go-cqhttp.org/api/

到此这篇关于SpringBoot搭建go-cqhttp机器人的方法实现的文章就介绍到这了,更多相关SpringBoot搭建go-cqhttp机器人内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot实现钉钉机器人消息推送的示例代码

    零.前言 上一次做消息推送,是微信公众号的定时消息通知. 由于自己当时的水平不够,加上企鹅家的开发文档普遍不太友好,导致根本看不懂文档在写什么,不得不去看第三方博客来学习公众号的开发. 这次就不一样了,昨天刚看了一下,阿里的开发文档比鹅厂要清晰的多,而且在同一功能上,使用了多种语言作为示例代码,可以说很友好了.可能这就是阿里和鹅厂的区别吧...辣鸡文档和好文档的区别... 本着"授之以渔"的态度,写了这篇文章,作为官方文档的补充. 一.在群里添加机器人 在群设置的智能群助手中添加自定义

  • SpringBoot搭建多数据源的实现方法

    首先我们建立两个数据库(可以不在同一台电脑上): multiple_order: DROP DATABASE IF EXISTS `multiple_order`; CREATE DATABASE `multiple_order`; USE `multiple_order`; CREATE TABLE `order` ( `order_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '订单id', `user_id` BIGINT U

  • 使用Springboot搭建OAuth2.0 Server的方法示例

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749. OAuth 简介 OAuth 是由 Blaine Cook.Chris Messina.Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全.开放的标准. 基于 OAuth 认证授权具有以下特点: 安全.OAuth 与别的授

  • SpringBoot搭建go-cqhttp机器人的方法实现

    目录 参考文档: 一.搭建go-cqhttp机器人 二.搭建SpringBoot环境 1.HTTP通信 2.WebScoket 通信 三.补充 百度一下搭建go-cqhttp,千篇一律都是采用python搭建的,Java搭建根本没有.导致自己在搭建的时候可折磨了,出现了许多的问题.唯一能参考就只有官方文档.文档对小白也不是太友好,所以出这篇博客弥补一下Java 的搭建版本. 搭建环境: winndows 系统 + Java + Idea 2020.2 注意:本博客写的比较简单,存在很多不完善的地

  • Spring-boot结合Shrio实现JWT的方法

    本文介绍了Spring-boot结合Shrio实现JWT的方法,分享给大家,具体如下: 关于验证大致分为两个方面: 用户登录时的验证: 用户登录后每次访问时的权限认证 主要解决方法:使用自定义的Shiro Filter 项目搭建: 这是一个spring-boot 的web项目,不了解spring-boot的项目搭建,请google. pom.mx引入相关jar包 <!-- shiro 权限管理 --> <dependency> <groupId>org.apache.s

  • springboot快速整合Mybatis组件的方法(推荐)

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 原有Spring优缺点分析 Spring的优点分析 Spring是Java企业版(Java Enterprise Edition,

  • 详解docker部署SpringBoot及替换jar包的方法

    关于docker的安装和使用,可以看看之前这两篇文章.docker kubernetes dashboard安装部署详细介绍和Docker如何使用link建立容器之间的连接.这篇文章主要介绍如何在docker上部署springboot项目.关于如何创建springboot项目可以看看这篇文章IDEA上面搭建一个SpringBoot的web-mvc项目遇到的问题 本文主要介绍docker部署springboot的三种方式,分别是:入门方式.jar包替换部署的方式和脚本部署方式,一步步来手把手教程.

  • SpringBoot连接使用PostgreSql数据库的方法

    一.介绍 此次更新时间:2020-10-28,现在是上班时间,偷更一下.其实使用IDEA的话无需配置Maven什么的,如果你们公司不是强制要求使用Eclipse的话,只需要有个JDK的环境即可,IDEA自带了一个版本的Maven,还是挺新的,目前IDEA最新版2.2.3的版本.我们也不用按照下面这个步骤去下载Spring Initializr,我们在IDEA中新建项目选择到Maven就行了,干净简洁. 目前在Resources目录下的application大多数是使用yml语法了.现在已经太长时

  • 关于springboot整合swagger问题及解决方法

    一.前言 解决了一个困扰很久的问题.自己搭建的一个springboot项目,整合完jsp之后可以正常访问前端界面,但当再整合上swagger之后,前端界面就无法访问了.当注释掉swagger之后,前端界面又可以正常访问. 二.整合jsp 1.pom引入 <!-- 添加jsp引用 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-

  • SpringBoot搭建全局异常拦截

    1.异常拦截类的创建 package com.liqi.web.core.exception; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice; import

随机推荐