02/11/2023Si vous souhaitez surveiller une modification de page Internet, vous pouvez vous tourner vers des sites spécialisés, qui proposent de récupérer à intervalles réguliers une page et de vous notifier en cas de changement de celle-ci. Cela peut impliquer un paiement ou le recueil de vos informations personnelles...
Aussi, j'ai réalisé un script en Bash qui offre ces mêmes fonctionnalités. Il propose :
- de renseigner une ou plusieurs URL à surveiller
- pour chacune, de saisir une expression régulière, afin d'extraire seulement une partie de la page
- de télécharger la page et, en cas de modification, d'envoyer un email avec un titre personnalisé
- de visualiser les dernières valeurs récupérées (en les stockant dans un fichier historique)
#!/bin/bash
# Tableau d'URL à surveiller
urls=(
"https://site.com/ps5-pro.html"
"https://site.fr/ps5-pro.html"
)
# Tableau d'expressions régulières correspondantes
regex=(
".*<span id=\"product-availability\">[^<]*<span class=\"control-label\">[^<]*</span>([^<]*)</span>.*"
".*<span id=\"product-availability\">[^<]*<span class=\"control-label\">[^<]*</span>([^<]*)</span>.*"
)
# Tableau de sujets d'e-mail correspondants
emailSujet=(
"Changement sur PS5, site 1"
"Changement sur PS5, site 2"
)
repSauve="analyses" # Répertoire de stockage des appels précédents
emailDesti=monemail@domaine.fr # Email destinataire (mettre vide si aucun email à envoyer)
# Créer le répertoire s'il n'existe pas
if [ ! -d "$repSauve"; then
mkdir "$repSauve"
fi
# Fonction pour surveiller une URL donnée
function surveille_url() {
local url="$1"
local reg="$2"
local email="$3"
local sujet="$4"
# Extrait le nom du domaine de l'URL pour le nom du fichier de sauvegarde
nomDomaine=$(echo "$url" | grep -oP '(?<=://)[^/]+')
# Extrait le nom de fichier de l'URL et remplace les caractères invalides par des underscores
nomFichier=$(basename "$url" | tr '/.' '_')
fichierSauvegarde="$repSauve/${nomDomaine}_${nomFichier}.txt"
# Télécharge la page
echo "Vérifie ${url}"
curl -s "$url" > "page.html"
# Extraction (en supprimant les retours chariots)
valActu=$(tr -d '\n' < "page.html" | sed -n -E "s#$reg#\1#p" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
rm "page.html"
if [ ! -e "$fichierSauvegarde"; then
# Si 1er appel
valPreced=$valActu
else
# Sinon, lit la valeur précédente
valPreced=$(tail -n 1 "$fichierSauvegarde" | sed 's/^[^:]*:[[:space:]]*//')
fi
# Enregistre la valeur extraite
echo $(date +'%Y-%m-%d_%H-%M-%S') " : $valActu" >> "$fichierSauvegarde"
# Limite le nombre de lignes à conserver
fichierTmp=$(mktemp) # Crée un fichier temporaire
tail -n 100 "$fichierSauvegarde" > "$fichierTmp" # Conserve les 100 dernières lignes
mv "$fichierTmp" "$fichierSauvegarde" # Remplace le fichier d'origine par le fichier temporaire
# Compare les valeurs précédente/actuelle
if [ "$valActu" != "$valPreced"; then
echo "- Ancienne valeur : '$valPreced'"
echo "- Nouvelle valeur : '$valActu'"
if [ -n "$email"; then
message="La page $url qui est en surveillance a changé : la valeur est passée à '$valActu'"
echo "$message" | mail -s "$sujet" "$email"
fi
else
echo "- La valeur est inchangée : '$valActu'"
fi
echo
}
# Parcourir les URL, expressions régulières et sujets d'e-mail correspondants
for ((i = 0; i < ${#urls[@]}; i++)); do
surveille_url "${urls[i]}" "${regex[i]}" "${emailDesti}" "${emailSujet[i]}"
done
Une fois créé, il faut planifier une exécution régulière du script :
- Affichez le gestionnaire CRON :
- Ajoutez la ligne suivante, enregistrez et quittez
*/180 * * * * bash /opt/scripts/monitorer_page.sh
Le script sera ainsi lancé toutes les 3 h.
Dernière modification le 02/11/2023 - Quillevere.net