Analyser le texte d'une page web [Résolu]

CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 25 août 2013 à 11:27 - Dernière réponse : CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention
- 11 sept. 2013 à 21:01
Bonjour,
J'essaye depuis quelques mois de développer un contrôle parental, je bloque cependant sur une fonction que j'aimerais bien arriver à faire, l'analyse du texte sur la page où se trouve l'utilisateur. J'ai réussi à récupérer le code source de la page, ce qui me permet de trouver le texte qui s'y trouve. Cependant l'analyse des mots présents dans cette page peut être faussée par la présence des balises HTML ... J'ai donc pensé à supprimer toutes les balises HTML que récupère mon programme afin d'extraire uniquement le texte. Cette solution me semble correcte.
Mais c'est ici que commence le problème, en effet la récupération du code source est simple car dans mon programme, je défini telle ou telle adresse, il faudrait que l'utilisateur utiliser un navigateur que j'ai fais moi, mais je ne peux pas imposer une telle contrainte, donc peut-on récupérer les URL's des autres navigateurs ou récupérer les URL's (Ou IP) qui transitent sur l'ordinateur local ?
Pensez vous que c'est une bonne solution ou en avez vous une meilleure ? A moins de créer un add-on pour chaque navigateur ...
Merci.
Afficher la suite 

13 réponses

Répondre au sujet
ghuysmans99 2520 Messages postés jeudi 14 juillet 2005Date d'inscriptionContributeurStatut 5 juin 2016 Dernière intervention - 25 août 2013 à 18:04
0
Utile
1
Salut,

En utilisant des sockets, tu peux faire un proxy : les navigateurs se connectent à lui (c'est à configurer pour chacun) et c'est ton proxy qui fait la requête sur chaque serveur et qui fait ce qu'il veut avec les données renvoyées (remplacement d'images, censure, etc.).

Une solution plus simple consiste à placer un PC dédié entre Internet (plus précisément, ton routeur) et le reste de ton réseau. Des versions de BSD comme Untangle sont tout à fait adaptées au filtrage, mais ça ne fonctionne pas sur base de mots-clés mais plutôt sur base d'URL...
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 25 août 2013 à 23:35
Salut,
c'est également ce que m'avait conseillé un membre de Developpez lorsque j'avais du mal à bloquer les sites via le hosts (problème de fichier inaccessible maintenant résolu). J'ai cherché sur internet comment créer un proxy mais je n'ai rien trouvé de concluant (ou du moins compréhensible à mon niveau), de plus il y a une chose que je ne comprends pas, en plus de devoir configurer automatiquement le navigateur pour qu'il utilise mon proxy, il faudrait que je programme ce dernier afin qu'il bloque certains mots, sites ... Mais je n'ai aucune idée de comment faire, pourrais-tu m'indiquer une piste ? Une procédure ?
Merci d'avance !
Commenter la réponse de ghuysmans99
ghuysmans99 2520 Messages postés jeudi 14 juillet 2005Date d'inscriptionContributeurStatut 5 juin 2016 Dernière intervention - 25 août 2013 à 23:44
0
Utile
Un exemple en C# est disponible là, tu devrais t'en inspirer : http://www.mentalis.org/soft/projects/proxy/.

Pour ce qui est du "comment on fait le blocage", il suffit de nettoyer les blocs (de texte) qui sont sur le point d'être envoyés au client, de vérifier si des mots interdits s'y trouvent (boucle pour chaque mot interdit) et si c'est le cas, d'écraser le contenu de la page. Pour le blocage par site, là c'est encore plus simple vu que tu n'as qu'à écraser le contenu lorsque l'URL contient ou vaut tel ou tel truc.

