Skip to content

Commit 69a2a6a

Browse files
authored
Merge pull request #18 from jwdeveloper/develop-1-0-6
Changes: fixed TikTokLive.isHostNameValid() fixed TikTokLive.isLiveOnline() those methods was not working in some regions
2 parents ca18278 + 5305517 commit 69a2a6a

File tree

7 files changed

+116
-111
lines changed

7 files changed

+116
-111
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.jwdeveloper.tiktok.data.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
@Data
7+
@AllArgsConstructor
8+
public class TikTokUserInfo
9+
{
10+
UserStatus userStatus;
11+
12+
String roomId;
13+
14+
public enum UserStatus
15+
{
16+
NotFound,
17+
Offline,
18+
LivePaused,
19+
Live
20+
}
21+
}

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ public CompletableFuture<LiveClient> connectAsync() {
9393
public void connect() {
9494
try {
9595
tryConnect();
96-
} catch (TikTokLiveException e)
97-
{
96+
} catch (TikTokLiveException e) {
9897
setState(ConnectionState.DISCONNECTED);
9998
tikTokEventHandler.publish(this, new TikTokErrorEvent(e));
10099
tikTokEventHandler.publish(this, new TikTokDisconnectedEvent());
@@ -109,6 +108,10 @@ public void connect() {
109108
this.connect();
110109
}
111110
throw e;
111+
} catch (Exception e) {
112+
logger.info("Unhandled exception report this bug to github https://github.com/jwdeveloper/TikTokLiveJava/issues");
113+
this.disconnect();
114+
e.printStackTrace();
112115
}
113116
}
114117

@@ -140,10 +143,10 @@ public void tryConnect() {
140143

141144

142145
var liveRoomMeta = apiService.fetchRoomInfo();
143-
if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostNotFound) {
146+
if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostNotFound) {
144147
throw new TikTokLiveOfflineHostException("LiveStream for Host name could not be found.");
145148
}
146-
if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostOffline) {
149+
if (liveRoomMeta.getStatus() == LiveRoomMeta.LiveRoomStatus.HostOffline) {
147150
throw new TikTokLiveOfflineHostException("LiveStream for not be found, is the Host offline?");
148151
}
149152

@@ -156,7 +159,7 @@ public void tryConnect() {
156159
var clientData = apiService.fetchClientData();
157160
webSocketClient.start(clientData, this);
158161
setState(ConnectionState.CONNECTED);
159-
tikTokEventHandler.publish(this,new TikTokRoomInfoEvent(liveRoomInfo));
162+
tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(liveRoomInfo));
160163
}
161164

162165

Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java

Lines changed: 26 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
package io.github.jwdeveloper.tiktok.http;
2424

2525
import io.github.jwdeveloper.tiktok.ClientSettings;
26-
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
26+
import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo;
2727
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException;
2828
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException;
2929
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
@@ -57,62 +57,43 @@ public void updateSessionId() {
5757
}
5858

5959
public String fetchRoomId(String userName) {
60-
var roomId = fetchRoomIdFromTiktokApi(userName);
61-
clientSettings.getClientParameters().put("room_id", roomId);
62-
logger.info("RoomID -> " + roomId);
63-
return roomId;
60+
var userInfo = fetchUserInfoFromTikTokApi(userName);
61+
clientSettings.getClientParameters().put("room_id", userInfo.getRoomId());
62+
logger.info("RoomID -> " + userInfo.getRoomId());
63+
return userInfo.getRoomId();
6464
}
6565

