forked from j62/ctbrec
Fix Streamate login
This commit is contained in:
parent
c6f5750e1b
commit
f36d833228
|
@ -22,6 +22,7 @@ public class HttpConstants {
|
||||||
public static final String USER_AGENT = "User-Agent";
|
public static final String USER_AGENT = "User-Agent";
|
||||||
public static final String XML_HTTP_REQUEST = "XMLHttpRequest";
|
public static final String XML_HTTP_REQUEST = "XMLHttpRequest";
|
||||||
public static final String X_CSRF_TOKEN = "X-CSRF-Token";
|
public static final String X_CSRF_TOKEN = "X-CSRF-Token";
|
||||||
|
public static final String X_XSRF_TOKEN = "X-XSRF-Token";
|
||||||
public static final String X_REQUESTED_WITH = "X-Requested-With";
|
public static final String X_REQUESTED_WITH = "X-Requested-With";
|
||||||
|
|
||||||
private HttpConstants() {}
|
private HttpConstants() {}
|
||||||
|
|
|
@ -1,21 +1,5 @@
|
||||||
package ctbrec.sites.streamate;
|
package ctbrec.sites.streamate;
|
||||||
|
|
||||||
import static ctbrec.io.HttpConstants.*;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import ctbrec.Model;
|
import ctbrec.Model;
|
||||||
import ctbrec.StringUtil;
|
import ctbrec.StringUtil;
|
||||||
import ctbrec.io.HttpClient;
|
import ctbrec.io.HttpClient;
|
||||||
|
@ -23,11 +7,24 @@ import ctbrec.io.HttpException;
|
||||||
import ctbrec.sites.AbstractSite;
|
import ctbrec.sites.AbstractSite;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static ctbrec.io.HttpConstants.ORIGIN;
|
||||||
|
|
||||||
public class Streamate extends AbstractSite {
|
public class Streamate extends AbstractSite {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(Streamate.class);
|
private static final Logger LOG = LoggerFactory.getLogger(Streamate.class);
|
||||||
|
|
||||||
|
public static final String API_URL = "https://streamate.com";
|
||||||
public static final String BASE_URL = "https://www.streamate.com";
|
public static final String BASE_URL = "https://www.streamate.com";
|
||||||
public static final String NAIAD_URL = "https://member.naiadsystems.com/search/v3";
|
public static final String NAIAD_URL = "https://member.naiadsystems.com/search/v3";
|
||||||
|
|
||||||
|
@ -60,34 +57,6 @@ public class Streamate extends AbstractSite {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double getTokenBalance() throws IOException {
|
public Double getTokenBalance() throws IOException {
|
||||||
// int userId = ((StreamateHttpClient)getHttpClient()).getUserId();
|
|
||||||
// String url = Streamate.BASE_URL + "/tools/amf.php";
|
|
||||||
// RequestBody body = new FormBody.Builder()
|
|
||||||
// .add("method", "ping")
|
|
||||||
// .add("args[]", Integer.toString(userId))
|
|
||||||
// .build();
|
|
||||||
// Request request = new Request.Builder()
|
|
||||||
// .url(url)
|
|
||||||
// .addHeader(USER_AGENT, getConfig().getSettings().httpUserAgent)
|
|
||||||
// .addHeader(ACCEPT, MIMETYPE_APPLICATION_JSON)
|
|
||||||
// .addHeader(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage())
|
|
||||||
// .addHeader(REFERER, Streamate.BASE_URL)
|
|
||||||
// .addHeader(X_REQUESTED_WITH, XML_HTTP_REQUEST)
|
|
||||||
// .post(body)
|
|
||||||
// .build();
|
|
||||||
// try(Response response = getHttpClient().execute(request)) {
|
|
||||||
// if(response.isSuccessful()) {
|
|
||||||
// JSONObject json = new JSONObject(response.body().string());
|
|
||||||
// if(json.optString("status").equals("online")) {
|
|
||||||
// JSONObject userData = json.getJSONObject("userData");
|
|
||||||
// return userData.getInt("balance");
|
|
||||||
// } else {
|
|
||||||
// throw new IOException("Request was not successful: " + json.toString(2));
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// throw new HttpException(response.code(), response.message());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
return 0d;
|
return 0d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,18 +115,19 @@ public class Streamate extends AbstractSite {
|
||||||
String url = NAIAD_URL + "/autocomplete?filters=gender:&performerCount=10&domain=streamate.com&tagCount=5&query=" + URLEncoder.encode(q, "utf-8");
|
String url = NAIAD_URL + "/autocomplete?filters=gender:&performerCount=10&domain=streamate.com&tagCount=5&query=" + URLEncoder.encode(q, "utf-8");
|
||||||
LOG.debug("Search: {}", url);
|
LOG.debug("Search: {}", url);
|
||||||
String saKey = httpClient.getSaKey();
|
String saKey = httpClient.getSaKey();
|
||||||
|
String smtid = UUID.randomUUID() + "G0211569057409";
|
||||||
Request req = httpClient.newRequestBuilder()
|
Request req = httpClient.newRequestBuilder()
|
||||||
.url(url)
|
.url(url)
|
||||||
.header(ORIGIN, getBaseUrl())
|
.header(ORIGIN, getBaseUrl())
|
||||||
.header("sakey", saKey)
|
.header("sakey", saKey)
|
||||||
.header("platform", "SCP")
|
.header("platform", "SCP")
|
||||||
.header("smtid", UUID.randomUUID().toString() + "G0211569057409")
|
.header("smtid", smtid)
|
||||||
.header("smeid", UUID.randomUUID().toString() + "G0211569057409")
|
.header("smeid", smtid)
|
||||||
.header("smvid", UUID.randomUUID().toString() + "G0211569057409")
|
.header("smvid", smtid)
|
||||||
.build();
|
.build();
|
||||||
try (Response response = getHttpClient().execute(req)) {
|
try (Response response = getHttpClient().execute(req)) {
|
||||||
if (response.isSuccessful()) {
|
if (response.isSuccessful()) {
|
||||||
String body = response.body().string();
|
String body = Objects.requireNonNull(response.body(), "HTTP body is null").string();
|
||||||
JSONObject json = new JSONObject(body);
|
JSONObject json = new JSONObject(body);
|
||||||
if (json.has("performers")) {
|
if (json.has("performers")) {
|
||||||
List<Model> models = new ArrayList<>();
|
List<Model> models = new ArrayList<>();
|
||||||
|
|
|
@ -2,16 +2,16 @@ package ctbrec.sites.streamate;
|
||||||
|
|
||||||
import ctbrec.Config;
|
import ctbrec.Config;
|
||||||
import ctbrec.io.HttpClient;
|
import ctbrec.io.HttpClient;
|
||||||
|
import ctbrec.io.HttpException;
|
||||||
import okhttp3.*;
|
import okhttp3.*;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.*;
|
||||||
import java.util.Locale;
|
import java.util.regex.Matcher;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.regex.Pattern;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static ctbrec.io.HttpConstants.*;
|
import static ctbrec.io.HttpConstants.*;
|
||||||
|
|
||||||
|
@ -21,10 +21,12 @@ public class StreamateHttpClient extends HttpClient {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(StreamateHttpClient.class);
|
private static final Logger LOG = LoggerFactory.getLogger(StreamateHttpClient.class);
|
||||||
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
|
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
|
||||||
|
public static final String HTTP_BODY_IS_NULL = "HTTP response body is null";
|
||||||
|
|
||||||
private Long userId;
|
private Long userId;
|
||||||
private String saKey = "";
|
private String saKey = "";
|
||||||
private String userNickname = "";
|
private String userNickname = "";
|
||||||
|
private String xsrfToken = "";
|
||||||
|
|
||||||
public StreamateHttpClient(Config config) {
|
public StreamateHttpClient(Config config) {
|
||||||
super("streamate", config);
|
super("streamate", config);
|
||||||
|
@ -39,11 +41,40 @@ public class StreamateHttpClient extends HttpClient {
|
||||||
|
|
||||||
// try to load sakey from cookie
|
// try to load sakey from cookie
|
||||||
try {
|
try {
|
||||||
Cookie cookie = getCookieJar().getCookie(HttpUrl.parse("https://www.streamate.com"), SAKEY_KEY);
|
Cookie cookie = getCookieJar().getCookie(HttpUrl.parse(Streamate.API_URL), SAKEY_KEY);
|
||||||
saKey = cookie.value();
|
saKey = cookie.value();
|
||||||
} catch (NoSuchElementException e) {
|
} catch (NoSuchElementException e) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadXsrfToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadXsrfToken() {
|
||||||
|
// do a first request to get cookies and stuff
|
||||||
|
Request req = new Request.Builder() //
|
||||||
|
.url(Streamate.BASE_URL + "/initialData.js") //
|
||||||
|
.header(USER_AGENT, config.getSettings().httpUserAgent) //
|
||||||
|
.header(COOKIE, "smtid=" + UUID.randomUUID() + "; Xld_rct=1;") //
|
||||||
|
.header(REFERER, Streamate.BASE_URL)
|
||||||
|
.build();
|
||||||
|
try (Response resp = execute(req)) {
|
||||||
|
if (resp.code() == 200) {
|
||||||
|
String body = Objects.requireNonNull(resp.body(), HTTP_BODY_IS_NULL).string();
|
||||||
|
LOG.info("Initial request was fine, Extracting XSRF token");
|
||||||
|
Matcher m = Pattern.compile("\"xsrfToken\":\"(.*?)\"", Pattern.DOTALL).matcher(body);
|
||||||
|
if (m.find()) {
|
||||||
|
xsrfToken = m.group(1);
|
||||||
|
LOG.info("XSRF token is {}", xsrfToken);
|
||||||
|
} else {
|
||||||
|
LOG.warn("Couldn't find xsrf in initialData.js");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new HttpException(resp.code(), resp.message());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.error("Initial request failed", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -55,7 +86,7 @@ public class StreamateHttpClient extends HttpClient {
|
||||||
boolean cookiesWorked = checkLoginSuccess();
|
boolean cookiesWorked = checkLoginSuccess();
|
||||||
if (cookiesWorked) {
|
if (cookiesWorked) {
|
||||||
loggedIn = true;
|
loggedIn = true;
|
||||||
LOG.debug("Logged in with cookies");
|
LOG.info("Logged in with cookies");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,11 +105,18 @@ public class StreamateHttpClient extends HttpClient {
|
||||||
loginRequest.put("tzOffsetMinutes", 0);
|
loginRequest.put("tzOffsetMinutes", 0);
|
||||||
RequestBody body = RequestBody.Companion.create(loginRequest.toString(), JSON);
|
RequestBody body = RequestBody.Companion.create(loginRequest.toString(), JSON);
|
||||||
Request login = newRequestBuilder()
|
Request login = newRequestBuilder()
|
||||||
.url(Streamate.BASE_URL + "/api/member/login")
|
.url(Streamate.API_URL + "/api/member/login")
|
||||||
|
.header(USER_AGENT, config.getSettings().httpUserAgent)
|
||||||
|
.header(ORIGIN, Streamate.BASE_URL)
|
||||||
|
.header(REFERER, Streamate.BASE_URL + '/')
|
||||||
|
.header(ACCEPT, MIMETYPE_APPLICATION_JSON)
|
||||||
|
.header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage())
|
||||||
|
.header(CONTENT_TYPE, MIMETYPE_APPLICATION_JSON)
|
||||||
|
.header(X_XSRF_TOKEN, xsrfToken)
|
||||||
.post(body)
|
.post(body)
|
||||||
.build();
|
.build();
|
||||||
try (Response response = client.newCall(login).execute()) {
|
try (Response response = client.newCall(login).execute()) {
|
||||||
String content = Objects.requireNonNull(response.body(), "HTTP response body is null").string();
|
String content = Objects.requireNonNull(response.body(), HTTP_BODY_IS_NULL).string();
|
||||||
if (response.isSuccessful()) {
|
if (response.isSuccessful()) {
|
||||||
JSONObject json = new JSONObject(content);
|
JSONObject json = new JSONObject(content);
|
||||||
loggedIn = json.has(SAKEY_KEY);
|
loggedIn = json.has(SAKEY_KEY);
|
||||||
|
@ -112,7 +150,7 @@ public class StreamateHttpClient extends HttpClient {
|
||||||
Request request = newRequestBuilder().url(url).build();
|
Request request = newRequestBuilder().url(url).build();
|
||||||
try (Response response = execute(request)) {
|
try (Response response = execute(request)) {
|
||||||
if (response.isSuccessful()) {
|
if (response.isSuccessful()) {
|
||||||
String content = Objects.requireNonNull(response.body(), "HTTP response body is null").string();
|
String content = Objects.requireNonNull(response.body(), HTTP_BODY_IS_NULL).string();
|
||||||
JSONObject json = new JSONObject(content);
|
JSONObject json = new JSONObject(content);
|
||||||
return json.optString("status").equals("SM_OK");
|
return json.optString("status").equals("SM_OK");
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue