Dans certains programmes, il est parfois utile de récupérer les données d’un site web. Cependant, dans certains cas, on cherche à récupérer des infos « personnalisées ». Par exemple, le résultat d’une recherche.
Pour de nombreux moteurs de recherche, il est possible d’effectuer une recherche par la méthode Get (en passant le terme recherché dans l’URL). Mais, parfois, ce n’est pas possible : le formulaire ne peut être validé que par la méthode Post (notamment pour les identifications et autres).
Une API du projet Jakarta Commons a été développée en ce sens, elle s’appelle HttpClient. Nous allons voir ici comment l’utiliser afin de remplir un formulaire et récupérer la réponse du site web.
Dans cet exemple, nous utiliserons un petit formulaire de démo : https://www.pexiweb.be/demo/form/index.html. N’hésitez pas non plus à regarder dans l’API de HttpClient.
Tout d’abord, il va falloir récupérer la librairie HttpClient (la version utilisée ici est la 3.1) ainsi que ses dépendances : Commons Codecs et le Logging Component. Ajoutez les jar téléchargés au BuildPath de votre projet. Commençons par importer les classes utilisées : HttpClient et PostMethod pour les requêtes envoyées au site et BufferedReader et InputStreamReader pour récupérer la réponse du site web.
[codesyntax lang= »java »]
[/codesyntax]
Ensuite, il faut créer un objet HttpClient. On pourrait dire que cet objet est un petit peu comme votre navigateur. Et, évidemment, il faut dire à votre navigateur ce qu’il va devoir faire. On va donc créer un objet PostMethod. Cet objet, hérité de la classe HttpMethod, va indiquer au client (HttpClient) ce qu’il faut faire. Dans son constructeur, on va indiquer non pas l’url du formulaire mais l’url du traitement du formulaire ! Donc, c’est l’url indiquée après le ‘action=…’. Vous trouverez cela facilement dans le code source de la page. Ensuite, il faut encore indiquer à notre méthode quels sont les champs du formulaire et avec quoi il faut les remplir.
[codesyntax lang= »java »]
HttpClient client = new HttpClient();
PostMethod methode = new PostMethod(« https://www.pexiweb.be/demo/form/traitement.php »);
methode.addParameter(« champ », « Hello World ! »);
[/codesyntax]
Maintenant que tout est prêt, on va appuyer sur le bouton submit de notre formulaire : on appelle executeMethod de HttpClient avec comme paramètre notre PostMethod. Attention, cette méthode peut lancer une exception et renvoie un nombre en fonction de l’état de la requête ! Ne pas oublier également de créer un buffer qui récupérera la réponse du site. Ce buffer va récupérer stream provenant de notre PostMethod. On l’affiche ensuite avec une bête boucle qui parcoure toutes les lignes.
[codesyntax lang= »java »]
BufferedReader br = null;
try
{
int retour = client.executeMethod(methode) ;
br = new BufferedReader(new InputStreamReader(methode.getResponseBodyAsStream()));
String readLine;
while(((readLine = br.readLine()) != null))
{
System.out.println(readLine);
}
}
catch (Exception e)
{
System.err.println(e);
}
[/codesyntax]
Pour finir, on ferme la connexion avec le site internet (on ferme le PostMethod) et si le buffer a été ouvert, on le ferme également.
[codesyntax lang= »java »]
finally
{
methode.releaseConnection();
if(br != null)
{
try
{
br.close();
}
catch (Exception e) { }
}
}
[/codesyntax]
Normalement, vous devriez voir apparaitre votre requête si vous testez le programme sur le formulaire de démo. Mais attention, ne pensez pas que vous pouvez dès à présent remplir tous les formulaires du web, faire des programmes bruteforce ou de spam : de nombreux sites requièrent l’utilisation de cookies, de sessions ou d’autres utilisent le protocole https. HttpClient peut gérer tout cela, je vous invite à aller regarder dans l’API. A noter que je vous proposais récemment comment récupérer le code source d’une page, c’est également possible avec cette librairie.
Pour les paresseux, voici le code complet de la classe :
[codesyntax lang= »java »]
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Envoi {
public static void main(String args[]) {
// On cree le client
HttpClient client = new HttpClient();
// Le HTTPMethod qui sera un Post en lui indiquant l’URL du traitement du formulaire
PostMethod methode = new PostMethod(« https://www.pexiweb.be/demo/form/traitement.php »);
// On ajoute les parametres du formulaire
methode.addParameter(« champ », « Hello World ! »); // (champs, valeur)
// Le buffer qui nous servira a recuperer le code de la page
BufferedReader br = null;
try
{
// http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpStatus.html
int retour = client.executeMethod(methode);
// Pour la gestion des erreurs ou un debuggage, on recupere le nombre renvoye.
System.out.println(« La reponse de executeMethod est : » + retour);
br = new BufferedReader(new InputStreamReader(methode.getResponseBodyAsStream()));
String readLine;
// Tant que la ligne en cours n’est pas vide
while(((readLine = br.readLine()) != null))
{
System.out.println(readLine);
}
}
catch (Exception e)
{
System.err.println(e); // erreur possible de executeMethod
}
finally
{
// On ferme la connexion
methode.releaseConnection();
if(br != null)
{
try
{
br.close(); // on ferme le buffer
}
catch (Exception e) { /* on fait rien */ }
}
}
}
}
[/codesyntax]
Merci pour ce blog, Comment faire pour ajouter la config du proxy ?
Pour cet article, je n’ai pas poussé plus loin mes recherches dans l’API httpClient.
Je sais que HttpClient est configurable à souhait, en cherchant un peu dans la doc, ça ne devrait pas être trop compliqué de trouver 😉
En faite, je voudrais développer un auto-posteur de forum en java à partant par ce blog 🙂
Ah, un logiciel de flood en somme ? ^^ Pas bien …
Je ne peux te dire qu’une chose, va voir sur le site officiel, il y a des guides, tutos et exemples :
http://hc.apache.org/httpclient-3.x/
(ça c’est le lien de la version 3, celle utilisée dans le code de cette page mais la version 4 est dispo !)
J’ai testé votre code en le réadaptant (httpclient 4.0.1) et j’arrive sur une page qui ressemble à celle là :
Exemple de formulaire
Vous n’etes pas passe par le formulaire pour arriver ici.
Comme si le script détectait la provenance non « conventionnelle »…Vous avez une idée pourquoi ???
oups toutes les balises du texte ci dessus ont disparu…
mais après le deux points il y a du code html, avec les balises html head title etc…
et j’ai oublié de vous remercier !!!
😉
Et si le site nécessite l’utilisation de cookies ?
Est-ce que je peux appliquer la même méthode avec HttpClient 4.1.1 ?