В этом примере мы покажем вам, как войти на веб-сайт с помощью стандартной Java HttpsURLConnection
. Этот метод должен работать в большинстве форм входа в систему.
Инструменты и библиотека Java, используемые в этом примере
- Браузер Google Chrome – вкладка “Сеть” для анализа полей заголовка HTTP-запроса и ответа.
- jsoup библиотека – Извлекает значения HTML-формы.
- JDK 6.
1. Анализируйте заголовки Http, данные формы.
Чтобы войти на веб-сайт, вам необходимо знать следующие значения:
- URL-адрес формы входа.
- Данные формы входа в систему.
- URL-адрес для аутентификации.
- Заголовок Http-запроса/ответа.
Использует Google Chrome для получения вышеуказанных данных. В Chrome щелкните правой кнопкой мыши везде, выберите “Проверить элемент” – > вкладка “Сеть”.
Прежде чем писать код, попробуйте войти в систему через Chrome, понаблюдайте, как работают HTTP-запрос, ответ и данные формы, позже вам нужно будет смоделировать те же действия на Java.
2. Соединение HttpsURLConnection Пример
В этом примере мы покажем вам, как войти в Gmail.
Резюме:
- Отправьте HTTP-запрос “GET” в форму входа в Google – https://accounts.google.com/ServiceLoginAuth
- Анализируйте данные формы с помощью функции “Сеть” Google Chrome. Кроме того, вы можете просмотреть исходный код HTML.
- Используйте библиотеку jSoup для извлечения всех видимых и скрытых данных формы, замените их своим именем пользователя и паролем.
- Отправьте HTTP-запрос “POST” обратно в форму входа вместе с созданными параметрами
- После аутентификации пользователя отправьте еще один HTTP-запрос “GET” на страницу Gmail. После аутентификации пользователя отправьте еще один HTTP-запрос “GET” на страницу Gmail.
package com.mkyong; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.CookieHandler; import java.net.CookieManager; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import javax.net.ssl.HttpsURLConnection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class HttpUrlConnectionExample { private Listcookies; private HttpsURLConnection conn; private final String USER_AGENT = "Mozilla/5.0"; public static void main(String[] args) throws Exception { String url = "https://accounts.google.com/ServiceLoginAuth"; String gmail = "https://mail.google.com/mail/"; HttpUrlConnectionExample http = new HttpUrlConnectionExample(); // make sure cookies is turn on CookieHandler.setDefault(new CookieManager()); // 1. Send a "GET" request, so that you can extract the form's data. String page = http.GetPageContent(url); String postParams = http.getFormParams(page, "username@gmail.com", "password"); // 2. Construct above post's content and then send a POST request for // authentication http.sendPost(url, postParams); // 3. success then go to gmail. String result = http.GetPageContent(gmail); System.out.println(result); } private void sendPost(String url, String postParams) throws Exception { URL obj = new URL(url); conn = (HttpsURLConnection) obj.openConnection(); // Acts like a browser conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Host", "accounts.google.com"); conn.setRequestProperty("User-Agent", USER_AGENT); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); for (String cookie : this.cookies) { conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]); } conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestProperty("Referer", "https://accounts.google.com/ServiceLoginAuth"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", Integer.toString(postParams.length())); conn.setDoOutput(true); conn.setDoInput(true); // Send post request DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes(postParams); wr.flush(); wr.close(); int responseCode = conn.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + postParams); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // System.out.println(response.toString()); } private String GetPageContent(String url) throws Exception { URL obj = new URL(url); conn = (HttpsURLConnection) obj.openConnection(); // default is GET conn.setRequestMethod("GET"); conn.setUseCaches(false); // act like a browser conn.setRequestProperty("User-Agent", USER_AGENT); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); if (cookies != null) { for (String cookie : this.cookies) { conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]); } } int responseCode = conn.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); // Get the response cookies setCookies(conn.getHeaderFields().get("Set-Cookie")); return response.toString(); } public String getFormParams(String html, String username, String password) throws UnsupportedEncodingException { System.out.println("Extracting form's data..."); Document doc = Jsoup.parse(html); // Google form id Element loginform = doc.getElementById("gaia_loginform"); Elements inputElements = loginform.getElementsByTag("input"); List paramList = new ArrayList (); for (Element inputElement : inputElements) { String key = inputElement.attr("name"); String value = inputElement.attr("value"); if (key.equals("Email")) value = username; else if (key.equals("Passwd")) value = password; paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8")); } // build parameters list StringBuilder result = new StringBuilder(); for (String param : paramList) { if (result.length() == 0) { result.append(param); } else { result.append("&" + param); } } return result.toString(); } public List getCookies() { return cookies; } public void setCookies(List cookies) { this.cookies = cookies; } }
Выход
Sending 'GET' request to URL : https://accounts.google.com/ServiceLoginAuth Response Code : 200 Extracting form data... Sending 'POST' request to URL : https://accounts.google.com/ServiceLoginAuth Post parameters : dsh=-293322094146108856&GALX=CExqdUbvEr4&timeStmp=&secTok=&_utf8=%E2%98%83 &bgresponse=js_disabled&Email=username&Passwd=password&signIn=Sign+in&PersistentCookie=yes&rmShown=1 Response Code : 200 Sending 'GET' request to URL : https://mail.google.com/mail/ Response Code : 200
Рекомендации
- Автоматический Вход На Веб-Сайт
- Документация для Android – HttpURLConnection
- Отправка HTTP-запроса GET/POST в форму с помощью Java?
- Библиотека jSoup
- Примеры HttpClient для Apache
Оригинал: “https://mkyong.com/java/how-to-automate-login-a-website-java-example/”