From 530551763c4197fb706085744fe950ef8b9be0ab Mon Sep 17 00:00:00 2001 From: JW Date: Tue, 14 Nov 2023 18:44:09 +0100 Subject: [PATCH] Changes: fixed TikTokLive.isHostNameValid() fixed TikTokLive.isLiveOnline() those methods was not working in some regions --- .../tiktok/data/dto/TikTokUserInfo.java | 21 +++++ .../jwdeveloper/tiktok/TikTokLiveClient.java | 13 ++-- .../tiktok/http/TikTokApiService.java | 71 +++++++---------- .../tiktok/http/TikTokDataChecker.java | 72 +++++------------- .../http/TikTokLiveOnlineCheckerTest.java | 38 ++++++++- .../jwdeveloper/tiktok/SimpleExample.java | 12 +-- .../tiktok/gifts/GiftsDownloader.class | Bin 4951 -> 4957 bytes 7 files changed, 116 insertions(+), 111 deletions(-) create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java new file mode 100644 index 00000000..92b97771 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/TikTokUserInfo.java @@ -0,0 +1,21 @@ +package io.github.jwdeveloper.tiktok.data.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class TikTokUserInfo +{ + UserStatus userStatus; + + String roomId; + + public enum UserStatus + { + NotFound, + Offline, + LivePaused, + Live + } +} diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index a6cea967..8822f8fe 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -93,8 +93,7 @@ public CompletableFuture connectAsync() { public void connect() { try { tryConnect(); - } catch (TikTokLiveException e) - { + } catch (TikTokLiveException e) { setState(ConnectionState.DISCONNECTED); tikTokEventHandler.publish(this, new TikTokErrorEvent(e)); tikTokEventHandler.publish(this, new TikTokDisconnectedEvent()); @@ -109,6 +108,10 @@ public void connect() { this.connect(); } throw e; + } catch (Exception e) { + logger.info("Unhandled exception report this bug to github https://github.com/jwdeveloper/TikTokLiveJava/issues"); + this.disconnect(); + e.printStackTrace(); } } @@ -140,10 +143,10 @@ public void tryConnect() { var liveRoomMeta = apiService.fetchRoomInfo(); - if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostNotFound) { + if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostNotFound) { throw new TikTokLiveOfflineHostException("LiveStream for Host name could not be found."); } - if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostOffline) { + if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostOffline) { throw new TikTokLiveOfflineHostException("LiveStream for not be found, is the Host offline?"); } @@ -156,7 +159,7 @@ public void tryConnect() { var clientData = apiService.fetchClientData(); webSocketClient.start(clientData, this); setState(ConnectionState.CONNECTED); - tikTokEventHandler.publish(this,new TikTokRoomInfoEvent(liveRoomInfo)); + tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(liveRoomInfo)); } 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 7110c891..0cc468b0 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 @@ -23,7 +23,7 @@ package io.github.jwdeveloper.tiktok.http; import io.github.jwdeveloper.tiktok.ClientSettings; -import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; +import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; @@ -57,62 +57,43 @@ public void updateSessionId() { } public String fetchRoomId(String userName) { - var roomId = fetchRoomIdFromTiktokApi(userName); - clientSettings.getClientParameters().put("room_id", roomId); - logger.info("RoomID -> " + roomId); - return roomId; + var userInfo = fetchUserInfoFromTikTokApi(userName); + clientSettings.getClientParameters().put("room_id", userInfo.getRoomId()); + logger.info("RoomID -> " + userInfo.getRoomId()); + return userInfo.getRoomId(); } - private String fetchRoomIdFromTikTokPage(String userName) - { - /* var roomId = RequestChain.create() - .then(() -> fetchRoomIdFromTikTokPage(userName)) - .then(() -> fetchRoomIdFromTiktokApi(userName)) - .run();*/ - logger.info("Fetching room ID"); - String html; - try { - html = tiktokHttpClient.getLivestreamPage(userName); - } catch (Exception e) { - throw new TikTokLiveRequestException("Failed to fetch room id from WebCast, see stacktrace for more info.", e); - } - - var firstPattern = Pattern.compile("room_id=([0-9]*)"); - var firstMatcher = firstPattern.matcher(html); - var id = ""; - - if (firstMatcher.find()) { - id = firstMatcher.group(1); - } else { - var secondPattern = Pattern.compile("\"roomId\":\"([0-9]*)\""); - var secondMatcher = secondPattern.matcher(html); - - if (secondMatcher.find()) { - id = secondMatcher.group(1); - } - } - - if (id.isEmpty()) { - throw new TikTokLiveOfflineHostException("Unable to fetch room ID, live host could be offline or name is misspelled"); - } - - - return id; - } - - private String fetchRoomIdFromTiktokApi(String userName) { + public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { var params = new HashMap<>(clientSettings.getClientParameters()); params.put("uniqueId", userName); params.put("sourceType", 54); var roomData = tiktokHttpClient.getJsonFromTikTokApi("api-live/user/room/", params); + var message = roomData.get("message").getAsString(); + + if (message.equals("params_error")) { + throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer"); + } + if (message.equals("user_not_found")) { + return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, ""); + } + //live -> status 2 + //live paused -> 3 + //not live -> status 4 var data = roomData.getAsJsonObject("data"); - var user =data.getAsJsonObject("user"); + var user = data.getAsJsonObject("user"); var roomId = user.get("roomId").getAsString(); + var status = user.get("status").getAsInt(); + var statusEnum = switch (status) { + case 2 -> TikTokUserInfo.UserStatus.Live; + case 3 -> TikTokUserInfo.UserStatus.LivePaused; + case 4 -> TikTokUserInfo.UserStatus.Offline; + default -> TikTokUserInfo.UserStatus.NotFound; + }; - return roomId; + return new TikTokUserInfo(statusEnum, roomId); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokDataChecker.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokDataChecker.java index 9c3e74ff..66b90153 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokDataChecker.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokDataChecker.java @@ -1,12 +1,15 @@ package io.github.jwdeveloper.tiktok.http; +import io.github.jwdeveloper.tiktok.ClientSettings; +import io.github.jwdeveloper.tiktok.Constants; +import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import java.util.concurrent.CompletableFuture; +import java.util.logging.Logger; import java.util.regex.Pattern; -public class TikTokDataChecker -{ +public class TikTokDataChecker { public CompletableFuture isOnlineAsync(String hostName) { return CompletableFuture.supplyAsync(() -> isOnline(hostName)); @@ -17,63 +20,24 @@ public CompletableFuture isHostNameValidAsync(String hostName) { } public boolean isOnline(String hostName) { - var factory = new TikTokHttpRequestFactory(new TikTokCookieJar()); - var url = getLiveUrl(hostName); - try { - var response = factory.get(url); - var titleContent = extractTitleContent(response); - return isTitleLiveOnline(titleContent); - } catch (Exception e) - { - throw new TikTokLiveRequestException("Unable to make check live online request",e); - } + var data = getApiService().fetchUserInfoFromTikTokApi(hostName); + return data.getUserStatus() == TikTokUserInfo.UserStatus.Live || + data.getUserStatus() == TikTokUserInfo.UserStatus.LivePaused; } public boolean isHostNameValid(String hostName) { - var factory = new TikTokHttpRequestFactory(new TikTokCookieJar()); - var url = getProfileUrl(hostName); - try { - var response = factory.get(url); - var titleContent = extractTitleContent(response); - return isTitleHostNameValid(titleContent, hostName); - } catch (Exception e) - { - throw new TikTokLiveRequestException("Unable to make check host name valid request",e); - } + var data = getApiService().fetchUserInfoFromTikTokApi(hostName); + return data.getUserStatus() != TikTokUserInfo.UserStatus.NotFound; } - private boolean isTitleLiveOnline(String title) { - return title.contains("is LIVE"); + public TikTokApiService getApiService() { + var jar = new TikTokCookieJar(); + var factory = new TikTokHttpRequestFactory(jar); + var client = new TikTokHttpClient(jar, factory); + var settings = new ClientSettings(); + settings.setClientParameters(Constants.DefaultClientParams()); + var apiService = new TikTokApiService(client, Logger.getGlobal(), settings); + return apiService; } - private boolean isTitleHostNameValid(String title, String hostName) - { - return title.contains(hostName); - } - - private String extractTitleContent(String html) { - var regex = "]*>(.*?)<\\/title>"; - var pattern = Pattern.compile(regex); - var matcher = pattern.matcher(html); - if (matcher.find()) { - return matcher.group(1); - } else { - return ""; - } - } - - private String getLiveUrl(String hostName) { - var sb = new StringBuilder(); - sb.append("https://www.tiktok.com/@"); - sb.append(hostName); - sb.append("/live"); - return sb.toString(); - } - - private String getProfileUrl(String hostName) { - var sb = new StringBuilder(); - sb.append("https://www.tiktok.com/@"); - sb.append(hostName); - return sb.toString(); - } } diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokLiveOnlineCheckerTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokLiveOnlineCheckerTest.java index c82c969a..5fe50a1b 100644 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokLiveOnlineCheckerTest.java +++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokLiveOnlineCheckerTest.java @@ -5,14 +5,50 @@ public class TikTokLiveOnlineCheckerTest { - private final String TARGET_USER = "bangbetmenygy"; + public boolean enableTests = false; @Test public void shouldTestOnline() { + + if(!enableTests) + { + return; + } + + var TARGET_USER = "bangbetmenygy"; var sut = new TikTokDataChecker(); var result = sut.isOnline(TARGET_USER); Assertions.assertTrue(result); } + @Test + public void shouldBeOffline() { + + var TARGET_USER = "dostawcavideo"; + var sut = new TikTokDataChecker(); + var result = sut.isOnline(TARGET_USER); + + Assertions.assertFalse(result); + } + + @Test + public void shouldBeValid() { + + var TARGET_USER = "dostawcavideo"; + var sut = new TikTokDataChecker(); + var result = sut.isHostNameValid(TARGET_USER); + + Assertions.assertTrue(result); + } + + @Test + public void shouldNotBeValid() { + var TARGET_USER = "adadsdadadadadadadadddasdadsafafsafsafas"; + var sut = new TikTokDataChecker(); + var result = sut.isHostNameValid(TARGET_USER); + + Assertions.assertFalse(result); + } + } \ No newline at end of file diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java index 3541b622..29a05a28 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java @@ -31,25 +31,25 @@ public class SimpleExample { - public static String TIKTOK_HOSTNAME = "bangbetmenygy"; + public static String TIKTOK_HOSTNAME = "adasdsadadadasdasdsadasdasad"; public static void main(String[] args) throws IOException { showLogo(); // set tiktok username - /* - Optional checking if host name is correct + + //Optional checking if host name is correct if(TikTokLive.isHostNameValid(TIKTOK_HOSTNAME)) { - System.out.println("Live is online!"); + System.out.println("user name exists!"); } - Optional checking if live is online + //Optional checking if live is online if(TikTokLive.isLiveOnline(TIKTOK_HOSTNAME)) { System.out.println("Live is online!"); } - */ + TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) .configure(clientSettings -> diff --git a/Tools/target/classes/io/github/jwdeveloper/tiktok/gifts/GiftsDownloader.class b/Tools/target/classes/io/github/jwdeveloper/tiktok/gifts/GiftsDownloader.class index aea1823dbaca747ea8bcf6ce867db0a2f00e4e64..b2da13f2fb7dfcdf16f5a47bae8e67efe6d99788 100644 GIT binary patch delta 25 gcmcbvc2{kKHWOpSWF017ws^yMgLsq8l}z^p0Bw*682|tP delta 18 Zcmcbsc3o|QHWOpeWF02o&Gk(81OPy$24MgI