Passer une page d'authentification web et garder la connexion

Passer une page d'authentification web et garder la connexion - Java - Programmation

Marsh Posté le 14-08-2003 à 18:42:49    

Bonjour,  
 
  J'aimerais faire un programme qui se connecte à une page web pour récupérer des données (de la bourse) et les écrire dans un fichier.
  J'ai fait des essais en local avec une page web normale, j'y suis arrivé.
  Par contre, la page à laquelle il faudrait que je me connecte maintenant et qui est donc sur le web n'est accessible qu'après authentification ...
  Voila mon problème : je n'arrive pas à passer cette authentification...
 
Page à laquelle je désire accéder : http://www.boursorama.com/index.phtml
 
Page d'authentification que je dois passer :
http://www.boursorama.com/log_memb [...] ssword=XXX
 
(Si je rentre le lien précédent directement dans mon navigateur , je suis directement redirigé sur la page que je désire -celle des données : index.phtml -)
 
Voici mon code :


import java.net.*;
import java.io.*;
import java.util.*;
 
//==========================
public class Pierre{
 //==========================
 
 static SocketClient sock ;
 
 static String attendreEtLire ()
 {
  while (!sock.receptionEnCours())  
   Utilit.tempo (100) ;  
  return (sock.ligneRecue ()) ;
 }
 
 static void explorer (String serveur, String page)
 {
 // Connexion au serveur
  sock = new SocketClient (serveur, 80) ;
  sock.espionner(true) ;
   
 // Envoi en-tête http serveur
  sock.envoyerLigne ("GET /" + page + " HTTP/1.0" ) ;
  sock.envoyerLigne ("" ) ;
   
 // Lecture en-tête http envoyé par serveur
  String ligne = "debut" ;
  while (!ligne.equals("" ))
  {
   ligne = attendreEtLire () ;
  } // while
   
 // Lecture page HTMl envoyée par serveur
  ligne = "Debut du fichier" ;
   
 //on cherche le debut du tableau
  while(ligne.toUpperCase().trim().indexOf("LISTE</B></A>" ) < 0)
   {ligne = attendreEtLire () ;}
 
  //quand on est au debut du tableau
  if(ligne.toUpperCase().trim().indexOf("LISTE</B></A>" ) >= 0)
  {
  //on cree le fichier
   FileWriter fw ;  
   PrintWriter ps ;
   
   try
   {
   //pour ecrire dans le fichier
    fw = new FileWriter("a_lire.html" ) ;
    ps = new PrintWriter(fw);
 
   //on affiche un debut de page html
    ps.print("<html><body><table><tbody><tr>" ) ;
     
   //tant qu'on est pas a la fin du tableau
    while(ligne.toUpperCase().trim().indexOf("</TBODY></TABLE>" )<0)
    {
    //on lit et on affiche la ligne
     ligne = attendreEtLire () ;
     ps.print(ligne) ;
    }//for
   //finir la page
    ps.print("</body></html>" ) ;
    ps.close() ;
   }//try
   catch(IOException e)
    {System.out.println(e.getMessage()) ;}
  }//if
 
 //finir la lecture de la page du serveur
  while (!ligne.toUpperCase().trim().endsWith("</HTML>" ))
   {ligne = attendreEtLire () ;}
 
 //fermeture de la connexion
  sock.close () ;
 } // explorer
 
 public static void main(String parametres [])
 {
  explorer ("www.boursorama.com", "log_membre.phtml?login=XXX&password=XXX" ) ;
 } // main
} // Fin


 
et voila ce que j'ai si je trace la communication :  
 


java Pierre
Connexion Socket[addr=www.boursorama.com/209.207.226.77,port=80,localport=1489]
80 --> GET /log_membre.phtml?login=XXX&password=XXX HTTP/1.0
80 -->
80 <-- HTTP/1.1 302 Found


 
Et pis rien après... et j'ai pas d'idées pour passer à la page index.phtml...
J'espère que quelqu'un pourra m'aider. Merci d'avance
 
PS :(J'ai remplacé mes logins et password par des XXX)


Message édité par jultey le 14-08-2003 à 19:08:59
Reply

Marsh Posté le 14-08-2003 à 18:42:49   

Reply

Marsh Posté le 14-08-2003 à 20:34:10    

pb de cookie ou javascipt non interprété probablement.

Reply

Marsh Posté le 14-08-2003 à 20:58:51    

pour ca il faut que tu gère les cookies : lors de ta première requête, tu vas recevoir un cookies (headr = set-cookies ou un truc dans le genre). Il faut que tu renvoies ce cookie dans les headers de tes autres requêtes pour garder la session.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 14-08-2003 à 20:59:42    

Thyast a écrit :

pb de cookie ou javascipt non interprété probablement.


 
  Si c'est un pb de cookie, il faudrait que j'arrive à ouvrir une connexion sur la page suivante en spécifiant d'utiliser le cookie posé par la page d'authentification. Mais comment faire, si t'avais une piste, ca m'arrangerait bien.
  Pour le javascript, je vois pas trop, car si y'avait du javascript non interprété, il serait tout de même transmit par le serveur je pense... et donc affiché à l'écran sous forme de code ...
  Bref, maintenant que le pb est certainement localisé (cookie), comment y remédier ?
 
  Merci pour vos futurs réponses.
  Je ne pourrais revenir voir les réponses que demain, couchage tot à cause de job d'été oblige (6h du mat : dur dur d'être un facteur)

