go-cqhttp
go-cqhttp copied to clipboard
[Bug]: 调用群聊天记录API导致WebSocket断线重连
请确保您已阅读以上注意事项,并勾选下方的确认框。
- [X] 我已经仔细阅读上述教程和 "提问前需知"
- [X] 我已经使用 dev分支版本 测试过,问题依旧存在。
- [X] 我已经在 Issue Tracker 中找过我要提出的问题,没有找到相同问题的ISSUE。
- [X] 我已知晓并同意,此处仅用于汇报程序中存在的问题。若这个 Issue 是关于其他非程序本身问题,则我的 Issue 可能会被无条件自动关闭或/并锁定。(这些问题应当在 Discussion 板块提出。)
go-cqhttp 版本
1.10
运行环境
Windows (64)
运行架构
None
连接方式
WebSocket (正向)
使用协议
0 | Default
重现步骤
在ws中获取聊天记录,用http的get请求到了聊天记录,但是在处理的时候ws会断开,聊天记录也为空。
期望的结果是什么?
获得完整的聊天记录并把它进行获取。
实际的结果是什么?
ws连接断开重连,无法获取内容
简单的复现代码/链接(可选)
/**
* 群消息
*/
public synchronized static void sendGroupMsg(String msg) {
if(msg.contains("CQ:image")||!(msg.contains("[CQ:at,qq=1554257974]"))) return ;
Message parseObject = JSONObject.parseObject(msg, Message.class);
logger.info("收到群" + parseObject.getGroupId()+"中"+parseObject.getSender().getNickname() + "的消息:" + parseObject.getMessage());
HttpClientRequestThread requestThread = new HttpClientRequestThread(parseObject);
requestThread.start();
Request<Object> paramsRequest = new Request<>();
paramsRequest.setAction("send_group_msg");
Map<String, Object> params = new HashMap<>();
params.put("group_id", parseObject.getGroupId());
if(HttpClientRequestThread.chat ==null){
logger.info("chat为空,返回");
return;
}
String ai = AiOne(HttpClientRequestThread.chat);
if (ai == null) {
ai = "宝,回复失败!重新试试吧!";
}
params.put("message", ai);
// params.put("message_type", "group");
params.put("auto_escape", false);
paramsRequest.setParams(params);
msg = JSONObject.toJSONString(paramsRequest);
instance.session.getAsyncRemote().sendText(msg);
}
另外一个线程收集聊天记录
public class HttpClientRequestThread extends Thread {
private static final Logger logger = LoggerFactory.getLogger(Client.class);
private Message parseObject;
public static String chat = null;
public HttpClientRequestThread(Message parseObject) {
this.parseObject = parseObject;
}
@Override
public void run() {
String responseBody = null;
try {
// 创建 HttpClient 对象
HttpClient httpClient = HttpClients.createDefault();
// 创建 HttpGet 对象,并设置URL
HttpGet httpGet = new HttpGet("http://127.0.0.1:5700/get_group_msg_history?group_id=" + parseObject.getGroupId());
// 发送 GET 请求
HttpResponse response = httpClient.execute(httpGet);
// 处理响应数据
if (response.getStatusLine().getStatusCode() == 200) {
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("响应内容:" + responseBody);
} else {
System.out.println("请求失败,响应码:" + response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info("gouzao11");
// 解析JSON字符串
ArrayList<Message> messageList = new ArrayList<>();
JSONObject jsonObject = JSON.parseObject(responseBody);
JSONArray messagesArray = jsonObject.getJSONObject("message").getJSONObject("data").getJSONArray("messages");
// 将JSON数组转化为ArrayList
logger.info("gouzao");
for (int i = 0; i < messagesArray.size(); i++) {
JSONObject messageObject = messagesArray.getJSONObject(i);
Message message = JSON.toJavaObject(messageObject, Message.class);
messageList.add(message);
}
//构造聊天记录
StringBuilder sb = new StringBuilder();
for(int i=0;i<messageList.size();i++){
sb.append(messageList.get(i).getSender().getNickname())
.append(":")
.append(getRealString(messageList.get(i).getMessage()))
.append("\n");
}
if(sb!=null) {
chat = sb.toString();
logger.info("chat:{}",chat);
}
}
public static String getRealString(String originalString){
int indexOfFirstBracket = originalString.indexOf("]");
if (indexOfFirstBracket != -1) {
String subString = originalString.substring(indexOfFirstBracket + 1);
return subString;
}
return null;
}
}
日志记录(可选)
就是连接断开,在处理JSON字符串的时候,就直接断开重连了
补充说明(可选)
求大佬告知我原因