Mais avant de te lancer là-dedans, il faut déjà avoir un bon niveau en programmation, histoire de comprendre ce que tu fais. Une autre chose à savoir c'est que c'est très facile à contourner côté client (et je suppose que des tonnes de tutos existent sur la Toile)... Ça serait dommage de passer des jours à développer quelque chose qui sera contourné en peu de temps.
Commenter la réponse de ghuysmans99
ghuysmans99 2520 Messages postés jeudi 14 juillet 2005Date d'inscriptionContributeurStatut 5 juin 2016 Dernière intervention - 25 août 2013 à 23:47
0
Utile
3
Je me permets de répondre à la question que tu as posée à geeegeee : tu ne peux tout simplement pas intercepter toutes les demandes des navigateurs. Ou plutôt : si, tu le peux (peut-être pas en .NET), mais ton programme se comportera alors plus comme un virus que comme un contrôle parental.

Comme je l'ai dit plus haut, soit tu demandes gentiment aux navigateurs Web de passer par ton proxy, soit tu forces tout le monde à passer par une machine qui s'occupe de filtrer ce qui passe (et pour le coup, ça ne sera pas en .NET).
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 26 août 2013 à 00:19
Eh Si !!!! :D
Grâce au grand Fiddler et ses API !
Je viens de tomber dessus, je connaissais mais je n'avais jamais vu ses API !
http://fiddler2.com/fiddlercore
https://www.youtube.com/watch?v=-ZCsuJtJc_o
Je vais essayer de l'utiliser car c'est exactement ce qu'il me faut ! :)
Il me reste plus qu'a comprendre comment l'utiliser avec VisualBasic .NET ! Ce qui n'est pas une mince affaire !
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 26 août 2013 à 00:46
ghuysmans99 pourrais-tu essayer de faire marcher cette API afin d'analyser le trafic comme dans la vidéo car chez moi le code qu'écrit la personne qui fait la vidéo ne fonctionne pas.
Merci d'avance.
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 26 août 2013 à 17:16
C'est bon j'ai réussi à utiliser l'API de Fiddler (J'utilisais mal Intellisense et le double "Tab"), je suis satisfait du résultat ! Cependant j'ai du développer en C# et comme je dois utiliser des Webbrowser, et quelque bidouillage pour mettre en correspondance mon programme principal qui lui est en VB.NET, j'ai un peu du mal mais avec la motivation et en tonnant, pour l'instant ça va.
Je mettrai mon code final ainsi que le sujet résolu dès que j'ai terminé.

PS : Je ne sais pas comment utiliser l'API car en C#, elle se déclare toute seule lors de l'évènement form_load (voir vidéo).
Commenter la réponse de ghuysmans99
ghuysmans99 2520 Messages postés jeudi 14 juillet 2005Date d'inscriptionContributeurStatut 5 juin 2016 Dernière intervention - 26 août 2013 à 01:06
0
Utile
Fiddler ne fait qu'utiliser des addons (ou, pour IE, modifier les paramètres de proxy) afin de détourner le trafic. En gros, ce n'est qu'un proxy très perfectionné.

N'ayant pas de version de Visual Studio compatible avec .NET4 (et FiddlerCore en est à cette version), je ne peux même pas ouvrir le projet. Il n'empêche que c'est à toi de faire toi-même ton application, on n'est là seulement pour t'aider sur des points techniques précis.
Commenter la réponse de ghuysmans99
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 5 sept. 2013 à 12:49
0
Utile
Bonjour à tous,
j'ai réussi à trouver grâce à l'API FiddlerCore de l'application Fiddler.
Voici le code :
Option Explicit On
Imports Fiddler
Imports System.Net
Imports System.IO

