diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java index 3f3f31e..8784fad 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java @@ -88,7 +88,7 @@ public interface TikTokEventBuilder { T onEvent(TikTokEventConsumer event); - T onSuccessResponseMapping(TikTokEventConsumer event); + T onWebsocketMessage(TikTokEventConsumer event); } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSuccessResponseMappingEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokWebsocketMessageEvent.java similarity index 71% rename from API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSuccessResponseMappingEvent.java rename to API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokWebsocketMessageEvent.java index 08f222e..b77b607 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSuccessResponseMappingEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokWebsocketMessageEvent.java @@ -5,9 +5,13 @@ import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import lombok.AllArgsConstructor; import lombok.Data; + +/** + * Happens when TikTok websocket receive message from server + */ @Data @AllArgsConstructor -public class TikTokSuccessResponseMappingEvent extends TikTokEvent +public class TikTokWebsocketMessageEvent extends TikTokEvent { private TikTokEvent event; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java index 82b8c59..c6cd428 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java @@ -3,7 +3,6 @@ package io.github.jwdeveloper.tiktok.live; public interface LiveRoomInfo { int getViewersCount(); - String getRoomId(); String getUserName(); } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/utils/CancelationToken.java b/API/src/main/java/io/github/jwdeveloper/tiktok/utils/CancelationToken.java new file mode 100644 index 0000000..977f736 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/utils/CancelationToken.java @@ -0,0 +1,38 @@ +package io.github.jwdeveloper.tiktok.utils; + +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; + +public class CancelationToken +{ + private boolean isCanceled =false; + + public void cancel() + { + isCanceled =true; + } + + public boolean isCancel() + { + + return isCanceled; + } + + public void throwIfCancel() + { + if(!isCanceled) + { + return; + } + throw new TikTokLiveException("Token requested cancelation"); + } + + public boolean isNotCancel() + { + return !isCancel(); + } + + public static CancelationToken create() + { + return new CancelationToken(); + } +} diff --git a/API/src/main/proto/tiktokSchema.proto b/API/src/main/proto/tiktokSchema.proto index c8cb397..a63ffe7 100644 --- a/API/src/main/proto/tiktokSchema.proto +++ b/API/src/main/proto/tiktokSchema.proto @@ -414,13 +414,16 @@ message User { Picture profilePicture = 9; // Avatar Picture picture720 = 10; // 720p Picture picture1080 = 11; // 1080p - uint32 data2 = 15; - uint64 data3 = 16; + int32 status = 15; + int64 createTime = 16; + int64 modifyTime = 17; + int32 secret = 18; + string shareQrcodeUri = 19; repeated Picture additionalPictures = 21; FollowerData followerData = 22; - string userString1 = 23; +// string userString1 = 23; UserRanking userRank1 = 25; - string userString2 = 32; + // string userString2 = 32; uint64 data4 = 37; string uniqueId = 38; // @-ID for user string data5 = 46; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index ff62d51..8b47c81 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -12,6 +12,7 @@ import io.github.jwdeveloper.tiktok.http.TikTokCookieJar; import io.github.jwdeveloper.tiktok.http.TikTokHttpApiClient; import io.github.jwdeveloper.tiktok.http.TikTokHttpRequestFactory; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.utils.CancelationToken; import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient; import java.time.Duration; @@ -319,8 +320,8 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder event) { - tikTokEventHandler.subscribe(TikTokSuccessResponseMappingEvent.class, event); + public TikTokLiveClientBuilder onWebsocketMessage(TikTokEventConsumer event) { + tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event); return this; } } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java index 81fa4c9..37224c8 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java @@ -6,7 +6,7 @@ import io.github.jwdeveloper.tiktok.ClientSettings; import io.github.jwdeveloper.tiktok.TikTokLiveClient; import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; -import io.github.jwdeveloper.tiktok.events.messages.TikTokSuccessResponseMappingEvent; +import io.github.jwdeveloper.tiktok.events.messages.TikTokWebsocketMessageEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokUnhandledEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; @@ -70,7 +70,7 @@ public abstract class TikTokMessageHandler { } var handler = handlers.get(message.getType()); var tiktokEvent = handler.handle(message); - tikTokEventHandler.publish(client, new TikTokSuccessResponseMappingEvent(tiktokEvent, message)); + tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, message)); tikTokEventHandler.publish(client, tiktokEvent); } 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 0f15a69..983c830 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 @@ -25,10 +25,10 @@ public class TikTokWebSocketClient { private final TikTokCookieJar tikTokCookieJar; private final TikTokMessageHandlerRegistration webResponseHandler; private final TikTokEventHandler tikTokEventHandler; - private WebSocketClient webSocketClient; - private boolean isConnected; private TikTokLiveClient tikTokLiveClient; + private TikTokWebSocketPingingTask pingingTask; + private boolean isConnected; public TikTokWebSocketClient(Logger logger, TikTokCookieJar tikTokCookieJar, @@ -59,7 +59,13 @@ public class TikTokWebSocketClient { } webSocketClient = startWebSocket(url); webSocketClient.connect(); - } catch (Exception e) { + + pingingTask = new TikTokWebSocketPingingTask(); + pingingTask.run(webSocketClient); + isConnected = true; + } catch (Exception e) + { + isConnected =false; throw new TikTokLiveException("Failed to connect to the websocket", e); } } @@ -83,15 +89,23 @@ public class TikTokWebSocketClient { var cookie = tikTokCookieJar.parseCookies(); var map = new HashMap(); map.put("Cookie", cookie); - - return new TikTokWebSocketListener(URI.create(url), map, 3000, webResponseHandler, tikTokEventHandler, tikTokLiveClient); + return new TikTokWebSocketListener(URI.create(url), + map, + 3000, + webResponseHandler, + tikTokEventHandler, + tikTokLiveClient); } - public void stop() { + public void stop() + { if (isConnected && webSocketClient != null) { - webSocketClient.close(); + webSocketClient.close(1); } + webSocketClient = null; + pingingTask = null; + isConnected = false; } } 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 c59d5eb..846075a 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 @@ -101,17 +101,7 @@ public class TikTokWebSocketListener extends WebSocketClient { } } - private void pingTask(WebSocket webSocket) throws InterruptedException { - while (true) { - byte[] message = new byte[]{58, 2, 104, 98}; - ByteBuffer buffer = ByteBuffer.wrap(message); - while (buffer.hasRemaining()) { - webSocket.sendPing(buffer); - } - buffer.clear(); - Thread.sleep(10); - } - } + private void sendAckId(long id) { var serverInfo = WebcastWebsocketAck diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java new file mode 100644 index 0000000..1805124 --- /dev/null +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java @@ -0,0 +1,58 @@ +package io.github.jwdeveloper.tiktok.websocket; + +import org.java_websocket.WebSocket; +import java.util.Random; + +public class TikTokWebSocketPingingTask +{ + private Thread thread; + + private boolean isRunning = false; + private final int MIN_TIMEOUT = 5; + private final int MAX_TIMEOUT = 100; + + + public void run(WebSocket webSocket) + { + var thread = new Thread(() -> + { + pingTask(webSocket); + }); + isRunning =true; + thread.start(); + } + + public void stop() + { + if(thread != null) + { + thread.interrupt(); + } + isRunning = false; + } + + + private void pingTask(WebSocket webSocket) + { + var random = new Random(); + while (isRunning) + { + try + { + if(!webSocket.isOpen()) + { + Thread.sleep(100); + continue; + } + webSocket.sendPing(); + var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT; + Thread.sleep(timeout); + } + catch (Exception e) + { + isRunning = false; + } + } + + } +} diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/ParseMessagesTests.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/ParseMessagesTests.java index 71b7bee..ab95de2 100644 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/ParseMessagesTests.java +++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/ParseMessagesTests.java @@ -40,4 +40,10 @@ public class ParseMessagesTests extends TikTokBaseTest } + @Test + public void ShouldParseMessageWebcastMemberMessage() throws InvalidProtocolBufferException { + var bytes = getFileBytesUtf("WebcastMemberMessage.bin"); + var message = WebcastMemberMessage.parseFrom(bytes); + } + } diff --git a/Client/src/test/resources/WebcastMemberMessage.bin b/Client/src/test/resources/WebcastMemberMessage.bin new file mode 100644 index 0000000..1101742 --- /dev/null +++ b/Client/src/test/resources/WebcastMemberMessage.bin @@ -0,0 +1 @@ +CqYQEKCW5YLs3I75ZCDkstiRpTFIAVABsAEEwAEBChRXZWJjYXN0TWVtYmVyTWVzc2FnZRiglpnA0ouJ+WQwAULjDwoVbGl2ZV9yb29tX2VudGVyX3RvYXN0Eg97MDp1c2VyfSBqb2luZWQaDgoJI2I4ZmZmZmZmIJADIqgPCAsSDAoHIzhDRTdGRiCQA6oBlA8KkQ8Ihois9IGKsqBfsgEHCNYBEEMYAYICDQgBIP///////////wGyAg1lbWlsa2Fmb3JjemVr8gJMTVM0d0xqQUJBQUFBSndwZW92RzRJblZ6TmVHNWRMaXRLQzVoeUFMQXBKa0xYZ2YzR0NNVm5oQ012Z3FIWWtFMTRUUTRBNm9kVlBndRoORW1pbGthIEZvcmN6ZWtKigUSIzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwCp8BaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL3Rpa3Rvay1vYmovMTY3OTYzNDQ5MDMxMzczMH50cGx2LXRpa3Rvay1zaHJpbms6NzI6NzIud2VicD94LWV4cGlyZXM9MTY5Mzc2NzYwMCZ4LXNpZ25hdHVyZT05NjNDR1JHMVJiRzljSVBkOE4lMkZ3YiUyQnU5bHQ0JTNECpIBaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL2F3ZW1lLzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwLndlYnA/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9Z3ZWT25kTTYxOEZid2VxR1klMkZzdGhzRGZvQmMlM0QKlAFodHRwczovL3A3Ny1zaWduLXNnLnRpa3Rva2Nkbi5jb20vYXdlbWUvMTAweDEwMC90aWt0b2stb2JqLzE2Nzk2MzQ0OTAzMTM3MzAud2VicD94LWV4cGlyZXM9MTY5Mzc2NzYwMCZ4LXNpZ25hdHVyZT1kYmRjSVgxUXd4S0dYajhXaTR2JTJGdEo2JTJCTEZzJTNECpQBaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL2F3ZW1lLzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwLmpwZWc/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9dWc4VENIZW0lMkZweGpuJTJCd2hwb2RZeU95MmtVUSUzRLoBAIIE6gggAVLpAnNzbG9jYWw6Ly93ZWJjYXN0X2x5bnh2aWV3X3BvcHVwP3VzZV9zcGFyaz0xJnVybD1odHRwcyUzQSUyRiUyRmxmMTYtZ2Vja28tc291cmNlLnRpa3Rva2Nkbi5jb20lMkZvYmolMkZieXRlLWd1cmQtc291cmNlLXNnJTJGdGlrdG9rJTJGZmUlMkZsaXZlJTJGdGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4lMkZzcmMlMkZwYWdlcyUyRnByaXZpbGVnZSUyRnBhbmVsJTJGdGVtcGxhdGUuanMmaGlkZV9zdGF0dXNfYmFyPTAmaGlkZV9uYXZfYmFyPTEmY29udGFpbmVyX2JnX2NvbG9yPTAwMDAwMDAwJmhlaWdodD05MCUyNSZiZGhtX2JpZD10aWt0b2tfbGl2ZV9yZXZlbnVlX3VzZXJfbGV2ZWxfbWFpbiZ1c2VfZm9yZXN0PTFYAWJPKgIxMQoBMhITNzEzODM4MTc0NzI5MjQ3NzIyMBoBMCIubW9ja19maXhfd2lkdGhfdHJhbnNwYXJlbnRfNzEzODM4MTc0NzI5MjQ3NzIyMLoBnwV4DoABD6IBBggBEAIYICoGCAEQAhggMgA6BhoCEgAiAFoNCgASCSM5OTNGN0RGNmINCgASCSM5OTNGN0RGNggEEtgECl1odHRwczovL3AxNi13ZWJjYXN0LnRpa3Rva2Nkbi5jb20vd2ViY2FzdC12YS9ncmFkZV9iYWRnZV9pY29uX2xpdGVfbHYxMF92MS5wbmd+dHBsdi1vYmouaW1hZ2UKXWh0dHBzOi8vcDE5LXdlYmNhc3QudGlrdG9rY2RuLmNvbS93ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjEwX3YxLnBuZ350cGx2LW9iai5pbWFnZRIsd2ViY2FzdC12YS9ncmFkZV9iYWRnZV9pY29uX2xpdGVfbHYxMF92MS5wbmc66QJzc2xvY2FsOi8vd2ViY2FzdF9seW54dmlld19wb3B1cD91c2Vfc3Bhcms9MSZ1cmw9aHR0cHMlM0ElMkYlMkZsZjE2LWdlY2tvLXNvdXJjZS50aWt0b2tjZG4uY29tJTJGb2JqJTJGYnl0ZS1ndXJkLXNvdXJjZS1zZyUyRnRpa3RvayUyRmZlJTJGbGl2ZSUyRnRpa3Rva19saXZlX3JldmVudWVfdXNlcl9sZXZlbF9tYWluJTJGc3JjJTJGcGFnZXMlMkZwcml2aWxlZ2UlMkZwYW5lbCUyRnRlbXBsYXRlLmpzJmhpZGVfc3RhdHVzX2Jhcj0wJmhpZGVfbmF2X2Jhcj0xJmNvbnRhaW5lcl9iZ19jb2xvcj0wMDAwMDAwMCZoZWlnaHQ9OTAlMjUmYmRobV9iaWQ9dGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4mdXNlX2ZvcmVzdD0xIgIxMQgEEBQYCLgBARKRDxoORW1pbGthIEZvcmN6ZWtKigUSIzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwCp8BaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL3Rpa3Rvay1vYmovMTY3OTYzNDQ5MDMxMzczMH50cGx2LXRpa3Rvay1zaHJpbms6NzI6NzIud2VicD94LWV4cGlyZXM9MTY5Mzc2NzYwMCZ4LXNpZ25hdHVyZT05NjNDR1JHMVJiRzljSVBkOE4lMkZ3YiUyQnU5bHQ0JTNECpIBaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL2F3ZW1lLzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwLndlYnA/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9Z3ZWT25kTTYxOEZid2VxR1klMkZzdGhzRGZvQmMlM0QKlAFodHRwczovL3A3Ny1zaWduLXNnLnRpa3Rva2Nkbi5jb20vYXdlbWUvMTAweDEwMC90aWt0b2stb2JqLzE2Nzk2MzQ0OTAzMTM3MzAud2VicD94LWV4cGlyZXM9MTY5Mzc2NzYwMCZ4LXNpZ25hdHVyZT1kYmRjSVgxUXd4S0dYajhXaTR2JTJGdEo2JTJCTEZzJTNECpQBaHR0cHM6Ly9wMTYtc2lnbi1zZy50aWt0b2tjZG4uY29tL2F3ZW1lLzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwLmpwZWc/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9dWc4VENIZW0lMkZweGpuJTJCd2hwb2RZeU95MmtVUSUzRLIBBwjWARBDGAGCAg0IASD///////////8BsgINZW1pbGthZm9yY3pla/ICTE1TNHdMakFCQUFBQUp3cGVvdkc0SW5Wek5lRzVkTGl0S0M1aHlBTEFwSmtMWGdmM0dDTVZuaENNdmdxSFlrRTE0VFE0QTZvZFZQZ3UIhois9IGKsqBfggTqCCABUukCc3Nsb2NhbDovL3dlYmNhc3RfbHlueHZpZXdfcG9wdXA/dXNlX3NwYXJrPTEmdXJsPWh0dHBzJTNBJTJGJTJGbGYxNi1nZWNrby1zb3VyY2UudGlrdG9rY2RuLmNvbSUyRm9iaiUyRmJ5dGUtZ3VyZC1zb3VyY2Utc2clMkZ0aWt0b2slMkZmZSUyRmxpdmUlMkZ0aWt0b2tfbGl2ZV9yZXZlbnVlX3VzZXJfbGV2ZWxfbWFpbiUyRnNyYyUyRnBhZ2VzJTJGcHJpdmlsZWdlJTJGcGFuZWwlMkZ0ZW1wbGF0ZS5qcyZoaWRlX3N0YXR1c19iYXI9MCZoaWRlX25hdl9iYXI9MSZjb250YWluZXJfYmdfY29sb3I9MDAwMDAwMDAmaGVpZ2h0PTkwJTI1JmJkaG1fYmlkPXRpa3Rva19saXZlX3JldmVudWVfdXNlcl9sZXZlbF9tYWluJnVzZV9mb3Jlc3Q9MVgBYk8SEzcxMzgzODE3NDcyOTI0NzcyMjAaATAiLm1vY2tfZml4X3dpZHRoX3RyYW5zcGFyZW50XzcxMzgzODE3NDcyOTI0NzcyMjAqAjExCgEyugGfBQgEIgIxMTIAOgYaAhIAIgBiDQoAEgkjOTkzRjdERjaiAQYIARACGCAS2AQKXWh0dHBzOi8vcDE2LXdlYmNhc3QudGlrdG9rY2RuLmNvbS93ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjEwX3YxLnBuZ350cGx2LW9iai5pbWFnZQpdaHR0cHM6Ly9wMTktd2ViY2FzdC50aWt0b2tjZG4uY29tL3dlYmNhc3QtdmEvZ3JhZGVfYmFkZ2VfaWNvbl9saXRlX2x2MTBfdjEucG5nfnRwbHYtb2JqLmltYWdlEix3ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjEwX3YxLnBuZzrpAnNzbG9jYWw6Ly93ZWJjYXN0X2x5bnh2aWV3X3BvcHVwP3VzZV9zcGFyaz0xJnVybD1odHRwcyUzQSUyRiUyRmxmMTYtZ2Vja28tc291cmNlLnRpa3Rva2Nkbi5jb20lMkZvYmolMkZieXRlLWd1cmQtc291cmNlLXNnJTJGdGlrdG9rJTJGZmUlMkZsaXZlJTJGdGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4lMkZzcmMlMkZwYWdlcyUyRnByaXZpbGVnZSUyRnBhbmVsJTJGdGVtcGxhdGUuanMmaGlkZV9zdGF0dXNfYmFyPTAmaGlkZV9uYXZfYmFyPTEmY29udGFpbmVyX2JnX2NvbG9yPTAwMDAwMDAwJmhlaWdodD05MCUyNSZiZGhtX2JpZD10aWt0b2tfbGl2ZV9yZXZlbnVlX3VzZXJfbGV2ZWxfbWFpbiZ1c2VfZm9yZXN0PTEqBggBEAIYIFoNCgASCSM5OTNGN0RGNngOgAEPCAQQFBgIugEAGIYGUAGSAeMPChVsaXZlX3Jvb21fZW50ZXJfdG9hc3QSD3swOnVzZXJ9IGpvaW5lZBoOCgkjYjhmZmZmZmYgkAMiqA8ICxIMCgcjOENFN0ZGIJADqgGUDwqRD0qKBQqfAWh0dHBzOi8vcDE2LXNpZ24tc2cudGlrdG9rY2RuLmNvbS90aWt0b2stb2JqLzE2Nzk2MzQ0OTAzMTM3MzB+dHBsdi10aWt0b2stc2hyaW5rOjcyOjcyLndlYnA/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9OTYzQ0dSRzFSYkc5Y0lQZDhOJTJGd2IlMkJ1OWx0NCUzRAqSAWh0dHBzOi8vcDE2LXNpZ24tc2cudGlrdG9rY2RuLmNvbS9hd2VtZS8xMDB4MTAwL3Rpa3Rvay1vYmovMTY3OTYzNDQ5MDMxMzczMC53ZWJwP3gtZXhwaXJlcz0xNjkzNzY3NjAwJngtc2lnbmF0dXJlPWd2Vk9uZE02MThGYndlcUdZJTJGc3Roc0Rmb0JjJTNECpQBaHR0cHM6Ly9wNzctc2lnbi1zZy50aWt0b2tjZG4uY29tL2F3ZW1lLzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwLndlYnA/eC1leHBpcmVzPTE2OTM3Njc2MDAmeC1zaWduYXR1cmU9ZGJkY0lYMVF3eEtHWGo4V2k0diUyRnRKNiUyQkxGcyUzRAqUAWh0dHBzOi8vcDE2LXNpZ24tc2cudGlrdG9rY2RuLmNvbS9hd2VtZS8xMDB4MTAwL3Rpa3Rvay1vYmovMTY3OTYzNDQ5MDMxMzczMC5qcGVnP3gtZXhwaXJlcz0xNjkzNzY3NjAwJngtc2lnbmF0dXJlPXVnOFRDSGVtJTJGcHhqbiUyQndocG9kWXlPeTJrVVElM0QSIzEwMHgxMDAvdGlrdG9rLW9iai8xNjc5NjM0NDkwMzEzNzMwsgINZW1pbGthZm9yY3pla4ICDQgBIP///////////wHyAkxNUzR3TGpBQkFBQUFKd3Blb3ZHNEluVnpOZUc1ZExpdEtDNWh5QUxBcEprTFhnZjNHQ01WbmhDTXZncUhZa0UxNFRRNEE2b2RWUGd1ggTqCFgBYk8iLm1vY2tfZml4X3dpZHRoX3RyYW5zcGFyZW50XzcxMzgzODE3NDcyOTI0NzcyMjAqAjExCgEyEhM3MTM4MzgxNzQ3MjkyNDc3MjIwGgEwugGfBYABDyICMTEqBggBEAIYIDIAYg0KABIJIzk5M0Y3REY2eA4IBBLYBBIsd2ViY2FzdC12YS9ncmFkZV9iYWRnZV9pY29uX2xpdGVfbHYxMF92MS5wbmc66QJzc2xvY2FsOi8vd2ViY2FzdF9seW54dmlld19wb3B1cD91c2Vfc3Bhcms9MSZ1cmw9aHR0cHMlM0ElMkYlMkZsZjE2LWdlY2tvLXNvdXJjZS50aWt0b2tjZG4uY29tJTJGb2JqJTJGYnl0ZS1ndXJkLXNvdXJjZS1zZyUyRnRpa3RvayUyRmZlJTJGbGl2ZSUyRnRpa3Rva19saXZlX3JldmVudWVfdXNlcl9sZXZlbF9tYWluJTJGc3JjJTJGcGFnZXMlMkZwcml2aWxlZ2UlMkZwYW5lbCUyRnRlbXBsYXRlLmpzJmhpZGVfc3RhdHVzX2Jhcj0wJmhpZGVfbmF2X2Jhcj0xJmNvbnRhaW5lcl9iZ19jb2xvcj0wMDAwMDAwMCZoZWlnaHQ9OTAlMjUmYmRobV9iaWQ9dGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4mdXNlX2ZvcmVzdD0xCl1odHRwczovL3AxNi13ZWJjYXN0LnRpa3Rva2Nkbi5jb20vd2ViY2FzdC12YS9ncmFkZV9iYWRnZV9pY29uX2xpdGVfbHYxMF92MS5wbmd+dHBsdi1vYmouaW1hZ2UKXWh0dHBzOi8vcDE5LXdlYmNhc3QudGlrdG9rY2RuLmNvbS93ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjEwX3YxLnBuZ350cGx2LW9iai5pbWFnZToGGgISACIAWg0KABIJIzk5M0Y3REY2ogEGEAIYIAgBCAQQFBgIIAFS6QJzc2xvY2FsOi8vd2ViY2FzdF9seW54dmlld19wb3B1cD91c2Vfc3Bhcms9MSZ1cmw9aHR0cHMlM0ElMkYlMkZsZjE2LWdlY2tvLXNvdXJjZS50aWt0b2tjZG4uY29tJTJGb2JqJTJGYnl0ZS1ndXJkLXNvdXJjZS1zZyUyRnRpa3RvayUyRmZlJTJGbGl2ZSUyRnRpa3Rva19saXZlX3JldmVudWVfdXNlcl9sZXZlbF9tYWluJTJGc3JjJTJGcGFnZXMlMkZwcml2aWxlZ2UlMkZwYW5lbCUyRnRlbXBsYXRlLmpzJmhpZGVfc3RhdHVzX2Jhcj0wJmhpZGVfbmF2X2Jhcj0xJmNvbnRhaW5lcl9iZ19jb2xvcj0wMDAwMDAwMCZoZWlnaHQ9OTAlMjUmYmRobV9iaWQ9dGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4mdXNlX2ZvcmVzdD0xCIaIrPSBirKgXxoORW1pbGthIEZvcmN6ZWuyAQcI1gEQQxgBugEAmgEaaG9tZXBhZ2VfZm9sbG93LWxpdmVfY292ZXKiAQVjbGljaw== \ No newline at end of file diff --git a/README.md b/README.md index ae2c1e7..c164c58 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,7 @@ Do you prefer other programming languages? https://jitpack.io -``` -```xml com.github.jwdeveloper.TikTok-Live-Java diff --git a/TestApplication/pom.xml b/TestApplication/pom.xml index f35b131..9243fa8 100644 --- a/TestApplication/pom.xml +++ b/TestApplication/pom.xml @@ -2,11 +2,48 @@ + + + TikTokLiveJava io.github.jwdeveloper.tiktok 0.0.14-Release + 4.0.0 TestApplication diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java index 0e6adc0..f16c9a7 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -4,13 +4,19 @@ import io.github.jwdeveloper.tiktok.events.messages.*; import io.github.jwdeveloper.tiktok.live.LiveClient; import java.io.IOException; +import java.time.Duration; public class Main { - public static String TEST_TIKTOK_USER = "polonezgarage"; + public static String TEST_TIKTOK_USER = "olchik.m1"; public static void main(String[] args) throws IOException { var client = TikTokLive.newClient(TEST_TIKTOK_USER) + .configure(clientSettings -> + { + clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(5)); + clientSettings.setRetryOnConnectionFailure(true); + }) .onConnected(Main::onConnected) .onDisconnected(Main::onDisconnected) .onRoomViewerData(Main::onViewerData) @@ -26,9 +32,13 @@ public class Main { { error.getException().printStackTrace(); }) + .onEvent((liveClient, event) -> + { + var viewers = liveClient.getRoomInfo().getViewersCount(); + }) .buildAndRun(); - var viewers = client.getRoomInfo().getViewersCount(); + System.in.read(); } diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java index 5146359..330b3c2 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java @@ -8,18 +8,52 @@ import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel; import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; public class Main { + //https://protobuf-decoder.netlify.app/ + /* + mia_tattoo + moniczkka + besin1276 + */ + + public static List ignoredEvents; + public static void main(String[] args) throws SQLException { - var tiktokUser = "mr_cios"; + + ignoredEvents = List.of("TikTokJoinEvent","TikTokLikeEvent"); + var db = new TikTokDatabase("test"); db.init(); + + var users = new ArrayList(); + users.add("mia_tattoo"); + users.add("moniczkka"); + users.add("besin1276"); + + for(var user : users) + { + runTikTokLiveInstance(user, db); + } + } + + private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) + { + TikTokLive.newClient(tiktokUser) - .onSuccessResponseMapping((liveClient, event) -> + .onWebsocketMessage((liveClient, event) -> { var eventName = event.getEvent().getClass().getSimpleName(); + + if(ignoredEvents.contains(eventName)) + { + return; + } + var binary = Base64.getEncoder().encodeToString(event.getMessage().getBinary().toByteArray()); var model = TikTokMessageModel.builder() .type("message") @@ -28,8 +62,8 @@ public class Main { .eventContent(binary) .build(); - db.insertMessage(model); - System.out.println("EVENT: " + eventName); + tikTokDatabase.insertMessage(model); + System.out.println("EVENT: ["+tiktokUser+"] " + eventName); }) .onError((liveClient, event) -> { @@ -53,7 +87,7 @@ public class Main { } var error = builder.build(); - db.insertError(error); + tikTokDatabase.insertError(error); System.out.println("ERROR: "+error.getErrorName()); exception.printStackTrace(); diff --git a/Tools/pom.xml b/Tools/pom.xml index 49dd295..ce11f67 100644 --- a/Tools/pom.xml +++ b/Tools/pom.xml @@ -33,6 +33,11 @@ ${project.version} compile + + org.jsoup + jsoup + 1.13.1 + io.github.jwdeveloper.tiktok Client diff --git a/Tools/src/main/java/io/github/jwdeveloper/tiktok/protocol/ProtocolGenerator.java b/Tools/src/main/java/io/github/jwdeveloper/tiktok/protocol/ProtocolGenerator.java new file mode 100644 index 0000000..1980101 --- /dev/null +++ b/Tools/src/main/java/io/github/jwdeveloper/tiktok/protocol/ProtocolGenerator.java @@ -0,0 +1,43 @@ +package io.github.jwdeveloper.tiktok.protocol; + + +import org.jsoup.Jsoup; +import java.io.File; +import java.io.IOException; + +public class ProtocolGenerator +{ + public static void main(String[] args) { + // Path to the HTML file + File htmlFile = new File("C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Tools\\src\\main\\resources\\page.html"); + + try { + // Parse the HTML file with Jsoup + var doc = Jsoup.parse(htmlFile, "UTF-8"); + + // Find all script tags + var scriptTags = doc.select("script"); + + // Display all script tags + int counter = 1; + for (var scriptTag : scriptTags) { + String srcValue = scriptTag.attr("src"); + + + + if(!srcValue.contains("tiktok/webapp/main/webapp-live/")) + { + continue; + } + // Only print those script tags which have a 'src' attribute + if (!srcValue.isEmpty()) { + System.out.println("Script Tag " + counter + " src attribute: " + srcValue); + } + counter++; + } + + } catch (IOException e) { + e.printStackTrace(); + } + } +}