From ecfee1f7257aa2c73b5ea4b16cb7448f3ed26ab8 Mon Sep 17 00:00:00 2001 From: ZayrexDev Date: Wed, 27 May 2026 10:12:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E8=87=B31.6.1=E5=B9=B6=E4=BC=98=E5=8C=96=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E4=BB=A4=E7=89=8C=E8=8E=B7=E5=8F=96=E5=92=8C=E7=BB=AD=E6=9C=9F?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/java/xyz/zcraft/seira/bot/QQApi.java | 34 ++++++++----------- src/main/java/xyz/zcraft/seira/bot/QQBot.java | 5 +++ .../xyz/zcraft/seira/util/TokenManager.java | 13 ++++--- 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index d56061d9..94ac6fd0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ xyz.zcraft Seira - 1.6.0 + 1.6.1 25 diff --git a/src/main/java/xyz/zcraft/seira/bot/QQApi.java b/src/main/java/xyz/zcraft/seira/bot/QQApi.java index a58f1aa5..bc4b0465 100644 --- a/src/main/java/xyz/zcraft/seira/bot/QQApi.java +++ b/src/main/java/xyz/zcraft/seira/bot/QQApi.java @@ -41,28 +41,24 @@ public static String getWSSEndpoint(AccessToken accessToken) { } } - public static AccessToken getAccessToken(String appId, String appSecret) { - try { - JsonObject payload = new JsonObject(); - payload.addProperty("appId", appId); - payload.addProperty("clientSecret", appSecret); + public static AccessToken getAccessToken(String appId, String appSecret) throws Exception { + JsonObject payload = new JsonObject(); + payload.addProperty("appId", appId); + payload.addProperty("clientSecret", appSecret); - HttpRequest request = HttpRequest.newBuilder() - .header("Content-Type", "application/json") - .uri(URI.create("https://bots.qq.com/app/getAppAccessToken")) - .POST(HttpRequest.BodyPublishers.ofString(payload.toString())) - .build(); + HttpRequest request = HttpRequest.newBuilder() + .header("Content-Type", "application/json") + .uri(URI.create("https://bots.qq.com/app/getAppAccessToken")) + .POST(HttpRequest.BodyPublishers.ofString(payload.toString())) + .build(); - final JsonElement jsonElement = JsonParser.parseString(CLIENT.send(request, HttpResponse.BodyHandlers.ofString()).body()); + final JsonElement jsonElement = JsonParser.parseString(CLIENT.send(request, HttpResponse.BodyHandlers.ofString()).body()); - return new AccessToken( - jsonElement.getAsJsonObject().get("access_token").getAsString(), - System.currentTimeMillis(), - jsonElement.getAsJsonObject().get("expires_in").getAsLong() - ); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } + return new AccessToken( + jsonElement.getAsJsonObject().get("access_token").getAsString(), + System.currentTimeMillis(), + jsonElement.getAsJsonObject().get("expires_in").getAsLong() + ); } public static void sendPrivateMessage(AccessToken accessToken, String openId, Message message) { diff --git a/src/main/java/xyz/zcraft/seira/bot/QQBot.java b/src/main/java/xyz/zcraft/seira/bot/QQBot.java index 1205f217..98a663be 100644 --- a/src/main/java/xyz/zcraft/seira/bot/QQBot.java +++ b/src/main/java/xyz/zcraft/seira/bot/QQBot.java @@ -34,6 +34,11 @@ public QQBot(AppConfig config) { while (true) { try { + if (tokenManager.isExpired()) { + LOG.warn("Waiting for token renewal"); + continue; + } + LOG.info("Getting wss endpoint"); String wssEndpoint = QQApi.getWSSEndpoint(tokenManager.getToken()); LOG.info("Endpoint: {}", wssEndpoint); diff --git a/src/main/java/xyz/zcraft/seira/util/TokenManager.java b/src/main/java/xyz/zcraft/seira/util/TokenManager.java index c30ee860..6a83aab4 100644 --- a/src/main/java/xyz/zcraft/seira/util/TokenManager.java +++ b/src/main/java/xyz/zcraft/seira/util/TokenManager.java @@ -23,12 +23,17 @@ public TokenManager(String clientId, String clientSecret) { } public boolean isExpired() { - return System.currentTimeMillis() - token.tokenGrantTime() >= (token.expiresIn() - 60) * 1000; + return (token == null) || (System.currentTimeMillis() - token.tokenGrantTime() >= (token.expiresIn() - 60) * 1000); } public void renew() { - token = QQApi.getAccessToken(clientId, clientSecret); - LOG.info("Token renewed, expire in {}", token.expiresIn()); + try { + token = QQApi.getAccessToken(clientId, clientSecret); + LOG.info("Token renewed, expire in {}", token.expiresIn()); + } catch (Exception e) { + token = null; + LOG.error("Failed to renew token, will retry in 60 sec", e); + } timer.schedule(new java.util.TimerTask() { @Override @@ -38,6 +43,6 @@ public void run() { renew(); } } - }, Math.min(token.expiresIn() - 60, 60) * 1000L); + }, Math.min((token != null ? token.expiresIn() : 0) - 60, 60) * 1000L); } }