Public Class Form1

    Dim url As String = Nothing

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        AddHandler FiddlerApplication.BeforeResponse, AddressOf FiddlerBeforeResponseHandler
        AddHandler FiddlerApplication.BeforeRequest, AddressOf FiddlerBeforeRequestHandler
        AddHandler Application.ApplicationExit, AddressOf ShutdownFiddlerApp
        Dim oFlags As FiddlerCoreStartupFlags = FiddlerCoreStartupFlags.Default
        FiddlerApplication.Startup(0, oFlags)
        MsgBox("Started proxy on port " & FiddlerApplication.oProxy.ListenPort)
    End Sub

    Private Sub ShutdownFiddlerApp()
        FiddlerApplication.Shutdown()
        MsgBox("Unloaded proxy")
        Threading.Thread.Sleep(1000)
    End Sub

    Private Sub FiddlerBeforeRequestHandler(ByVal tSession As Session)
        RichTextBox1.BeginInvoke(New AsyncMethodCaller(AddressOf AddText), tSession.fullUrl)
    End Sub

    Private Sub FiddlerBeforeResponseHandler(ByVal tSession As Session)
    End Sub

    Public Sub Verification()
        Try
            ListeMot.AddRange(IO.File.ReadAllLines("C:UsersClémentDocumentsListeDeMots.txt"))
            Dim found As Boolean = False
            For Each s As String In ListeMot
                If url.ToLower.Contains("-" & s.ToLower & "-") Or url.ToLower.Contains("." & s.ToLower & ".") Or url.ToLower.Contains("." & s.ToLower & "-") Or url.ToLower.Contains("-" & s.ToLower & ".") Then
                    MsgBox("Un mot interdit dans l'URL a été détecté :" & s)
                End If
            Next
        Catch
        End Try
        Try
            Dim webClient As New System.Net.WebClient
            Dim result As String = webClient.DownloadString(url)
            Dim client As WebClient = New WebClient()
            Dim data As Stream = client.OpenRead(url)
            Dim reader As StreamReader = New StreamReader(data)
            Dim Page As String = reader.ReadToEnd
            ListeMot.AddRange(IO.File.ReadAllLines("C:UsersClémentDocumentsListeDeMots.txt"))
            Dim found As Boolean = False
            For Each s As String In ListeMot
                If Page.ToLower.Contains(" " & s.ToLower & " ") Then
                    MsgBox("Un mot interdit a été détecté :" & s)
                End If
            Next
        Catch
        End Try
    End Sub

    Dim ListeMot As New List(Of String)

    Private Sub AddText(sText As String)
        Dim url2 As Uri
        url2 = New Uri(sText)
        If url2.AbsolutePath.EndsWith(".js") = False And url2.AbsolutePath.EndsWith(".jpg") = False And url2.AbsolutePath.EndsWith(".gif") = False And url2.AbsolutePath.EndsWith(".png") = False And url2.AbsolutePath.EndsWith(".css") = False And url2.AbsolutePath.EndsWith(".ico") = False And url2.AbsolutePath.EndsWith(":443") = False Then
            RichTextBox1.AppendText(sText & vbCrLf)
            url = sText
            Dim Thread As New Threading.Thread(AddressOf Verification)
            Thread.Start()
        End If
    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub
End Class

Public Delegate Sub AsyncMethodCaller(sText As String)
Commenter la réponse de CLeBeR_FR
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 11 sept. 2013 à 21:01
0
Utile
Bonjour,

j'ai optimisé encore une fois le code, le programme plantait lors de la lecture de vidéos, trop grand nombre d'URLs...
Option Explicit On
Imports Fiddler
Imports System.Net
Imports System.IO
Imports Microsoft.Win32

