source-code.png
J’ai eu beaucoup de retours pour mon petit code de récupération de pages web en PHP, publié hier et ici : Respawn 0.0.1.

À propos du nom : « Respawn », c’est expliqué sur ce post → https://github.com/broncowdd/respawn

Depuis la version 0.0.1, je passe ce soir à la version 0.0.2, avec les améliorations de Cyril :
– les pages téléchargées contiennent un bouton de retour à l’interface de Respawn (en bas et en transparent).
– il y a un bookmarklet JS (le lien « respawn » sous le formulaire).

Et un bug remonté par Tontof que l’on vient de corriger :
– si on utilisait le lien site.com ça ne marchait pas. Il fallait utiliser le lien site.com/ (avec le slash à la fin). C’est corrigé là.

D’autres idées ont aussi été proposées, comme celle de récupérer tous les fichiers d’une page web dans un seul fichier (le CSS dans une balise <style> même chose pour le JS et les images liées encodées en BASE64).
Ça ferait quelque chose comme les archives de pages Web « .mht », utilisées par IE et Opera.

Bug connus (dans les versions <=0.0.2) :
– une page ne doit pas subir de redirections, sinon le script s’arrête. Exemple : tentez de récupérer « www.lehollandaisvolant.net/ » et ça plantera. Mon site redirige vers la même chose sans le « www. » inutile devant.

Téléchargement :
– respawn-002.7z
(sha1 : fa0545a44b0bd827432e34eae4c1d87f55e64a1e)
Voir ici plutot : https://github.com/broncowdd/respawn

Cette page sert de page de discussion pour le script. Toutes les propositions sont les bienvenues. Je reste également dispo par email :-).

image publiée par 4chan

30 commentaires

gravatar
baba a dit :

Salut,

Personnellement, j'utilise le MHT d'Opera pour consulter une page ultérieurement (je ne vois pas trop l'intérêt de réinventer la roue).

S'il s'agit d'un aspirateur Web, je m'en suis déjà fait un, mais beaucoup plus puissant : identification sur les serveurs comme étant un vrai utilisateur (avec gestion du référent, délais entre les téléchargements...), paramétrage de limites mini/maxi pour les fichiers et par extension, gestion du nombre de niveaux de téléchargement, liste de sites blacklistés... Le tout 100% Javascript/Ajax côté client (avec fenêtres) et 100% PHP côté serveur.
Mais il ne renomme pas les chemins comme respawn le fait, c'est vraiment du 1:1.

Bon courage pour le projet, c'est prometteur. Le code m'a l'air un peu confus par contre.

gravatar
qwerty a dit :

Oh cool, une page ! Si paq possible que le script attend la fin de la redirection ?

gravatar
Tontof a dit :

Je ne pense pas que c'est évident pour tout le monde, du coup je voulais préciser que respawn ne permettait pas totalement de remplacer un proxy (même si dans la plupart des cas c'est ce qui se passe).

J'ai eu du mal à trouver un exemple de site à la con, mais si vous essayez de faire un respawn du bon coin vous verrez qu'il charge les images de leur carte en javascript (et qui ne sont donc pas chargées par respawn). Si votre but est d'en faire un proxy, il faut donc penser à bien désactiver javascript quand vous accédez aux pages qui ont été respawned :-)

gravatar
Le Hollandais Volant a dit :

@Tontof : ce n'est pas le but de Respawn de servir de proxy.

Pour cela je sortirais bientôt un script, Oranjeproxy, basé sur VerdaProxy (lui même basé sur un autre proxy basé à nouveau sur php-proxy) avec mes améliorations.

gravatar
Baronsed a dit :

Je ne voudrais pas être hors sujet, mais quel avantage par rapport à wget ?

gravatar
nucl3arsnake a dit :

Même question de @Baronsed ...

<hs>Quand je suis arrivé sur ton site j'ai eu le droit à "vous utilisez une @ IP suspecte" ... Un problème avec TOR ? </hs>

gravatar
Le Hollandais Volant a dit :

@Baronsed : Wget fait les fichiers externes à une page (je sais pas, je demande) ?
Mon script est une lib en PHP et pas en bash… Le but est donc son intégration dans une appli web.

@nucl3arsnake : pas avec tor, mais avec mon anti-spam (project-honeypot). Je pense que des spammeurs utilisent Tor désormais, et que ton IP de l’instant ait été détectée comme spammeuse par le passé.
Dans tous les cas, ça ne devrais pas t’empêcher de surfer :)

gravatar
Ploppe a dit :

Suggestion : faire un bookmarklet qui récupère tout le DOM de la page (donc ce qui est affiché (et possiblement modifié par le JS), et non ce qui est donné par le serveur) et envoie le tout au script respawn (en POST). Ensuite, celui ci n'a plus qu'à télécharger les ressources manquantes et *paf*, on a un snapshot complet de la page actuelle.

