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.
Développement Web Libre 
14 commentaires ↓
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 ?
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.
Est ce qu’il y aune bibliothèque pour que ce robot arrive a lire et remplir les captcha …?
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.
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)
quand je lance le script, je n’ai pas d’erreur même si les logins et mot de passe sont faux
bizarre
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
bon ca affiche pas ce qui est après # :
Mechanize::Form::Field:0x548bc3c @name= »log », @value= »"
Mechanize::Form::Field:0x548b458 @name= »pass », @value= »"
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.
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
Merci pour le retour d’infos, je suis sûr que ça peut aider d’autres personnes qui ont eu ce problème.
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…
Moi je voulais savoir si le contenu est affiché via Ajax, est il possible de le recupérer tout de meme ?
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