From 1b8b150d61199b582979704e014663edccbf44d8 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Wed, 20 Dec 2023 14:18:55 -0500 Subject: [PATCH 1/4] Removed not needed @Override in ApiServiceMock! --- .../tools/tester/mockClient/mocks/ApiServiceMock.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/mockClient/mocks/ApiServiceMock.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/mockClient/mocks/ApiServiceMock.java index 52667584..ef08dcb7 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/mockClient/mocks/ApiServiceMock.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/mockClient/mocks/ApiServiceMock.java @@ -54,10 +54,4 @@ public LiveRoomMeta fetchRoomInfo() public WebcastResponse fetchClientData() { return WebcastResponse.newBuilder().build(); } - - - @Override - public String fetchRoomId(String userName) { - return "mock-room-id"; - } -} +} \ No newline at end of file From 0b9f1570d00ed9ef65c84fa6ccf22454fae8d67c Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Thu, 21 Dec 2023 21:40:11 -0500 Subject: [PATCH 2/4] Optimized a few methods when calling and using the Api! --- .../tiktok/TikTokLiveClientBuilder.java | 10 ++-- .../jwdeveloper/tiktok/http/HttpUtils.java | 54 +++++-------------- .../tiktok/http/TikTokApiService.java | 8 ++- .../tiktok/http/TikTokCookieJar.java | 17 ++---- .../tiktok/http/TikTokHttpClient.java | 12 ++--- .../tiktok/http/TikTokHttpRequestFactory.java | 18 +++---- .../listener/TikTokListenersManager.java | 4 +- .../tiktok/http/HttpUtilsTest.java | 47 ++++++++++++++++ 8 files changed, 87 insertions(+), 83 deletions(-) create mode 100644 Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java 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 545806df..36672ac7 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -136,12 +136,10 @@ protected void validate() { handler.setFormatter(new Formatter() { @Override public String format(LogRecord record) { - var sb = new StringBuilder(); - sb.append(ConsoleColors.GREEN).append("[").append(record.getLoggerName()).append("] "); - sb.append(ConsoleColors.GREEN).append("[").append(record.getLevel()).append("]: "); - sb.append(ConsoleColors.WHITE_BRIGHT).append(record.getMessage()); - sb.append(ConsoleColors.RESET).append("\n"); - return sb.toString(); + return ConsoleColors.GREEN + "[" + record.getLoggerName() + "] " + + ConsoleColors.GREEN + "[" + record.getLevel() + "]: " + + ConsoleColors.WHITE_BRIGHT + record.getMessage() + + ConsoleColors.RESET + "\n"; } }); logger.setUseParentHandlers(false); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java index 10c441ff..ada69914 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java @@ -22,58 +22,30 @@ */ package io.github.jwdeveloper.tiktok.http; -import lombok.SneakyThrows; - import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.stream.Collectors; public class HttpUtils { public static String parseParameters(String url, Map parameters) { - var parameterString = ""; - if (!parameters.isEmpty()) { - var builder = new StringBuilder(); - builder.append("?"); - var first = false; - for (var param : parameters.entrySet()) { - - if (first) { - builder.append("&"); - } - builder.append(param.getKey()).append("=").append(param.getValue()); - first = true; - } - parameterString = builder.toString(); - } + if (parameters.isEmpty()) + return url; - return url+parameterString; + return url+ "?" + parameters.entrySet().stream().map(entry -> entry.getKey()+"="+entry.getValue()).collect(Collectors.joining("&")); } - @SneakyThrows public static String parseParametersEncode(String url, Map parameters) { - - var parameterString = ""; - if (!parameters.isEmpty()) { - var builder = new StringBuilder(); - builder.append("?"); - var first = false; - for (var param : parameters.entrySet()) { - - if (first) { - builder.append("&"); - } - - final String encodedKey = URLEncoder.encode(param.getKey(), StandardCharsets.UTF_8); - final String encodedValue = URLEncoder.encode(param.getValue().toString(), StandardCharsets.UTF_8); - builder.append(encodedKey).append("=").append(encodedValue); - first = true; - } - parameterString = builder.toString(); - } - - return url+parameterString; + if (parameters.isEmpty()) + return url; + + return url+ "?" + parameters.entrySet().stream().map(entry -> { + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8); + return encodedKey+"="+encodedValue; + }).collect(Collectors.joining("&")); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java index 4ec76329..344f7f69 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java @@ -73,7 +73,7 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { var message = roomData.get("message").getAsString(); if (message.equals("params_error")) { - throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer"); + throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer"); } if (message.equals("user_not_found")) { return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1); @@ -81,7 +81,11 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { //live -> status 2 //live paused -> 3 //not live -> status 4 - var data = roomData.getAsJsonObject("data"); + var element = roomData.get("data"); + if (element.isJsonNull()) { + return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1); + } + var data = element.getAsJsonObject(); var user = data.getAsJsonObject("user"); var roomId = user.get("roomId").getAsString(); var status = user.get("status").getAsInt(); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java index 951138a6..927ad926 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java @@ -22,9 +22,8 @@ */ package io.github.jwdeveloper.tiktok.http; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class TikTokCookieJar { private final Map cookies; @@ -40,13 +39,7 @@ public void set(String key, String value) { cookies.put(key, value); } - public String parseCookies() - { - var sb = new StringBuilder(); - for(var entry : cookies.entrySet()) - { - sb.append(entry.getKey()).append("=").append(entry.getValue()).append(";"); - } - return sb.toString(); + public String parseCookies() { + return cookies.entrySet().stream().map(entry -> entry.getKey()+"="+entry.getValue()+";").collect(Collectors.joining()); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java index dd527814..cb44e760 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java @@ -45,8 +45,7 @@ public TikTokHttpClient(TikTokCookieJar tikTokCookieJar, TikTokHttpRequestFactor this.tikTokCookieJar = tikTokCookieJar; } - public void setSessionId(String sessionId) - { + public void setSessionId(String sessionId) { tikTokCookieJar.set("sessionid", sessionId); tikTokCookieJar.set("sessionid_ss", sessionId); tikTokCookieJar.set("sid_tt", sessionId); @@ -54,14 +53,12 @@ public void setSessionId(String sessionId) public String getLivestreamPage(String userName) { - var url = Constants.TIKTOK_URL_WEB + "@" + userName + "/live/"; var get = getRequest(url, null); return get; } - public JsonObject getJsonFromTikTokApi(String path, Map params) - { + public JsonObject getJsonFromTikTokApi(String path, Map params) { var get = getRequest(Constants.TIKTOK_URL_WEB + path, params); var json = JsonParser.parseString(get); var jsonObject = json.getAsJsonObject(); @@ -117,7 +114,6 @@ private byte[] getSignRequest(String url, Map parameters) { { var split = cookie.split(";")[0].split("="); - var key = split[0]; var value = split[1]; tikTokCookieJar.set(key, value); @@ -133,7 +129,6 @@ private byte[] getSignRequest(String url, Map parameters) { private String getSignedUrl(String url, Map parameters) { - var fullUrl = HttpUtils.parseParameters(url,parameters); var signParams = new TreeMap(); signParams.put("client", "ttlive-java"); @@ -143,7 +138,6 @@ private String getSignedUrl(String url, Map parameters) { var request = requestFactory.setQueries(signParams); var content = request.get(Constants.TIKTOK_SIGN_API); - try { var json = JsonParser.parseString(content); var jsonObject = json.getAsJsonObject(); @@ -157,4 +151,4 @@ private String getSignedUrl(String url, Map parameters) { } } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java index 79a10ef2..63580638 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java @@ -42,6 +42,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.stream.Collectors; public class TikTokHttpRequestFactory implements TikTokHttpRequest { private final CookieManager cookieManager; @@ -122,18 +123,16 @@ public TikTokHttpRequest setAgent(String value) { public TikTokHttpRequest setQueries(Map queries) { if (queries == null) return this; - var testMap = new TreeMap(queries); - query = String.join("&", testMap.entrySet().stream().map(x -> - { + var testMap = new TreeMap<>(queries); + query = testMap.entrySet().stream().map(x -> { var key = x.getKey(); - var value = ""; try { - value = URLEncoder.encode(x.getValue().toString(), StandardCharsets.UTF_8); + return key+"="+URLEncoder.encode(x.getValue().toString(), StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); + return key + "="; } - return key + "=" + value; - }).toList()); + }).collect(Collectors.joining("&")); return this; } @@ -162,10 +161,7 @@ private String getContent(HttpRequest request) throws Exception { var map = new HashMap>(); map.put(key, List.of(value)); cookieManager.put(uri, map); - } return response.body(); } - - -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java index c33ec297..410bb74b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java @@ -115,8 +115,8 @@ private ListenerBindingModel bindToEvents(TikTokEventListener listener) { throw new TikTokEventListenerMethodException(e); } }; - eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList>()).add(eventMethodRef); + eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList<>()).add(eventMethodRef); } return new ListenerBindingModel(listener, eventsMap); } -} +} \ No newline at end of file diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java new file mode 100644 index 00000000..c32a18e6 --- /dev/null +++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java @@ -0,0 +1,47 @@ +package io.github.jwdeveloper.tiktok.http; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.*; + +public class HttpUtilsTest +{ + @Test + public void parseParameters_EmptyParameters_ShouldHaveNoParameters() + { + String parsed = HttpUtils.parseParameters("https://webcast.tiktok.com/webcast/im/fetch/", new HashMap<>()); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/", parsed); + } + + @Test + public void parseParameters_ValidParameters_ShouldConstructValidURL() + { + LinkedHashMap testMap = new LinkedHashMap<>(); + testMap.put("room_id", 1); + testMap.put("uniqueId", "randomName"); + String parsed = HttpUtils.parseParameters("https://webcast.tiktok.com/webcast/im/fetch/", testMap); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/?room_id=1&uniqueId=randomName", parsed); + } + + @Test + public void parseParametersEncode_EmptyParameters_ShouldHaveNoParameters() + { + String parsed = HttpUtils.parseParametersEncode("https://webcast.tiktok.com/webcast/im/fetch/", new HashMap<>()); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/", parsed); + } + + @Test + public void parseParametersEncode_ValidParameters_ShouldConstructValidURL() + { + LinkedHashMap testMap = new LinkedHashMap<>(); + testMap.put("room_id", 1); + testMap.put("root_referer", "https://www.tiktok.com/"); + String parsed = HttpUtils.parseParametersEncode("https://webcast.tiktok.com/webcast/im/fetch/", testMap); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/?room_id=1&root_referer=https%3A%2F%2Fwww.tiktok.com%2F", parsed); + } +} \ No newline at end of file From b0bf4ac606a4823fe44548db3ea40a8138c988c2 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Fri, 22 Dec 2023 10:32:49 -0500 Subject: [PATCH 3/4] Added @Getter to Badge classes and toString methods! --- .../tiktok/data/models/badges/CombineBadge.java | 11 +++++++---- .../tiktok/data/models/badges/PictureBadge.java | 12 +++++++++--- .../tiktok/data/models/badges/StringBadge.java | 12 +++++++++--- .../tiktok/data/models/badges/TextBadge.java | 15 ++++++++++----- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java index 655efe00..0b240332 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java @@ -24,19 +24,22 @@ import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class CombineBadge extends Badge { private final Picture picture; private final String text; private final String subText; - public CombineBadge(BadgeStruct.CombineBadge combineBadge) { - picture = Picture.map(combineBadge.getIcon()); text = combineBadge.getText().getDefaultPattern(); subText = combineBadge.getStr(); } - -} + @Override + public String toString() { + return "CombineBadge{picture=" + picture +", text='" + text + "', subText='" + subText + "'}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java index 3dbba78a..409662aa 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java @@ -24,12 +24,18 @@ import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class PictureBadge extends Badge { - private final Picture picture; - public PictureBadge(BadgeStruct.ImageBadge imageBadge) { + public PictureBadge(BadgeStruct.ImageBadge imageBadge) { picture = Picture.map(imageBadge.getImage()); } -} + + @Override + public String toString() { + return "PictureBadge{picture=" + picture + "}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java index 4f241b3e..68d64be3 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java @@ -23,12 +23,18 @@ package io.github.jwdeveloper.tiktok.data.models.badges; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class StringBadge extends Badge { + private final String text; - public String text; public StringBadge(BadgeStruct.StringBadge stringBadge) { - this.text = stringBadge.getStr(); } -} + + @Override + public String toString() { + return "StringBadge{text='" + text + "'}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java index cf62a345..d736569d 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java @@ -23,13 +23,18 @@ package io.github.jwdeveloper.tiktok.data.models.badges; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; -public class TextBadge extends Badge -{ +@Getter +public class TextBadge extends Badge { private final String text; - public TextBadge(BadgeStruct.TextBadge textBadge) - { + public TextBadge(BadgeStruct.TextBadge textBadge) { this.text = textBadge.getDefaultPattern(); } -} + + @Override + public String toString() { + return "TextBadge{text='" + text + "'}"; + } +} \ No newline at end of file From ea525470e22514618917076aae2468c9159793cf Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Fri, 22 Dec 2023 12:22:50 -0500 Subject: [PATCH 4/4] Revert to StringBuilder and stacking stream line! --- .../jwdeveloper/tiktok/TikTokLiveClientBuilder.java | 10 ++++++---- .../jwdeveloper/tiktok/http/TikTokCookieJar.java | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) 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 36672ac7..545806df 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -136,10 +136,12 @@ protected void validate() { handler.setFormatter(new Formatter() { @Override public String format(LogRecord record) { - return ConsoleColors.GREEN + "[" + record.getLoggerName() + "] " + - ConsoleColors.GREEN + "[" + record.getLevel() + "]: " + - ConsoleColors.WHITE_BRIGHT + record.getMessage() + - ConsoleColors.RESET + "\n"; + var sb = new StringBuilder(); + sb.append(ConsoleColors.GREEN).append("[").append(record.getLoggerName()).append("] "); + sb.append(ConsoleColors.GREEN).append("[").append(record.getLevel()).append("]: "); + sb.append(ConsoleColors.WHITE_BRIGHT).append(record.getMessage()); + sb.append(ConsoleColors.RESET).append("\n"); + return sb.toString(); } }); logger.setUseParentHandlers(false); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java index 927ad926..046d7c5f 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java @@ -40,6 +40,9 @@ public void set(String key, String value) { } public String parseCookies() { - return cookies.entrySet().stream().map(entry -> entry.getKey()+"="+entry.getValue()+";").collect(Collectors.joining()); + return cookies.entrySet() + .stream() + .map(entry -> entry.getKey()+"="+entry.getValue()+";") + .collect(Collectors.joining()); } } \ No newline at end of file