go-cqhttp+SpringBoot3实现QQ机器人

这篇具有很好参考价值的文章主要介绍了go-cqhttp+SpringBoot3实现QQ机器人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本QQ机器人实现的功能

1.调用青云客的API进行自动聊天

2.输入关键词自动添加为好友

技术栈

非特殊情况保持一致即可!

1.SpringBoot-3.0.5

2.JDK-17

3.go-cqhttp1.0

Github:GitHub - Mrs4s/go-cqhttp: cqhttp的golang实现,轻量、原生跨平台.

gocq api文档地址:https://docs.go-cqhttp.org/api/

源码

https://gitee.com/mumangguo/go-cqhttp

实现步骤:

1. 新建一个springBoot项目,不选任何依赖直接创建即可

java qq机器人,机器人,java,spring boot

 java qq机器人,机器人,java,spring boot

 2. 引入相关依赖

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

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

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

        <!-- httpclient用来请求自动回复API -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>

3.编写相关实体类,处理json

Friend类

import lombok.Data;

@Data
public class Friend {

    private String user_id;
    private String comment;
    private String flag;
}

Message类

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

import java.io.Serializable;

@Data
public class Message implements Serializable {

    @JSONField(name = "post_type")
    private String postType;
    @JSONField(name = "meta_event_type")
    private String metaEventType;
    @JSONField(name = "message_type")
    private String messageType;
    @JSONField(name = "notice_type")
    private String noticeType;
    // 操作人id 比如群管理员a踢了一个人,那么该值为a的qq号
    @JSONField(name = "operator_id")
    private String operatorId;
    private Long time;
    @JSONField(name = "self_id")
    private String selfId;
    @JSONField(name = "sub_type")
    private String subType;
    @JSONField(name = "user_id")
    private String userId;
    @JSONField(name = "sender_id")
    private String senderId;
    @JSONField(name = "group_id")
    private String groupId;
    @JSONField(name = "target_id")
    private String targetId;
    private String message;
    @JSONField(name = "raw_message")
    private String rawMessage;
    private Integer font;
    //private Sender sender;
    @JSONField(name = "message_id")
    private String messageId;
    @JSONField(name = "message_seq")
    private Integer messageSeq;
    private String anonymous;
}

Request类

import lombok.Data;

@Data
public class Request<T> {

    private String action;
    private T params;
    private String echo;
}

4.编写消息监听类(Websocket实现)

/**
 * 消息监听
 */
@ClientEndpoint
public class Client {
    private static final Logger logger = LoggerFactory.getLogger(Client.class);
    private Session session;
    public static Client instance;
    public static boolean isOpen = false;

    private Client(String url) {
        try {
            session = ContainerProvider.getWebSocketContainer().connectToServer(this, URI.create(url));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public synchronized static boolean connect(String url) {
        instance = new Client(url);
        return true;
    }

    @OnOpen
    public void onOpen(Session session) {
        isOpen = true;
        logger.info("连接成功!");
    }

    @OnClose
    public void onClose(Session session) {
        isOpen = false;
        logger.info("连接关闭!");
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        logger.info("连接错误!");
    }

    @OnMessage
    public void onMessage(String message) {
        if (message.contains("\"request_type\":\"friend\"")) {
            sendFriend(message);
        }
        if (message.contains("\"post_type\":\"message\"") && message.contains("\"message_type\":\"private\"")) {
            sendMsg(message);
        }
    }

    /**
     * 好友请求
     */
    private synchronized void sendFriend(String msg) {
        Friend parseObject = JSONObject.parseObject(msg, Friend.class);
        logger.info("收到好友请求:" + parseObject.getUser_id() + ",验证消息:" + parseObject.getComment());
        Request<Object> paramsRequest = new Request<>();
        paramsRequest.setAction("set_friend_add_request");
        Map<String, Object> params = new HashMap<>();
        params.put("flag", parseObject.getFlag());
        if (parseObject.getComment().equals("木芒果")) {
            params.put("approve", true);
            logger.info("已同意好友请求:" + parseObject.getUser_id());
        } else {
            params.put("approve", false);
            logger.info("已拒绝好友请求:" + parseObject.getUser_id());
        }
        paramsRequest.setParams(params);
        instance.session.getAsyncRemote().sendText(JSONObject.toJSONString(paramsRequest));
    }

    /**
     * 好友消息
     */
    public synchronized static void sendMsg(String msg) {
        Message parseObject = JSONObject.parseObject(msg, Message.class);
        String message = parseObject.getMessage();
        //message = message.replaceAll(" ", ",");
        logger.info("收到好友" + parseObject.getUserId() + "的消息:" + message);
        Request<Object> paramsRequest = new Request<>();
        paramsRequest.setAction("send_private_msg");
        Map<String, Object> params = new HashMap<>();
        params.put("user_id", parseObject.getUserId());
        String ai = AiOne(message);
        if (ai == null) {
          ai = "宝,回复失败!重新试试把!";
        }
        params.put("message",ai);
        paramsRequest.setParams(params);
        msg = JSONObject.toJSONString(paramsRequest);
        System.out.println("msg="+msg);
        instance.session.getAsyncRemote().sendText(msg);
    }

    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);
            logger.info("AiOne={}", body);
            return body;
        } catch (Exception e) {
            logger.error(e.toString());
            return null;
        }
    }
}

