Amazon : Comment avoir un fichier Excel/Numbers ( format CSV ) des factures à partir des emails ? ( sous Mac )

Après avoir demandé au support d’Amazon (très réactif sur Twitter) qui m’a envoyé vers ce lien : https://www.amazon.fr/gp/help/customer/display.html/ref=help_search_1-1?ie=UTF8&nodeId=202119330&qid=1521482623&sr=1-1 . Mais en fait ce lien n’est valable uniquement pour Amazon Business . Je me suis lancé dans la création d’un script …

Cette première version du script permet d’avoir (à 100%) :

  • La date.
  • La référence.
  • Le prix.

En fait dans mon fichier CSV j’ai mis :

  • compteur :compteur d’email : fiable à 100%
  • Fichier : lien vers l’email : fiable à 100%
  • De : envoyé par : fiable à 100% (c’est toujours  confirmation-commande@amazon.fr )
  • Date : date : fiable à 100%
  • Amazon RTE : le but était la recherche de la balise « X-AMAZON-RTE-VERSION:« 
  • Commande : Référence de la commande  : fiable à 100%
  • Document : le but était la recherche de la balise « X-SES-Outgoing: » . Pour plus d’information voir ici : https://docs.aws.amazon.com/fr_fr/ses/latest/DeveloperGuide/receiving-email-notifications-examples.html
  • Sequence : le but était la recherche de la balise « Feedback-ID:« .
  • Amazon Client Host : le but était la recherche de la balise « X-AMAZON-CLIENT-HOST:« .
  • Message ID : le but était la recherche de la balise « Message-ID:« .
  • Prix : prix total de la commande :  fiable à 100%
  • Cumul : non fiable
  • Version Total : version pour la découpage du total ( pour le debug )
  • Version Commande : version pour la découpage du total ( pour le debug )

Il ne faut pas tenir compte de la colonne cumul, car dans le fichier on trouve plusieurs fois une même commande (répétition des emails).

Comment utiliser le script ? Il suffit de faire un répertoire à la racine et de copier le script à l’intérieur. Ensuite le script recherche tous les emails dans Mail (sou Mac) qui sont relatifs à une commande. J’aurais pu faire le script en Perl ou Python, mais je préfère ne pas imposer d’installation de ses deux langages.

Voici le script (sans indentation … à cause du copier/coller sous WordPress):

#!/bin/bash
# ARIAS Frederic
# Version V1
compteur=1
erreur=0
Somme=0
NbLu=0

