IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Excel QueryTables - Requête sur une URL protégée - Est-ce possible ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut Excel QueryTables - Requête sur une URL protégée - Est-ce possible ?
    Bonjour à tous

    Je suis actuellement occupé à mettre à jour une application VBA Excel que j'ai développé et qui fait entre autres des requêtes vers des APIs et donc, des appels à des URL telles que https://monsite/api/clients (pour avoir un array avec tous mes clients) p.ex.

    Le code VBA est fonctionnel depuis six mois. Tout baigne ... toutefois, je viens d'ajouter une protection HTTP sur les APIs : quand on accède à l'URL, un popup s'affiche pour demander un login et un mot de passe. Ce popup, c'est celui du navigateur car la protection en place est faite au travers d'une protection "HTTP Basic Authentication" (en terme Apache: j'ai mis un fichier .htpasswd dans mon projet PHP).

    Nom : auth.png
Affichages : 838
Taille : 62,5 Ko

    Et là, mon code ci-dessous ne fonctionne plus car il faut pouvoir transmettre à Excel le login et le mot de passe à utiliser.

    Le code fonctionnel (avant protection):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With ActiveSheet.QueryTables.Add(Connection:="URL;https://UNE_URL_VALIDE", Destination:=Range("a1"))
        .BackgroundQuery = True
        .TablesOnlyFromHTML = True
        .Refresh BackgroundQuery:=False
        .SaveData = True
    End With
    Pour info, en VBA pur, je peux construire une requête HTTP GET, transmettre dans les headers de mon appel le login et le mot de passe et j'ai bien mon résultat attendu dans le "body" de la réponse.

    Le truc, c'est que j'aimerais continuer à utiliser la puissance des QueryTables d'Excel et je souhaiterai conserver mon code où j'utilise des QueryTables.

    Mes premières lectures semblent indiquer que QueryTable ne gère pas l'authentication. Avez-vous une quelconque expérience à ce sujet ?

    Merci à tous.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  2. #2
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    La nuit portant conseil et ne pouvant trop attendre une solution, j'ai mis en place l'astuce ci-dessous.

    En quelques mots :

    * Dans ma solution Excel, j'utilise VBA-Web (https://github.com/VBA-tools/VBA-Web) qui permet de simplifier les appels à des URLs (il vous faudra donc importer les différentes classes si ma solution vous intéresse)
    * Je fais un appel à WebClient pour récupérer la réponse de mon API (ici, pour ce besoin précis, l'API retourne un code HTML avec un <table>...</table>)
    * Lors de l'initialisation, je lui passe entre autres le login et le mot de passe HTTP Basic Auth
    * Si l'appel (Execute) est OK, ma réponse HTML est alors sauvée dans un fichier texte sur mon disque au format UTF-8 afin de correctement gérer les accents
    * Mon QueryTable ne fait donc plus un appel URL (ce qui était mon problème évoqué plus haut) mais FILE et là, je vais rechercher mon fichier temporaire.
    * Finalement, une fois mon tableau importé dans ma sheet Excel, je supprime le fichier devenu inutile

    Remarques:
    * le code ci-dessous a été simplifié; mon code réel est plus complexe mais j'espère que ce code-là est bel et bien fonctionnel et peut servir d'exemple
    * cFile est une classe que j'utilise et où j'ai regroupé, sous forme de librairie, plusieurs fonctionnalités de gestion de fichiers; il faudra adapter cette partie

    Bonne journée à tous.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    ' WebClient, HttpBasicAuthenticator, WebRequest et Response
    ' sont des classes qu'on trouve ici : https://github.com/VBA-tools/VBA-Web
    '
    ' Note:
    ' cFile plus bas est une classe que j'ai créé et qui permet de faire plusieurs 
    ' opérations sur des fichiers (créer, supprimer, renommer, ...). Il faudra adapter
    ' les appels à votre situation
     
     
    Dim Client As New WebClient
    Dim Auth As New HttpBasicAuthenticator
    Dim Request As New WebRequest
    Dim Response As WebResponse
    Dim sFileName As String
    Dim qt As QueryTable
     
        Auth.Setup "Admin", "MonSuperMotDePasseMagique"
        Set Client.Authenticator = Auth
     
        Client.BaseUrl = "https://...."
     
        Request.Method = WebMethod.HttpGet
        Request.Format = PlainText
        Request.Resource = "/api/clients"
     
        Set Response = Client.Execute(Request)
     
     
        If Response.StatusCode = WebStatusCode.Ok Then
     
            ' cFile.CreateTemp est une fonction qui va générer un fichier texte
            ' encodé en UTF-8
            sFileName = cFile.CreateTemp(Response.Content, "UTF-8")
     
            Set qt = ActiveSheet.QueryTables.Add( _
                Connection:="URL;file:///" & Replace(sFileName, "\", "//"), _
                Destination:=ActiveSheet.Cells(1, 1) _
            )
     
            qt.Refresh BackgroundQuery:=False
     
            ' Suppression du fichier temporaire qui n'est plus nécessaire
            cFile.Delete(sFileName)
     
        End If
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Deux critères "contraires" sur une mème ligne: est-ce possible?
    Par Qcabel Lehcim dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/12/2018, 15h13
  2. Intercepter la requête d'une URL sur le LAN
    Par campeaux dans le forum Réseaux
    Réponses: 0
    Dernier message: 04/10/2017, 11h12
  3. Requête sur une base access dans excel
    Par adrien.gendre dans le forum Excel
    Réponses: 3
    Dernier message: 23/07/2007, 12h06
  4. Réponses: 8
    Dernier message: 30/01/2007, 23h20
  5. [ADO][excel] clé primaire sur une base excel
    Par mandale dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/09/2004, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo