Ouvrir une page HTML avec mot de passe depuis Access
Dans l’article Piloter Internet Explorer depuis Access, vous avez vu comment ouvrir une page Web en VBA. La technique devient plus intéressante lorsqu’on doit manipuler le code HTML de la page affichée.
Dans ce qui suit, nous allons voir comment nous connecter à la section privée d’un site Web, en remplissant automatiquement les identifiant (login) et mot de passe d’un formulaire HTML.
Etape 1 : décrypter le formulaire d’identification
Le formulaire d’identification est la portion de page HTML qui vous demande votre nom (identifiant ou login), et votre mot de passe. Un bouton permet ensuite d’expédier ces informations vers une page ou un script de traitement, qui vérifie si les informations fournies sont correctes. Cette page de traitement est appelée « l’action » en HTML.
Pour atteindre notre objectif, il faut donc connaître :
- L’adresse (ou URL) de la page HTML qui contient le formulaire d’identification.
- L’action du formulaire, dans la page HTML.
- Le nom du champ Identifiant.
- Le nom du champ Mot de passe.
Je suppose que vous connaissez l’URL de la page HTML de connexion. Pour obtenir les trois autres informations :
- Affichez la page de connexion dans votre navigateur.
- Cliquez sur la page du bouton droit, et choisissez Afficher la source (ou Code source de la page, sous Firefox).
- Faites un Edition / Rechercher (ou
CTRL
+F
). - Cherchez une portion de HTML qui démarre par
<form
(en majuscules ou minuscules, ça n’a pas d’importance).
Le formulaire complet est obligatoirement compris entre des balises<form ...>
et</form>
. - La balise d’ouverture du formulaire s’écrit sous cette forme :
<form action="xyz.html" method="post">
Notez l’action (ici :xyz.html
, mais ça peut être n’importe quoi d’autre !). Vous avez votre première information. - Quelque part entre les balises
<form>
et</form>
doivent se trouver les champs de saisie. Ce sont des balises de la forme :
<input type="..." name="...">
Les 2 champs de saisie qui nous intéressent peuvent par exemple s’écrire :
<input type="text" name="username">
<input type="password" name="password">
Notez les 2 attributsname
(ici :username
etpassword
). Vous avez vos 2 autres informations !
Etape 2 : le code VBA
On peut maintenant passer à Access…
- Ouvrez votre base de données et ajoutez-y un module standard.
- Recopiez tout ce qui suit, tel quel, dans le module :
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Type AuthFormDef ' Adresse à atteindre URL As String ' Action du formulaire d'identification FormAction As String ' Nom du champ qui demande le nom d'utilisateur UserField As String ' Nom du champ qui demande le mot de passe PasswordField As String ' Valeur du champ Utilisateur UserValue As String ' Valeur du champ Mot de passe PasswordValue As String End Type ' --- ' CONNEXION A INTERNET EXPLORER AVEC IDENTIFIANT / MOT DE PASSE ' --- Function ConnexionIE(afd As AuthFormDef) As Boolean Dim ie As Object Dim doc As MSHTML.HTMLDocument Dim frm As MSHTML.HTMLFormElement Dim blnFormOK As Boolean ' Démarrer et afficher Internet Explorer On Error GoTo ConnexionIEErr Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ' Naviguer vers la page et attendre qu'elle soit chargée ie.navigate afd.URL While ie.Busy DoEvents Wend ' Récupérer l'objet Document affiché Set doc = ie.Document ' Identifier le formulaire demandé blnFormOK = False For Each frm In doc.Forms If frm.Action = afd.FormAction Then blnFormOK = True ' Trouver et renseigner les champs Identifiant/Mot de passe ' du formulaire Dim obj As Object For Each obj In frm.elements If obj.Name = afd.UserField Then obj.Value = afd.UserValue If obj.Name = afd.PasswordField Then obj.Value = afd.PasswordValue Next ' Forcer l'envoi du formulaire frm.submit ConnexionIE = True End If Next ' Valeur de retour ConnexionIE = blnFormOK Exit Function ConnexionIEErr: MsgBox "Erreur : " & Err.Number & vbCrLf _ & Err.Description, vbExclamation ConnexionIE = False Exit Function End Function |
Le programme est composé :
- D’un type de données
AuthFormDef
qui devrait simplifier la description du formulaire et le passage de paramètres. - D’une fonction
ConnexionIE
qui gère la connexion proprement dite.
elements
pose problème. D’où le hack…Etape 3 : tester le code
Voici un autre petit programme, que vous ajoutez dans votre module, et qui va permettre de lancer votre connexion proprement dite :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
' --- ' TEST DU FORMULAIRE D'IDENTIFICATION ' --- Sub TestConnexionIE() Dim afd As AuthFormDef ' Paramètres de la connexion With afd .URL = "http://www.votre-site.com/formulaire.php" .FormAction = "http://www.votre-site.com/identification.php" .UserField = "username" .PasswordField = "password" .UserValue = "votre_identifiant" .PasswordValue = "votre_mot_de_passe" End With ' Lancer la connexion If ConnexionIE(afd) Then MsgBox "Connexion établie !", vbInformation Else MsgBox "Echec de la connexion", vbExclamation End If End Sub |
Comme vous le voyez, j’utilise la structure AuthFormDef
pour renseigner tous les paramètres du formulaire à remplir :
URL
L’adresse (URL) où se trouve le formulaire sur le Web.FormAction
L’action du formulaire, que vous avez repérée plus tôt, et qui permet de trouver le formulaire dans la page Web.UserField
Le nom du champ Identifiant.PasswordField
Le nom du champ Mot de passe.UserValue
La valeur du champ Identifiant (votre identifiant à vous !)PasswordValue
La valeur du champ Mot de passe (votre mot de passe !).
Il ne reste plus qu’à appeler la fonction ConnexionIE
, en lui transmettant la structure. Cette fonction renvoie True
si la connexion s’est bien passée, et False
sinon.
Merci pour cet excellent article, présenté brillamment du point de vue pédagogique.
En revanche, est-il possible de l’appliquer de façon différente, soit avec Firefox — j’arrive à ouvrir la page voulue dans FF — à partir d’Excel.
Mais je me heurte à l’accès des champs (dont je connais les noms et que j’ouvre correctement en IE).
Merci d’avance de votre aide.
Erik
Merci pour le retour. 🙂
Le problème de Firefox (dans ce scénario précis ; sinon c’est un excellent navigateur) est qu’il n’est pas programmable à distance en VBA (à ma connaissance). C’est pour cette raison que j’utilise un objet « InternetExplorer.Application ».
Il y a aurait une autre approche (traitée dans les articles sur RSS) qui consisterait à passer par la bibliothèque ServerXMLHTTP. L’approche est de plus bas niveau, mais justement, elle permet de travailler sur les échanges de pures données. Ça reste une bibliothèque Microsoft. 😉
J’ai testé l’ouverture de la page html avec mot de passe depuis Access: super!
Je voudrais aller plus loin, mais je ne sais pas comment faire. En fait, je voudrais pouvoir lancer automatiquement d’autres actions consécutives à l’ouverture de cette page.
Mon cas précis, c’est pouvoir lancer l’importation d’un fichier csv dans mes contacts Gmail. Le fichier est sur mon disque dur, mais il me manque les maillons suivants: cliquer sur le bouton « Plus » sur la page Gmail, puis « Importer », sélectionner le bon fichier sur le disque, et valider.
Quelqu’un a une bonne idée? Ou bien cela peut-il faire l’objet d’un nouveau tutoriel?
Ce n’est effectivement pas si simple : il y a une succession de pages/formulaires à valider en séquence, et reproduire ce type de séquence n’est sans doute pas une bonne approche (on est très dépendant de l’interface graphique). Je serais plus tenté par la Google Contacts API. Ça demande aussi de la mise en place, mais c’est plus « carré ».
Vincent > Je n’ai pas testé sur IE10, mais au cas où : à quel endroit est-ce que ça plante ?
Est-ce que ça peut venir d’un problème de références ?
Bonjour Hervé…
J.utilise depuis un moment cette méthode sans soucis…. Merci.
Par contre en passant sur ie10 j ai des erreurs et ça ne fonctionne plus… J ai cherché !
Sans trouver..
Aurais-tu des idées?
J ai downgradé a ie9 mais il plante Souvent depuis pour pas grand choses…
Merci.
Vincent.
matt76 > Les infos sont disponibles dans le code source de la page dont tu parles (les champs, par exemple, s’appellent
user_name
etpwd_field
). Maintenant :Bonjour,
je suis étudiant et j’ai suivi votre tuto pour accéder a des pages sécuriser d’un site internet, mais rien n’y fait, je n’arrive pas a trouver dans le code les infos !
voila le site en question: http://muse.jhu.edu/books/978276051…
c’est pour accéder a des cours d’hydraulique. quelqu’un pourrais m’aider ?
cordialement, matthieu
lakhdar16 > C’est un peu compliqué de répondre dans ce commentaire, mais j’ai prévu une série d’articles qui tournent autour du sujet. Voir notamment la série autour des flux RSS, et l’article sur le transfert de données via HTTP (c’est un peu dans l’autre sens, il ne s’agit pas de lecture mais d’envoi de données, mais les techniques sont les mêmes).
Bonjour,
comment Ouvrir une page HTML avec mot de passe depuis Access et atteindre une rubrique précisée ou faire des extractions par exemple. avec le même code. merci
@lahlou La procédure d’identification, en PHP, demande un peu de mise en place. Il faut un hébergement PHP, une base de données – souvent MySQL dans ce cas – pour stocker les utilisateurs (et leur mot de passe crypté), un formulaire de saisie et un bout de code PHP pour récupérer les données du formulaires, les nettoyer, les vérifier par rapport à la base de données. Si la combinaison utilisateur+mot de passe existe dans la base de données, l’utilisateur est considéré comme identifié (et dans ce cas, on peut passer par des cookies ou des sessions PHP pour mémoriser cet état temporaire) ; sinon, l’identification échoue.
Comme ce blog est plutôt orienté Access, je n’ai pas le temps d’en dire plus. Dans l’article, je me place du côté « accès à la section privée du site », pas du côté « mise en place de la partie privée ». Par contre, une recherche Google sur le sujet devrait te donner d’autres sites qui en parlent en détail. Bons tests !
Bonjour,
je m’excuse, je souhaiterai savoir comment on crée le fichier identification.php et surtout avec quel logiciel.
Si vous avez un petit tutorial à me présenter, je vous remercie infiniment.
Merci