Reply

Marsh Posté le 14-08-2003 à 21:02:20    

benou a écrit :

pour ca il faut que tu gère les cookies : lors de ta première requête, tu vas recevoir un cookies (headr = set-cookies ou un truc dans le genre). Il faut que tu renvoies ce cookie dans les headers de tes autres requêtes pour garder la session.


 
Merci, je vais essayer ça demain après-midi.
 
Bonne nuit à tous (ou plutot bon veillage très très tard)

Reply

Marsh Posté le 16-08-2003 à 18:29:05    

 Je sens que ces cookies vont me prendre la tête !!!
  J'ai vu sur le net qu'on pouvait récupérer les cookies en ajoutant les packages javax.servlet.* et javax.servlet.http.* et en faisant :
// Recupere la session
 HttpSession session = request.getSession(true);
 
  Lorsque je compile, java me dit que les packages "does not exist". J'ai le jdk 1.3, c'est normal qu'ils n'y soient pas ?
 
  C'est la bonne solution pour récupérer le cookie ?
 
  J'ai vu aussi ceci :
Cookie[] cookies = request.getCookies();
 
  Mais je vois pas trop la différence entre les cookies et une session...

Reply

Marsh Posté le 16-08-2003 à 20:50:01    

tu confond tout ... ce que t'as lu c'est pour la programmation d'application web côté serveur (d'un site web quoi).
 
toi faut que tu gères ca à la mimine côté client en faisant comme je l'ai dit ...
 
sinon, cherche un truc tout fait genre ca : http://www.innovation.ch/java/HTTPClient/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 17-08-2003 à 11:16:36    

benou a écrit :

tu confond tout ... ce que t'as lu c'est pour la programmation d'application web côté serveur (d'un site web quoi).
 
toi faut que tu gères ca à la mimine côté client en faisant comme je l'ai dit ...
 
sinon, cherche un truc tout fait genre ca : http://www.innovation.ch/java/HTTPClient/


 
  Salut Benou,
  En fait, si je fais ça à la mano, j'ai besoin de rien ? Je veux dire d'aucune classe cookie ou autre ?
  Si j'ai bien compris ce que tu veux me dire et les nouvelles infos que j'ai lu sur le net :
  Je me connecte à la page de login, je récupère dans les headers de cette même page la ligne commençant par :
"Set-Cookie: IDENTIFIANT=XXXXXXXXXXXXXXXXXXXXXXX"
  Ensuite, j'ouvre une connexion sur la page que je veux en spécifiant :
"GET  ...
Cookie: IDENTIFIANT=XXXXXXX "
 
  Mais le problème que j'ai je ne récupère qu'une ligne de header :  
80 <-- HTTP/1.1 302 Found
_
 
   
Et ensuite plus rien, c'est là qu'il faudrait que je récupère le set-cookie, mais j'ai rien. Juste un curseur qui clignote...

Reply

Marsh Posté le 17-08-2003 à 11:30:25    

C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller.
 
Sinon, c'est quoi la page à laquelle tu essayes d'accéder et qui te retourne un 302 ?  
 
oublie pas aussi que dans la page d'identification tu dois passer tous les champs du formulaire de la page d'identification. Y en a peut être d'autre que le login password. Et puis c'est aussi peut être important si ils sont passé en GET ou en POST ...
 
je serais toi, je ferais déjà des tests avec un bête telnet  : ca ira plus vite que de passer par le prog java à chaque fois pour faire tes tests
 
edit : c'est ca pour les cookies : ca marche comme ca. Sauf que tu peux acvoir plusiers coolies d'affectés sur une même ligne Set-Cookie


Message édité par benou le 17-08-2003 à 11:31:22

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 17-08-2003 à 11:54:56    

benou a écrit :

C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller.
 
Sinon, c'est quoi la page à laquelle tu essayes d'accéder et qui te retourne un 302 ?  
 
oublie pas aussi que dans la page d'identification tu dois passer tous les champs du formulaire de la page d'identification. Y en a peut être d'autre que le login password. Et puis c'est aussi peut être important si ils sont passé en GET ou en POST ...
 
