Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/08/2012, à 21:26

PJSimply

[Script] Télécharger les images d'un thread de l'imageboard 4chan

Je pense que beaucoup ici connaissent 4chan, c'est une board anonyme où l'on peut poster des images. Le problème c'est que des threads particuliers comme des fonds d'écran ou des scan de comics ça peut s'avérer assez long, j'ai donc écrit ce script tout bête mais pratique :

#! /bin/sh

		cdir=$(pwd)
	qflag='';
	dir='./';
	url=''
	while [ $# -gt 0 ]
		do
    			case "$1" in
        		-q)  qflag='-q';;
			-d)  dir="$2"; shift;;
			-u)  url="$2"; shift;;
			--)  shift; break;;
			-*)
	    			echo >&2 \
	    			"usage: $0 [-q pour ne pas afficher le téléchargement des images] [-d dir] [dossier de estination] [-u url] [thread 4chan à dl]"
	    			return 1;;
			*)  break;;
    			esac
    		shift;
		done;
	echo '
Coucou, vous pouvez laisser tourner, vous serez avertis à la fin
	';
	if [ ! -d "${dir}" ]; 
		then mkdir "${dir}";
		echo 'Dossier crée ...
';
	fi;
	cd "${dir}";
	wget -q "${url}" -O etape1.txt # récupération du thread dans etape1.txt
    sed 's/</\n/g' etape1.txt | grep 'images.*fileThumb\|fileThumb.*images' | cut -d '"' -f4 > etape2.txt; 
        # - on remplace une partie des balises html par des sauts de ligne pour faciliter l'utilsation des commandes cut et grep
        # - on récupère liens de type image qui ont la classe FileThumb
        # - on récupère les morceaux url que l'on stock dans etape2.txt
        #


        for line in $(cat etape2.txt);
                 do line='http:'"${line}"; echo "${line}"; done > urls.txt; # ajout du morceau d'url pour les rendre compréhensibles par wget
        echo 'Téléchargement des images en cours ...
';
	wget "${qflag}" -i urls.txt; # récupération des url au bon format contenues dans urls.txt
	echo 'Suppression des fichiers inutiles';
        rm -f etape1.txt etape2.txt urls.txt; 
        cd "${cdir}";
	if [ -d /usr/bin/notify-send]; 
        	then notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "Téléchargement terminé"; # si l'utilisateur a installé notify send il a un bel avertissement
	else
		echo 'Téléchargement terminé'; # sinon simple fin de commande
	fi;

PS : les fichiers étape sont là pour simplifier mais je les ai aussi utilisés pour expliquer les cuommades cut et sed quand j'expliquais à quelqu'un qu'il voit bien les étapes.

J'espère que vous apprécierez smile

PS : toutes les critiques étant bonnnes à prendre, je suis tout ouï (je suis pas sur de orthographe là)

Meci à Zakhar pour les explications / améliorations

Dernière modification par PJSimply (Le 22/08/2012, à 23:12)

Hors ligne

#2 Le 22/08/2012, à 22:31

Zakhar

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Je ne connais pas 4chan mais quelques conseils...

- pourquoi bash ? Ton script a l'air d'être tout à fait "standard" et de n'utiliser aucun "bashism" (ce qui est plutôt bien, c'est portable), dans ce cas tu mets en première ligne /bin/sh
/bin/sh est un "pseudo-shell" ça dit simplement à ton Linux d'utiliser son shell par défaut qui n'est PAS bash pour Ubuntu, mais dash, lequel est bien 5 à 10 fois plus rapide !..

- toutes tes variables sont "nues". Ca c'est une très mauvaise habitude, et on peut faire planter facilement ton programme ! Par exemple, tu prévoies qu'on puisse introduire un nom de répertoire, eh bien si l'utilisateur a la mauvaise idée de mettre un nom de répertoire avec un espace (après tout il nomme ses répertoires comme il le veut !) ton script va planter à plusieurs endroits.
Par exemple:

them mkdir $dir

mal, mal, mal, mal !...

Démonstration:

dir="Mon répertoire"
mkdir $dir
ls -l

... résultat:

drwxrwxr-x 2 zakhar   zakhar      40 août  22 22:10 Mon
drwxrwxr-x 2 zakhar   zakhar      40 août  22 22:10 répertoire

Ce que tu voulais en fait c'est:

