Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 + "'}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 + "}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 + "'}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 + "'}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String,Object> 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<String,Object> 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("&"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,15 +73,19 @@ 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);
}
//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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String> cookies;
Expand All @@ -40,13 +39,10 @@ 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());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,23 +45,20 @@ 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);
}


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<String,Object> params)
{
public JsonObject getJsonFromTikTokApi(String path, Map<String,Object> params) {
var get = getRequest(Constants.TIKTOK_URL_WEB + path, params);
var json = JsonParser.parseString(get);
var jsonObject = json.getAsJsonObject();
Expand Down Expand Up @@ -117,7 +114,6 @@ private byte[] getSignRequest(String url, Map<String, Object> parameters) {
{
var split = cookie.split(";")[0].split("=");


var key = split[0];
var value = split[1];
tikTokCookieJar.set(key, value);
Expand All @@ -133,7 +129,6 @@ private byte[] getSignRequest(String url, Map<String, Object> parameters) {


private String getSignedUrl(String url, Map<String, Object> parameters) {

var fullUrl = HttpUtils.parseParameters(url,parameters);
var signParams = new TreeMap<String,Object>();
signParams.put("client", "ttlive-java");
Expand All @@ -143,7 +138,6 @@ private String getSignedUrl(String url, Map<String, Object> parameters) {
var request = requestFactory.setQueries(signParams);
var content = request.get(Constants.TIKTOK_SIGN_API);


try {
var json = JsonParser.parseString(content);
var jsonObject = json.getAsJsonObject();
Expand All @@ -157,4 +151,4 @@ private String getSignedUrl(String url, Map<String, Object> parameters) {
}
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -122,18 +123,16 @@ public TikTokHttpRequest setAgent(String value) {
public TikTokHttpRequest setQueries(Map<String, Object> queries) {
if (queries == null)
return this;
var testMap = new TreeMap<String, Object>(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;
}

Expand Down Expand Up @@ -162,10 +161,7 @@ private String getContent(HttpRequest request) throws Exception {
var map = new HashMap<String, List<String>>();
map.put(key, List.of(value));
cookieManager.put(uri, map);

}
return response.body();
}


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ private ListenerBindingModel bindToEvents(TikTokEventListener listener) {
throw new TikTokEventListenerMethodException(e);
}
};
eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList<EventConsumer<?>>()).add(eventMethodRef);
eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList<>()).add(eventMethodRef);
}
return new ListenerBindingModel(listener, eventsMap);
}
}
}
Original file line number Diff line number Diff line change
@@ -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<String, Object> 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<String, Object> 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);
}
}