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

VBScript Discussion :

VBA API : code source récupéré différent de celui de la page web souhaitée.


Sujet :

VBScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Points : 14
    Points
    14
    Par défaut VBA API : code source récupéré différent de celui de la page web souhaitée.
    Bonjour à tous,

    J'ai une colle à soumettre à votre expertise !!

    Voila. Si vous cliquez sur ce lien, votre navigateur préféré vous affiche la recherche dont je souhaite récupérer le code source dans un fichier.txt.

    Maintenant, lorsque l'url de cette recherche est incluse dans la macro ci-dessous, le code source que je récupère ne correspond en rien à la page que vous venez d'afficher dans votre navigateur ! J'obtiens le code source de celle-ci...une recherche générique sur Paris

    J'ai tout essayé : modification de l'Url, temporisation entre les différentes étapes, tentative (peut-être pas très heureuse) de jouer avec les constantes de internetopenurl etc..., danser tout nu devant l'ordi...rien n'y fait.

    Est-ce une protection sur le site, une redirection...? En tous les cas si quelqu'un à un éclaire de génie...je suis preneur !!!

    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
    Private Declare Function OuvreInternet Lib "wininet" _
         Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, _
         ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    Private Declare Function fermeInternet Lib "wininet" _
         Alias "InternetCloseHandle" (ByVal hInet As Long) As Integer
    Private Declare Function code_page Lib "wininet" _
         Alias "InternetReadFile" (ByVal hFile As Long, ByVal sBuffer As String, _
         ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
    Private Declare Function Ouvrepage Lib "wininet" _
         Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal lpszUrl As String, _
         ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, _
         ByVal dwContext As Long) As Long
     
    Sub lit_code_page_Web()
    Dim texte_code As String * 1024
     
    page_Web_à_lire = "http://www.trivago.fr/?sQuery={toDealsOnly=false&bDispMoreFilter=false&iSlideOutItem=99875&aDateRange%5Barr%5D=2015-03-15&aDateRange%5Bdep%5D=2015-03-16&aCategoryRange=0%2C1%2C2%2C3%2C4%2C5&iRoomType=7&sOrderBy=distance%20asc&aPartner=&aOverallLiking=1%2C2%2C3%2C4%2C5&iGeoDistanceLimit=500&iOffset=0&iLimit=25&iIncludeAll=0&bTopDealsOnly=false&iViewType=0&aPriceRange%5Bfrom%5D=0&aPriceRange%5Bto%5D=0&iGeoDistanceItem=99875&bIsSeoPage=false&mgo=false&bHotelTestContext=false&th=false&aHotelTestClassifier=&bSharedRooms=false&bIsTotalPrice=false&bIsSitemap=false&rp=&sSemKeywordInfo=&ww=false&}&cip=123050002010101"
    internet = OuvreInternet("toto", 0, vbNullString, vbNullString, 0) 'ouvre Internet
    URL = Ouvrepage(internet, page_Web_à_lire, vbNullString, _
        0, &H400000 Or &H4000000 Or &H80000000, 0) 'ouvre la page Web
    'lecture du code de la page par paquet de 1024 caractères
     
    txt = ""
    nb_caractères_lus = 1
    Do While nb_caractères_lus > 0
    'lit 1024 caractères et les copie dans texte_code
    code_page URL, texte_code, 1024, nb_caractères_lus
    txt = txt & Left(texte_code, nb_caractères_lus)
    Loop 'fait entrer le code source de la page recherchée dans
     
    Open "C:\toto.txt" For Output As #1
    Write #1, txt
    Close #1
     
    End sub

    Merci d'avance pour votre précieuse aide.
    Bien à vous

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    snif, snif ...

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    bonjour,
    cet exemple de code n'est pas du vbscript mais du vba (voir le sous-forum Microsoft Office)
    en tout état de cause, Internet Explorer ne sait pas exécuter le vba
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 180
    Points
    17 180
    Par défaut
    Salut


    Étant dans le forum VBScript, n'est il pas possible d’intégrer ce code dans VBA ?
    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
    Dim IE, MaPageHtml
    Dim TxtRecupereR
     
    Set IE = CreateObject("InternetExplorer.Application")
      'IE.Visible = True
    IE.Navigate ("http://www.trivago.fr/?sQuery={toDealsOnly=false&bDispMoreFilter=false&iSlideOutItem=99875&aDateRange%5Barr%5D=2015-03-15&aDateRange%5Bdep%5D=2015-03-16&aCategoryRange=0%2C1%2C2%2C3%2C4%2C5&iRoomType=7&sOrderBy=distance%20asc&aPartner=&aOverallLiking=1%2C2%2C3%2C4%2C5&iGeoDistanceLimit=500&iOffset=0&iLimit=25&iIncludeAll=0&bTopDealsOnly=false&iViewType=0&aPriceRange%5Bfrom%5D=0&aPriceRange%5Bto%5D=0&iGeoDistanceItem=99875&bIsSeoPage=false&mgo=false&bHotelTestContext=false&th=false&aHotelTestClassifier=&bSharedRooms=false&bIsTotalPrice=false&bIsSitemap=false&rp=&sSemKeywordInfo=&ww=false&}&cip=123050002010101")
      'Attendre la fin du chargement
    Do Until IE.ReadyState = 4
        Wscript.Sleep 20
    Loop
     
    Set MaPageHtml = IE.document
    TxtRecupereR = MaPageHtml.Body.innerHTML
    IE.Quit
    Set MaPageHtml = Nothing
    Set IE = Nothing
    'enregistrer dans toto.txt le contenu de la variable TxtRecupereR
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Bonjour ;
    Étant dans le forum VBScript, n'est il pas possible d’intégrer ce code dans VBA ?
    Si; mais en déclarant Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long).
    puis en remplaçant (linge 9) WScript.Sleep 20 par Sleep 20.

    Somme toute, WScript(CScript aussi) n'est pas reconnu par VB6 (VBA) et inférieurs
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    Me voilà de retour de congés

    Merci à tous pour votre participation !! :D

    Malheureusement, je ne vous aurez pas dérangé pour obtenir un code passant par IE car d'une part j'ai déjà utilisé ce type de macro jadis et d'autre part mon IE ne fonctionne vraiment pas bien. Par exemple, j'ai beau marquer .visible = false...ça apparait quand même, certaines sites apparaissent mal sous mon IE et bien sur l'IE d'un autre pc !! Enfin bref...

    De plus, comparativement, passer par IE est plus long. En utilisant la macro API sur laquelle je travaille, j'obtiens un fichier .txt contenant le code source complet de la page en moins de deux secondes alors que la page IE n'a pas encore fini de s'afficher dans le même laps de temps !!


    Pour moi, ces macros API sont une belle découverte. Le seul hic, c'est le problème évoqué dans ce post.

    faut-il déplacer ce sujet vers le forum VBA ? Peut-on le faire de façon automatique et complet ?

    Merci d'avance pour votre aide.
    Bien à vous

  7. #7
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    En relisant le code du 1er post, j'ai constaté que les déclarations de quelques fonctions et procédures(Sub) ne correspondent pas à quelque chose de véridique.
    Ainsi, OuvreInternet, Ouvrepage, FermeInternet , Code_page ...ne peuvent d'aucune façon être des déclarations provenant d'une DLL.

    Avec Dependancy walker(Depends.exe) , rien de tel ne sort de Wininet.dll
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    Merci l_autodidacte pour vous être replonger sur mon problème.

    OuvreInternet, Ouvrepage, FermeInternet , Code_page ...ne peuvent d'aucune façon être des déclarations provenant d'une DLL
    Je ne suis vraiment pas un expert mais ces noms OuvreInternet, Ouvrepage etc... ne sont-ils pas juste des noms "compréhensibles" auxquels on affecte les fonctions InternetOpenA, InternetReadFile, InternetOpenUrlA ??

    Comment les auriez-vous déclarées ?

    J'utilise pourtant cette macro, avec succès, sur un autre site et c'est pour cela que j'évoque le fait que le problème vient du site visé (redirection, protection etc...)

  9. #9
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Bonjour
    En essayant ton code avec VB6, eh bien il marche bien et je récupère le code de la page demandée.

    Pour comprendre, j'ai dû essayer d'autres exemples d'APIs Windows et le résultat est le suivant :
    1 - Si la fonction ou la procédure possède un alias (et/ou point d'entrée), le renommage de ladite fonction(procédure) n'influe pas sur le fonctionnement.
    2 - Si elle n'en possède pas, une erreur se produit si on lui donne un nom autre que le sien initialement existant dans la DLL.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 31
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je ne suis vraiment pas un spécialiste et lorsque je vois tous les langages de programmation évoqués sur developpez.com je me demande si je ne commets pas une erreur.

    Je travaille sur le Visual Basic d'Excel qui est la version 6.3. Lorsque vous dites VB6, parle-t-on de la même chose ou suis-je à coté de la plaque ??

    Pour comprendre, j'ai dû essayer d'autres exemples d'APIs Windows et le résultat est le suivant :
    1 - Si la fonction ou la procédure possède un alias (et/ou point d'entrée), le renommage de ladite fonction(procédure) n'influe pas sur le fonctionnement.
    2 - Si elle n'en possède pas, une erreur se produit si on lui donne un nom autre que le sien initialement existant dans la DLL.
    Ca veut dire que le code que je vous ai soumis est correct, non ?

  11. #11
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Je travaille sur le Visual Basic d'Excel qui est la version 6.3. Lorsque vous dites VB6, parle-t-on de la même chose ou suis-je à coté de la plaque ??
    Ce que tu appelles Visual Basic d'Excel c'est connu sous le nom VBA(Visual Basic for Application) intégré aux différents éditeurs(Excel, Word, Powerpoint ....) de MS Office avec lesquels on crée des macros mais pas de projets autonomes.
    VB6(et versions inférieures) est un éditeur complet et autonome permettant de créer des projets exécutables
    Ca veut dire que le code que je vous ai soumis est correct, non ?
    Je l'ai bien dit dans mon dernier poste : le code marche correctement car les fonctions évoquées ont chacune un alias, qui semble être ciblé par le compilateur sans se soucier du nom de la fonction elle-même.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Citation Envoyé par cabrettologue Voir le message
    Je ne suis vraiment pas un expert mais ces noms OuvreInternet, Ouvrepage etc... ne sont-ils pas juste des noms "compréhensibles" auxquels on affecte les fonctions InternetOpenA, InternetReadFile, InternetOpenUrlA ??

    Comment les auriez-vous déclarées ?

    J'utilise pourtant cette macro, avec succès, sur un autre site et c'est pour cela que j'évoque le fait que le problème vient du site visé (redirection, protection etc...)
    salut Cabrettologue,

    1 éviter d'utiliser les API qui finissent par "A" ce sont les API ANSI donc pour Internet qui est majoritairement unicode ça risque de ne pas marcher
    Donc il faut utiliser InternetOpenW plutôt que InternetOpenA


    2 si tu veux faire des connections Internet tu devras interroger à intervalles régulier la connection que tu as établies donc prendre un timer ou au mieux étudier une solution avec du multithreading.
    Mais si on début le multithreading ça risque d'être un peu trop pointu pour un débutant.
    Le multithreading c'est une logique qui consiste à exécuter des programmes en parallèle de ton programme principal mais ces programmes/processus appartiennent au même programme principal

Discussions similaires

  1. Réponses: 36
    Dernier message: 25/08/2014, 12h17
  2. debug jsf-api code source
    Par telendri dans le forum JSF
    Réponses: 0
    Dernier message: 02/08/2014, 15h58
  3. [XL-2007] VBA Excel : Comment executer un script .aspx inclus dans une page Web
    Par BrunoZZZ dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/08/2011, 12h09
  4. [Toutes versions] Vba html code source
    Par jeanne2 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/06/2010, 15h10
  5. Réponses: 5
    Dernier message: 11/02/2009, 11h57

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