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 :

Interaction avec le web ne fonctionne plus


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut Interaction avec le web ne fonctionne plus
    Bonjour,
    J'ai un code que j'utilise depuis plusieurs années qui récupère une chaine Json donnée par une URL : https://www.bloomberg.com/markets2/a...mePeriod=daily

    La fonction suivante est supposée récupérer cette chaine

    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
    Function LectureGraphiqueJSON(ByVal vURL As String) As String
    ' permet de stocker dans une variable un texte renvoyé par une URL
     
        Dim http As MSXML2.XMLHTTP60
    ' Lecture du flux
        Set http = New MSXML2.XMLHTTP60
        http.Open "GET", vURL, False
    ' le 22/11/22, ajout de la ligne suivante
        http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        http.send
    ' En cas de réussite, le code renvoyé est 200
        If (http.Status <> 200) Then
            LectureGraphiqueJSON = ""
        Else
    ' Transformation du JSON en VBA
            LectureGraphiqueJSON = http.responseText
        End If
    ' On libère les objets
        Set http = Nothing
    End Function
    Jusqu'à la semaine dernière, tout fonctionnait correctement.
    Mais depuis, cette fonction me renvoie un texte HTML qui n'a rien à voir, un truc qui commence par "<!doctype html>
    <html lang="en">
    <head>
    <title>Bloomberg - Are you a robot?</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="robots" content="noindex">
    <style rel="stylesheet">
    "

    J'ai cru un moment que c'est le site web qui avait sécurisé son site pour empêcher que quelqu'un puisse interroger à distance via un code, mais mon code marche sur un autre ordinateur.

    La cause de mon problème n'est donc pas le code mais la config de mon ordinateur visiblement.
    Par exemple, je suis sous Win7 (alors que l'autre ordi est sous Win10 ou 11). Est-ce la cause ? Mais dans ce cas pourquoi ça marchait jusqu'à la semaine dernière ? Et existe-t-il une parade (un réglage à faire dans mon Win7 ou dans mon code) ?

    Je pense que le site a dû changer quelque chose, pas forcément de rédhibitoire, qui fait que mon code ne peut plus fonctionner tel quel sous Win7. C'est pour ça que je poste ce message dans ce forum car je ne suis pas très connaisseur du fonctionnement intrinsèque de ces instructions VBA. De mémoire, je crois que j'avais trouvé ce code en cherchant sur internet une fonction qui récupère une chaine donnée par une URL

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, essaie une autre bibliothèque pour récupérer la chaîne JSON, modifie ton code comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim http As WinHttp.WinHttpRequest
        Set http = New WinHttp.WinHttpRequest
    Si ce n'est pas déjà fait, active la référence Microsoft.WinHttp.WinHttpRequest.5.1 dans ton projet.

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 253
    Par défaut
    Hello,
    en tout cas chez moi j'avais le même problème et pourtant je suis sous Windows11, en rajoutant dans l'entête http le paramètre qui fait croire que c'est un navigateur qui fait la requête, cela fonctionne maintenant :
    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
    Function LectureGraphiqueJSON(ByVal vURL As String) As String
    ' permet de stocker dans une variable un texte renvoyé par une URL
        Dim http As Object
        Set http = CreateObject("MSXML2.XMLHTTP")
    ' Lecture du flux
        http.Open "GET", vURL, False
    ' le 22/11/22, ajout de la ligne suivante
        http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
        http.send
    ' En cas de réussite, le code renvoyé est 200
        If (http.Status <> 200) Then
            LectureGraphiqueJSON = ""
        Else
    ' Transformation du JSON en VBA
            LectureGraphiqueJSON = http.responseText
        End If
    ' On libère les objets
        Set http = Nothing
    End Function
    Ami calmant, J.P

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Citation Envoyé par Franc Voir le message
    Bonjour, essaie une autre bibliothèque pour récupérer la chaîne JSON, modifie ton code comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim http As WinHttp.WinHttpRequest
        Set http = New WinHttp.WinHttpRequest
    Si ce n'est pas déjà fait, active la référence Microsoft.WinHttp.WinHttpRequest.5.1 dans ton projet.
    Merci mais cela ne change rien, j'obtiens toujours une erreur "une erreur s'est produite lors de la connexion sécurisée"

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    @jurassic pork
    J'ai testé ton code, mais je bloque toujours sur l'instruction send.
    Est-ce parce que j'utilise encore Win 7 ?
    Tu es sûr que ça marche chez toi ?

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 253
    Par défaut
    Hello,
    Citation Envoyé par noftal Voir le message
    Tu es sûr que ça marche chez toi ?
    avec ce code sous Excel 2021 et windows 11 :
    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
    Sub TestHttp()
        Dim reponse As String
        reponse = LectureGraphiqueJSON("https://www.bloomberg.com/markets2/api/history/EACTCRE:FP/PX_LAST?timeframe=5_YEAR&period=daily&volumePeriod=daily")
        Debug.Print reponse
    End Sub
     
     
    Function LectureGraphiqueJSON(ByVal vURL As String) As String
    ' permet de stocker dans une variable un texte renvoyé par une URL
        Dim http As Object
        Set http = CreateObject("MSXML2.XMLHTTP")
    ' Lecture du flux
        http.Open "GET", vURL, False
    ' le 22/11/22, ajout de la ligne suivante
        http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
        http.send
    ' En cas de réussite, le code renvoyé est 200
        If (http.Status <> 200) Then
            LectureGraphiqueJSON = ""
        Else
    ' Transformation du JSON en VBA
            LectureGraphiqueJSON = http.responseText
        End If
    ' On libère les objets
        Set http = Nothing
    End Function
    voici ce que j'obtiens dans la fenêtre d'exécution VBA :
    [{"ticker":"EACTCRE:FP","previousClosingPriceOneTradingDayAgo":null,"openPrice":null,"range":null,"price":[{"dateTime":"2019-04-15","value":87.47},{"dateTime":"2019-04-16","value":87.65},{"dateTime":"2019-04-17","value":87.52},{"dateTime":"2019-04-18","value":87.75},{"dateTime":"2019-04-23","value":87.96},{"dateTime":"2019-04-24","value":88.19},{"dateTime":"2019-04-25","value":87.75},{"dateTime":"2019-04-26","value":88.11},{"dateTime":"2019-04-29","value":88.35},{"dateTime":"2019-04-30","value":88.25},{"dateTime":"2019-05-02","value":87.93},{"dateTime":"2019-05-03","value":87.98},{"dateTime":"2019-05-06","value":87.27},{"dateTime":"2019-05-07","value":86.72},{"dateTime":"2019-05-09","value":85.69},{"dateTime":"2019-05-10","value":85.81},{"dateTime":"2019-05-13","value":84.75},{"dateTime":"2019-05-14","value":85.68},{"dateTime":"2019-05-15","value":85.9},{"dateTime":"2019-05-16","value":86.63},{"dateTime":"2019-05-17","value":86.48},{"dateTime":"2019-05-20","value":85.61},{"dateTime":"2019-05-21","value":86.2
    2}, ...
    Ami calmant, J.P

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Ben chez moi, avec ce même code, response me renvoie un code HTML d'une page web qui corrrespond à la détection de robot et qui me demande de valider un captcha
    Moi je suis sur Windows 7 et Excel 2007 (je sais c'est vieux, mais toutes ces instructions existaient déjà)
    Cela montre que l'environnement informatique y est pour quelque chose.
    Mais cela, je l'avait identifié dans mon post initial puisque j'avais testé mon code sur un autre ordi plus récent (Win 11) équipé de la même version d'Excel

  8. #8
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 210
    Par défaut re:
    Bonjour
    le meilleur moyen d'arriver a un bon résultat et d'imiter la requête
    tel que le ferait votre navigateur
    pour ma part j'utilise à 90% firefox
    j'ai donc ouvert une page blanche "about;blank"
    lancer F2 et reseau
    et coller l'url
    resultat

    Nom : Capture.JPG
Affichages : 351
Taille : 116,6 Ko

    alors quelque fois ça fonctionne sans header de requête mais attention au bout d'un moment si la requête n'est pas conforme le site vous rejette pendant un moment qui peut varier selon les sites
    parfois même le fetch est obligatoire
    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
    Sub TestHttp()
        Dim reponse As String
        URL = "https://www.bloomberg.com/markets2/api/history/EACTCRE:FP/PX_LAST?timeframe=5_YEAR&period=daily&volumePeriod=daily"
        reponse = LectureGraphiqueJSON(URL)
        Debug.Print reponse
    End Sub
     
     
    Function LectureGraphiqueJSON(ByVal vURL As String) As String
    ' permet de stocker dans une variable un texte renvoyé par une URL
        Dim http As Object
        Set http = CreateObject("MSXML2.XMLHTTP")
        ' Lecture du flux
        http.Open "GET", vURL, False
        ' le 22/11/22, ajout de la ligne suivante
        http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0"
        http.setRequestHeader "Host", "www.bloomberg.com"
        http.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
        http.setRequestHeader "Accept-Language", "fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3"
        http.setRequestHeader "Accept -Encoding", "gzip , deflate, br"
        http.setRequestHeader "Connection", "keep -alive"
        'http.setRequestHeader "Upgrade-Insecure-Requests", "1"
        'http.setRequestHeader "Sec -Fetch - Dest", "document"
        'http.setRequestHeader "Sec -Fetch - Mode", "navigate"
        ''http.setRequestHeader "Sec -Fetch - Site", "none"
        'http.setRequestHeader "Sec -Fetch - User", "Print 1"
     
     
     
        http.send
        ' En cas de réussite, le code renvoyé est 200
        If (http.Status <> 200) Then
            LectureGraphiqueJSON = ""
        Else
            ' Transformation du JSON en VBA
            LectureGraphiqueJSON = http.responseText
        End If
        ' On libère les objets
        Set http = Nothing
    End Function

  9. #9
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Bonjour,
    Oui j'ai testé aussi cette méthode qui consiste à ajouter les headers dont on obtient la liste grâce à l'outil de développement Web de firefox (ou de Chrome)
    Mais ça ne marche pas non plus.
    Tu verra que http.status obtenu est 400

  10. #10
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 210
    Par défaut re
    Bonjour

    dans cas là tu fait partie des malheureux sur W10 qui ont laissé la mise à jour ( il y a quelque temps déjà) shunter les librairie IE
    donc tout les object xml , html , et même le scripcontrol sont absents ou inhibés dans ton exploitation
    et là mon pauvre ami je ne vois pas de solution
    cette mise a jour un peu plus tard c'est transformée en une bascule sur EDGE quand on sollicitait IE
    mais ceux qui on eu la première c'est cuit il n'y a pas eu de rétropédalage sur ce coup

  11. #11
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Je suis sous Win7, donc a priori je ne suis pas dans ce cas là (d'ailleurs je n'ai même pas Edge installé)

  12. #12
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 210
    Par défaut re
    re
    bonsoir
    avez vous fait ce que j'ai dis précédemment
    c'est à dire aller dans la console de votre explorateur
    et enregistrer la requête pour reproduire le user-agent du header de requête
    chez moi c'est ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0"
    chez vous ça sera peut être différent
    surtout que Google et Firefox ne sont plus mis à jour pour windows 7 et pour peu que vous ayez un autre explorateur du genre Opera qui fonctionne à peu près bien sur W 7, les protocoles sont différents

  13. #13
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Oui, c'est ce que j'ai fait. voici mon code :

    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
    Function LectureGraphiqueJSON(ByVal vURL As String) As String
    ' permet de stocker dans une variable un texte renvoyé par une URL
        Dim responseText As String
        Dim xmlHttp As MSXML2.XMLHTTP60
     
        ' Créer un objet XMLHTTP
        Set xmlHttp = New MSXML2.XMLHTTP60
     
        ' Envoyer une requête GET
        With xmlHttp
            .Open "GET", vURL, False
            .setRequestHeader "upgrade-insecure-requests", "1"
            .setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0"
            .setRequestHeader "accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
            .setRequestHeader "sec-fetch-site", "none"
            .setRequestHeader "sec-fetch-mode", "navigate"
            .setRequestHeader "sec-fetch-user", "?1"
            .setRequestHeader "sec-fetch-dest", "document"
            .setRequestHeader "Accept-Encoding", "gzip, deflate, br"
            .setRequestHeader "Connection", "keep-alive"
            .setRequestHeader "Cookie", "exp_pref=EUR; country_code=FR; seen_uk=1"
            .setRequestHeader "If-None-Match", """W/""c560-g035Y4OcmGYoK98v4m2sZNYuus4"""
            .setRequestHeader "Host", "www.bloomberg.com"
            .setRequestHeader "accept-language", "fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3"
            .send
            responseText = .responseText
        End With
     
        ' Afficher la réponse dans la fenêtre de l'explorateur VBA
        Debug.Print responseText
     
        ' Libérer la mémoire
        Set xmlHttp = Nothing
     
     
        LectureGraphiqueJSON = responseText
    End Function
    J'ai l'impression qu'il manque une histoire de cookie (c'est l'ultime différence que j'imagine entre mon code et ce qui se passe dans un vrai navigateur)

  14. #14
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 253
    Par défaut
    Hello,
    voir cet article :
    XMLHttpRequest setRequestHeader method and Cookies

    ami calmant, J.P

  15. #15
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 210
    Par défaut re
    re
    bonjour à tous
    de toute façons de plus en plus ça va dérailler ce truc
    les objets requête pour VBA ne sont plus mis à jour
    il ne restera plus que PQ
    aujourd'hui par exemple va savoir pourquoi la requête n’ aboutie pas avec les entêtes
    je shunte tout et ça repart
    Nom : Capture.JPG
Affichages : 312
Taille : 197,1 Ko

  16. #16
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Comme tu dis, un coup ça marche (et même plusieurs fois d'affilée) un coup il me prend pour un robot et ça ne marche pas.
    Par curiosité, j'ai testé le même code en Python et ça marche tout le temps

  17. #17
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Salut,

    En résumé,
    tu te heurtes aux défenses du serveur web.
    Il n'y a pas grand chose à faire:
    Toi: Petit développeur <===> Eux: Développeurs surarmés

    A mon avis, le meilleur moyen de "leurrer" le serveur, est de ne pas le leurrer, en d'autres termes: piloter un navigateur Web.
    Avec les navigateurs modernes, tu peux passer par Selenium Web Driver.
    Ou CDP (ChromeDevProtocol): https://github.com/PerditionC/VBAChromeDevProtocol

  18. #18
    Membre éclairé
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Par défaut
    Ou bien coder en python ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/08/2015, 20h52
  2. Réponses: 2
    Dernier message: 25/08/2015, 12h01
  3. Réponses: 13
    Dernier message: 18/07/2010, 19h10
  4. Réponses: 6
    Dernier message: 02/02/2010, 09h17
  5. Réponses: 5
    Dernier message: 01/12/2009, 00h05

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