diff --git a/CHANGELOG.md b/CHANGELOG.md index 36b62862..29aded74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ======================== * Fix one directory per group * Add Stripchat tags thx to @winkru +* Fix follow / unfollow for Stripchat thx to @winkru * Fix: Loading the config failed with model URLs, which contained spaces 5.2.2 diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java index e15b3ed9..63b60ae4 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatHttpClient.java @@ -6,16 +6,15 @@ import ctbrec.io.HttpClient; import ctbrec.io.HttpException; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import okhttp3.MediaType; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; +import okhttp3.*; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; +import java.net.URLDecoder; import static ctbrec.io.HttpConstants.*; +import static java.nio.charset.StandardCharsets.UTF_8; @Slf4j public class StripchatHttpClient extends HttpClient { @@ -96,7 +95,7 @@ public class StripchatHttpClient extends HttpClient { } private void loadCsrfToken() throws IOException { - String url = Stripchat.baseUri + "/api/front/v2/config?requestPath=%2F&timezoneOffset=0"; + String url = Stripchat.baseUri + "/api/front/v2/config/data?requestPath=%2F&timezoneOffset=0"; Request request = new Request.Builder() .url(url) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) @@ -112,6 +111,25 @@ public class StripchatHttpClient extends HttpClient { csrfToken = data.optString("csrfToken"); csrfTimestamp = data.optString("csrfTimestamp"); csrfNotifyTimestamp = data.optString("csrfNotifyTimestamp"); + } else { + throw new HttpException(response.code(), response.message()); + } + } + } + + private void loadJwtToken() throws IOException { + String url = Stripchat.baseUri + "/api/front/v2/config?requestPath=%2F&timezoneOffset=0"; + Request request = new Request.Builder() + .url(url) + .header(ACCEPT, MIMETYPE_APPLICATION_JSON) + .header(USER_AGENT, config.getSettings().httpUserAgent) + .header(ORIGIN, Stripchat.baseUri) + .header(REFERER, Stripchat.baseUri) + .header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON) + .build(); + try (Response response = execute(request)) { + if (response.isSuccessful()) { + JSONObject resp = new JSONObject(response.body().string()); JSONObject config = resp.getJSONObject("config"); jwtToken = config.optString("jwtToken"); } else { @@ -127,7 +145,7 @@ public class StripchatHttpClient extends HttpClient { */ public boolean checkLoginSuccess() throws IOException { try { - loadCsrfToken(); + loadJwtToken(); } catch (Exception e) { log.info("Login check returned unsuccessful: {}", e.getLocalizedMessage()); return false; @@ -158,4 +176,15 @@ public class StripchatHttpClient extends HttpClient { } return userId; } + + public JSONObject getAmpl() { + try { + Cookie cookie = getCookieJar().getCookie(HttpUrl.parse(Stripchat.baseUri), "baseAmpl"); + String json = URLDecoder.decode(cookie.value(), UTF_8); + JSONObject ampl = new JSONObject(json); + return ampl; + } catch (Exception ex) { + return new JSONObject(); + } + } } diff --git a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java index 73d319ee..5a481526 100644 --- a/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java +++ b/common/src/main/java/ctbrec/sites/stripchat/StripchatModel.java @@ -25,10 +25,7 @@ import java.io.InputStream; import java.text.MessageFormat; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ExecutionException; import static ctbrec.Model.State.*; @@ -42,7 +39,7 @@ public class StripchatModel extends AbstractModel { private int[] resolution = new int[]{0, 0}; private int modelId = 0; private boolean isVr = false; - private JSONObject modelInfo; + private transient JSONObject modelInfo; private transient Instant lastInfoRequest = Instant.EPOCH; @@ -85,8 +82,8 @@ public class StripchatModel extends AbstractModel { } private JSONObject getModelInfo() throws IOException { - if (Duration.between(lastInfoRequest, Instant.now()).getSeconds() < 5) { - return Optional.ofNullable(modelInfo).orElse(new JSONObject()); + if (Objects.nonNull(modelInfo) && Duration.between(lastInfoRequest, Instant.now()).getSeconds() < 5) { + return modelInfo; } lastInfoRequest = Instant.now(); modelInfo = loadModelInfo(); @@ -251,6 +248,8 @@ public class StripchatModel extends AbstractModel { requestParams.put("csrfToken", client.getCsrfToken()); requestParams.put("csrfTimestamp", client.getCsrfTimestamp()); requestParams.put("csrfNotifyTimestamp", client.getCsrfNotifyTimestamp()); + requestParams.put("uniq", getUniq()); + requestParams.put("ampl", client.getAmpl()); RequestBody body = RequestBody.Companion.create(requestParams.toString(), JSON); Request request = new Request.Builder() .url(url) @@ -286,6 +285,7 @@ public class StripchatModel extends AbstractModel { requestParams.put("csrfToken", client.getCsrfToken()); requestParams.put("csrfTimestamp", client.getCsrfTimestamp()); requestParams.put("csrfNotifyTimestamp", client.getCsrfNotifyTimestamp()); + requestParams.put("uniq", getUniq()); RequestBody body = RequestBody.Companion.create(requestParams.toString(), JSON); Request request = new Request.Builder() .url(url) @@ -335,4 +335,15 @@ public class StripchatModel extends AbstractModel { return new MergedFfmpegHlsDownload(getSite().getHttpClient()); } } + + protected String getUniq() { + Random r = new Random(); + String dict = "0123456789abcdefghijklmnopqarstvwxyz"; + char[] text = new char[16]; + for (int i = 0; i < 16; i++) { + text[i] = dict.charAt(r.nextInt(dict.length())); + } + return new String(text); + } + }