Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package wiki;
- import org.apache.commons.io.IOUtils;
- import org.apache.http.Header;
- import org.apache.http.HttpEntity;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.config.RequestConfig;
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.conn.ConnectTimeoutException;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClientBuilder;
- import org.apache.http.util.EntityUtils;
- import org.jetbrains.annotations.NotNull;
- import org.json.*;
- import javax.naming.NamingException;
- import java.io.InputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.URI;
- import java.net.URLEncoder;
- import java.net.UnknownHostException;
- import java.nio.charset.StandardCharsets;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.HashSet;
- /**
- * API для работы с сайтом
- */
- public class SiteAPI {
- /**
- * Логин для авторизации на сайте
- */
- private String login;
- /**
- * Пароль для соединения с сайтом
- */
- private String password;
- /**
- * Имя хоста для соединения с сайтом
- */
- private String hostName;
- /**
- * Смещение временной зоны
- */
- private String timezoneOffset;
- /**
- * Имя протокола для соединения с сайтом (http, https)
- */
- private String protocol;
- /**
- * Клиент для соединения
- */
- private CloseableHttpClient httpClient;
- /**
- * Куки для авторизации
- */
- private String authCookie;
- /**
- * Токен для запросов с XSRF-Token
- */
- private String xsrfToken;
- /**
- * Таймштамп последней авторизации
- */
- private long lastAuthorizeTimestamp;
- /**
- * Создаёт новый объект данных
- * @param login логин для авторизации
- * @param password пароль для авторизации
- * @param hostName имя хоста для соединения
- * @param protocol протокол для соединения
- */
- SiteAPI(String login, String password, String hostName, String protocol, String timezoneOffset) {
- this.login = login;
- this.password = password;
- this.hostName = hostName;
- if (this.hostName.endsWith("/")) {
- this.hostName = this.hostName.substring(0, this.hostName.length() - 1);
- }
- this.protocol = protocol.toLowerCase();
- this.httpClient = HttpClientBuilder.create().setRedirectStrategy(new KmsRedirectStrategy()).build();
- this.timezoneOffset = timezoneOffset;
- this.lastAuthorizeTimestamp = 0;
- }
- /**
- * Возвращает данные страницы авторизации для дальнейшего разбора
- * @throws Exception исключение в случае ошибки
- */
- private void tryAuthorize() throws Exception {
- boolean error;
- do {
- String encodedLogin = URLEncoder.encode(this.login, "UTF-8");
- String encodedPassword = URLEncoder.encode(this.password, "UTF-8");
- String encodedTimezoneOffset = URLEncoder.encode(this.timezoneOffset, "UTF-8");
- String url = this.toAbsoluteUrl("/kms/lh/login/post?username=" + encodedLogin + "&password=" + encodedPassword + "&monitoring=&timezoneOffset=" + encodedTimezoneOffset + "&loginform=true");
- HttpPost request = new HttpPost(url);
- request.addHeader("User-Agent", "FindBrokenLinks");
- request.addHeader("Content-Type", "application/x-www-form-urlencoded");
- request.addHeader("Referrer", this.toAbsoluteUrl("/kms/lh/login"));
- CloseableHttpResponse response = httpClient.execute(request);
- int statusCode = response.getStatusLine().getStatusCode();
- boolean authError = true;
- if (statusCode == 302) {
- Header[] headers = response.getAllHeaders();
- StringBuilder authResult = new StringBuilder("Авторизация на сайте вернула следующие заголовки, помимо кода 302: \n");
- for (Header header: headers) {
- authResult.append(header.getName()).append(": ").append(header.getValue()).append("\n");
- }
- Utils.logDebugInfo(authResult.toString());
- Header[] location = response.getHeaders("Location");
- if (location.length == 0) {
- location = response.getHeaders("location");
- }
- Header[] cookie = response.getHeaders("Set-Cookie");
- if (cookie.length == 0) {
- cookie = response.getHeaders("set-cookie");
- }
- if ((location.length == 1) && (cookie.length > 0)) {
- // Если редирект происходит в
- if (location[0].getValue().contains("/kms/lh/;jsessionid=") || location[0].getValue().endsWith("/kms/lh/") || location[0].getValue().contains("/kms/lh/?")) {
- ArrayList<String> list = new ArrayList<>();
- for (Header header : cookie) {
- String[] parts = header.getValue().split(";");
- list.add(parts[0]);
- }
- this.authCookie = String.join("; ", list);
- authError = false;
- }
- }
- error = false;
- } else {
- // В таком случае, явно не ошибка, прокси, авторизация провалена
- error = statusCode == 503;
- }
- EntityUtils.consume(response.getEntity());
- if (!error && authError) {
- throw new Exception("Не удаётся авторизоваться в KMS, проверьте корректность логина и пароля");
- }
- } while (error);
- String[] parts = this.authCookie.split(";");
- this.xsrfToken = null;
- for (String part : parts) {
- String[] result = part.split("=");
- if (result.length == 2) {
- if (result[0].equals("XSRF-TOKEN")) {
- this.xsrfToken = result[1];
- }
- }
- }
- if (this.xsrfToken == null) {
- this.xsrfToken = "";
- throw new Exception("Не удаётся получить XSRF-токен при авторизации");
- }
- this.lastAuthorizeTimestamp = System.currentTimeMillis();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement