mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-27 16:59:39 -05:00
Implemeting tiktok ws handling
This commit is contained in:
@@ -1,20 +1,106 @@
|
|||||||
package io.github.jwdeveloper.tiktok.websocket;
|
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.net.http.WebSocket;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.CompletionStage;
|
import java.util.concurrent.CompletionStage;
|
||||||
|
|
||||||
|
|
||||||
public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener {
|
public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener {
|
||||||
|
|
||||||
|
List<ByteBuffer> 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<ByteBuffer> 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
|
@Override
|
||||||
public void onOpen(java.net.http.WebSocket webSocket) {
|
public void onOpen(java.net.http.WebSocket webSocket) {
|
||||||
System.out.println("WebSocket opened");
|
System.out.println("WebSocket opened");
|
||||||
|
webSocket.request(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(java.net.http.WebSocket webSocket, Throwable error) {
|
public void onError(java.net.http.WebSocket webSocket, Throwable error) {
|
||||||
System.out.println("Error occurred: " + error.getMessage());
|
System.out.println("Error occurred: " + error.getMessage());
|
||||||
|
webSocket.request(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
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
|
@Override
|
||||||
public CompletionStage<?> onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) {
|
public CompletionStage<?> onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) {
|
||||||
System.out.println("WebSocket closed with status code: " + statusCode + " and reason: " + reason);
|
System.out.println("WebSocket closed with status code: " + statusCode + " and reason: " + reason);
|
||||||
return java.net.http.WebSocket.Listener.super.onClose(webSocket, statusCode, 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -79,12 +79,14 @@ public class TikTokWebsocketClient {
|
|||||||
public void startWS(String url) {
|
public void startWS(String url) {
|
||||||
try {
|
try {
|
||||||
var cookie = tikTokCookieJar.parseCookies();
|
var cookie = tikTokCookieJar.parseCookies();
|
||||||
logger.info("WssIP: " + url);
|
System.out.println("WssIP: " + url);
|
||||||
logger.info("Cookie: " + cookie);
|
System.out.println("Cookie: " + cookie);
|
||||||
|
|
||||||
var map = new HashMap<String, String>();
|
var map = new HashMap<String, String>();
|
||||||
map.put("Cookie", cookie);
|
map.put("Cookie", cookie);
|
||||||
|
|
||||||
|
|
||||||
|
// System.in.read();
|
||||||
//var cluent2 = new Client2(URI.create(url), map);
|
//var cluent2 = new Client2(URI.create(url), map);
|
||||||
var builder = HttpClient.newHttpClient().newWebSocketBuilder();
|
var builder = HttpClient.newHttpClient().newWebSocketBuilder();
|
||||||
var ws = builder
|
var ws = builder
|
||||||
@@ -95,12 +97,11 @@ public class TikTokWebsocketClient {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
var i =0;
|
|
||||||
while (true) {
|
while (true) {
|
||||||
byte[] message = new byte[]{58, 2, 104, 98};
|
byte[] message = new byte[]{58, 2, 104, 98};
|
||||||
ByteBuffer buffer = ByteBuffer.wrap(message);
|
ByteBuffer buffer = ByteBuffer.wrap(message);
|
||||||
while (buffer.hasRemaining()) {
|
while (buffer.hasRemaining()) {
|
||||||
ws.sendPing(buffer);
|
ws.sendPing(buffer).get();
|
||||||
}
|
}
|
||||||
buffer.clear();
|
buffer.clear();
|
||||||
Thread.sleep(10);
|
Thread.sleep(10);
|
||||||
|
|||||||
Reference in New Issue
Block a user