5.代码部分完成,下载go-cqhttp

下载链接:Releases · Mrs4s/go-cqhttp · GitHub,根据自身实际情况下载对应的操作系统版本,当然我的源码中包含了Linux版本和Windows版本

java qq机器人,机器人,java,spring boot

 6.这边只演示windows操作系统如何启动,Linux启动可以看api文档

官方推荐使用cmd的方式启动,我们就在文件目录上输入cmd启动即可

java qq机器人,机器人,java,spring boot

 java qq机器人,机器人,java,spring boot

可以看到他在当前文件夹下生成了一个config.yml文件,我们打开看看,只要修改我箭头标注位置即可

java qq机器人,机器人,java,spring boot

java qq机器人,机器人,java,spring boot

 修改完后,重新启动该程序,完成qq的登录验证,正常完成验证的情况下,就会出现登录成功!

java qq机器人,机器人,java,spring boot

登录出现45/235错误代表着当前QQ号处于腾讯的风控,就需要修改协议(不用配置密码,把密码保持为空即可)采用扫码的方式进行登录!

java qq机器人,机器人,java,spring boot

一、修改config.yml,把密码置为空表示扫码登录 

java qq机器人,机器人,java,spring boot

二、修改刚刚生成的device.json

java qq机器人,机器人,java,spring boot

三、把这个protocol修改为2或者0,保存后再继续启动,出现扫码登录即可

java qq机器人,机器人,java,spring boot文章来源地址https://www.toymoban.com/news/detail-620451.html

7.编写启动类,启动项目即可,就可以实现自动所有功能了,需要特别注意的是要先启动go-cqhttp才能启动项目!

import com.mmg.gocqhttp.websocket.Client;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.Timer;
import java.util.TimerTask;

/**
 * https://docs.go-cqhttp.org/guide/quick_start.html
 */
@SpringBootApplication
public class GoCqhttpApplication implements CommandLineRunner {
    private static final Logger logger = LoggerFactory.getLogger(GoCqhttpApplication.class);

    public static void main(String[] args) {
        SpringApplication.run(GoCqhttpApplication.class, args);
    }

    @Override
    public void run(String... args) {
        Client.connect("ws://127.0.0.1:9090");
        // 断线重连
        Timer t = new Timer();
        t.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (!Client.isOpen || Client.instance == null) {
                    Client.connect("ws://127.0.0.1:9090");
                    logger.error("正在断线重连!");
                }
            }
        }, 1000, 5000);
    }
}

