Bonjour à tous,

je cherche à créer un Robot Web me permettant de me connecter à un site Internet gouvernemental en HTTPS à travers le Proxy (Webwasher) de l'entreprise où je suis.

Je rassure tout le monde : j'ai l'autorisation de faire ça de la part du site Internet en question et bien évidemment c'est dans le cadre de mon travail !

La connexion à ce fameux site en HTTPS via le Proxy ne pose plus de problèmeS, sic !

Par contre, l'authentification me donne du fil à retordre !


Voici comment cela fonctionne :
- remplissage de 2 champs "login" et "pass" ;
- clic sur le mot "Entrer" ;
- chargement de la page résultat.


Rien de bien extraordinaire me direz-vous ... sauf que ce formulaire ne possède pas de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<input type="submit" ... />
et que l'attribut "action" de la balise <form> n'est pas présent !!!

Code : Sélectionner tout - Visualiser dans une fenêtre à part
<form id="blablaLogin" name="blablaLogin" method="post" onsubmit="return false;">

Comment tout cela peut-il bien fonctionner ?

C'est assez simple : "login" et "pass" sont des <input /> classiques, mais "Entrer" est la valeur d'une simple balise <div> qui est surchargé par un CSS afin que la valeur de ce <div> soit cliquable !?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
<div class="blabla_class" onmouseOver='HoverClass(this);' onmouseOut='HoverClass(this);' onclick="testlogin();" title="Cliquer pour entrer dans une session privée de blabla">Entrer</div>
La valeur "Entrer", qui devient donc cliquable, appelle une fonction Javascript via un attribut onclick="testlogin();" de la balise <div> à laquelle elle appartient.

La fonction "testlogin()" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function testlogin() {
 	var testok=true
	if (document.getElementById("blablaLogin").login.value=="")
		{alert("Vous devez donner un identifiant pour accéder à l'ensemble des ressources de blabla !! Merci");
		testok=false;
		}
	else if (document.getElementById("blablaLogin").pass.value=="")
		{alert("Vous devez donner un mot de passe pour accéder à l'ensemble des ressources de blabla !! Merci");
		testok=false;
		}
	if (testok)
		{envoyer();
		}
	else  {
		document.getElementById("blablaLogin").login.focus();
		}
}		
 
function envoyer() {
	document.getElementById("blablaLogin").action = "/blablasession.asp";
	document.getElementById("blablaLogin").target = "";
	document.getElementById("blablaLogin").submit();
}

Grâce à cet #@''¤*µ ingénieux système ... je ne peux pas utiliser la méthode suivante nécessaire à la validation de mon formulaire :
Je ne peux pas non plus passer directement en paramètres, via l'url, le "login" et "pass" à la page affectée à l'attribut "action" via le JS ... car on est en method="POST" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
https://blabla.gouv.fr/blablasession.asp?login=mon_login&pass=mon_pass
... moi j'y croyais !!!


Je pense que la solution serait que je commence par faire une connexion + authentification classique, mais au moment de la validation du formulaire : il faudrait que j'arrive à indiquer l'url de l'attribut "action" de la balise <form> associée à mon formulaire d'authentification ... suis-je claire ?


Mon code actuel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    #!c:/perl/bin -w
    use strict; use warnings;
    use WWW::Mechanize;
    use Crypt::SSLeay;
    use HTML::TreeBuilder;
 
    my $m = WWW::Mechanize->new;
 
		# PROXY SUPPORT
		$ENV{HTTPS_PROXY} = 'http://proxy.mycompany.com:8080';
 
		# PROXY_BASIC_AUTH
		$ENV{HTTPS_PROXY_USERNAME} = 'mon_ident';
		$ENV{HTTPS_PROXY_PASSWORD} = 'mon_mdp';
 
    # récupération des informations
    $m->agent_alias("Linux Mozilla");
    $m->get('https://blabla.gouv.fr/default.asp');
    exit unless $m->success;
 
    # remplissage et validation
    $m->set_fields(
        login => 'mon_login', # entrez vos identifiants de connexion ici
        pass => 'mon_pass',
    );
    $m->click;
    die $m->res->status_line unless $m->success;
 
 
    # affichage des informations
    my $tree = HTML::TreeBuilder->new_from_content( $m->content );
    print
      map { $_->as_trimmed_text . "\n" }
      $tree->look_down( _tag => 'span', id => qr/blabla_Ident/ );


Une idée ?


Gôm ... en plein doute !