Public Class Form1

    Dim ListeMots As New List(Of String)
    Dim url As String = Nothing
    Public Delegate Sub AsyncMethodCaller(sText As String)

   

    Private Sub ShutdownFiddlerApp()
        FiddlerApplication.Shutdown()
        MsgBox("Unloaded proxy")
        Threading.Thread.Sleep(1000)
    End Sub

    Private Sub FiddlerBeforeRequestHandler(ByVal tSession As Session)
        RichTextBox1.BeginInvoke(New AsyncMethodCaller(AddressOf AddText), tSession.fullUrl)
    End Sub

    Private Sub FiddlerBeforeResponseHandler(ByVal tSession As Session)
    End Sub

    Public Sub VerificationPage()
        Try
            Dim webClient As New System.Net.WebClient
            Dim result As String = webClient.DownloadString(url)
            Dim client As WebClient = New WebClient()
            Dim data As Stream = client.OpenRead(url)
            Dim reader As StreamReader = New StreamReader(data)
            Dim Page As String = reader.ReadToEnd
            ListeMots.AddRange(IO.File.ReadAllLines("C:Users\" & System.Environment.UserName & "DocumentsListeDeMots.txt"))
            Dim found As Boolean = False
            For Each s As String In ListeMots
                If Page.ToLower.Contains(" " & s.ToLower & " ") = True Or Page.ToLower.Contains("<h1>" & s.ToLower & "</h1>") = True Then
                    RichTextBox1.Clear()
                    MsgBox("Un mot interdit a été détecté :" & s)

                End If
            Next
        Catch
        End Try

    End Sub
    Public Sub VerificationURL()
        Try
            Dim found As Boolean = False
            For Each s As String In ListeMots
                If url.ToLower.Contains("-" & s.ToLower & "-") = True Or url.ToLower.Contains("." & s.ToLower & ".") = True Or url.ToLower.Contains("." & s.ToLower & "-") = True Or url.ToLower.Contains("-" & s.ToLower & ".") = True Then
                    RichTextBox1.Clear()
                    MsgBox("Un mot interdit dans l'URL a été détecté :" & s)

                End If
            Next
        Catch
        End Try
    End Sub
    Private Sub AddText(sText As String)
        RichTextBox1.SelectAll()
        Dim nbrligne As Integer = RichTextBox1.GetLineFromCharIndex(RichTextBox1.SelectionLength())
        If nbrligne > 40 Then
            RichTextBox1.Clear()
        End If
        Dim url2 As Uri
        url2 = New Uri(sText)
        If url2.AbsolutePath.EndsWith(".js") = False And url2.AbsolutePath.EndsWith(".jpg") = False And url2.AbsolutePath.EndsWith(".gif") = False And url2.AbsolutePath.EndsWith(".png") = False And url2.AbsolutePath.EndsWith(".css") = False And url2.AbsolutePath.EndsWith(".ico") = False And url2.AbsolutePath.EndsWith(".jpeg") = False And RichTextBox1.Text.Contains(sText) = False And url2.ToString.Length < 200 = True Then
            RichTextBox1.AppendText(sText & vbCrLf)
            url = sText
            Dim ThreadVerificationPage As New Threading.Thread(AddressOf VerificationPage)
            ThreadVerificationPage.Start()
            Dim ThreadVerificationURL As New Threading.Thread(AddressOf VerificationURL)
            ThreadVerificationURL.Start()
        End If

    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        AddHandler FiddlerApplication.BeforeResponse, AddressOf FiddlerBeforeResponseHandler
        AddHandler FiddlerApplication.BeforeRequest, AddressOf FiddlerBeforeRequestHandler
        AddHandler Application.ApplicationExit, AddressOf ShutdownFiddlerApp
        Dim oFlags As FiddlerCoreStartupFlags = FiddlerCoreStartupFlags.Default
        FiddlerApplication.Startup(0, oFlags)
        MsgBox("Started proxy on port " & FiddlerApplication.oProxy.ListenPort)

    End Sub
End Class
Commenter la réponse de CLeBeR_FR
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 11 sept. 2013 à 21:01
0
Utile
Bonjour,

j'ai optimisé encore une fois le code, le programme plantait lors de la lecture de vidéos, trop grand nombre d'URLs...
Option Explicit On
Imports Fiddler
Imports System.Net
Imports System.IO
Imports Microsoft.Win32

Public Class Form1

    Dim ListeMots As New List(Of String)
    Dim url As String = Nothing
    Public Delegate Sub AsyncMethodCaller(sText As String)

   

    Private Sub ShutdownFiddlerApp()
        FiddlerApplication.Shutdown()
        MsgBox("Unloaded proxy")
        Threading.Thread.Sleep(1000)
    End Sub

    Private Sub FiddlerBeforeRequestHandler(ByVal tSession As Session)
        RichTextBox1.BeginInvoke(New AsyncMethodCaller(AddressOf AddText), tSession.fullUrl)
    End Sub

    Private Sub FiddlerBeforeResponseHandler(ByVal tSession As Session)
    End Sub

    Public Sub VerificationPage()
        Try
            Dim webClient As New System.Net.WebClient
            Dim result As String = webClient.DownloadString(url)
            Dim client As WebClient = New WebClient()
            Dim data As Stream = client.OpenRead(url)
            Dim reader As StreamReader = New StreamReader(data)
            Dim Page As String = reader.ReadToEnd
            ListeMots.AddRange(IO.File.ReadAllLines("C:Users\" & System.Environment.UserName & "DocumentsListeDeMots.txt"))
            Dim found As Boolean = False
            For Each s As String In ListeMots
                If Page.ToLower.Contains(" " & s.ToLower & " ") = True Or Page.ToLower.Contains("<h1>" & s.ToLower & "</h1>") = True Then
                    RichTextBox1.Clear()
                    MsgBox("Un mot interdit a été détecté :" & s)

                End If
            Next
        Catch
        End Try

    End Sub
    Public Sub VerificationURL()
        Try
            Dim found As Boolean = False
            For Each s As String In ListeMots
                If url.ToLower.Contains("-" & s.ToLower & "-") = True Or url.ToLower.Contains("." & s.ToLower & ".") = True Or url.ToLower.Contains("." & s.ToLower & "-") = True Or url.ToLower.Contains("-" & s.ToLower & ".") = True Then
                    RichTextBox1.Clear()
                    MsgBox("Un mot interdit dans l'URL a été détecté :" & s)

                End If
            Next
        Catch
        End Try
    End Sub
    Private Sub AddText(sText As String)
        RichTextBox1.SelectAll()
        Dim nbrligne As Integer = RichTextBox1.GetLineFromCharIndex(RichTextBox1.SelectionLength())
        If nbrligne > 40 Then
            RichTextBox1.Clear()
        End If
        Dim url2 As Uri
        url2 = New Uri(sText)
        If url2.AbsolutePath.EndsWith(".js") = False And url2.AbsolutePath.EndsWith(".jpg") = False And url2.AbsolutePath.EndsWith(".gif") = False And url2.AbsolutePath.EndsWith(".png") = False And url2.AbsolutePath.EndsWith(".css") = False And url2.AbsolutePath.EndsWith(".ico") = False And url2.AbsolutePath.EndsWith(".jpeg") = False And RichTextBox1.Text.Contains(sText) = False And url2.ToString.Length < 200 = True Then
            RichTextBox1.AppendText(sText & vbCrLf)
            url = sText
            Dim ThreadVerificationPage As New Threading.Thread(AddressOf VerificationPage)
            ThreadVerificationPage.Start()
            Dim ThreadVerificationURL As New Threading.Thread(AddressOf VerificationURL)
            ThreadVerificationURL.Start()
        End If

    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        AddHandler FiddlerApplication.BeforeResponse, AddressOf FiddlerBeforeResponseHandler
        AddHandler FiddlerApplication.BeforeRequest, AddressOf FiddlerBeforeRequestHandler
        AddHandler Application.ApplicationExit, AddressOf ShutdownFiddlerApp
        Dim oFlags As FiddlerCoreStartupFlags = FiddlerCoreStartupFlags.Default
        FiddlerApplication.Startup(0, oFlags)
        MsgBox("Started proxy on port " & FiddlerApplication.oProxy.ListenPort)

    End Sub
End Class
Commenter la réponse de CLeBeR_FR
geeegeee 118 Messages postés samedi 6 octobre 2012Date d'inscription 17 mars 2014 Dernière intervention - 25 août 2013 à 18:27
-1
Utile
1
Bonjour,

Extraction de données de pages web à l'aide de HTML Agility Pack
http://tlevesque.developpez.com/tutoriels/dotnet/extraction-donnees-web-html-agility-pack/
CLeBeR_FR 301 Messages postés mercredi 22 septembre 2010Date d'inscription 28 juillet 2017 Dernière intervention - 25 août 2013 à 23:45
Bonjour,
merci ton lien est très intéressant, cependant on reste bloqué dans mon problème, comment récupérer les URL's qui transitent dans n'importe quel navigateur sur l'ordinateur ?
Commenter la réponse de geeegeee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.