package ctbrec.sites.mfc; import static ctbrec.io.HttpConstants.*; import java.io.IOException; import java.util.List; import java.util.Locale; import java.util.NoSuchElementException; import java.util.Objects; import org.jsoup.select.Elements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.io.HttpException; import okhttp3.Cookie; import okhttp3.CookieJar; import okhttp3.FormBody; import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.WebSocket; import okhttp3.WebSocketListener; public class MyFreeCamsHttpClient extends HttpClient { private static final Logger LOG = LoggerFactory.getLogger(MyFreeCamsHttpClient.class); public MyFreeCamsHttpClient() { super("myfreecams"); } @Override public boolean login() throws IOException { if(loggedIn) { return true; } if(checkLogin()) { loggedIn = true; LOG.debug("Logged in with cookies"); return true; } String username = Config.getInstance().getSettings().mfcUsername; String password = Config.getInstance().getSettings().mfcPassword; RequestBody body = new FormBody.Builder() .add("username", username) .add("password", password) .add("tz", "2") .add("ss", "1920x1080") .add("submit_login", "97") .build(); Request req = new Request.Builder() .url(MyFreeCams.baseUrl + "/php/login.php") .header(ACCEPT, "*/*") .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(CONNECTION, KEEP_ALIVE) .header(REFERER, MyFreeCams.baseUrl) .header("Content-Type", "application/x-www-form-urlencoded") .post(body) .build(); Response resp = execute(req); if(resp.isSuccessful()) { String page = resp.body().string(); if(page.contains("Your username or password are incorrect")) { return false; } else { loggedIn = true; return true; } } else { resp.close(); LOG.error("Login failed {} {}", resp.code(), resp.message()); return false; } } private boolean checkLogin() throws IOException { Request req = new Request.Builder() .url(MyFreeCams.baseUrl + "/php/account.php?request=status") .header(ACCEPT, "*/*") .header(ACCEPT_LANGUAGE, Locale.ENGLISH.getLanguage()) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(CONNECTION, KEEP_ALIVE) .build(); try(Response response = execute(req)) { if(response.isSuccessful()) { String content = response.body().string(); try { Elements tags = HtmlParser.getTags(content, "div.content > p > b"); tags.get(2).text(); return true; } catch(Exception e) { LOG.debug("Token tag not found. Login failed"); return false; } } else { throw new HttpException(response.code(), response.message()); } } } @Override public WebSocket newWebSocket(Request req, WebSocketListener webSocketListener) { return client.newWebSocket(req, webSocketListener); } public Cookie getCookie(String name) { CookieJar jar = client.cookieJar(); HttpUrl url = HttpUrl.parse(MyFreeCams.baseUrl); List cookies = jar.loadForRequest(url); for (Cookie cookie : cookies) { if(Objects.equals(cookie.name(), name)) { return cookie; } } throw new NoSuchElementException("No cookie with name " + name); } }