Comment automatiser la connexion à un site Web - exemple Java
Dans cet exemple, nous allons vous montrer comment vous connecter à un site Web via JavaHttpsURLConnection
standard. Cette technique devrait fonctionner dans la plupart des formulaires de connexion.
Outils et bibliothèque Java utilisés dans cet exemple
-
Navigateur Google Chrome - onglet Réseau pour analyser les champs d'en-tête de demande et de réponse HTTP.
-
Bibliothèquejsoup - Extrait les valeurs du formulaire HTML.
-
JDK 6.
1. Analysez les en-têtes Http, formez les données.
Pour vous connecter à un site Web, vous devez connaître les valeurs suivantes:
-
URL du formulaire de connexion.
-
Données du formulaire de connexion.
-
URL pour l'authentification.
-
En-tête de demande / réponse HTTP.
Utilise Google Chrome pour obtenir les données ci-dessus. Dans Chrome, faites un clic droit partout, choisissez «Inspecter l'élément» → onglet «Réseau».
Avant de coder, essayez de vous connecter via Chrome, observez le fonctionnement de la requête HTTP, de la réponse et des données du formulaire.Plus tard, vous devrez simuler les mêmes étapes en Java.
2. Exemple HttpsURLConnection
Dans cet exemple, nous vous montrons comment vous connecter à Gmail.
Sommaire :
-
Envoyez une requête HTTP «GET» au formulaire de connexion Google -https://accounts.google.com/ServiceLoginAuth
-
Analysez les données du formulaire via la fonctionnalité "Réseau" de Google Chrome. Alternativement, vous pouvez afficher le code source HTML.
-
Utilisez la bibliothèque jSoup pour extraire toutes les données du formulaire visibles et masquées, remplacez-les par votre nom d'utilisateur et votre mot de passe.
-
Renvoyez une demande HTTP «POST» au formulaire de connexion, avec les paramètres construits
-
Une fois l'utilisateur authentifié, envoyez une autre demande HTTP «GET» à la page Gmail. https://mail.google.com/mail/
Note
Cet exemple est juste pour vous montrer la capacité et la fonctionnalité de Java HttpURLConnection. En général, vous devez utiliser lesGoogle Gmail API pour interagir avec 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; } }
Sortie
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
Reportez-vous à cet exemple équivalent, mais en utilisantApache HttpClient to send HTTP request.