Surveiller une image en ligne

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Un petit coup de pêche à la ligne, on ne sait jamais...

J'ai besoin de surveiller la modification d'images sur un site: savoir à quelle heure exactement elle ont été publiées (ces images sont changées tous les jours).
Les images en question sont dans un répertoire accessible du site.

J'ai pensé à curl/wget + stat/diff sur les fichiers téléchargés, mais c'est un peu lourd d'aller télécharger toutes les x minutes des fichiers...

Si vous avez une piste plus simple je suis intéressé!
Merci.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
Dunatotatos
Membre
Membre
Messages : 425
Inscription : 11 mai 2016, 20:56
Status : Hors-ligne

Si tu as la chance d'avoir un en-tête avec un champ "Last Modified", voici une solution :D

EDIT option -I (i majuscule) de curl pour afficher uniquement l'en-tête.
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

Avec ça ?
curl -s -v -X HEAD https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
Merci pour vos pistes.
Dunatotatos a écrit :Si tu as la chance d'avoir un en-tête avec un champ "Last Modified", voici une solution :D
EDIT option -I (i majuscule) de curl pour afficher uniquement l'en-tête.
Effectivement ça fonctionne:

Code : Tout sélectionner

HTTP/1.1 200 OK
Date: Wed, 07 Sep 2016 08:27:11 GMT
Cache-Control: None
Last-Modified: Wed, 07 Sep 2016 06:22:23 GMT
ETag: "57cfb21f-dbd1"
X-SysID: TGcache
Content-Type: image/png; charset=utf-8
url: /thumbnail/issue/ed96eb3e-b1ec-45cb-ba28-190a2fd6f85a/front/catalog-cover.png
Age: 28932
X-Cache25: HIT
Content-Length: 56273
vohu a écrit :Avec ça ?
curl -s -v -X HEAD https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
Un peu plus poussif:

Code : Tout sélectionner

