Annonce

Réduire
Aucune annonce.

Un bot web en python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Tutoriel Un bot web en python

    Vous avez envie de voir python interagir avec le monde merveilleux du web ? Vous souhaitais avoir un script vous informant du classement de kittenwar.com ? Vous êtes au bonne endroit !


    Les imports nécessaires :
    - Urllib et Urllib2 : cela vous permettra de gérer des requêtes web simples.
    - Cookielib : Bah parceque les cookies sont trop bon.

    Il me semble que cela fonctionne sous Windows (mais je vérifierai plus tard).

    Maintenant explications pour les deux versions d'Urllib : bah il y a pas toute les fonctions qui faut dans la deux (essentiellement encode pour les requetes POST).

    Je vais baser mes explications sur un code que j'ai écrit dans un but statistique sur un site de jeu ( les jeux du site jsnetwork.fr ), ce site propose des jeux de hasard permettant en théorie de gagner des cadeaux.
    Je vous cache pas le résultat de mon étude, au départ on gagne énormément et à la fin, on stagne tout proche du cadeau.

    Première étape : Une requête basique

    Code:
    import urllib2
    
    url = 'http://www.google.fr'
    req = urllib2.Request(url)
    reponse = urllib2.urlopen(req)
    html = reponse.read()
    Nous voulons voir la page http://www.google.fr, on utilise urllib2.request pour préparer la requête que l'on va stocker dans req, ensuite on exécute cette dernière via urlib2.urlopen.
    Cette fonction nous renvoie la réponse du serveur web mais ici nous voulons récupérer le html de la page, on utilise reponse.read pour cela.

    Remarque: Pour des requêtes simples comme celle-ci, on peut utiliser directement urllib2.urlopen(url) sans passer par request.

    Deuxième partie : Une requête POST
    Grâce à la première partie, vous êtes capable de faire des requêtes GET, mais comment faire les POST ? C'est ce qu'on l'on va voir maintenant.

    Code:
    import urllib
    import urllib2
    
    url = 'http://server.com/post_data.php'
    values = {'name':'Pasterp',
    'pass':'kangourou',
    'message':'Python !'} #Valeurs d'un formulaire web
    
    data = urllib.urlencode(values)
    req = urllib2.Request(the_url, data)
    handle = urllib2.urlopen(req)
    Nous allons ici simuler l'envoie du resultat d'un formulaire HTML. values contient les différents champs du formulaire et leur valeurs (ici : name, pass et message).
    On utilise urlib.urlencode pour encoder ces valeurs avant de les passer à la fonction urllib2.Request et ensuite on agit de même que dans la première partie.

    Troisième partie : Mais qui sommes nous ?

    Les sites web peuvent vous identifier grâce aux headers de vos requêtes web tel que user-gent qui identifie votre navigateur, referer qui permet au site de savoir d'ou vous venez...

    Nous allons pour indiquer au site ces infos reprendre l'exemple précédant.
    Code:
    import urllib
    import urllib2
    
    url = 'http://server.com/post_data.php'
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    values = {'name':'Pasterp',
    'pass':'kangourou',
    'message':'Python !'} #Valeurs d'un formulaire web
    headers = { 'User-Agent' : user_agent }
    
    data = urllib.urlencode(values)
    req = urllib2.Request(the_url, data, headers)
    handle = urllib2.urlopen(req)
    Bien sur il suffit de faire de même avec les autres paramètres du headers.

    Quatrième partie :Miam ! Des cookies !

    Les sites web utilisent les cookies pour vous reconnaitre de manière plus sécurisée, par exemple lors de la connexion sur un site un cookies se crée pour que le site sache que vous êtes connecté tandis que vous changer de pages.

    Code:
    import urllib
    import urllib2
    import cookielib
    
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    cookiejar = cookielib.CookieJar()
    urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
    urlOpener.addheaders = [{'User-agent', user_agent}]
    
    url = 'http://www.google.fr'
    req = urllib2.Request(url)
    reponse = urlOpener(req)
    html = reponse.read()
    Pour pouvoir utiliser les cookies et être identifié par le site, nous allons utiliser un cookiejar (en français un pot de cookies ça donne très faim). Ce dernier va stocker les cookies qu'il recevra. Pour l'intégrer dans nos requêtes, on doit créer un Url_opener, qui est la fonction envoyant la requête au serveur (comme la fonction openurl que nous avons vu. Cet url_opener va gerer de manière interne les headers (dont les cookies font parties), dont on a la possibilité d'en ajouter (comme ci dessus pour le user-agent).

    Conclusion :
    Vous avez desormais les bases essentielles pour programmer des requetes web en python, vous pouvez ainsi vous fabriquer votre propre fuzzer web, un bot web ou plein d'autres choses.

  • #2
    Thanks!

    Exercice : répondre à ce post via python en postant notamment le code nécessaire pour faire ça.

    Intéressé ?!!
    sigpic

    Cyprium Download Link

    Plus j'étudie plus j'me rends compte que je n'sais rien.

    †|

    Commentaire


    • #3
      Je veux bien te le faire mais je n'ai pas les logiciels pour coder là j'ai même pas d'éditeur de texte :O
      Je passerai sous linux toute à l'heure

      Commentaire


      • #4
        Hello,

        Toujours intéressant.
        J'hésite à développer un bot qui va crawler les sites Internet en recherchant certains informations.

        D'après vous, le mieux pour faire des bots c'est le Python, le Ruby ou l'AutoIt (si on imagine qu'on est sur Windows) ?


        Cordialement.

        Commentaire


        • #5
          Merci, ces requêtes post, des fois ça fonctionne, des fois il y a des subtilités, et des fois ça ne fonctionne pas... Bref bonnes explications, bons tutoriels, et comme dans tout tutoriel, il y a un mais

          Je regrette que ce tutoriel ne soit pas utilisable avec la version python 3.x

          D'après vous, le mieux pour faire des bots c'est le Python, le Ruby ou l'AutoIt (si on imagine qu'on est sur Windows) ?
          Eh bien en fait, les 3 étant capable de le faire, je dirais de prendre celui avec lequel niveau syntaxe du langage tu te sens le mieux...

          Commentaire


          • #6
            L'AutoIt est très simple à prendre en main, c'est le langage que j'ai utiliser pour faire un logiciel de phishing jadis (genre ceux fait en Vb.Net)
            Après pas testé le ruby.
            Et je voterai pour le python si tu veux le coupler à d'autre chose (comme moi pour les stats que je voulais calculer).
            D'ailleurs je vous donnerais la source de mon bot et peut-être même expliquer comment j'ai procéder x)

            Commentaire


            • #7
              bravo bien expliqué meme pour moi qui suis un débutant en python. Par contre quelle version de python ? la 2.7.4 ?
              sigpic
              Notre Liberté Ne Doit Pas Être Limitée
              Pour Permettre A Une Minorité De S’enrichir

              Commentaire


              • #8
                Le code que j'ai donné fonctionne avec python 2,python 3 n'a pas de support pour cela, à première vue, en creusant peut etre qu'il y a des trucs non officiels...

                EDIT : là il y a des trucs mais pas aussi complet qu'en 2.7 : http://docs.python.org/3.3/library/u...=urllib#urllib

                Commentaire


                • #9
                  j'ais Python 2.7.4 donc ok pour moi et joli tuto bien expliqué !
                  sigpic
                  Notre Liberté Ne Doit Pas Être Limitée
                  Pour Permettre A Une Minorité De S’enrichir

                  Commentaire


                  • #10
                    Très bon tutoriel !
                    Je n'ai jamais testé les cookies via python.

                    Même si je préfère le PHP pour les crawlers ou les proxys, ça peut être utile.
                    ~ Yarflam ~

                    ❉ L'Univers se dirige vers son ultime perfection ❉

                    Commentaire


                    • #11
                      Le code que j'ai donné fonctionne avec python 2,python 3 n'a pas de support pour cela, à première vue, en creusant peut etre qu'il y a des trucs non officiels...

                      EDIT : là il y a des trucs mais pas aussi complet qu'en 2.7 : http://docs.python.org/3.3/library/u...=urllib#urllib
                      what? C'est simple, python 3.x est une amélioration de la version 2.x, il est forcément possible d'avoir au moins aussi bien niveau possibilités...

                      Voir ICI

                      Commentaire


                      • #12
                        J'ai reussi ! Mon script python edite bien mon message. Very nice !
                        Voici mon code source (generate by Python) :
                        Code:
                        #!/usr/bin/python
                        import urllib
                        import urllib2
                        
                        def security():
                          out=''
                          file=open('bothcs.py','r')
                          elm=file.read().split('\n')
                          for line in range(len(elm)):
                              if not line in [21,22,35]:
                                  out+=elm[line]
                              else:
                                  if line == 21: out+="bb_userid=''"
                                  if line == 22: out+="bb_password=''"
                                  if line == 35: out+="	'securitytoken':'',"
                              out+='\n'
                          file.close()
                          return out
                        
                        bbcode=['[',']']
                        
                        bb_userid=''
                        bb_password=''
                        msg="J'ai reussi ! Mon script python edite bien mon message. Very nice !\n"
                        msg+="Voici mon code source (generate by Python) :\n"
                        msg+=bbcode[0]+"CODE"+bbcode[1]+security()+bbcode[0]+"/CODE"+bbcode[1]
                        
                        url='http://hackademics.fr/editpost.php?do=updatepost&postid=19935'
                        agent='Mozilla/5.0 (compatible; Konqueror/3.1; Linux 2.4.22-10mdk; X11; i686; fr, fr_FR)'
                        
                        opener = urllib2.build_opener()
                        opener.addheaders.append(('User_agent', agent))
                        opener.addheaders.append(('Cookie', 'bb_userid='+bb_userid+';bb_password='+bb_password))
                        
                        params={
                        	'securitytoken':'',
                        	'do':'updatepost',
                        	'ajax':'1',
                        	'postid':'19935',
                        	'message':msg,
                        	'relpath':'showthread.php%3F3673-Un-bot-web-en-python%26amp%3Bp%3D19935'
                        }
                        req = urllib2.Request(url, urllib.urlencode(params))
                        
                        html = opener.open(req)
                        Dernière modification par Yarflam, 27 octobre 2013, 16h49.
                        ~ Yarflam ~

                        ❉ L'Univers se dirige vers son ultime perfection ❉

                        Commentaire


                        • #13
                          @Yarflams, hello

                          Peux-tu spécifier l'objectif de ton code?

                          Pourquoi ne mets-tu pas en paramètre de security, le fichier?
                          Que représente les lignes 21, 22 et 35?

                          Code:
                          elm=file.read().split('\n')
                          Pourquoi n'utilises-tu pas readlines au lieu de la ligne ci-dessus? (Voir la proposition ci-dessous)

                          Code:
                          lines = [line.strip('\n') for line in f.readlines()]

                          Commentaire


                          • #14
                            La fonction de sécurité me permettais d'importer le script en cours d'exécution en excluant mes identifiants de connexions (lignes 21, 22, 35).

                            Pourquoi n'utilises-tu pas readlines au lieu de la ligne ci-dessus? (Voir la proposition ci-dessous)
                            Bonne question ... Je n'y est pas pensé.
                            ~ Yarflam ~

                            ❉ L'Univers se dirige vers son ultime perfection ❉

                            Commentaire


                            • #15
                              Hey ! J'ai un petit soucis, comment trouve-t-on le "nom des values" ? J'ai essayé en faisant "inspecter l'élément", j'ai donc toutes les infos sur le bloc dans lequel je veux écrire pourtant j'ai tout essayé et impossible de trouver ce qu'il me faut.
                              Au passage, est-ce que le programme "valide" tout seul le post ? C'est-à-dire, s'il y a un bouton sur lequel il faut cliquer pour valider, doit-on le lui demander ou bien est-ce que le programme le fait tout seul comme un grand ?

                              Merci d'avance ! ^^

                              Commentaire

                              Chargement...
                              X