Comment automatiser la connexion à un site Web - exemple Java

Comment automatiser la connexion à un site Web - exemple Java

login-form

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

  1. Navigateur Google Chrome - onglet Réseau pour analyser les champs d'en-tête de demande et de réponse HTTP.

  2. Bibliothèquejsoup - Extrait les valeurs du formulaire HTML.

  3. 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:

  1. URL du formulaire de connexion.

  2. Données du formulaire de connexion.

  3. URL pour l'authentification.

  4. 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».

chrome-network

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 :

  1. Envoyez une requête HTTP «GET» au formulaire de connexion Google -https://accounts.google.com/ServiceLoginAuth

  2. Analysez les données du formulaire via la fonctionnalité "Réseau" de Google Chrome. Alternativement, vous pouvez afficher le code source HTML.

  3. 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.

  4. Renvoyez une demande HTTP «POST» au formulaire de connexion, avec les paramètres construits

  5. 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 List cookies;
  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.