mkdir "${dir}"

Là j'ai écrit la forme totale des variables, mais ce qui est important en l'occurrence ce sont les guillemets. Sans ça, aïe aïe les espaces et caractères "spéciaux". Les accolades sont superflues lorsque tu utilises une variable toute seule comme ça, mais je trouve que ça "unifie" les choses et ça évite de les oublier le jour où tu en as besoin. D'un seul coup d'oeil tu vois bien ainsi où sont les variables.

- Homogénéité: pourquoi utiliser les deux formes : `commande` et $(commande), comme dans :

        mv -f `echo $url | cut -d '/' -f6` etape1.txt;
        cat etape1.txt | sed 's/</\n/g' | grep images | grep fileThumb | cut -d '"' -f4 > etape2.txt;
        for line in $(cat etape2.txt);

(première forme sur la première ligne, et deuxième sur la dernière).
La forme avec $() est la plus "moderne", elle de plus des avantages, notamment quand on veut les imbriquer. Je te suggère de t'en tenir à cette forme là, et d'homogénéiser ainsi.

        mv -f $(echo "${url}" | cut -d '/' -f6) etape1.txt;
        cat etape1.txt | sed 's/</\n/g' | grep images | grep fileThumb | cut -d '"' -f4 > etape2.txt;
        for line in $(cat etape2.txt);

- Useless Use of Cat Award

cat etape1.txt | sed 's/</\n/g' 

==>

sed 's/</\n/g' etape1.txt

Et tu peux aussi fusionner le grep qui suit :

grep images | grep fileThumb
grep 'images.*fileThumb\|fileThumb.*images'

(parce que je ne sais pas s'il y a un ordre déterminé entre image et fileThumb, si oui, tu peux garder l'alternative correcte).
Cette deuxième version est plus rapide:
- une seule invocation de grep
- un pipe de moins (donc 2 file handles + open/close en moins)
Par contre, surtout si l'ordre des deux mots est quelconque, elle est nettement moins lisible et maintenable... donc c'est à toi de voir !

L'idéal cependant, si tu es un maître 3ème dans en sed, c'est de tout faire dans ta commande sed, qui est tout à fait capable de te trouver des patterns comme un grep. Je te laisse chercher, c'est un bon exercice ! tongue


- Dernier point... et non des moindres.... il y a 0 commentaire !.. roll roll roll
Même pour toi, si tu relis quelques temps plus tard, les commentaires sont essentiels !...
A minima, tu mets une entête qui explique ce que le script est sensé faire.
J'ai aussi remarqué qu'en mettant des commentaires détaillés, j'arrivais à corriger bien des erreurs avant qu'elles ne se manifestent, c'est donc une bonne habitude à prendre.

Dernière modification par Zakhar (Le 22/08/2012, à 22:38)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 22/08/2012, à 22:45

PJSimply

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Merci beaucoup pour tous tes commentaires big_smile
J'ai encore du travail mais bon au moins j'éviterais toujours des erreurs / bêtises et c'est agréable

- pour le bash au lieu du sh je t'avoue que je n'avais pas bien compris la différence et que par précaution on m'avait dit de mettre /bin/bash
- Pour les noms des variables je t'avoue n'y avoir jamais réfléchit et oui en effet c'est bien bête
- Après pour le cat c'est bête mais en gros je test toujours en ligne de commande avant d'écrire mon script et donc je fais cat ... pour voir la tête et ensuite flèche du haut, pipe et sed et je le met tel quel dans mon script

Enfin bref, merci beaucoup je met à jour celui là et je vasi modifier d'autre script de ce pas big_smile

Hors ligne

#4 Le 22/08/2012, à 22:50

Zakhar

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Oui, oui, comme ça on apprend !

