Un robot qui parcourt le web à votre place

Qui n’a pas un jour eu besoin d’un robot effectuant une action répétitive sur un site web. C’est ce que nous allons réaliser sous la forme d’un simple script Ruby.

Pièces détachées

Pour construire notre robot nous avons besoin des ces divers éléments :

  • Ruby
  • La bibliothèque Mechanize
  • Un éditeur de texte, si vous êtes sous windows je vous conseille d’aller voir du côté de chez e-texteditor

Assemblage

Nous allons étudier un exemple fourni dans la documentation de Mechanize : celui qui permet d’envoyer automatiquement une image sur le site Flickr.

require 'rubygems'
require 'mechanize'
agent = WWW::Mechanize.new
 
# Page de connexion à Flickr
page  = agent.get('http://flickr.com/signin/flickr/')
 
# Remplissage du formulaire de connexion
form  = page.forms.name('flickrloginform').first
form.email = ARGV[0]
form.password = ARGV[1]
page  = agent.submit(form)
 
# Page de transfert
page  = agent.click page.links.text('Upload')
 
# Remplissage du formulaire de transfert
form  = page.forms.action('/photos_upload_process.gne').first
form.file_uploads.name('file1').first.file_name = ARGV[2]
agent.submit(form)

Rien qu’en lisant le code on arrive déjà à comprendre le fonctionnement général de cet exemple. On retrouve les classiques inclusions de bibliothèque et initialisations d’objets au début du script.

Mechanize permet d’effectuer toutes les actions que ferrait un visiteur humain sur une page web. Notre robot commence donc par ouvrir la page de connexion de Flicker en utilisant le fonction get. Puis il trouve le formulaire avec forms.name(‘nom_du_formulaire’).first et remplis chaque champs : la fonction précédente nous à retourné un objet initialisé avec tous les champs du formulaire, on peut y accéder directement. Il ne nous reste plus qu’a soumettre ce formulaire, c’est ce que fait la méthode submit, ça reviendrait à cliquer sur le bouton Get in there si on était un vrai visiteur en chair et en os.

Voila, on est connecté, pour transférer une image il faut simuler un clic sur le lien texte Upload, c’est ce que fait le morceau de script qui suit (Le agent.clic …) et remplir le nouveau formulaire, celui du transfert. On notera la fonction file_uploads qui facilite bien les choses …

Le transfert commence dès qu’on valide ce dernier formulaire.

Vous avez vu, c’est vraiment très simple. Il ne vous reste plus qu’a créer votre propre script pour automatiser vos tâches de navigation qui seraient un peut trop rébarbatives. Vous pouvez vous en servir pour exemple mettre à jour un site de façon régulière en plaçant votre script dans une tâche cron.

14 commentaires ↓

#1 alex on 05.13.07 at 22:26

salut,

il y a un lien pour téléchager la bibliothèque mechanize pour windows?
de plus avec rubis on doit enregistrer où les fichiers .rb ?

#2 Stéphane on 05.15.07 at 10:36

Pour installer Mechanize, un simple ‘gem install mechanize’ devrait suffire. Pour lancer un script Ruby vous devez taper : ‘ruby monscript.rb’, et du moment que l’interpréteur Ruby est accessible (dans le path) vous pouvez placer vos script où vous voulez. Voici un guide pour commencer avec Ruby.

#3 musikou on 06.16.07 at 17:41

Est ce qu’il y aune bibliothèque pour que ce robot arrive a lire et remplir les captcha …?

#4 Stéphane on 06.18.07 at 10:03

Le but d’un captcha est justement d’empêcher l’utilisation d’un robot pour éviter le spam. Si j’ai publié ce billet, c’est seulement pour montrer comment automatiser un process de façon simple.

#5 Kiet on 05.31.08 at 12:03

Merci pour ton script
j’ai essayé
mais comment on fait pour vérifier si il s’est bien connecté?
J’ai essayé avec ce script sur mon site mais en vérifiant sur un autre site il met que je ne suis pas connecté

Voici mon script
require ‘rubygems’
require ‘mechanize’
agent = WWW::Mechanize.new

# Page de connexion à Flickr
page = agent.get(‘http://…’)

# Remplissage du formulaire de connexion
form = page.forms.name(‘formlog’).first
form.log = « titi »
form.pass = « toto »
page = agent.submit(form)

#6 Kiet on 05.31.08 at 12:05

quand je lance le script, je n’ai pas d’erreur même si les logins et mot de passe sont faux
bizarre

#7 Stéphane on 06.02.08 at 13:24

Il faut essayer d’afficher les variables renvoyées par Mechanize pour comprendre ce qu’il se passe.

Essayer :
p page
ou puts page.inspect

#8 KIet on 06.02.08 at 21:56

bon ca affiche pas ce qui est après # :

Mechanize::Form::Field:0×548bc3c @name= »log », @value= »"

Mechanize::Form::Field:0×548b458 @name= »pass », @value= »"

#9 Stéphane on 06.03.08 at 15:49

Apparemment les valeurs ne sont pas passées… Essayez de voir dans la doc s’il n’y a pas un problème de syntaxe : http://mechanize.rubyforge.org/mechanize/
Cet article date un peu et ça a peut-être changé depuis.

#10 KIet on 06.03.08 at 17:47

Voila avec cela ca marche
avec aide de mechanize
Merci

require ‘rubygems’
require ‘mechanize’
agent = WWW::Mechanize.new

agent_alias = ‘Windows IE 6′
# Page de connexion à Flickr
page = agent.get(‘http://…’)

# Remplissage du formulaire de connexion
form = page.form(‘formlog’)
# form = page.forms.name(‘formlog’).first
# form.log = ‘titi’
# form.pass = ‘toto’
form.log = ‘toto’
form.pass = ‘titi’

page = agent.submit(form, form.buttons.first)
puts page.inspect

#11 Stéphane on 06.04.08 at 8:50

Merci pour le retour d’infos, je suis sûr que ça peut aider d’autres personnes qui ont eu ce problème.

#12 Hachmaki on 09.02.08 at 16:42

wow

dommage que je sois si nul en programmation.
C’est l’outil de la mort qui tue: un robo qui va chercher sous flickr les membres d’un groupe et les ajoute tous comme amis….

un peu l’equivalent des trains d’amis pour myspace…

#13 x on 03.17.09 at 10:17

Moi je voulais savoir si le contenu est affiché via Ajax, est il possible de le recupérer tout de meme ?

#14 Stéphane on 03.18.09 at 9:30

Ca reste possible sous certaines conditions : il faut connaître l’url et les paramètres où est effectuée la requête et il faut aussi que le concepteur du script (de la requête) n’ait pas fait en sorte que son script ne fonctionne que depuis son site.

Laisser un commentaire