go-cqhttp icon indicating copy to clipboard operation
go-cqhttp copied to clipboard

[Bug]: 调用群聊天记录API导致WebSocket断线重连

Open huangdoudou1215 opened this issue 1 year ago • 0 comments

请确保您已阅读以上注意事项,并勾选下方的确认框。

  • [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字符串的时候,就直接断开重连了

补充说明(可选)

求大佬告知我原因

huangdoudou1215 avatar Sep 03 '23 02:09 huangdoudou1215