66-
private String fetchRoomIdFromTikTokPage(String userName)
67-
{
68-
/* var roomId = RequestChain.<String>create()
69-
.then(() -> fetchRoomIdFromTikTokPage(userName))
70-
.then(() -> fetchRoomIdFromTiktokApi(userName))
71-
.run();*/
72-
logger.info("Fetching room ID");
73-
String html;
74-
try {
75-
html = tiktokHttpClient.getLivestreamPage(userName);
76-
} catch (Exception e) {
77-
throw new TikTokLiveRequestException("Failed to fetch room id from WebCast, see stacktrace for more info.", e);
78-
}
79-
80-
var firstPattern = Pattern.compile("room_id=([0-9]*)");
81-
var firstMatcher = firstPattern.matcher(html);
82-
var id = "";
83-
84-
if (firstMatcher.find()) {
85-
id = firstMatcher.group(1);
86-
} else {
87-
var secondPattern = Pattern.compile("\"roomId\":\"([0-9]*)\"");
88-
var secondMatcher = secondPattern.matcher(html);
89-
90-
if (secondMatcher.find()) {
91-
id = secondMatcher.group(1);
92-
}
93-
}
94-
95-
if (id.isEmpty()) {
96-
throw new TikTokLiveOfflineHostException("Unable to fetch room ID, live host could be offline or name is misspelled");
97-
}
98-
99-
100-
return id;
101-
}
102-
103-
private String fetchRoomIdFromTiktokApi(String userName) {
66+
public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) {
10467

10568
var params = new HashMap<>(clientSettings.getClientParameters());
10669
params.put("uniqueId", userName);
10770
params.put("sourceType", 54);
10871
var roomData = tiktokHttpClient.getJsonFromTikTokApi("api-live/user/room/", params);
10972

73+
var message = roomData.get("message").getAsString();
74+
75+
if (message.equals("params_error")) {
76+
throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer");
77+
}
78+
if (message.equals("user_not_found")) {
79+
return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "");
80+
}
81+
//live -> status 2
82+
//live paused -> 3
83+
//not live -> status 4
11084
var data = roomData.getAsJsonObject("data");
111-
var user =data.getAsJsonObject("user");
85+
var user = data.getAsJsonObject("user");
11286
var roomId = user.get("roomId").getAsString();
87+
var status = user.get("status").getAsInt();
11388

89+
var statusEnum = switch (status) {
90+
case 2 -> TikTokUserInfo.UserStatus.Live;
91+
case 3 -> TikTokUserInfo.UserStatus.LivePaused;
92+
case 4 -> TikTokUserInfo.UserStatus.Offline;
93+
default -> TikTokUserInfo.UserStatus.NotFound;
94+
};
11495

115-
return roomId;
96+
return new TikTokUserInfo(statusEnum, roomId);
11697
}
11798

11899

Lines changed: 18 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package io.github.jwdeveloper.tiktok.http;
22

3+
import io.github.jwdeveloper.tiktok.ClientSettings;
4+
import io.github.jwdeveloper.tiktok.Constants;
5+
import io.github.jwdeveloper.tiktok.data.dto.TikTokUserInfo;
36
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException;
47

58
import java.util.concurrent.CompletableFuture;
9+
import java.util.logging.Logger;
610
import java.util.regex.Pattern;
711

