springboot对接napcatQQ机器人
napcat官网
我这里是使用linux安装的 官网还有windows版本
首先使用命令
curl -o \
napcat.sh \
https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh \
&& sudo bash napcat.sh \
--docker n \
--cli y
你会看到如下界面 等待安装完成即可

安装成功之后 放行6099端口 该端口是napcat的webui 建议限制ip访问 避免被扫描端口
启动napcat
xvfb-run -a qq --no-sandbox -q 123456

这里建议先不要扫码
先打开webui 地址是:http://ip:6099/webui/
会提示让你输入token 默认token为:napcat

进入之后会提示登录QQ 可以选择扫码登录 登录成功之后会进去这样一个界面

点击网络配置去配置我们需要的消息回调和发送消息接口
这里有两个http
http服务器就是调用发送消息 比如你需要调用这个地址给好友发送消息
http客户端代表的是回调 也就是别人在给你登录的QQ发送的消息 会回调到这个地址

第一步配置回调地址
1.输入回调地址
2:消息格式可选array和string(我这边使用java用的array也就是我们的json)
3:启用 =》 保存

第二步配置发送端
1:配置地址 默认0.0.0.0 可以不用修改 监听的本机
2:配置端口 默认3000 可以修改(记得防火墙放行端口)
3:启用 =》 保存

开始springboot代码
第一步接收回调
@PostMapping("callback")
public void callback(@RequestBody JSONObject jsonObject) throws Exception {
log.info("jsonObject: {}", jsonObject);
String userId = jsonObject.getString("user_id");
String selfId = jsonObject.getString("self_id");
String rawMessage = jsonObject.getString("raw_message");
String messageType = jsonObject.getString("message_type");
if (!StringUtils.hasLength(messageType)) {
log.error("messageType为空");
return;
}
if (!messageType.equals("private")) {
log.error("messageType不是private");
return;
}
if (rawMessage.startsWith("找")) {
rawMessage = rawMessage.replaceAll("找", "").trim();
String content = queryProd(rawMessage);
sendMsg(userId, content);
} else {
String content = "请以找开头查询闲鱼商品,例如:找手机";
sendMsg(userId, content);
}
}
测试发送消息是否接收到回调
{"self_id":94470980,"user_id":319355229,"time":1751444668,"message_id":1570382681,"message_seq":1570382681,"real_id":1570382681,"real_seq":"107","message_type":"private","sender":{"user_id":319355229,"nickname":"稚初","card":""},"raw_message":"hello 我是一条测试消息","font":14,"sub_type":"friend","message":[{"type":"text","data":{"text":"hello 我是一条测试消息"}}],"message_format":"array","post_type":"message","target_id":319355229,"raw":{"msgId":"7522397570517006805","msgRandom":"1525718624","msgSeq":"107","cntSeq":"0","chatType":1,"msgType":2,"subMsgType":1,"sendType":0,"senderUid":"u_z-p-Aw1CvvaBz2UPb_LibA","peerUid":"u_z-p-Aw1CvvaBz2UPb_LibA","channelId":"","guildId":"","guildCode":"0","fromUid":"0","fromAppid":"0","msgTime":"1751444668","msgMeta":{},"sendStatus":2,"sendRemarkName":"","sendMemberName":"","sendNickName":"","guildName":"","channelName":"","elements":[{"elementType":1,"elementId":"7522397570517006804","elementGroupId":0,"extBufForUI":{},"textElement":{"content":"hello 我是一条测试消息","atType":0,"atUid":"0","atTinyId":"0","atNtUid":"","subElementType":0,"atChannelId":"0","atRoleId":"0","atRoleColor":0,"atRoleName":"","needNotify":0}}],"records":[],"emojiLikesList":[],"commentCnt":"0","directMsgFlag":0,"directMsgMembers":[],"peerName":"","editable":false,"avatarMeta":"","avatarPendant":"","feedId":"","roleId":"0","timeStamp":"0","isImportMsg":false,"atType":0,"roleType":0,"fromChannelRoleInfo":{"roleId":"0","name":"","color":0},"fromGuildRoleInfo":{"roleId":"0","name":"","color":0},"levelRoleInfo":{"roleId":"0","name":"","color":0},"recallTime":"0","isOnlineMsg":true,"generalFlags":{},"clientSeq":"12107","senderUin":"319355229","peerUin":"319355229","msgAttrs":{},"nameType":0,"avatarFlag":0,"categoryManage":0,"sourceType":1,"id":1570382681}}
我这边因为设置了开头所以会返回我的指定错误信息

第二步发送消息

在webui里面可供我们调试
编写发送端
我这里是回调解析到文本消息后调用该接口
host就是你napcat部署的服务器地址+端口
public void sendMsg(String qq, String content) {
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("user_id", qq);
JSONObject msgJson = new JSONObject();
msgJson.put("type", "text");
JSONObject dataJson = new JSONObject();
dataJson.put("text", content);
msgJson.put("data", dataJson);
JSONArray jsonArray = new JSONArray();
jsonArray.add(msgJson);
jsonObject.put("message", jsonArray);
String url = "/send_private_msg";
log.info("请求地址:{},send_private_msg请求参数: {}", url, jsonObject.toJSONString());
String post = HttpUtil.post(host + url, jsonObject.toJSONString());
log.info("send_private_msg返回参数: {}", post);
JSONObject respJson = JSONObject.parseObject(post);
Integer integer = respJson.getInteger("retcode");
if (!integer.equals(0)) {
throw new Exception("发送失败");
}
} catch (Exception e) {
log.error("发送失败", e);
}
}
测试发送消息

可以根据自己的需要做功能 我这边只是查商品
有问题可以联系我:319355229

3617

被折叠的 条评论
为什么被折叠?



