From 542c57616da7f4b6f67dd4e44874e2c781c4fdc8 Mon Sep 17 00:00:00 2001 From: JW Date: Sun, 6 Aug 2023 03:10:26 +0200 Subject: [PATCH] Implemeting tiktok ws handling --- .../websocket/TikTokWebSocketListener.java | 106 +++++++++++++++--- .../websocket/TikTokWebsocketClient.java | 9 +- 2 files changed, 93 insertions(+), 22 deletions(-) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java index c072f26..46ec18a 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java @@ -1,20 +1,106 @@ package io.github.jwdeveloper.tiktok.websocket; +import io.github.jwdeveloper.generated.WebcastMessageEvent; +import io.github.jwdeveloper.generated.WebcastResponse; +import io.github.jwdeveloper.generated.WebcastWebsocketAck; +import io.github.jwdeveloper.generated.WebcastWebsocketMessage; +import io.github.jwdeveloper.tiktok.TikTokLiveException; + import java.net.http.WebSocket; import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener { +public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener { + + List parts = new ArrayList<>(); + CompletableFuture accumulatedMessage = new CompletableFuture<>(); + + @Override + public CompletionStage onBinary(WebSocket webSocket, ByteBuffer data, boolean last) { + System.out.println("Received onBinary: " + data + " " + last); + parts.add(data); + webSocket.request(1); + if (last) { + var buffer = combineBuffer(parts); + accumulatedMessage.complete(null); + CompletionStage cf = accumulatedMessage; + accumulatedMessage = new CompletableFuture<>(); + handleBinary(webSocket, buffer); + parts = new ArrayList<>(); + return cf; + } + return accumulatedMessage; + } + + + public ByteBuffer combineBuffer(List buffers) { + int totalCapacity = buffers.stream().mapToInt(ByteBuffer::remaining).sum(); + ByteBuffer combined = ByteBuffer.allocate(totalCapacity); + for (ByteBuffer buffer : buffers) { + combined.put(buffer); + } + combined.flip(); + return combined; + } + + + private void handleBinary(WebSocket webSocket, ByteBuffer buffer) { + try { + WebcastWebsocketMessage websocketMessage = WebcastWebsocketMessage.parseFrom(buffer); + + if(websocketMessage.getBinary().isEmpty()) + { + return; + } + // System.out.println(websocketMessage.getBinary()); + try { + var response = WebcastResponse.parseFrom(websocketMessage.getBinary()); + var serverInfo = WebcastWebsocketAck + .newBuilder() + .setType("ack") + .setId(websocketMessage.getId()) + .build(); + webSocket.sendBinary(serverInfo.toByteString().asReadOnlyByteBuffer(), true); + + System.out.println("Works"); + // handleResponse(response); + } catch (Exception e) { + // throw new TikTokLiveException("Unabel to read WebcastResponse"); + System.out.println("Unable to read WebcastResponse"); + } + } catch (Exception e) { + + System.out.println("Unable to read WebcastWebsocketMessage"); + //throw new TikTokLiveException("Unabel to read WebcastWebsocketMessage"); + } + } + + + public void handleResponse(WebcastResponse webcastResponse) { + System.out.println("Handling response: Messages"+webcastResponse.getMessagesList().size()); + + for(var message : webcastResponse.getMessagesList()) + { + + + } + } + @Override public void onOpen(java.net.http.WebSocket webSocket) { System.out.println("WebSocket opened"); + webSocket.request(1); } @Override public void onError(java.net.http.WebSocket webSocket, Throwable error) { System.out.println("Error occurred: " + error.getMessage()); + webSocket.request(1); } @Override @@ -23,27 +109,11 @@ public class TikTokWebSocketListener implements java.net.http.WebSocket.Listene return java.net.http.WebSocket.Listener.super.onText(webSocket, data, last); } - @Override - public CompletionStage onPing(WebSocket webSocket, ByteBuffer message) { - System.out.println("Received onPing: " ); - return java.net.http.WebSocket.Listener.super.onPing(webSocket, message); - } - - @Override - public CompletionStage onBinary(WebSocket webSocket, ByteBuffer data, boolean last) { - System.out.println("Received onBinary: " + data); - return java.net.http.WebSocket.Listener.super.onBinary(webSocket, data, last); - } - @Override public CompletionStage onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) { System.out.println("WebSocket closed with status code: " + statusCode + " and reason: " + reason); return java.net.http.WebSocket.Listener.super.onClose(webSocket, statusCode, reason); } - @Override - public CompletionStage onPong(WebSocket webSocket, ByteBuffer message) { - System.out.println("Received onPong: "); - return java.net.http.WebSocket.Listener.super.onPong(webSocket,message); - } + } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebsocketClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebsocketClient.java index 11ea349..0752d63 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebsocketClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebsocketClient.java @@ -79,12 +79,14 @@ public class TikTokWebsocketClient { public void startWS(String url) { try { var cookie = tikTokCookieJar.parseCookies(); - logger.info("WssIP: " + url); - logger.info("Cookie: " + cookie); + System.out.println("WssIP: " + url); + System.out.println("Cookie: " + cookie); var map = new HashMap(); map.put("Cookie", cookie); + + // System.in.read(); //var cluent2 = new Client2(URI.create(url), map); var builder = HttpClient.newHttpClient().newWebSocketBuilder(); var ws = builder @@ -95,12 +97,11 @@ public class TikTokWebsocketClient { - var i =0; while (true) { byte[] message = new byte[]{58, 2, 104, 98}; ByteBuffer buffer = ByteBuffer.wrap(message); while (buffer.hasRemaining()) { - ws.sendPing(buffer); + ws.sendPing(buffer).get(); } buffer.clear(); Thread.sleep(10);