8-
public class TikTokDataChecker
9-
{
12+
public class TikTokDataChecker {
1013

1114
public CompletableFuture<Boolean> isOnlineAsync(String hostName) {
1215
return CompletableFuture.supplyAsync(() -> isOnline(hostName));
@@ -17,63 +20,24 @@ public CompletableFuture<Boolean> isHostNameValidAsync(String hostName) {
1720
}
1821

1922
public boolean isOnline(String hostName) {
20-
var factory = new TikTokHttpRequestFactory(new TikTokCookieJar());
21-
var url = getLiveUrl(hostName);
22-
try {
23-
var response = factory.get(url);
24-
var titleContent = extractTitleContent(response);
25-
return isTitleLiveOnline(titleContent);
26-
} catch (Exception e)
27-
{
28-
throw new TikTokLiveRequestException("Unable to make check live online request",e);
29-
}
23+
var data = getApiService().fetchUserInfoFromTikTokApi(hostName);
24+
return data.getUserStatus() == TikTokUserInfo.UserStatus.Live ||
25+
data.getUserStatus() == TikTokUserInfo.UserStatus.LivePaused;
3026
}
3127

3228
public boolean isHostNameValid(String hostName) {
33-
var factory = new TikTokHttpRequestFactory(new TikTokCookieJar());
34-
var url = getProfileUrl(hostName);
35-
try {
36-
var response = factory.get(url);
37-
var titleContent = extractTitleContent(response);
38-
return isTitleHostNameValid(titleContent, hostName);
39-
} catch (Exception e)
40-
{
41-
throw new TikTokLiveRequestException("Unable to make check host name valid request",e);
42-
}
29+
var data = getApiService().fetchUserInfoFromTikTokApi(hostName);
30+
return data.getUserStatus() != TikTokUserInfo.UserStatus.NotFound;
4331
}
4432

45-
private boolean isTitleLiveOnline(String title) {
46-
return title.contains("is LIVE");
33+
public TikTokApiService getApiService() {
34+
var jar = new TikTokCookieJar();
35+
var factory = new TikTokHttpRequestFactory(jar);
36+
var client = new TikTokHttpClient(jar, factory);
37+
var settings = new ClientSettings();
38+
settings.setClientParameters(Constants.DefaultClientParams());
39+
var apiService = new TikTokApiService(client, Logger.getGlobal(), settings);
40+
return apiService;
4741
}
4842

49-
private boolean isTitleHostNameValid(String title, String hostName)
50-
{
51-
return title.contains(hostName);
52-
}
53-
54-
private String extractTitleContent(String html) {
55-
var regex = "<title\\b[^>]*>(.*?)<\\/title>";
56-
var pattern = Pattern.compile(regex);
57-
var matcher = pattern.matcher(html);
58-
if (matcher.find()) {
59-
return matcher.group(1);
60-
} else {
61-
return "";
62-
}
63-
}
64-
65-
private String getLiveUrl(String hostName) {
66-
var sb = new StringBuilder();
67-
sb.append("https://www.tiktok.com/@");
68-
sb.append(hostName);
69-
sb.append("/live");
70-
return sb.toString();
71-
}
72-
73-
private String getProfileUrl(String hostName) {
74-
var sb = new StringBuilder();
75-
sb.append("https://www.tiktok.com/@");
76-
sb.append(hostName);
77-
return sb.toString();
78-
}
7943
}

Client/src/test/java/io/github/jwdeveloper/tiktok/http/TikTokLiveOnlineCheckerTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,50 @@
55

66
public class TikTokLiveOnlineCheckerTest {
77

8-
private final String TARGET_USER = "bangbetmenygy";
8+
public boolean enableTests = false;
99

1010
@Test
1111
public void shouldTestOnline() {
12+
13+
if(!enableTests)
14+
{
15+
return;
16+
}
17+
18+
var TARGET_USER = "bangbetmenygy";
1219
var sut = new TikTokDataChecker();
1320
var result = sut.isOnline(TARGET_USER);
1421

1522
Assertions.assertTrue(result);
1623
}
1724

25+
@Test
26+
public void shouldBeOffline() {
27+
28+
var TARGET_USER = "dostawcavideo";
29+
var sut = new TikTokDataChecker();
30+
var result = sut.isOnline(TARGET_USER);
31+
32+
Assertions.assertFalse(result);
33+
}
34+
35+
@Test
36+
public void shouldBeValid() {
37+
38+
var TARGET_USER = "dostawcavideo";
39+
var sut = new TikTokDataChecker();
40+
var result = sut.isHostNameValid(TARGET_USER);
41+
42+
Assertions.assertTrue(result);
43+
}
44+
45+
@Test
46+
public void shouldNotBeValid() {
47+
var TARGET_USER = "adadsdadadadadadadadddasdadsafafsafsafas";
48+
var sut = new TikTokDataChecker();
49+
var result = sut.isHostNameValid(TARGET_USER);
50+
51+
Assertions.assertFalse(result);
52+
}
53+
1854
}

Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,25 @@
3131

3232
public class SimpleExample
3333
{
34-
public static String TIKTOK_HOSTNAME = "bangbetmenygy";
34+
public static String TIKTOK_HOSTNAME = "adasdsadadadasdasdsadasdasad";
3535
public static void main(String[] args) throws IOException {
3636

3737
showLogo();
3838
// set tiktok username
3939

40-
/*
41-
Optional checking if host name is correct
40+
41+
//Optional checking if host name is correct
4242
if(TikTokLive.isHostNameValid(TIKTOK_HOSTNAME))
4343
{
44-
System.out.println("Live is online!");
44+
System.out.println("user name exists!");
4545
}
4646

47-
Optional checking if live is online
47+
//Optional checking if live is online
4848
if(TikTokLive.isLiveOnline(TIKTOK_HOSTNAME))
4949
{
5050
System.out.println("Live is online!");
5151
}
52-
*/
52+
5353

5454
TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
5555
.configure(clientSettings ->
Binary file not shown.

0 commit comments

Comments
 (0)