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项目,不选任何依赖直接创建即可

go-cqhttp+SpringBoot3实现QQ机器人_第1张图片

 go-cqhttp+SpringBoot3实现QQ机器人_第2张图片

 2. 引入相关依赖

        
            org.springframework.boot
            spring-boot-starter-websocket
        

        
            com.alibaba
            fastjson
            2.0.21
        

        
            org.projectlombok
            lombok
        

        
        
            org.apache.httpcomponents
            httpclient
            4.5.13
        

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 {

    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;

    private static Client instance;

    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) {
        logger.info("连接成功!");
    }

    @OnClose
    public void onClose(Session session) {
        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 paramsRequest = new Request<>();
        paramsRequest.setAction("set_friend_add_request");
        Map 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);
        logger.info("收到好友" + parseObject.getUserId()+"的消息:"+parseObject.getMessage());
        Request paramsRequest = new Request<>();
        paramsRequest.setAction("send_msg");
        Map params = new HashMap<>();
        params.put("user_id", parseObject.getUserId());
        String ai = AiOne(parseObject.getMessage());
        if (ai == null) {
           ai = "宝,回复失败!重新试试把!";
        }
        params.put("message", ai);
        params.put("message_type", "private");
        params.put("auto_escape", true);
        paramsRequest.setParams(params);
        msg = JSONObject.toJSONString(paramsRequest);
        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版本

go-cqhttp+SpringBoot3实现QQ机器人_第3张图片

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

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

go-cqhttp+SpringBoot3实现QQ机器人_第4张图片

 go-cqhttp+SpringBoot3实现QQ机器人_第5张图片

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

go-cqhttp+SpringBoot3实现QQ机器人_第6张图片

go-cqhttp+SpringBoot3实现QQ机器人_第7张图片

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

go-cqhttp+SpringBoot3实现QQ机器人_第8张图片

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

go-cqhttp+SpringBoot3实现QQ机器人_第9张图片

修改刚刚生成的device.json

go-cqhttp+SpringBoot3实现QQ机器人_第10张图片

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

go-cqhttp+SpringBoot3实现QQ机器人_第11张图片

go-cqhttp+SpringBoot3实现QQ机器人_第12张图片

7.编写启动类,启动项目即可,就可以实现自动所有功能了

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

/**
 * https://docs.go-cqhttp.org/guide/quick_start.html
 */
@SpringBootApplication
public class GoCqhttpApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(GoCqhttpApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        //这里的地址是根据config.yml里面配置的IP和端口号保持一致
        Client.connect("ws://127.0.0.1:9090");
    }
}

你可能感兴趣的:(机器人,java,spring,boot)