Le coup de la "précaution" pour bash... ça c'est un mauvais qui t'a dit ça !.. Au contraire, on devrait prendre soin de ne PAS mettre de bashism (c'est à dire un truc qui ne marche QUE avec bash) pour faire en sorte que ton script soit le plus portable possible.
Par exemple, j'ai fait un script pour recoller des .xtm (un format à la noix inventé par un Windowsien qui refuse d'Open-Sourcer sont truc à 2 balles pour qu'on fasse un exécutable Linux...). J'ai eu plein d'utilisateurs sur Synology, alors qu'à l'origine je l'avais fait pour Ubuntu. C'est la beauté de GNU, qui est partout, y compris ces petites machines là (les NAS). Si j'avais pensé du premier coup à le faire sans "bashism", ça aurait facilité les choses. En effet, sur les NAS Synology, bash est bien trop lourd pour une "petite machine" de la sorte, et c'est Ash qui est utilisé. Bon, heureusement il y a un système de dépôts qui permet de rajouter bash sur un Synology... mais ça aurait été mieux, plus simple et plus rapide sans avoir à le faire.

Et n'oublie pas les commentaires wink

Dernière modification par Zakhar (Le 22/08/2012, à 22:57)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#5 Le 22/08/2012, à 22:58

PJSimply

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

J'ai corrigé, c'est mieux?

Et en fait les commentaires j'en met mais à la base c'est pas un script seul mais une fonction que je définit dans un fichier annexe de .bashrc donc j'ai un commentaire avant mais oui je vais commenter pour que ça soit compréhensible smile

Hors ligne

#6 Le 22/08/2012, à 23:17

Zakhar

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Ca a l'air mieux... et au moins ça ne plantera sur un utilisateur nigaud qui a la mauvaise idée de donner un nom de répertoire avec des espaces !..

Et tiens, juste pour t'embêter...

echo 'abcĢd"ef' | iconv -f utf-8 -t utf-16 | cut -d '"' -f1

Tu vois, tu as utilisé "cut" et c'est une méthode incertaine pour obtenir ce que tu veux.
Là tu n'y peux hélas pas grand chose... c'est que cut n'est pas fait pour fonctionner en "multibyte".
La démonstration ci-dessus prouve que si le site sur lequel tu as fait ton wget a la mauvaise idée de t'envoyer de l'UTF-16 (heureusement c'est rarissime !) eh bien ton script est susceptible se planter au cut et de mal couper, dans la mesure où certains caractère en UTF-16 peuvent contenir l'octet 0x22 qui représente le guillemet (quote).

Bref... la protection "absolue" n'existe pas... du moins dans l'état actuel des outils GNU sur le multibyte (il y en a extrêmement peu de compatibles).

P.S.: heureusement, tel qu'est conçu UTF-8, il est impossible de rencontrer 0x22 autrement que si tu as le caractères guillemets (quote) !

P.S.2: tu pourrais traiter un retour en UTF-16... le site doit te le dire dans l'entête du HTML, et il "suffit" alors de faire un iconv en utf-8 avant ton cut

Dernière modification par Zakhar (Le 22/08/2012, à 23:25)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#7 Le 22/08/2012, à 23:31

PJSimply

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Donc en fait c'est une erreur probable mais pas évitable sad ?


Après pour cela, "l'avantage" de ce script est qu'il est pas un lien de récupération d'image générique mais qu'il est fait que pour un site et que donc sauf en cas de changements du site l'utilisateur risque pas à priori de grosses surprises. Mais c'est vrai que c'est emmerdant. hmm

Ah ok ben je vais voir ça merci du conseil

Dernière modification par PJSimply (Le 22/08/2012, à 23:34)

Hors ligne

#8 Le 22/08/2012, à 23:47

Zakhar

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Mais effectivement, puisque ton script est dédié à un site particulier, inutile de t'embêter avec des iconv... enfin si le site en question sert bien de l'UTF-8

S'il te donne de l'UTF-16... bah là t'es dans le caca ! lol


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#9 Le 27/08/2012, à 13:02

cracolinux

Re : [Script] Télécharger les images d'un thread de l'imageboard 4chan

Salut, une petite idée de modification :

for line in $(cat etape2.txt);
                 do line='http:'"${line}"; echo "${line}"; done > urls.txt

devient :

while read line ; do
echo "http:${line}" > urls.txt
done < etape2.txt

Ceci dit, est-ce que > urls.txt ne devrait pas etre >> urls.txt ??


Sympa votre discussion les gars, merci

Dernière modification par cracolinux (Le 27/08/2012, à 13:03)


Pixup : postez vos images vite et bien - Wificheck : Aidez nous à vous aider

« Ne devenez jamais pessimiste. Un pessimiste a plus souvent raison qu'un optimiste, mais l'optimiste s'amuse plus — et aucun des deux ne peut arrêter la marche du monde. » R.Heinlein

Hors ligne