je serais toi, je ferais déjà des tests avec un bête telnet  : ca ira plus vite que de passer par le prog java à chaque fois pour faire tes tests
 
edit : c'est ca pour les cookies : ca marche comme ca. Sauf que tu peux acvoir plusiers coolies d'affectés sur une même ligne Set-Cookie


 
Voila ce que j'obtient avec un telnet:
 

Code :
  1. GET /log_membre.phtml?login=XXX&password=XXX HTTP/1.1
  2. host: www.boursorama.com
  3. HTTP/1.1 302 Found
  4. Date: Sun, 17 Aug 2003 09:42:39
  5. Server: Apache
  6. Vary: *
  7. Location: /non_cookies.phtml
  8. Transfer-Encoding: chunked
  9. Content-Type: text/html
  10. 0


 
Donc apparement c'est mon prog java qui n'arrive pas à récupérer les headers... (Je vois pas trop pourquoi mais bon...)
 
Les headers choppés en telnet me redirige vers une page non_cookies.phtml... et j'ai pas de header set-cookie...
 
La page à laquelle j'essaie de me connecter est la page d'authentification log_membre.phtml, c'est elle qui retourne un 302.
Je vais regarder si y'a d'autres champs, et en POST aussi (mais je pourrais p'être plus passer les valeurs des champs dans l'URL...).
Je vais aussi rajouter un user-agent...

Reply

Marsh Posté le 17-08-2003 à 11:54:56   

Reply

Marsh Posté le 17-08-2003 à 12:31:58    

d'après ce que je comprend, la page d'identification s'attend déjà à recevoir un cookie => il faut que tu le récupère sur une page précédente, c'est à dire que tu fasses une touche sur la page d'avant juste pour récupérer le cookie et l'envoyer au moment de l'identification


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 17-08-2003 à 14:14:44    

Effectivement, je me suis connecté à la racine du site et je reçois déjà des cookies :

Code :
  1. Expires: Sun, 17 Aug 2003 10:58:30 GMT
  2. Set-Cookie: clePwd=deleted; expires=Sat, 17-Aug-02 10:58:29 GMT; path=/; domain=www.boursorama.com
  3. Set-Cookie: perso=zjJgrzmbYrdHBkrZyhlihyT; expires=Fri, 15-Aug-08 10:58:30 GMT; path=/; domain=www.boursorama.com
  4. Set-Cookie: SUP_COOKIE=OUI; expires=Mon; 16-Aug-04 10:58:30 GMT; path=/; domain=www.boursorama.com
  5. Set-Cookie: pub_default=PUB; expires=Sun, 17-Aug-03 11:27:18 GMT; path=/; domain=www.boursorama.com


Je vais essayer de les faire passer aux pages suivantes... (tous ?, je pense que oui)...
et je sais pas trop encore si il faut faire une autre connexion, avec un autre socket... enfin, je vais tester et je vous tiens au courant.
Merci :-)
 

Reply

Marsh Posté le 17-08-2003 à 14:22:57    

vaut mieux que tu fasses une autre socket ouais ! c'est plus simple.
 
et oui, il vat mieux que tu passes tous les cookies. Ils sont surement pas tous nécessaires, mais en les envoyant tous, t'es sûr que ca marche ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 18-08-2003 à 12:25:43    

benou a écrit :

C'est pas possible que tu te manges qu'une seule ligne en retour : si c'est un HTTP 302, y a forcément un header Location qui te dit vers quelle page aller.


 
  J'ai pigé pourquoi je ne récupèrais qu'une seule ligne de header : C'est ma fonction de récupération de ligne qui foire (toujours !)
  Ce qui est bizarre, c'est que lorsque je récupère les headers d'un serveur de test fait en java ca marche -> je récupère tout. Alors que si je récupère les headers sur le web ou easyphp, je récupère que la première ligne.
  Ca dit venir d'un problème de fin de ligne je pense...
  Plus qu'a trouver ce pb et j'approche du but !http://www.jultey.firstream.net/jultey/smiley/doigt.gif

Reply

Marsh Posté le 18-08-2003 à 22:45:51    

