Как автоматизировать вход на сайт - пример Java
В этом примере мы покажем вам, как войти на веб-сайт через стандартный JavaHttpsURLConnection
. Эта техника должна работать в большинстве форм входа в систему.
Инструменты и библиотека 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. https://mail.google.com/mail/
Note
Этот пример предназначен только для демонстрации возможностей и функциональности Java HttpURLConnection. В общем, вы должны использоватьGoogle Gmail API для взаимодействия с Gmail.
HttpUrlConnectionExample.java
package com.example; 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, "[email protected]", "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
Note
Обратитесь к этому эквивалентному примеру, но используяApache HttpClient to send HTTP request.