chercheFichier() {
 Rep="$1"
 for item in $Rep/*
 do [ -f "$item" ] 
 ext="${item##*.}"
 if [ "$ext" = "emlx" ] ; then
 De=`head -50 $item | grep "^X-Envelope-From:" | awk '{print $2 }' | head -1`
 if [ ! -n "$De" ] ;
 then
 De=`head -60 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1`
 fi
 if [ ! -n "$De" ] ;
 then
 De=`head -60 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1`
 fi
 NbLu=`expr $NbLu + 1`
 if [ "$De" == "confirmation-commande@amazon.fr" ] || [ "$De" == "confirmation-envoi@amazon.fr" ]
 then
 echo "Une nouvelle facture Amazon ? " 
 Business=`head -200 $item | grep "^X-AMAZON-RTE-VERSION:" | awk '{print $2}' | head -1`
 if [ ! -n "$Business" ] ;
 then
 Business='?'
 fi
 ClientHost=`head -200 $item | grep "^X-AMAZON-CLIENT-HOST:" | awk '{print $2}' | head -1`
 if [ ! -n "$ClientHost" ] ;
 then
 ClientHost='?'
 fi
 MessageID=`head -100 $item | grep "Message-ID: " | awk '{print $2}' | head -1`
 Date=`head -150 $item | grep "^Date:" | awk '{print $2 " " $3 " " $4 " " $5 " " $6}' | head -1`
 Document=`head -50 $item | grep "X-SES-Outgoing:" | awk '{print $2}' | head -1`
 Sequence=`head -50 $item | grep "Feedback-ID:" | awk '{print $2}' | head -1`
 Commande=`head -100 $item | grep "^Commande" | awk '{print $2}' | head -1`
 CommandeVersion=1
 if [ "$Commande" == "n=C2=B0" ] ;
 then
 Commande=`head -100 $item | grep "^Commande" | awk '{print "#" $3}' | head -1`
 CommandeVersion=2
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -100 $item | grep "D=C3=A9tails de votre commande n=C2=B0" | awk '{print "#" $6}' | head -1`
 CommandeVersion=3
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -100 $item | grep "tail de votre commande n" | awk '{print "#" $6}' | head -1`
 CommandeVersion=4
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -100 $item | grep "Commande Num=C3=A9ro de commande :=09=09=09" | awk '{print $5}' | sed 's/=09/ /g' | awk '{print "#" $2}' | head -1`
 CommandeVersion=5
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -100 $item | grep "N=C2=B0 de commande Amazon :" | awk '{print "#" $6}' | head -1`
 CommandeVersion=9
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -100 $item | grep "Num=C3=A9ro de commande :=09=09=09" | awk '{print $4}' | sed 's/=09/ /g' | awk '{print "#" $2}' | head -1`
 CommandeVersion=6
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -400 $item | grep "display-order-status" | sed 's/</ /g' | sed 's/>/ /g' | awk '{print "#" $3}' | head -1`
 CommandeVersion=7
 fi
 if [ ! -n "$Commande" ] ;
 then
 Commande=`head -300 $item | grep "history/view.html" | sed 's/</ /g' | sed 's/>/ /g' | awk '{print "#" $3}' | head -1 `
 CommandeVersion=8
 fi
 Total=`head -200 $item | grep "Montant total pour cet envoi :" | awk '{print $7}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=1
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Montant total de la commande :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=2
 fi
 if [ "$Total" == "EUR" ] ;
 then
 Total=`head -200 $item | grep "Montant total de la commande :" | awk '{print $7}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=3
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Montant total pour cet envoi :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=4
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Total TTC :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=5
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Total TTC :" | awk '{print $5}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=6
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "^Total :" | awk '{print $4}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=7
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Total TTC:" | awk '{print $4}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=8
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Montant total pour cette commande&nbsp;:EUR" | awk '{print $6}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=9
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep '<td width="98%"><span class="small">' | awk '{print $4}' | sed 's/</ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=10
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep '<b>Montant total de la commande:' | awk '{print $7}' | sed 's/</ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=11
 fi
 if [ ! -n "$Total" ] ;
 then
 Total=`head -200 $item | grep "Total :" | awk '{print $4}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
 TotalVersion=12
 fi
 if [ -n "$Commande" ] ;
 then
 if [ -n "$Total" ] ; 
 then
 Somme=`echo "scale=3; $Somme + $Total " | bc`
 fi 
 if [ ! -n "$Total" ] ;
 then
 echo "Source (Total err) : $item "
 fi
 echo "$compteur | $De | $Date | $Business | $Commande | $Document | $Sequence | $ClientHost | $MessageID | $Total | $Somme "
 echo "$compteur ; $item ; $De ; $Date ; $Business ; $Commande ; $Document ; $Sequence ; $ClientHost ; $MessageID ; $Total ; $Somme ; $TotalVersion ; $CommandeVersion " >> facture_amazon.csv
 compteur=`expr $compteur + 1`
 fi
 if [ ! -n "$Commande" ] ;
 then
 echo "Source : $item "
 erreur=`expr $erreur + 1`
 fi
 fi
 fi
 [ -d "$item" ] && chercheFichier "$item"
 done
}

echo "compteur ; Fichier ; De ; Date ; Amazon RTE Version ; Commande ; Document ; Sequence ; Amazon Client Host ; Message ID ; Prix ; Cumul ; Version Total ; Version Commande " > facture_amazon.csv

START=$(date +%s);

[ -d "../Library/Mail/" ] && chercheFichier "../Library/Mail/"

END=$(date +%s);
DIFF=`echo $((END-START)) | awk '{print int($1/60)":"int($1%60)}'`

echo "Fin du script : Lu : $NbLu / Bon : $compteur / Mauvais : $erreur / Temps : $DIFF ."

J’ai testé ce script sur mes emails et cela a bien fonctionné. Le nom du fichier CSV est facture_amazon.csv et il doit être dans le répertoire crée. J’ai compté 12 syntaxes différentes sur les emails de 2006 à 2018.

Pour connaitre le nombre de commande il faut faire (les commandes sont en double, ou en triple … car il y a répétition des emails) :

cat facture_amazon.csv | awk '{print $15}' | grep -v "Document" | sort -n | uniq -c | wc -l

Sinon avec Number/Excel vous pouvez le faire aussi.

A suivre.

P.S.: Si vous utilisez ce script, j’accepte d’avoir une bière en retour ? .

Une réflexion sur « Amazon : Comment avoir un fichier Excel/Numbers ( format CSV ) des factures à partir des emails ? ( sous Mac ) »

  1. Petite modification sur le script :

    #!/bin/bash
    # ARIAS Frederic
    # Version V2
    compteur=1
    erreur=0
    Somme=0
    NbLu=0
    
    chercheFichier() {
       Rep="$1"
       for item in $Rep/*
       do [ -f "$item" ] 
    	ext="${item##*.}"
    		if [ "$ext" = "emlx" ] ; then
    			De=`head -80 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1`
    			if [ "$De" == "Amazon.fr" ] ;
    					then
    					De=`head -80 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1`
    			fi
    			if [ ! -n "$De" ] ;
                                            then
                                            De=`head -80 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1`
                            fi
                            if [ ! -n "$De" ] ;
                                            then
    					De=`head -80 $item | grep "^X-Envelope-From:" | awk '{print $2 }' | head -1`
                            fi
    			NbLu=`expr $NbLu + 1`
    		        if [ "$De" == "confirmation-commande@amazon.fr" ] || [ "$De" == "confirmation-envoi@amazon.fr" ]
                                    then
    				echo "Une nouvelle facture Amazon ? " 
    				Business=`head -200 $item | grep "^X-AMAZON-RTE-VERSION:" | awk '{print $2}' | head -1`
    				if [ ! -n "$Business" ] ;
    					then
    					Business='?'
    				fi
    				ClientHost=`head -200 $item | grep "^X-AMAZON-CLIENT-HOST:" | awk '{print $2}' | head -1`
    				if [ ! -n "$ClientHost" ] ;
    					then
    					ClientHost='?'
    				fi
    				MessageID=`head -100 $item | grep "Message-ID: " | awk '{print $2}' | head -1`
    				Date=`head -150 $item | grep "^Date:" | awk '{print $2 " " $3 " " $4 " " $5 " " $6}' | head -1`
    				Document=`head -50 $item | grep "X-SES-Outgoing:" | awk '{print $2}' | head -1`
    				Sequence=`head -50 $item | grep "Feedback-ID:" | awk '{print $2}' | head -1`
    				Commande=`head -100 $item | grep "^Commande" | awk '{print $2}' | head -1`
    				CommandeVersion=1
    				if [ "$Commande" == "n=C2=B0" ] ;
    					then
    					Commande=`head -100 $item | grep "^Commande" | awk '{print "#" $3}' | head -1`
    					CommandeVersion=2
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					Commande=`head -100 $item | grep "D=C3=A9tails de votre commande n=C2=B0" | awk '{print "#" $6}' | head -1`
    					CommandeVersion=3
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					Commande=`head -100 $item | grep "tail de votre commande n" | awk '{print "#" $6}' | head -1`
    					CommandeVersion=4
    				fi
    				if [ ! -n "$Commande" ] ;
                                            then
    					Commande=`head -100 $item | grep "Commande Num=C3=A9ro de commande :=09=09=09" | awk '{print $5}' | sed 's/=09/ /g' | awk '{print "#" $2}' | head -1`
    					CommandeVersion=5
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					Commande=`head -100 $item | grep "N=C2=B0 de commande Amazon :" | awk '{print "#" $6}' | head -1`
    					CommandeVersion=9
    				fi
                                    if [ ! -n "$Commande" ] ;
                                            then
                                            Commande=`head -100 $item | grep "Num=C3=A9ro de commande :=09=09=09" | awk '{print $4}' | sed 's/=09/ /g' | awk '{print "#" $2}' | head -1`
                                    	CommandeVersion=6
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					Commande=`head -400 $item | grep "display-order-status" | sed 's// /g' | awk '{print "#" $3}' | head -1`
    					CommandeVersion=7
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					Commande=`head -300 $item | grep "history/view.html" | sed 's// /g' | awk '{print "#" $3}' | head -1 `
    					CommandeVersion=8
    				fi
    				Total=`head -200 $item | grep "Montant total pour cet envoi :" | awk '{print $7}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
    				TotalVersion=1
    				if [ ! -n "$Total" ] ;
    					then
    					Total=`head -200 $item | grep "Montant total de la commande :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
    					TotalVersion=2
    				fi
    				if [ "$Total" == "EUR" ] ;
                                            then
                                            Total=`head -200 $item | grep "Montant total de la commande :" | awk '{print $7}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
                                    	TotalVersion=3
    				fi
    				if [ ! -n "$Total" ] ;
                                            then
                                            Total=`head -200 $item | grep "Montant total pour cet envoi :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
                                    	TotalVersion=4
    				fi
    				if [ ! -n "$Total" ] ;
    					then
    				        Total=`head -200 $item | grep "Total TTC :" | awk '{print $8}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
    					TotalVersion=5
    				fi
                                    if [ ! -n "$Total" ] ;
                                            then
                                            Total=`head -200 $item | grep "Total TTC :" | awk '{print $5}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
                                    	TotalVersion=6
    				fi
    				if [ ! -n "$Total" ] ;
                                            then
                                            Total=`head -200 $item | grep "^Total :" | awk '{print $4}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
                                    	TotalVersion=7
    				fi
                                    if [ ! -n "$Total" ] ;
                                            then
                                            Total=`head -200 $item | grep "Total TTC:" | awk '{print $4}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
                                    	TotalVersion=8
    				fi
    				if [ ! -n "$Total" ] ;
    					then
    					Total=`head -200 $item | grep "Montant total pour cette commande :EUR" | awk '{print $6}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
    					TotalVersion=9
    				fi
    				if [ ! -n "$Total" ] ;
    					then
    					Total=`head -200 $item | grep '' | awk '{print $4}' | sed 's/Montant total de la commande:' | awk '{print $7}' | sed 's/> facture_amazon.csv
    					compteur=`expr $compteur + 1`
    				fi
    				if [ ! -n "$Commande" ] ;
    					then
    					echo "Source : $item "
    					erreur=`expr $erreur + 1`
    				fi
    			fi
    		fi
          [ -d "$item" ] && chercheFichier "$item"
       done
    }
    
    echo "compteur ; Fichier ; De ; Date ; Amazon RTE Version ; Commande ; Document ; Sequence ; Amazon Client Host ; Message ID ; Prix ; Cumul ; Version Total ; Version Commande " > facture_amazon.csv
    
    START=$(date +%s);
    
    [ -d "../Library/Mail/" ] && chercheFichier "../Library/Mail/"
    
    END=$(date +%s);
    DIFF=`echo $((END-START)) | awk '{print int($1/60)":"int($1%60)}'`
    
    echo "Fin du script : Lu : $NbLu / Bon : $compteur / Mauvais : $erreur / Temps : $DIFF ."
    
    

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.