-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathunsubscribe.sh
executable file
·122 lines (111 loc) · 4.61 KB
/
unsubscribe.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#! /bin/bash
# Pour se désinscrire massivement de listes de diffusion indésirables.
# Licence GNU GPL v3
# Vincent MAGNIN, 2020-02-15
# Dernière modification le 2020-10-17
# Mode strict :
set -euo pipefail
function usage(){
echo "Usage : ${0} [OPTION]... CHEMIN"
echo
echo "Se désinscrit des listes de diffusion reçues dans CHEMIN, qui peut"
echo "être un fichier ou un répertoire qui sera parcouru récursivement."
echo "Collecte également dans courriels.log les adresses e-mail quand la"
echo "désinscription n'est possible que par ce moyen."
echo
echo "Options :"
echo " -h afficher l'aide"
echo " -n ne pas se désinscrire (simuler)"
echo
echo "Exemples :"
echo " $ ./unsubscribe.sh ~/.thunderbird/rfjzi2xb.default/Mail/pop.aliceadsl.fr/Junk"
echo " $ ./unsubscribe.sh ~/.monlogicieldemail/Junk/"
echo
echo "Documentation : https://github.com/vmagnin/unsubscribe/blob/master/README.md"
}
ne_rien_faire=false
# On analyse les options de la ligne de commandes :
while getopts hn option ; do
case "$option" in
h) usage ; exit 0 ;; # Afficher l'aide
n) ne_rien_faire=true ;; # Ne pas télécharger
?) echo ; usage ; exit 1 ;; # Options inconnues
esac
done
# On saute les arguments de type option :
shift $((OPTIND - 1))
# On vérifie la présence des autres arguments
# et on affiche l'usage en cas d'oubli :
if [ ${#} -eq 0 ]; then
usage
exit 1
else
# On récupère le chemin fourni en ligne de commandes :
readonly chemin="${1}"
fi
# Si le paramètre est un répertoire, grep fonctionnera en mode récursif, sinon
# il n'analysera que le fichier indiqué :
if [ -d "${chemin}" ]; then
readonly recursif="-R"
echo "Analyse récursive du répertoire... Soyez patients... "
elif [ -f "${chemin}" ]; then
readonly recursif=""
echo "Analyse du fichier fourni... Soyez patients... "
else
echo "Chemin non valide !"
exit 2
fi
# On cherche avec grep les liens http(s) de désinscription dans les champs
# List-Unsubscribe (ou list-unsubscribe ou X-List-Unsubscribe) des en-têtes
# des courriels.
# Options de grep :
# -z : remplace les retours à la ligne par des octets nuls
# -P : Perl-compatible regular expressions (PCREs)
# -o : ne garde que la partie correspondant au motif
# La commande tr fait l'opération inverse.
# L'expression régulière est expliquée dans le fichier README.md :
readonly liens1="$(grep ${recursif} -zPo '[Ll]ist-[Uu]nsubscribe:\s+?(?:<mailto:[^>]+?>,\s*?)?<http[s]?://[^>]+?>' "${chemin}" | tr '\000' '\n' | grep -Po 'http[s]?://[^>]+')"
readonly liens2="$(grep ${recursif} -zPo '[Ll]ist-[Uu]nsubscribe:\s+?http[s]?://[^>]+?\.htm[l]?' "${chemin}" | tr '\000' '\n' | grep -Po 'http[s]?://[^>]+')"
# Compteurs :
n=0
echecs=0
# Ne pas mettre de guillemets autour de ${liens} pour que ça reste une liste !
for un_lien in ${liens1} ${liens2}; do
n=$((n + 1))
if ${ne_rien_faire} ; then
echo "${un_lien}"
else
# On se connecte avec wget et si ça échoue, on incrémente le compteur
# d'échecs.
# -a : ajouter ("append") la sortie de wget au fichier de log.
# -t : nombre d'essais ("tries").
# -T : délai d'attente ("timeout").
# -P : répertoire où seront téléchargés les fichiers.
if ! wget -a unsubscribe.log -P téléchargés -t 2 -T 10 "${un_lien}"
then
echecs=$((echecs + 1))
# On affiche un zéro pour marquer la progression...
echo -n "0"
else
# On affiche des points à la suite pour marquer la progression...
echo -n "."
fi
fi
done
# Pour afficher les statistiques même si la ligne suivante échoue :
set +e
# Les champs comportant uniquement une adresse e-mail sont simplement collectés
# dans le fichier courriels.log. C'est à l'utilisateur d'exploiter ensuite
# ces adresses. L'expression régulière est expliquée dans le fichier README.md :
grep -oPz '[Ll]ist-[Uu]nsubscribe:\s+?<mailto:[^>]+?>[^,]' "${chemin}" | tr '\000' '\n' | grep -oP '(?<=mailto:)[^>]+' > courriels.log
set -e
# La commande wc -l permet d'afficher le nombre de lignes d'un fichier.
echo
echo "Statistiques :"
echo "* Nombre de liens : ${n}"
echo "* Echecs de connexion : ${echecs}"
echo "Dans le répertoire 'téléchargés' :"
echo "* Nombre de ' bien ' : $(grep -iR ' bien ' téléchargés/ | wc -l)"
echo "* Nombre de ' success' : $(grep -iR ' success' téléchargés/ | wc -l)"
echo "* Nombre d'erreurs : $(grep -iRE 'err(eu|o)r' téléchargés/ | wc -l)"
echo "Adresses e-mails collectées dans courriels.log : $(wc -l < courriels.log)"