gravatar
Ploppe a dit :

@Le Hollandais Volant : Je n'ai pas regardé la source de respawn, mais je ne pense pas que ça soit trop dur à implémenter. Si le script est appelé "normalement", ca télécharge l'URL et ses dépendances, si c'est une requête POST, on zappe le téléchargement initial de la page et il n'y a que les dépendances à télécharger.

gravatar
Tontof a dit :

@Le Hollandais Volant : Oui oui je sais bien que ce n'est pas le but de Respawn, mais c'était surtout pour préciser aux gens qui pensaient pouvoir l'utiliser comme proxy que ce n'était pas sans risque :-)

@Ploppe et @Le Hollandais Volant : Je ne sais pas si ça pourrait servir, mais j'ai proposé il y a quelque temps un bookmarklet qui avait justement pour but de sauvegarder une page. L'avantage étant de pouvoir supprimer/modifier des éléments de la page pour ne garder que l'information utile (à la base je n'avais pas de script PHP pour faire de sauvegarde et je voulais essayer de faire un truc qui fonctionne uniquement côté client (avec les problèmes que ça pose concernant la possibilité de récupérer les images et le style). J'ai réussi à faire un truc pour récupérer les images en base64 mais ça pose problème pour la conversion des images qui ne sont pas hébergées sur le même domaine. Pour le style, j'utilise le style généré qui est souvent très/trop verbeux).

Bref, j'avais aussi pensé faire un truc du style de Respawn pour la dernière lettre 'E' : 'export' que j'avais marqué en TODO.

Du coup, ça peut peut-être te servir ; sinon il est aussi envisageable de faire un mixte de KrISS pin et Respawn ?

https://github.com/tontof/kriss_pin
avec un peu plus de détails ici :
http://tontof.net/?1350316640

gravatar
Exagone313 a dit :

Hmmm ... Je ferais bien la même chose en extension Firefox/Chrome, qui récupère la structure courante de la page (donc pas de problème de Javascript). Sauf qu'ils peuvent pas écrire de fichiers, non ? Donc il faudrait coupler avec un serveur qui pourra récupérer le code et écrire le fichier. Un peu chiant.

gravatar
Gilles a dit :

Ça accepte les jokers ? URL = *
Et hop on télécharge tout Internet :)

==> je sors :p

gravatar
baba a dit :

@Exagone313 : Il ne faut plus faire du limité à un seul navigateur. On est en 2012 !

gravatar
Baronsed a dit :

@Le Hollandais Volant : Non seulement les fichiers extérieurs à une page (-p, --page-requisities), mais aussi la conversion en liens relatifs (-k), la récursivité (-r), la profondeur de celle-ci (-l, --level), le filtrage positif (-A) ou négatif (-R) par type de fichier ou par répertoire (-I, -X), les connexions lentes et, semble-t-il, les mots de passe, cookies et sessions (pas testé ces derniers), ainsi que beaucoup d'autres choses :-)

Ce n'est pas un script, il est en C (d'après les dépendances), mais il est sans doute possible de l'appeler depuis PHP.

gravatar
qwerty a dit :

Au bout de 30s le script s'arrête, et quand il doit récupérer des fichiers lourd (vidéo) ça empêche le téléchargement jusqu'au bout. Essaye de jouer avec set_time_limit.

gravatar
Juanito a dit :

Hello Timo,

Je trouve ton projet de Respawn excellent. Il y a quelques jours je cherchais sur le net un outil dans le style wget qui fasse exactement la même chose que ce que fait Opera, c'est à dire d'enregister une page web avec tous les éléments en .MHT. Mais cela n'existe pas encore. A part Opera, mais il faut faire chaque URL manuellement.

