Envoi de POST à CGI en java

Bonjour,
j’ouvre un nouveau fil car j’ai progressé (https://www.debian-fr.org/utilisation-classe-authenticator-t37765.html Merci MisterFreez)

Je vois en me connectant sur ma banque que mon programme s’est connecté à l’heure où je l’ai lancé, mais le fichier que je reçois est toujours la page d’identification (comme si le mot de passe était erroné).
J’ai retardé le moment où je reçois les données (imaginant laisser du temps au CGI pour élaborer la page) mais ça ne change rien.

Merci de me donner le dernier petit coup de pouce qui va me permettre d’aboutir enfin !

[code]import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public class bank {

public static void main(String[] args) throws IOException {
	
	URL url = new URL("https://www.creditmutuel.fr/cmne/fr/identification/default.cgi"); 
	HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

	
	   
	    		    

	    try {
	      
	    
	      con.setRequestMethod("POST");
	      con.setRequestProperty("Content-type","application/x-www-form-urlencoded");
	      con.setDoOutput(true);
	      con.setDoInput(true);
	      PrintWriter pout = new PrintWriter( new OutputStreamWriter(
	       con.getOutputStream(), "utf-8"), true );
	      pout.print("_cm_user=0290012345678&_cm_pwd=12345678");
	      pout.flush(); 
	      		      
	      
	      
	      File fichier = new File("/home/eric/Bureau/extrait") ;
			
		  BufferedWriter ecr = new BufferedWriter (new FileWriter (fichier));
			
	      BufferedReader lit =new BufferedReader(new InputStreamReader(
	    	con.getInputStream()));
	   
	     
	    	  System.out.println ("début");
	    	  if (! fichier.exists())	fichier.createNewFile();
	      do{
	          String ligne=lit.readLine();
	          if(ligne==null)break;
	          ecr.write(ligne);
	      }while(true);
	      System.out.println ("fin");
	      
	     
	      
	      
	      lit.close(); ecr.close(); con.disconnect();pout.close();
	      

	      
	      
	    } catch (MalformedURLException e) {
	      System.out.println(e);     // bad postURL
	    } catch (IOException e2) {
	      System.out.println(e2);    // I/O error
	    }
	  }
}

[/code]

As-tu essayé de tracer une session normale avec un truc genre HttpFox (extension Iceweasel) pour voir ce qui se passe précisément ?

Sinon il y a un truc qui me frappe dans ton code : tu fais directement un POST sans récupérer de cookie session auparavant avec un GET. Perso quand je fais un système de login web je vérifie toujours que la session (donc le cookie) existe déjà au moment du POST (donc qu’il y a eu une page chargée auparavant) car sans cookie pas de session et sans session l’utilisateur serait obligé de retaper son login à chaque changement de page, il vaut mieux afficher un message propre “autorisez les cookies”. C’est un comportement assez courant.

  1. GET sur la page de login, récupérer le cookie session
  2. POST sur la page de login en incluant le cookie session
  3. éventuellement des séries de GET ou POST pour récupérer les infos que tu veux, toujours en incluant le cookie session
  4. étant donné qu’il s’agit d’un site sensible, faire un dernier GET ou POST, toujours en incluant le cookie session, correspondant à la déconnexion afin que ce cookie ne puisse plus servir.

Effectivement, si je refuse les cookies sur epiphany, il retourne sur la page de connexion inlassablement.
Il me reste donc à savoir comment gérer un cookie session avec JAVA alors.
Merci pour cette nouvelle piste !

Ça je pourrai pas t’aider, Java et moi ça fait trois… (si ça faisait que deux ça irait encore :stuck_out_tongue:)

J’ai l’erreur nid=xxxxxxxxxxxxxxx80c331a6xxxxxxxxxxxxxx Exception in thread "main" java.lang.IllegalStateException: Already connected at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:2284) at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316) at cook.main(cook.java:32)
avec le code suivant:

[code]public static void main(String args[]) throws IOException{

	URL url = new URL("https://www.creditmutuel.fr/cmne/fr/identification/default.cgi");
	HttpsURLConnection uc = (HttpsURLConnection) url.openConnection();
	
    try {
    	String cookie = uc.getHeaderField(8); 
		cookie = cookie.substring(0, cookie.indexOf(";"));
		System.out.println(cookie);
    	uc.setRequestProperty("Content-type","application/x-www-form-urlencoded");
    	uc.addRequestProperty("Cookie", cookie);
    	uc.setDoOutput(true);
    	uc.setDoInput(true);
    	PrintWriter pout = new PrintWriter( new OutputStreamWriter(
    		uc.getOutputStream(), "iso-8859-1"), true );
    	pout.print("_cm_user=0290012345678&_cm_pwd=87654321");
    	pout.flush(); 
    	      		      
      
      [/code]

L’erreur ligne 32 (uc.setRequestProperty(“Content-type”,“application/x-www-form-urlencoded”):wink: disparaît si j’enlève le uc.getHeaderField 3 lignes plus haut.

Merci pour votre aide

Je crois qu’il faut remplacer :

par

String cookie = uc.getHeaderField(8); uc.disconnect(); uc = (HttpsURLConnection) url.openConnection();

Je n’ai plus l’erreur mais je ne comprends pas bien le mécanisme :

  1. Créer la connexion uc donne accès à une page contenant un cookie que j’enregistre
  2. Se déconnecter puis se reconnecter (quel intérêt ?) produit un nouveau cookie et le précédent est obsolète

Non ? (je nébule)

D’autre part, je n’ai toujours pas ma connexion à SITFIN (loggé)

Je n’y connais pas bien plus que toi en fait, mais la doc devrait pouvoir t’en dire plus : docs.oracle.com/javase/1.5.0/doc … alive.html

Et j’ai trouvé ça sur StackOverflow :
stackoverflow.com/questions/3460 … n-question
stackoverflow.com/questions/4037 … ach-time-h

question subsidiaire : les champs cachés
il y en a trois :
_cm_app=SITFIN
_cm_idtype=\quoi mettre ?
_cm_langue=fr

Je ne les mettais pas dans le POST car ça marchait sans dans le petit code HTML suivant :

[code]

bank

identif

Identifiant :
Mot de passe :

[/code]

Ai-je raison de les ignorer ?

:041 presque un an plus tard, je fais enfin ce que je veux grâce à httpClient (hc.apache.org/httpcomponents-client-ga/)
ou plus exactement client-dev/

C’est une merveille de simplicité. Je posterai mon code dès qu’il sera présentable.
Merci encore à tous ceux qui donnent de leur temps sur ce site :049