Comment ouvrir une page web avec mot de passe (VBA)


L'accès à certaines pages ou certains sites Web est contrôlé par un mot de passe.
L'objet de ce qui suit n'est pas de trouver une méthode pour accéder par effraction à des sites protégés; mais seulement d'automatiser la saisie d'un mot de passe connu.
Attention toutefois, il est très imprudent de "laisser trainer" un login et mot de passe dans une page de code !

Plusieurs méthodes sont utilisables selon le type de page visée et leur niveau de sécurisation.
Quelques unes sont présentées ci-dessous à titre d'exemple.

La méthode la plus simple consiste à regarder dans le code de la page html qui vous invite à saisir login et mot de passe quelle action est associée au formulaire de saisie.
Dans les cas les plus simples, la saisie du formulaire envoie les données vers une nouvelle page Web.
Pour automatiser l'opération, il suffit donc d'appeler directement la page cible en prenant soin de lui transmettre en paramètres les login et le mot de passe.
Tout le problème se résume donc à trouver dans le code de la page Web, les références permettant de transmettre les login et mots de passe.
Un exemple :
Votre login
Votre mot de passe

Si on examine le code correspondant à la zone de saisie ci-dessus, on lit :
<TABLE border=0>
<FORM action="cible.html" method=get>
<TR><TD align='right'>Votre login</TD><TD><INPUT size=12 name='log'></TD></TR>
<TR><TD align='right'>Votre mot de passe</TD><TD><INPUT type=password size=12 name='pass'></TD></TR>
<TR><TD></TD><TD><INPUT type=submit value="cliquez ici" ></TD></TR></TABLE>


Quand le formulaire est soumis, il ouvre la page cible.html avec en paramètres pass et log.
Si vous saisissez comme login "zaza" et comme mot de passe "miaou", vous allez, en cliquant sur le bouton, ouvrir la page cible.html?log=zaza&pass=miaou.
Rien ne vous empèche d'ouvrir directement cette page (cliquez sur le lien) :
cible.html?log=zaza&pass=miaou.

Dans cet exemple simple, les login et mot de passe sont envoyés vers une page html simple qui va traiter l'information par javascript.
C'est un cas de figure très rarement rencontré en pratique dans la mesure où le javascript est executé localement (sur l'ordinateur de l'utilisateur) et n'autorise donc pas de confidentialité.
Par contre, on peut facilement par cette méthode automatiser l'ouverture de pages de type asp, php, cgi...

Dans l'exemple précédent, il suffit d'écrire en VBA :
ThisWorkbook.FollowHyperlink "http://jacxl.free.fr/cours_xl/cible.html?log=zaza&pass=miaou", , True
pour ouvrir la page souhaitée.

La méthode précédente, d'une extrème simplicité (une seule ligne de code, une fois qu'on a trouvé la bonne page et les noms des paramètres), ne fonctionne hélas pas dans tous les cas.
La zone de saisie n'est pas forcément un formulaire html, et diverses mesures destinées à améliorer la sécurité peuvent compliquer les opérations.
Parmi les autres méthodes, on peut piloter Internet Explorer par le biais de VBA (cliquez ici pour découvrir le vocabulaire d'Internet Explorer").
Il suffit pour cela de créer un objet "Application Internet Explorer" qui va supporter diverses commandes et propriétés :


Sub objet_ie()
Dim ie As Object
Set ie = CreateObject("internetexplorer.application")
ie.Visible = True
ie.navigate ("http://jacxl.free.fr/cours_xl/passw.html")
Do While ie.Busy
Application.Wait (Now + 0.1 / 3600 / 24)
Loop
Set dct = ie.document.parentwindow.frames.Item(1).frames.Item(1).document
For Each formul In dct.forms
If formul.Action = "cible.html" Then
Exit For
End If
Next formul
formul.elements("log").Value = "zaza"
formul.elements("pass").Value = "miaou"
formul.submit
End Sub


Après la création de l'objet Application Internet Explorer (ie), on lui demande d'ouvrir la page dans laquelle de mot de passe doit être saisi par ie.Navigate(page à ouvrir).
Reste à trouver dans la page ainsi ouverte, l'objet correspondant au formulaire (c'est plus facile s'il possède un nom...), puis les différents éléments devant recevoir les login et mot de passe, avant de soumettre le formulaire (submit).


On peut obtenir un résultat analogue, quoiqu'un peu plus laborieux, en utilisant les API :
Avec les fonctions InternetOpenA, InternetOpenUrlA et InternetReadFile de wininet, on peut lire le code de la page html contenant l'invite de saisie du mot de passe.
En analysant le texte, on peut en extraire les données nécessaires à la transmission du mot de passe : noms des zones d'entrée des login et mot de passe, adresse de la page cible.
Il suffit alors d'ouvrir la page visée en utilisant FollowHyperlink.

Le fichier Excel proposé au téléchargement effectue ces opérations, restitue le nom de la page html visée puis l'ouvre (il ne prend pas en compte tous les cas, et ne pourra par exemple pas soumettre des formulaires html qui n'ont pas de mention "action=").

cliquez ici pour voir le texte de la macro
cliquez ici pour télécharger le fichier Excel (zippé)

Enfin, la solution la moins élégante, mais qui marche généralement quand toutes les autres ont échoué : sendkeys, qui simule la frappe de touches au clavier. Une méthode qui manque un peu de fiabilité parce que les touches sont envoyées en aveugle. Si la page internet est longue à afficher, la touche peut être envoyée sur une mauvaise page, voire sur une autre application, avec des résultats plutôt aléatoires.

Sub sendki()
ThisWorkbook.FollowHyperlink "http://jacxl.free.fr/cours_xl/passw.html", , True Application.Wait (Now + 7 / 3600 / 24)
For num = 1 To 10
sendkeys "+{TAB}", True
Next
sendkeys "toto", True
sendkeys "{TAB}", True
For num = 1 To 10
sendkeys "+{RIGHT}", True
Next
sendkeys "minou"
sendkeys "{TAB}", True
sendkeys "~"
End Sub


La macro ouvre la page contenant les zones de saisie par FollowHyperlink (on aurait aussi pu utiliser Shell).
On attend pendant plusieurs secondes (patience !) pour être sur (ou presque) que la page est bien affichée.
Puis avec les touches TAB, on se place sur les zones de saisie auxquelles on envoie login et mot de passe, avant de positionner (toujours avec TAB) le curseur sur le bouton auquel on envoie ENTER (~).

(voir d'autres techniques pour simuler la frappe d'une touche du clavier)