Je suis fan de l'application mobile Opera sur Android et c'est très pratique pour moi d'enregistrer des pages pour les lire plus tard lorsque je n'ai pas de connexion (à l'étranger ou en voyage)

Du coup ce que je recherche c'est un outil (PHP ou script bash) qui permette de faire cela en boucle pour une liste de liens données.
Je me suis rendu compte que j'ai beaucoup d'url dans mon tiddlywiki dont je souhaiterais avoir une version dispo hors ligne.
De plus dans d'autres pays comme en Australie, les forfaits internet adsl sont limités en Go par mois, l'illimité est bien trop cher, idem pour la 3g, alors ce genre de projet permet d'économiser de la bande passante.

Alors pour l'instant je garde ma façon de faire manuellement avec Opera car je préfère un .MHT que plein de petit fichiers.

gravatar
Juanito a dit :

Euh merci, mais du coup je suis un peu perdu. D'où sort la version 3, et pourquoi n'est ce pas signalé sur cette page ?
Après la phase de login je me retrouve avec un mode debug et l'affichage d'un tableau Array avec les variables utilisés par le script.

Array
(
[GLOBALS] => Array
*RECURSION*
[_POST] => Array
(


Où puis-je trouver un tout petit plus d'info sans lire (tout) le code ?

gravatar
Le Hollandais Volant a dit :
Oula, mince !
C’est un bug qui était resté.
Voilà la version corrigée : (lien supprimé) voir là : https://github.com/broncowdd/respawn

Ce script, c’est un internaute (Cyril) qui nous a fait ça :D. En dehors de ce petit bug (un simple oublie d’une ligne "garde fou" qui traine encore là), le programme est beaucoup plus complet que ma lib, et possède un système de login, de sessions, de gestion des pages, de classement par dossiers…
gravatar
JerryWham a dit :

Pour ceux que ça intéressent, j'ai utilisé le modèle de connexion de Shaarli (adapté), la gestion des dossiers de pluxml (un peu modifié) et la lib de Timo pour faire un script autonome.

Je vais rédigé un petit article sur mon site dès que j'aurai 5 min (ou pas). Je vous donnerai des nouvelles s'il y en a.

Je remercie Timo pour le script d'origine qui est vraiment bien pratique.

Cyril alias Jerry Wham

gravatar
BoboTiG a dit :

Un petit snippet pour prendre en compte les images, scripts, etc qui utilisent de simple quotes.
À partir de la igne 325 de respawn 0.0.2 :
//preg_match_all('#<\s*(source|audio|img|script|video)[^>]+src="([^"]*)"[^>]*>#Si', $data, $matches, PREG_SET_ORDER);
preg_match_all('#<\s*(source|audio|img|script|video)[^>]+src=(["\'])([^\2]+?)\2[^>]*>#Si', $data, $matches, PREG_SET_ORDER);

foreach($matches as $i => $key) {
if (preg_match('#^data:#', $matches[$i][3])) break;
$retrievable = add_table_and_replace($data, $retrievable, $matches[$i][0], $matches[$i][3], $url_p, 'other');
}

gravatar
Panchua a dit :

Bonsoir, est-il prévu de déposer le code sur github ou qqch dans le genre pour gérer un peu le versionning ? D'ailleurs y-a-til de nouvelles versions depuis celle de noël ?
Bonne continuation

gravatar
Memiks a dit :

Hello, cette page ne passait pas avec l'extraction des CSS, du coup j'ai du faire un "patch":

http://forum.dsmg600.info/viewtopic.php?id=7344

$globurl = (preg_match('#/$#', $url_p['pat'])) ? $GLOBALS['url'] : $url_p['s'].'://'.$url_p['h'].$url_p['pat'];

$uuu = (strlen($url_p['file']) == 0 or preg_match('#/$#', $globurl)) ? $globurl : substr($globurl, 0, -strlen($url_p['file']));
//$uuu = (strlen($url_p['file']) == 0 or preg_match('#/$#', $url_p['pat'])) ? $GLOBALS['url'] : substr($GLOBALS['url'], 0, -strlen($url_p['file']));

mais je ne suis pas sur que cela fonctionne dans tout les cas...

gravatar
Le Hollandais Volant a dit :
En effet, il y avait un soucis parfois : quand l’URL avait un paramètre, ça ne marchait pas, ce qui est quand même un gros soucis.

Ton patch résout le problème… si il y a un nom de fichier dans l’URL !
Mais pas si l’URL contient un paramètre sans nom de fichier.

En gros, il marche là :
http://lehollandaisvolant.net/index.php?d=2012/12
http://lehollandaisvolant.net/index.php

Mais pas là :
http://lehollandaisvolant.net/?d=2012/12

J’ai à mon tour patché ton patch, ce qui donne ça :
$globurl = $url_p['s'].'://'.$url_p['h'].$url_p['pat'];
(tout simplement)

Et ça semble marcher.

La version corrigée de mon ZIP (pas des autres variantes de Respawn) est là : respawn-130218-1615.7z voir là : https://github.com/broncowdd/respawn
gravatar
Jerry Wham a dit :

Je ne sais pas si vous avez une idée mais souvent, lorsqu'une page contient jquery minifiée, il arrive qu'une virgule saute dans le fichier, souvent après utf-8. Ce qui fait que les scripts de la page ne fonctionnent pas car la librairie plante.

Je ne sais pas d'où ça peut venir. Une piste peut-être ???

PS : merci pour le patch...

gravatar
jerry wham a dit :

Bronco vient de nous faire une application dérivée de respawn. Je n'ai pas encore regardé le code, mais je pense que c'est mieux fait que ce que j'ai proposé. Je vous suggère d'aller faire un tour sur son site http://www.warriordudimanche.net

Les commentaires sont fermés pour cet article