到了这里,关于go-cqhttp+SpringBoot3实现QQ机器人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GLM联合go-cqhttp实现qq群GLM机器人服务器的本地化部署笔记

    以下chatgpt-mirai-qq-bot简称GPT转发程序 实现本地化部署的GLM q群机器人 最好16GB的显存 显卡性能要求不高 window环境 该项目的是利用lss233大佬的项目一头对接GLM模型将其消息处理成go-cqhttp可以处理的形式最后发送到qq群内 lss233大佬的项目地址 https://github.com/lss233/chatgpt-mirai-qq-bot

    2024年02月16日
    浏览(32)
  • 新版nonebot,go-cqhttp搭建qq机器人保姆级教程

    前段时间QQ进行了更新,所以导致了非手表协议扫码登陆报错的问题,不过好在大佬已经推出rc5版本的go-cqhttp,解决了这一头疼的问题 在开始之前,我需要说明一下,本文章是针对没有经验和基础的用户,所以说篇幅可能会长一点 你需要准备的东西有: python3.8及以上版本 虚

    2023年04月18日
    浏览(43)
  • go-cqhttp,QQ机器人发语音+视频+表情+接入chatgpt

    windows布局go-cqhttp_哔哩哔哩_bilibili 注意:图片需要放到go-cqhttp的目录下的data/images下面,否则无法发送,网络图片可以直接发送

    2024年02月11日
    浏览(41)
  • 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

    前言: 程序上云的服务器搭建步骤已经发布,大家可以移步至此查看:【0基础QQ机器人开发二】服务器篇 前段时间由于学习原因产生了一个自动化管理QQ群的需求,在我几天的努力之下,通过各种 学习 CV,终于实现了该需求,但是因为这个项目并不是很完美,里面有些许的bug,导致

    2023年04月08日
    浏览(37)
  • 【Python简单QQ机器人】使用nonebot2与go-cqhttp构建

    目录 一、前言 nonebot2-2.0.0b4 QQ机器人详细教程 二、准备 1.Python 2.Pycharm 3.nonebot2 4.go-cqhttp 三、配置 1.搭建go-cqhttp 2.创建nonebot2机器人 四、运行 五、nonebot2插件         闲着没事干,忽看到群里面的qq机器人,想要学习一下,用了两天实现了本体的搭建并添加了一些插件。期间

    2024年02月09日
    浏览(47)
  • 香菜Bot--基于chatgpt与stable diffusion和go-cqhttp的QQ机器人

    闲来无事,利用chatgpt的api和stable_diffusion的api写了一个qq机器人,qq使用的框架是go-cqhttp.这里做一些总结. 赛博(女)朋友 本项目需要魔法才行 废话不多说,先看看效果

    2024年02月11日
    浏览(33)
  • 使用腾讯云服务器+Nonebot2+go-cqhttp搭建QQ聊天机器人【保姆级教程 2023最新版】

    下载go-cqhttp 这里有不同版本的cqhttp,并且对每个版本都有介绍。但是大家可以看到有 arm与adm 不同的版本,这两个啥关系呢? 严格来说, AMD和ARM没有任何关系 。AMD是桌面级处理器和桌面级GPU的生产厂商,而ARM是移动级处理器的生产厂商。AMD是目前业内唯一一个可以提供高性能

    2023年04月18日
    浏览(39)
  • 实际工作中通过python+go-cqhttp+selenium实现自动检测维护升级并发送QQ通知消息(程序内测)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 首先,今年比较忙没有多余时间去实操创作分享文章给大家,那就给大家分享下博主在实际工作中的一点点内容吧,就当交流交流~ 目前公司有个跨平台大项目正在内测中,是基于QT框架研发的客户

    2024年02月13日
    浏览(30)
  • 【linux系统版本Centos7】基于nonebot与go-cqhttp的机器人云端部署

    二、Centos7安装Python3环境💖 ======================================================================================== 部署及机器人的时候需要使用nb-cli库,但是目前只有python3.7.6以上的版本支持他。所以大家安装Python的时候一定要安装python3.7.6以上的版本。否则就会报错没有nb-cli库。在这里小编推

    2024年04月27日
    浏览(29)
  • go-cqhttp调用接口

    1、 简介 在我们实现了权限控制功能后,那么我们就在也不用担心机器人话太多,同时,平时又没时间,电脑又不在身边,而无法控制机器人了。那么,我们实现了权限的管理就好说了。然后,又出现一个问题了,我们应该如何利用这个权限系统,来帮助我们管理机器人呢?

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包