Rrrrr, j'arrive pas à faire marcher cette fonction de réception de ligne...
(je reste dans le même topic car c'est toujours dans le même pb de connexion...)
 
Bon, alors mon pb est comme je l'ai dit juste au-dessus, que j'arrive à récupérer les headers d'un serveur web java de test mais pas des autres serveurs...
 
Mon code ressemble à ceci :

Code :
  1. static String attendreEtLire () {
  2.   //===============================
  3.   System.out.println("On est dans la fonction" ) ;
  4.      while (!sock.receptionEnCours())
  5.       {
  6.  System.out.println("On est dans le while" ) ;
  7.  Utilit.tempo (100) ;
  8. }
  9.      return (sock.ligneRecue ()) ;  // Lecture
  10.   }


...

Code :
  1. // Connexion au serveur
  2.     sock = new SocketClient (serveur, 80) ;
  3. // Envoi en-tête http serveur
  4.     sock.envoyerLigne ("GET /toto.html HTTP/1.0" ) ;
  5.     sock.envoyerLigne ("" ) ;
  6. // Lecture en-tête http envoyé par serveur
  7.     String ligne = "debut";
  8.     while (!ligne.equals("" )) {
  9.       ligne = attendreEtLire () ;       // Lecture
  10.     } // while
  11.     System.out.println ("Recu l'en-tete" ) ;


...

Code :
  1. public boolean receptionEnCours()
  2. {
  3.   boolea flag = false;
  4.   try
  5.   { flag = is.avaible() > 0 ; }
  6.   catch(IOException ioexception)
  7.   {Utilit.erreurFatale("test reception si en cours", ioexception) ;}
  8.   return flag ;
  9. }


 

Code :
  1. public String ligneRecue()
  2. {
  3.   String s = "Ligne vide" ;
  4.   try
  5.   {
  6.     s = reception.readLine() ;
  7.   }
  8.   catch(IOException ioexception)
  9.   {
  10.     Utilit.erreurFatale("reception ligne", ioexception) ;
  11.   }
  12.   if(espionnage)
  13. System.out.println(portCanal + " <-- " + s)  ;
  14. return s ;
  15. }


 
Alors si je fais le test avec le serveur web de test java, j'obtiens ca :

Code :
  1. D:\boursorama>java Crawler1
  2. Connexion Socket[addr=/127.0.0.1,port=800,localport=1445]
  3. 800 --> GET /toto.html HTTP/1.0
  4. 800 -->
  5. On est dans la fonction
  6. On est dans le while
  7. On est dans le while
  8. On est dans le while
  9. On est dans le while
  10. On est dans le while
  11. 800 <-- HTTP/1.0 200 OK
  12. On est dans la fonction
  13. On est dans le while
  14. On est dans le while
  15. 800 <-- Server: Iroquois/0.0
  16. On est dans la fonction
  17. On est dans le while
  18. On est dans le while
  19. On est dans le while
  20. On est dans le while
  21. 800 <-- Date: Mon Aug 18 22:38:36 CEST 2003
  22. On est dans la fonction
  23. On est dans le while
  24. On est dans le while
  25. 800 <-- Content-Type: text/html
  26. On est dans la fonction
  27. On est dans le while
  28. On est dans le while
  29. On est dans le while


... bref, tout ce passe bien.
Alors qu'avec un autre serveur, voila ce que ca donne

Code :
  1. D:\boursorama>java Crawler1
  2. Connexion Socket[addr=/127.0.0.1,port=80,localport=1447]
  3. 80 --> GET /toto.html HTTP/1.0
  4. 80 -->
  5. On est dans la fonction
  6. On est dans le while
  7. 80 <-- HTTP/1.1 200 OK
  8. On est dans la fonction
  9. On est dans le while
  10. On est dans le while
  11. On est dans le while
  12. On est dans le while
  13. On est dans le while
  14. On est dans le while
  15. On est dans le while
  16. On est dans le while
  17. On est dans le while
  18. On est dans le while
  19. On est dans le while
  20. On est dans le while
  21. On est dans le while
  22. On est dans le while


et comme ca pendant des lustres...
 
J'ai mit des "On est dans ..." pour débugger mais je n'y suis pas arriver...
Je ne comprends pas pourquoi il attend et ne voit pas les autres lignes...
Si vous pouvez m'éclairer... ... ... merci !


Message édité par jultey le 18-08-2003 à 22:48:23
Reply

Marsh Posté le 19-08-2003 à 08:36:40    

tu te compliques la vie pour rien !!!
 
fait une bête lecture de flux !

Code :
  1. BufferedReader reader = new BufferedReader(socket.getInputStream());
  2. String line;
  3. while ((line = reader.readLine()) != null) {
  4.    // traitement de ta ligne
  5. }


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 20-08-2003 à 22:41:41    

benou a écrit :

tu te compliques la vie pour rien !!!
 
fait une bête lecture de flux !

Code :
  1. BufferedReader reader = new BufferedReader(socket.getInputStream());
  2. String line;
  3. while ((line = reader.readLine()) != null) {
  4.    // traitement de ta ligne
  5. }




 
Tu as raison, je complique tout... c'est qu'au départ, j'ai voulu reprendre du code tout fait, et au final, ca me rallonge et complique le tout...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed