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

VB.NET Discussion :

Interaction Site Web/VB.Net


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Interaction Site Web/VB.Net
    Bonjour à tous,
    Je vous expose tout de suite mon projet afin de clarifier au maximum les choses et de simplifier votre compréhension de mon problème
    J'essaie de développer une sorte de "bot" pour Pinterest, assez simple qui "re-pinnerai" les images automatiquement.
    Pour ceux qui ne sont pas familier avec ce site, il s'agit d'un réseau social orienté images, images que les utilisateurs "pin", équivalent du "partage" Facebook.
    J'étais donc à la recherche de la meilleur façon de faire interagir mon programme avec le site web et j'ai fini par trouver la méthode du getElementById.
    Cette méthode me semble la plus simple mais dés le début, je me trouve face à un petit problème
    Si j'ai bien compris, cette méthode utilise le "name = ..." plutôt que "id = ..." ? Voilà ce que cela donne pour la phase de login qui se fait ici.
    Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WebBrowser1.Navigate("www.pinterest.com/login")
     WebBrowser1.Document.GetElementById("username_or_email").SetAttribute("value", TextBox1.Text)
     WebBrowser1.Document.GetElementById("password").SetAttribute("value", TextBox2.Text)
     WebBrowser1.Document.GetElementById("problème ici :(").InvokeMember("click")
    Le problème se situe au niveau du bouton : en fouillant dans le code source, je ne parviens pas à trouver le "name = ..." il y a certes un "id=..." mais je ne semble pas pourvoir l'utiliser avec cette méthode. En effet, lorsque j'essaie de mettre en argument "Button-9" de "id= Button-9", l'exception suivante apparait : System.NullReferenceException
    Voici le code source se trouvant aux environs de la login form :
    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
     
                            <ul class="userLogin">
                    <li class="loginUsername">
                        <input autofocus class="email" 
                            type="email" 
                            name="username_or_email" 
                            placeholder="E-mail" 
                            autocomplete="on"/>
                                        </li>
                    <li class="loginPassword">
                        <input type="password" 
                            name="password" 
                            placeholder="Mot de passe"/>
                    </li>
                </ul>
                        <div class="businessHint">
            Vous êtes un professionnel ? <a href="http://www.pinterest.com/_/_/business"
     
                    target="_blank"        
        >Cliquez ici pour commencer</a>    </div>
            <div class="loginError"></div>
     
        <div class="formFooter">
     
                    <div class="formFooterButtons">
                        <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">    
     
     
    <span class="buttonText">Se connecter</span>
            </button>
                    </div>
    Dois-je continuer avec cette méthode où y en a-t-il une plus simple/efficace ?
    Je vous remercie d'avance de votre réponse et si vous avez des questions, n'hésitez pas
    Bonne soirée

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Peut-être que le contenu qui t'intéresse est chargé de façon asynchrone.

    Pour en être sûr essaye de dumper le document juste avant de faire le GetElementById.
    Il y a de fortes chances pour que l'élément avec l'ID que tu recherches n'y soit pas encore.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse mais finalement je vais plutôt le faire en utilisant HTTPWebRequest je pense
    Cependant ça m'intéresse quand même de savoir comment j'aurais pu résoudre ce problème et je ne comprends pas très bien ta réponse, qu'entends-tu par "dumper" le document ?

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Si c'est bien le problème que je décris alors utiliser HttpWebRequest ne pourra qu'être pire.

    En effet beaucoup de pages web chargent leur contenu de façon asynchrone :
    - il y a une page de base avec du markup et du code JavaScript
    - quand cette page de base est chargée le code JavaScript est exécuté
    - il récupère via AJAX des données depuis le serveur et modifie la page pour arriver au rendu final
    - plus tard il peut encore récupérer des données et remodifier la page.

    Donc avec une HttpWebRequest tu n'auras que la page de base.
    Pour avoir le reste il faut pouvoir exécuter du JavaScript => il faut un navigateur comme le WebBrowser.
    Mais il faut alors attendre suffisamment longtemps que tout soit chargé : tu peux checker à intervalle régulier le DOM par exemple.

    Si tu veux vérifier mon hypothèse c'est simple :
    • accède à la page avec ton navigateur favori
    • affiche le code source original de la page ("View page source" sous Chrome)
    • cherche ton élément avec son id dedans :
      • tu le trouves : c'est parfait, tu vas pouvoir utiliser simplement HttpWebRequest (ou plus simple encore la classe WebClient)
      • tu ne le trouves pas : ça va être plus compliqué...
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Donc en trouvant mon bouton dans le code source j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                 <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">    
     
     
    <span class="buttonText">Se connecter</span>
            </button>
    Ça me semble donc possible d'utiliser HTTPWebRequest ou WebClient ? Ou du moins faire quelque chose avec l'id "Button-9" ?
    Dans le pire des cas, je pourrais utiliser la simulation de touches("tabulation" et "enter") pour me connecter mais je préférerai comprendre et faire avec les méthodes citées plus haut
    En tout cas, merci de ton aide

    EDIT:
    Enfait, je crois comprendre ce qu'il se passe, peut-être c'est le phénomène d'asynchronisme que tu abordais.
    J'ai remarqué que lorsque je recharge la page, le boutton de connexion est "rouge", activé, mais au moment où je clique ailleurs, il devient "gris", désactivé.
    Cela se répercute probablement dans le code source car lorsque la page est "fraiche" et que le bouton est activé, l'Id de ce dernier est visible mais lorsqu'il devient désactivé et que je clique droit, inspecter l'élément,
    l'Id n'est plus disponible.
    Bouton activé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">
    Bouton désactivé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <button type="submit" class="rounded Button primary Module large hasText btn disabled" disabled="">
    C'est probablement pour cela que le programme n'est pas en mesure de récupérer l'Id, je vais essayer de modifier mon code pour valider mon hypothèse
    REEDIT :
    Ça ne marche pas non plus

  6. #6
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir à tous,

    Le débat est intéressant mais à chaque méthode ses outils :

    Si tu veux utiliser un webbrowser alors tu analyses le contenu de la page (code source).

    Si tu veux utiliser les webrequests alors il faut analyser les requêtes avec un outil car comme le dit Pragmateek plus haut certains traitements sont dynamiques et asynchrones alors l'outil Fiddler devrait pouvoir t'aider.

    Maintenant je ne dis pas que ça sera plus simple mais un minimum de notions sur la constitution des requêtes Web est fortement recommandé !

    Personnellement j'utilise que des webrequests lorsque je veux :

    - me connecter/déconnecter à un site
    - récupérer des données sur une page Web
    - héberger des contenus....
    ...and so on.....

    ....et bien souvent les APIs de traitement requiert ce type d'utilisation.

    Il est également possible d'utiliser la classe Webclient qui lorsqu'on en hérite devient très complète.



    A+

  7. #7
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse, je vais effectivement me tourner vers ce que tu me conseilles. Je penses que c'est plus rapide(pas besoin de charger les images, etc) et que ça fait plus "pro" Cependant, aurais-tu un cours, une introduction aux requêtes HTTP avec VB.Net, en français si possible, j'ai chercher de mon côté et j'ai trouver des informations utiles mais peut-être aurais-tu une référence sous la main C'est encore un peu flou dans ma tête
    Merci encore

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Et oui il semble que ton DOM soit victime de manipulations.

    Dans ce cas il te faut identifier ton élément différemment que par son ID : en utilisant son positionnement et ses attributs comme ici sa liste de classes CSS.
    L'outil idéal pour ce type de recherche est XPath.

    Malheureusement à ma connaissance l'API du WebBrowser est très pauvre et ne supporte pas XPath.
    La bonne nouvelle c'est qu'il existe une très bonne bibliothèque .Net pour exécuter des requêtes XPath sur un DOM : HtmlAgilityPack.

    La difficulté va être de faire le lien entre le WebBrowser et HtmlAgilityPack.

    Sinon sans utiliser XPath tu peux faire un parcours manuel du HtmlDocument en recherchant les éléments qui matchent.
    Ça sera moins générique et fragile mais si tu as peu d'éléments à trouver (un seul dans l'idéal) ça devrait être suffisant.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Anjou Voir le message
    Merci de ta réponse, je vais effectivement me tourner vers ce que tu me conseilles. Je penses que c'est plus rapide(pas besoin de charger les images, etc) et que ça fait plus "pro" Cependant, aurais-tu un cours, une introduction aux requêtes HTTP avec VB.Net, en français si possible, j'ai chercher de mon côté et j'ai trouver des informations utiles mais peut-être aurais-tu une référence sous la main C'est encore un peu flou dans ma tête
    Merci encore
    o_O..... Les requêtes Web c'est surtout de la connaissance de l'environnement client/serveur --> comment ça fonctionne et le reste c'est de l'analyse essentiellement.

    Pour commencer :
    - tu DL Fiddler, tu l'installes et tu l'ouvres
    - ensuite tu ouvres une url depuis ton navigateur et tu analyses le contenu des requêtes depuis le volet de droite de Fiddler (en haut POST et GET et en bas les RESPonses).

    ....etc....mais déjà faut savoir sans parler du langage de programmation comment fonctionnent les Cookies, headers, ..les différentes couches qu'un entête transporte....

    ...brefff ce sont des cours de réseau....architecture OS....et que sais-je encore....qui aident à mieux comprendre tout ça.....

    Et si tu veux implémenter une classe particulière bah la bible Microsoft : exemple : Webclient, HttpWebRequest, HttpWebResponse,...etc..... y'a pas de cours pour ça c'est de la doc ou des snippets qu'il faut comprendre.

    Voilà à quoi ressemble la requête lorsque tu te logues sur le site Pinterest avec tes identifiants dans Fiddler :

    http://imabox.fr/a3/1429052257ifbBmu22.png

    PS : tu auras dans la partie response des redirections à prévoir et surtout du parsing JSON.....le problème c'est le chargement du contenu asynchrone...pas évident à gérer O_O



    A+

  10. #10
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok alors merci de vos réponses, je vais me renseigner de mon côté et essayer d'implémenter tout cela et je posterai la solution
    Je pourrais toujours faire avec tabulation + enter mais je préfère me tourner du côté des web requests pour en apprendre plus.
    Une dernière chose, avec xPath servirait à parser le code source c'est cela ? Jusqu'à trouver la "ligne" du bouton que je veux cliquer? Si c'est le cas, je peux également le faire en utilisant Regex ou bien utiliser HtmlAgilityPack ?
    Merci encore et à bientôt

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Tu peux utiliser les Regex mais à tes risques et périls.
    HtmlAgilityPack + XPath c'est le top.
    Mais bon fait au plus simple.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Donc voilà, j'ai continuer sur ce projet et j'ai préférer utiliser HTTPWebRequest afin d'obtenir une application plus "professionnelle"
    J'ai donc fait des recherches la dessus et je commence à saisir le concept petit à petit. J'ai donc essayer d'implémenter une connexion en utilisant une HTTPWebRequest avec la méthode POST.
    Evidemment, c'était trop simple pour fonctionner En effet, je pense que le site fonctionne de la façon suivante, de la même manière que Facebook, Gmail et bien d'autres.
    Lors de l'affichage de la page de login, ici, le site nous attribue un cookie (je pense que ça se dit comme ça) qui sera comparer lors du login.
    On ne peut donc pas directement utiliser la méthode POST puisque qu'aucun cookie nous a été attribué. Il faut donc d'abord utiliser une requête GET afin d'obtenir ce cookie qui sera utiliser lors du login. C'est là que les choses se compliquent
    Le code suivant est celui utilisé pour obtenir le cookie mais la messagebox censée afficher le nombre de cookie indique toujours 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim GetToken As HttpWebRequest = DirectCast(WebRequest.Create("https://pinterest.com/login/"), HttpWebRequest)
      GetToken.CookieContainer = CContainer
      GetToken.Method = "GET"
      GetToken.KeepAlive = True
      GetToken.Referer = "http://www.pinterest.com/"
     
      Dim ResponseToken As HttpWebResponse = CType(GetToken.GetResponse(), Net.HttpWebResponse)
      Dim ReaderToken As New StreamReader(ResponseToken.GetResponseStream())
      Sourcestring = ReaderToken.ReadToEnd
      ReaderToken.Close()
      ResponseToken.Close()
     
      MsgBox(ResponseToken.Cookies.Count.ToString) 'Everytime 0
      CContainer.Add(ResponseToken.Cookies)
    En cherchant sur le net, j'ai trouver une possible solution mais qui ne marche pas non plus. Il s'agirait d'extraire le cookie en parsant les headers. Le code est le suivant :
    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
    Imports System.Net
    Imports System.IO
     
    Public Class Form1
    Dim CContainer As New CookieContainer
     
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim GetToken As HttpWebRequest = DirectCast(WebRequest.Create("https://pinterest.com/login/"), HttpWebRequest)
        GetToken.CookieContainer = CContainer
        GetToken.Method = "GET"
        GetToken.KeepAlive = True
        GetToken.Referer = "http://www.pinterest.com/"
     
        Dim ResponseToken As HttpWebResponse = CType(GetToken.GetResponse(), Net.HttpWebResponse)
        'Manual setting up cookies from header
        CContainer = HeaderToCookie(ResponseToken, "Set-Cookie", "http://www.pinterest.com")
     
        Dim ReaderToken As New StreamReader(ResponseToken.GetResponseStream())
        Dim Sourcestring = ReaderToken.ReadToEnd
        ReaderToken.Close()
        ResponseToken.Close()
     
        'Show your incoming cookies
        MessageBox.Show(CContainer.GetCookieHeader(New Uri("http://www.pinterest.com")))
    End Sub
    Function HeaderToCookie(ByVal Response As HttpWebResponse, ByVal CookieKey As String, ByVal CookieUrl As String) As CookieContainer
        Dim RetCookie As New CookieContainer
        For Each HeaderItem As String In Response.Headers
            If HeaderItem.Contains(CookieKey) Then
                RetCookie.SetCookies(New Uri(CookieUrl), Response.Headers.Get(HeaderItem))
            End If
        Next
        Return RetCookie
    End Function
     
    End Class
    La message box n'affiche toujours rien Je suis un peu perdu alors si quelqu'un a une idée Merci d'avance
    EDIT : Désolé si vous trouvez des fautes de français mais j'ai la tête en compote

  13. #13
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour Anjou,

    Je pense que tu ne réalises pas le travaille que va représenter ta simple requête de connexion au site Pinterest !!!

    As-tu simplement regardé la capture d'écran dans mon post précédent qui montre comment est constituée la requête de login au site :
    http://www.developpez.net/forums/d14...t/#post7838518

    J'ai fais pas mal de projet qui nécessitent l'utilisation de WReq mais là personnellement je ne m'y attelerais pas !

    -----> La 1ère requête c'est l'envoi des données utilisateurs via cette url : https://www.pinterest.com/resource/U...source/create/

    Je vais détaillé :

    HttpWebRequest = http://imabox.fr/a3/1431051125ToW11B35.png

    HttpWebResponse = http://imabox.fr/a3/1431051140LJD6n942.png

    En rouge : Le header de ta requête qui fait appel à une méthode POST

    ---> Le header "httpWebRequest" en détail : http://imabox.fr/a3/1431051129FDfgMr07.png

    En vert : Le body de la requête. C'est principalement le contenu qui est traité par le serveur distant avec lequel il interagit dynamiquement.
    En jaune : Les adresses obligatoires pour le traitement de la requête. Le reste des adresses : Host et Origin sont affectée automatiquement grâce à la résolution.


    DONC : Si tu n'arrives pas à reproduire l'ensemble de ce contenu alors ta requête sera FAUSSE et ne sera jamais traitée par le serveur distant !

    La question que tu dois dors et déjà te poser :

    Est-ce que je peux reproduire cette requête ? A mon sens elle est bien trop complexe car la constitution des cookies et le contenu de la requête est bien trop complexe à reproduire !


    Voilà A+

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    D'où l'intérêt en effet de bosser avec un navigateur web qui va se charger de gérer toute cette complexité.

    .Net est plutôt pauvre pour le type de bot que tu veux développer :
    - tu as le WebBrowser mais son API est limitée et il faut l'associer à de bons outils comme HtmlAgilityPack et XPath pour qu'il soit utilisable dans des scénarios non triviaux comme le tien
    - tu as des composants tiers mais qui sont souvent payants et sont parfois des usines à gaz intégrales (un qui demande l'installation d'un SDK de plusieurs 100aines de Mos )

    En dehors de .Net, dans le monde web bien sûr, tu as de bien meilleurs outils comme CasperJS.
    Tu devrais arriver à faire ce que tu veux plus facilement avec lui, en espérant que tu ne sois pas allergique au JavaScript.
    Si tu pars sur ce chemin tu pourras utiliser la classe Process pour faire la communication entre ton application .Net et CasperJS.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  15. #15
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Pragmateek Voir le message
    D'où l'intérêt en effet de bosser avec un navigateur web qui va se charger de gérer toute cette complexité.
    .
    Je plussois Pragmateek, je n'avais pas regardé à la loupe la complexité des requêtes de ce site.

  16. #16
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok je vois où tu veux en venir wallace1, cela semble en effet trop complexe, surtout que je débute encore Penses-tu que ce mode de connexion soit pour une raison de sécurité, afin d'éviter les gens comme moi , ou bien simplement une façon particulière dont est fait le site ?
    J'éspère quand même pouvoir utiliser les requêtes sur d'autres projets mais bon je pense que pour le coup je vais me tourner du côté du WebBrowser. Sinon, pensez-vous qu'il est possible de me connecter avec le WebBrowser et de continuer en envoyant des WebReq ou cela serait trop compliqué?
    Pour ce qui est de ta solution Pragmateek, je pense que je vais y aller avec l'HTMLUtilityPack Je vais également regarder pour CasperJS mais je n'ai jamais vraiment été confronté à ce langage alors je ne sais pas si c'est la solution la plus approprié dans mon cas. Je vais tout de même jeter un coup d'oeil.
    Bon je continue la dessus et je vous tiens au courant. Merci encore de vos réponses et à bientôt

  17. #17
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ce site va me rendre fou
    J'ai donc abandonner les WebRequest pour mener ce petit projet à l'aide du WebBrowser et de HTMLAgilityPack que j'ai encore un peu de peine à prendre en main
    Le problème se trouve encore au login, pour le bouton. Ce site est vraiment très très étrange. Certaines fois sur la page de login, la moindre activité de la souris entraine une "désactivation" du bouton login autant d'autres fois je peux cliquer comme un fou sur tout l'écran le bouton reste activé. Je me suis dit qu'au point où j'en suis, autant faire les choses avec tab + enter puisque si la souris ne bouge pas, le bouton reste rouge alors il suffit de remplir les deux champs de textes de simuler tab et entré et le tour est jouer Et bien non, ça ne marche qu'une fois sur 3... J'ai donc perdu espoir avec cette méthode et je me tourne vers un moyen plus conventionnel.
    Je procède de la façon suivante : Le bouton de login ne possède pas d'Id,etc mais ça devrait fonctionner en utilisant d'autres attributs comme la classe, ou le type.
    Donc avec la classe ça ne marche pas, mais ce bouton est le seul "type=submit" sur la page, alors je me lance avec ce bout de 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
     
            WebBrowser1.Document.GetElementById("username_or_email").SetAttribute("value", "adresse email")
            WebBrowser1.Document.GetElementById("password").SetAttribute("value", "motdepasse")
     
            Dim allElements As HtmlElementCollection = WebBrowser1.Document.All
            'type="submit"
            For Each webpageElement As HtmlElement In allElements
                If webpageElement.GetAttribute("type") = "submit" Then
     
                    MessageBox.Show("Found")'test pour savoir s'il a été trouver 
                    webpageElement.InvokeMember("click")
     
                End If
     
            Next
    Et bien figurez-vous que ça marche Mais seulement à moitier Je m'explique : Quand je lance le code l'exception suivante est attrapée(corrigez-moi si on ne dit pas comme ça) : System.UnauthorizedAccessException. Le programme cesse donc mais, quand je le relance, Pinterest s'affiche et je suis bien connecté(le web browser stoque les cookies et me reconnecte automatiquement je présume), la tentative de connexion a donc fonctionné mais quelque chose ne marche pas à cause de cette exception.
    Je n'abandonnerai pas mais la je commence à être un peu perdu alors si quelqu'un a une idée
    De plus pragmateek, je n'ai pas trouver de documentation pour l'HTMLUtilityPack et je trouve peu d'informations sur le web à son propos, tu as une idée ?
    Merci encore et bonne journée

  18. #18
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour Anjou,

    Avant de rechercher le type dans ton document il faut filtrer un maximum les possibilités. Ton code que tu recherches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         <button type="submit" class="rounded Button primary Module large hasText btn" id="Button-9">
    Il faut avant toute chose faire un parsing pour trouver toutes les balises Button qui ont pour Type submit.

    Si c'est bien ce bouton sur lequel tu souhaites cliquer alors ça pourrait donner un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        For Each hElement As HtmlElement In WebBrowser1.Document.GetElementsByTagName("button")
            Dim hType As String = hElement.GetAttribute("type")
     
            If (hType = "submit") Then
                    hElement.InvokeMember("click")
            End If
        Next
    Et s'il existe plusieurs submit alors tu pourrais déclarer une list(Of) pour stocker l'htmlElement qui contient le bouton avec les propriétés adequates :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim SubmitBtns as new List(Of HtmlElement)
    ... et ensuite clicker sur le bon bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       SubmitBtns(0).InvokeMember("click")
       SubmitBtns(1).InvokeMember("click")

    Je connais une communauté qui pourrait t'aider efficacement pour utiliser le WebBrowser sous toute ses coutures : http://proghelp.fr/

    EDIT : HF aussi pourra t'aider à faire ton bot

    A+

  19. #19
    Candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2012
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Ok formidable tout fonctionne, je pense que l'exception vient du fait que je n'ai pas assez ciblé le bouton c'est cela ? En tout cas merci encore de ton aide, je me suis inscrit sur le forum que tu me conseilles et je connaissais déjà HF, il y a pleins de ressources utiles, spécialement pour le type de projet que je mène Merci encore et je vous tiendrai au courant de l'avancée du projet

  20. #20
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Concernant ta question sur la documentation de l'HtmlAgilityPack (pas Utility! ) tu as un petit exemple ici : http://htmlagilitypack.codeplex.com/...title=Examples
    Et pour un tuto plus complet je te conseille : http://tlevesque.developpez.com/tuto...-agility-pack/
    Tu verras c'est très basique comme API, toute la magie est dans le moteur XPath, et donc la difficulté est surtout de maitriser ce langage mais une fois que c'est fait le web-scrapping devient vraiment plus aisé.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Conversion de site web ASP.NET en projet d'application Web
    Par brazilia28 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/03/2009, 12h00
  2. Réponses: 2
    Dernier message: 22/02/2008, 22h17
  3. Développement site web ASP.NET
    Par adiekmann dans le forum Devis
    Réponses: 1
    Dernier message: 29/01/2008, 10h40
  4. site web asp.net
    Par christi dans le forum ASP.NET
    Réponses: 2
    Dernier message: 29/01/2007, 14h13

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