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 545806d..36672ac 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 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { 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 10c441f..ada6991 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 (parameters.isEmpty()) + return url; - if (first) { - builder.append("&"); - } - builder.append(param.getKey()).append("=").append(param.getValue()); - first = true; - } - parameterString = builder.toString(); - } - - 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) { + if (parameters.isEmpty()) + return url; - 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; + 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 4ec7632..344f7f6 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 class TikTokApiService { 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 class TikTokApiService { //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 951138a..927ad92 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 class TikTokCookieJar { 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 dd52781..cb44e76 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 class TikTokHttpClient { 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 class TikTokHttpClient { 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 @@ public class TikTokHttpClient { { var split = cookie.split(";")[0].split("="); - var key = split[0]; var value = split[1]; tikTokCookieJar.set(key, value); @@ -133,7 +129,6 @@ public class TikTokHttpClient { 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 @@ public class TikTokHttpClient { 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 @@ public class TikTokHttpClient { } } -} +} \ 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 79a10ef..6358063 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.HashMap; 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 class TikTokHttpRequestFactory implements TikTokHttpRequest { 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 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest { 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 c33ec29..410bb74 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 @@ public class TikTokListenersManager implements ListenersManager { 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 0000000..c32a18e --- /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