*   Trying xxx.xxx.xxx.xxx...
* Connected to xxxxx.xxxxx.com (xxx.xxx.xxx.xxx) port 443 (#0)
* found 173 certificates in /etc/ssl/certs/ca-certificates.crt
* found 699 certificates in /etc/ssl/certs
* ALPN, offering h2
* ALPN, offering http/1.1
* SSL connection using TLS1.2 / ECDHE_RSA_AES_128_GCM_SHA256
* 	 server certificate verification OK
* 	 server certificate status verification SKIPPED
* 	 common name: *.xxx.com (matched)
* 	 server certificate expiration date OK
* 	 server certificate activation date OK
* 	 certificate public key: RSA
* 	 certificate version: #3
* 	 subject: OU=GT77530668,OU=See www.rapidssl.com/resources/cps (c)14,OU=Domain Control Validated - RapidSSL(R),CN=*.xxx.com
* 	 start date: Mon, 13 Oct 2014 23:38:52 GMT
* 	 expire date: Sun, 15 Jan 2017 22:56:29 GMT
* 	 issuer: C=US,O=GeoTrust Inc.,CN=RapidSSL SHA256 CA - G3
* 	 compression: NULL
* ALPN, server did not agree to a protocol
> HEAD /thumbnail/issue/ed96eb3e-b1ec-45cb-ba28-190a2fd6f85a/front/catalog-cover.png HTTP/1.1
> Host: static.xxx.com
> User-Agent: curl/7.50.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Wed, 07 Sep 2016 08:31:08 GMT
< Cache-Control: None
< Last-Modified: Wed, 07 Sep 2016 06:22:23 GMT
< ETag: "57cfb21f-dbd1"
< X-SysID: TGcache
< Content-Type: image/png; charset=utf-8
< url: /thumbnail/issue/ed96eb3e-b1ec-45cb-ba28-190a2fd6f85a/front/catalog-cover.png
< Age: 28736
< X-Cache24: HIT
< Content-Length: 56273
< 
{ [0 bytes data]
* transfer closed with 56273 bytes remaining to read
* Closing connection 0
Mais le résultat y est aussi. Le fichier à bien été déposé à 06:22:23!

De mon côté j'ai pensé à ça:

Code : Tout sélectionner

wget --quiet -c -N --user-agent="" $site/xxx/front/catalog-cover.png
timestamp_actual=$(date -r $actual +%s)
timestamp_last=$(date -r $last +%s)
if [ "$timestamp_actual" -gt "$timestamp_last" ];
then
echo nouveau fichier sur le site
mv $actual $last
fi
L'option -N de wget permet de ne récupérer le fichier que s'il est modifié, je pense que c'est le plus simple: s'il y a un changelent de fichier wget le télécharge et écrase l'ancien.
Il suffit alors de comparer les "timestamp" générés avec date -r pour créer un déclencheur.
Je ne suis pas encore trop sur de mon coup, les images ne changent qu'un fois pas jour.
Je peaufine et je reviens plus tard avec des résultats!

Si mon code est moche, n'hésitez pas...
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Ahhh bah, ca, oui, il est moche ... mais on rectifiera après, une fois finie ! :p

Ok, je => [ ]
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

Ah bizarre, sur le test que j'ai fait, ça donnait que la ligne de la date

Code : Tout sélectionner

$ curl -s -v -X HEAD https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
< Last-Modified: Sat, 05 Sep 2015 17:31:24 GMT
$
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

PengouinPdt a écrit :Ahhh bah, ca, oui, il est moche ... mais on rectifiera après, une fois finie ! :p
Ok, je => [ ]
C'est déjà gentil d'avoir regardé, ça doit piquer les yeux, je sais... :biggrin:
vohu a écrit :Ah bizarre, sur le test que j'ai fait, ça donnait que la ligne de la date

Code : Tout sélectionner

$ curl -s -v -X HEAD https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
< Last-Modified: Sat, 05 Sep 2015 17:31:24 GMT
$
Peut-être le certificat ssl du site que je sonde. C'est un geotrust wildcard. Curl n'aime pas ?
Mais je vais quand même regarder du côté de vos suggestions, ça m'a l'air plus simple que mon comparateur de timestamp sur des fichiers téléchargés.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

vohu a écrit :Ah bizarre, sur le test que j'ai fait, ça donnait que la ligne de la date
Ma faute. Je faisais mes tests dans ma SID avec une version de curl boguée...
Sur un serveur stable avec curl 7.38.0-4+deb8u4 pas de problèmes.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Tiens je n'ai pas de pb avec ma Sid :

Code : Tout sélectionner

# curl -s -v -X HEAD https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
< Last-Modified: Sat, 05 Sep 2015 17:31:24 GMT
D'ailleurs, c'est peut-être plus simple ainsi :

Code : Tout sélectionner

# curl -I -v https://www.forum-debian.fr/upload/img/1441474284.jpg 2>&1 | grep '^< Last-Modified:'
< Last-Modified: Sat, 05 Sep 2015 17:31:24 GMT
Bref ... :p
L'option -N de wget permet de ne récupérer le fichier que s'il est modifié, je pense que c'est le plus simple: s'il y a un changelent de fichier wget le télécharge et écrase l'ancien.
Il suffit alors de comparer les "timestamp" générés avec date -r pour créer un déclencheur.
Euh, là, je ne comprends pas ton raisonnement ! Si l'option -N te permet de la télécharger parce que plus jeune ... à quoi te servirait le déclencheur ?!
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
Je crois être parvenu à mes fins...
C'est sûrement affreux, mais ça fonctionne (enfin faut que j'attende quelques lancements)

J'ai un fichier (editeur qui contient le nom de l'éditeur - celui censé déposer les images - et une partie des paramètres d'url - le MID).
Je stock dans un répertoire par éditeur le timestamp (dans le fichier last)
Si le timestamp ne change pas il ne se passe rien (il signale quand même qu'il n'y a pas eu de changement et me donne la dernière date de "parution").
Si le timestamp change le script télécharge l'image (afin que je puisse vérifier) et met à jour le timestamp local pour la prochaine vérification.

Code : Tout sélectionner

#!/bin/bash
# Variables
repbase='/home/admin/editeurs'
site='https://xxx.xxx.com/thumbnail/issue'
fichier="catalog-cover.png"
# Script
echo $date > $repbase/mailtexte

while IFS='' read -r line || [[ -n "$line" ]]; do
        editeur=$(echo $line | awk '{ print $1 }')
        repertoire="$repbase/$editeur"
        cd $repertoire
        MID=$(echo $line | awk '{ print $2 }')
        url="$site/$MID/front/$fichier"
        actueld=$(date -d "$(curl --head $url 2>&1 | grep -Po '(?<=^Last-Modified:\s).*$')")
        actuel=$(date -d "$actueld" +%s)
        last=$(cat $repbase/$editeur/last)

        if [ "$actuel" -gt "$last" ];
                then
        echo "-------------------" >> $repbase/mailtexte
        echo $editeur >> $repbase/mailtexte
        echo "nouveau fichier déposé par" $editeur le $actueld >> $repbase/mailtexte
        echo "-------------------" >> $repbase/mailtexte
        wget $url -O $repbase/cover/$editeur.catalog-cover.png
        echo $actuel > last
		else
	echo "-------------------" >> $repbase/mailtexte
	echo $editeur >> $repbase/mailtexte
	echo "Pas de nouveau fichier déposé" >> $repbase/mailtexte
	echo "La dernière parution date du" $actueld >> $repbase/mailtexte 
	echo "-------------------" >> $repbase/mailtexte
        fi

done < $repbase/editeurs

zip -r $repbase/cover{.zip,}
mail -s "Point Dépôt Editeurs" xx@xxx.com < $repbase/mailtexte -A $repbase/cover.zip
rm $repbase/cover.zip
rm $repbase/cover/*png
rm $repbase/mailtexte
exit 0
Y'a encore des trucs merdiques, je n'ai pas trouvé comment lister les fichiers png téléchargés et les joindre au mail.
Du coup j'ai fait un zip (qui peut être vide...).
Je ferais mieux de mettre tous les timestamp dans un seul répertoire avec des noms différents, ce serait plus simple qu'un répertoire par timestamp.
Bref, encore du boulot (et j'ai déjà passé la moitié de ma journée sur ce truc plutôt minable...) :003:

Vos critiques sont les bienvenues évidemment...
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
Voici mon "code" (je sais, c'est un bien grand mot...), fonctionnel.

J'ai une liste d'images à vérifier régulièrement (Savoir s'il y en a une nouvelle de postée sur un site)
Le script pioche les infos des images dans un fichier séparé, lis le fichier et vérifie pour chaque image si la date de dernière modification a changée).
SI l'image est changée elle est téléchargée et envoyée en PJ dans un mail.

Code : Tout sélectionner

#!/bin/bash
#check.editions.sh
#Vérification des dates de dernières publication des PDF (Vérifie la date de publication des couvertures).
#V 1.0
#Dernière modification le 10/09/2106 

# Variables
now=$(date +"%a %d %B %Y")
repbase='/home/admin/editeurs'
site='https://xxxxx.xxxxxx.com/thumbnail/issue'
fichier="catalog-cover.png"
une="catalog-cover-large.png"

# Script
echo $now > $repbase/mailtexte
echo "recapitulation mise en ligne éditeurs" >> $repbase/mailtexte

## Début boucle lecture fichier editeurs
while IFS='' read -r line || [[ -n "$line" ]]; do
	# Variables
	editeur=$(echo $line | awk '{ print $1 }')
	MID=$(echo $line | awk '{ print $2 }')
	url="$site/$MID/front/$fichier"
	url_une="$site/$MID/front/$une"

	### Récupération date "last modified" de la couverture
	actueld=$(curl --head $url 2>&1 | grep -Po '(?<=^Last-Modified:\s).*$')
	### Conversion en seconde de cette date (sera utilisé pour vérifier s'il y a eu une nouvelle publication d'image)
	actuel=$(date -d "$actueld" +%s)
	### Et conversion en GMT +3 (plus confortable pour la lecture du mail)
	gmt3=$(TZ=Indian/Antananarivo date -d "$actueld")
	last=$(cat $repbase/$editeur.last)

	# Test Lastmodified (Récupéré VS Stocké)
	if [ "$actuel" -gt "$last" ];
	then
		echo "-------------------" >> $repbase/mailtexte
		echo $editeur >> $repbase/mailtexte
		echo "nouveau fichier déposé par" $editeur le $actueld >> $repbase/mailtexte
		echo "" >> $repbase/mailtexte
		wget $url_une -O $repbase/cover/$editeur.catalog-cover.png
		echo $actuel > $repbase/$editeur.last

	else
		echo "-------------------" >> $repbase/mailtexte
		echo $editeur >> $repbase/mailtexte
		echo "Pas de nouveau dépôt depuis le" $gmt3 >> $repbase/mailtexte
		echo "" >> $repbase/mailtexte
	fi

done < $repbase/editeurs
## FIN boucle lecture fichier editeurs

# Préparation envoi couvertures si téléchargées
cd $repbase/cover
attachment=$(printf " -a /home/admin/editeurs/cover/%s" *; echo)
if [[ ${attachment} != *"png"* ]];
  then
	:
  attachment=""
  else
	:
  fi
# Envoi mail avec PJ
cat $repbase/mailtexte | mutt $attachment -s "Point Dépôt Editeurs" -- xxxxxxx@xxxxx.com
# Nettoyage
rm -f $repbase/cover/*
rm $repbase/mailtexte
exit 0
Et je vous remercie pour votre aide! :icon_biggrin:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Répondre