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

Rien de plus facile ! Pour informations les emails sont stockés sous : ./Library/Mail/ et les factures d’Apple ( iTunes, et non pas Apple Store )  ne sont pas des PDF. Pour rappel, si vous voulez voir la source d’un email il suffit de faire Cmd+Alt+U, ou bien aller dans le menu Présentation > Message > Contenu orginal.

Donc c’est facile l’étape n°1, vous prenez le script suivant que vous copiez à la racine de votre utilisateur c.a.d. /Users/MonLogin/ . Dans un fichier cherche_facture_Apple.bash par exemple …

Voici donc le script :

#!/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`
Sujet=`head -50 $item | grep "^Subject: " | awk '{print $2 }' | head -1`
NbLu=`expr $NbLu + 1`
#if [ "$De" == "do_not_reply@itunes.com" ]
#then
#echo "Sujet : '$Sujet'"
#echo "Fichier : $item"
#fi 
        if [ "$Sujet" == "Votre" ] || [[ "$Sujet" =~ =\?ISO\-8859\-1\?Q\?Votre_re* ]]  || [[ "$Sujet" =~ =\?ISO\-8859\-1\?Q\?Votre_facture* ]] || [[ "$Sujet" =~ =\?UTF\-8\?Q\?Votre_re* ]]
                                then
#echo "Une nouvelle facture Apple ? " 
if [ ! -n "$De" ] ;
then
De=`head -50 $item | grep "^From: " | awk -v FS="(<|>)" '{print $2}' | head -1`
fi
if [ ! -n "$De" ] ;
then
De=`head -50 $item | grep "^From: " | awk -v FS='("|")' '{print $2}' | head -1`
fi
Business=`head -50 $item | grep "^X-Business-Group:" | awk '{print $2}' | head -1`
if [ ! -n "$Business" ] ;
then
Business=`head -50 $item | grep "^X_BUSINESS_GROUP:" | awk '{print $2}' | head -1`
fi
Date=`head -50 $item | grep "^Date:" | awk '{print $2 " " $3 " " $4 " " $5 " " $6}' | head -1`
Visa=`head -100 $item | grep "^Visa ...." | awk '{print $3}' | head -1`
if [ ! -n "$Visa" ] ;
then
Visa=`head -100 $item | grep "Factur=C3=A9 =C3=A0 :" | awk '{print $6}' | head -1`
fi
Commande=`head -100 $item | grep "^N=C2=B0 DE COMMANDE:" | awk '{print $4}' | head -1`
if [ ! -n "$Commande" ] ;
then
Commande=`head -100 $item | grep "N=C2=B0 de commande :" | awk '{print $5}' | head -1`
fi
if [ ! -n "$Commande" ] ;
                                        then
                                        Commande=`head -100 $item | grep "Num=C3=A9ro de la commande :" | awk '{print $6}' | head -1`
                                fi
Document=`head -100 $item | grep "N=C2=B0 DE DOCUMENT:" | awk '{print $4}' | head -1`
if [ ! -n "$Document" ] ;
then
                         Document=`head -100 $item | grep "N=C2=B0 DU DOCUMENT:" | awk '{print $4}' | head -1`
fi
Sequence=`head -100 $item | grep "^N=C2=B0 DE S=C3=89QUENCE:" | awk '{print $4}' | head -1`
if [ ! -n "$Sequence" ] ;
then
Sequence=`head -100 $item | grep "^S=C3=89QUENCE N=C2=B0:" | awk '{print $3}' | head -1`
fi
                                if [ ! -n "$Sequence" ] ;
                                        then
                                        Sequence=`head -100 $item | grep "Num=C3=A9ro de s=C3=A9quence=C2=A0:" | awk '{print $4}' | head -1`
                                fi
DateDeLaFacture=`head -100 $item | grep "^DATE DE LA FACTURE:" | awk '{print $5 " " $6 " " $7}' | head -1`
if [ ! -n "$DateDeLaFacture" ] ;
then
DateDeLaFacture=`head -100 $item | grep "Date de la facture:" | awk '{print $5 }' | head -1`
fi
if [ ! -n "$DateDeLaFacture" ] ;
                                        then
                                        DateDeLaFacture=`head -100 $item | grep "Date du re=C3=A7u :" | awk '{print $5 }' | head -1`
fi
Total=`head -100 $item | grep "^TOTAL:" | awk '{print $2}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
if [ ! -n "$Total" ] ;
then
Total=`head -100 $item | grep "Total de la commande :" | awk '{print $6}' | sed 's/=/ /g' | awk '{print $1}' | sed 's/,/\./g' | head -1`
fi
if [ -n "$Commande" ] ;
then
Somme=`echo "scale=3; $Somme + $Total " | bc` 
echo "$compteur | $De | $Date | $Business | $Commande | $Document | $Sequence | $Visa | $DateDeLaFacture | $Total | $Somme "
echo "$compteur ; $De ; $Date ; $Business ; $Commande ; $Document ; $Sequence ; $Visa ; $DateDeLaFacture ; $Total ; $Somme " >> facture_apple.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 ; De ; Date ; Business ; Commande ; Document ; Sequence ; Carte Visa ; DateDeLaFacture ; Prix ; Cumul " > facture_apple.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 ."

Désolé mais l’indexation du code a sauté … l’autre point c’est qu’il n’est pas très propre car je l’ai fait très rapidement. Désolé pour les puristes …

Ensuite vous ouvrez un terminal, et vous lancer le bash : ./cherche_facture_Apple.bash. Le résultat est dans la racine : facture_apple.csv. C’est un fichier CSV, le séparateur est un point virgule.

J’ai fait un test et le programme découpe bien les emails de 2012, 2013, 2014, 2015, 2016, 2017, 2018.

Ensuite il faut penser à prendre des kleneex quand on regarde la somme totale … au passable vous avez la possibilité de voir les performances du disque dur avec le nombre d’email lu et le temps total du script.

Frédéric.

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

macOS : Pollution dans le fichier /var/log/system.log … merci iMagneto !

Si vous tapez la commande suivante pour savoir quel est le process qui écrit le plus dans system.log :

cat /var/log/system.log | awk '{print $5}' | grep '\[' | sed 's/\[/ /g' | awk '{print $1}' | sort -n | uniq -c | sort -n | tail 
  86 suhelperd
  88 KiesAgent
 262 loginwindow
 266 syslogd
 277 GoProMediaService
 688 ksfetch
 741 GoogleSoftwareUpdateAgent
 903 GoogleSoftwareUpdateDaemon
1672 imagneto_d
1695 com.apple.xpc.launchd

La pollution vient de imagneto_d ( iMagneto : http://imagneto.sourceforge.net/ ) et de GoogleSoftwareUpdate …. je trouve que passer un certain nombre de ligne c’est de l’abus.

En plus pour imagneto_d il y a deux fichiers de logs dans /var/log/ :

  • imagneto_d.stderr.log
  • imagneto_d.stdout.log

Pourquoi ne pas mettre le polling dans un fichier spécifique ? comme imagneto_d.calendar.log ?

Misère.

MacBook Pro 9,1 : Impact sur les performances suite au changement de disque dur

J’ai fait le changement du disque dur d’origine Hitachi : HDD 5K750-500 P/N : H2T500854S (5400 RPM), par un disque dur https://www.rueducommerce.fr/produit/crucial-mx300-1-to-sata-iii-26229992/offre-64120702CRUCIAL– MX300 1050 Go avec adaptateur 9.5 mm à 280 Euros ( SSD interne 1050 Go – 2,5 » – 7 mm – SATA III (6 Gb/s) ). Avec la livraison on va dire 300 Euros pour arrondir.

Si je regarde dans les logs systèmes : /var/log/system.log :

  • Le MacBook se lance avec ce log « localhost bootlog[0]: BOOT_TIME« .
  • Le MacBook est prêt avec ce log ‘Calling completion handler for phase « loginwindow Boot »‘
  • Attention au logs « timed[100]: settimeofday(«  car il peut y avoir une mise à l’heure. Quand on fait le calcul du temps entre les deux logs il faut aussi inclure la remise à l’heure si elle a eu lieux.

Je suis donc passé de 2min10sec. entre ses deux logs à 53 sec. C’est énorme ! J’ai gagné plus de 50% en performance. Toutes les applications sont plus fluides, c’est vraiment rentable !

Le tutorial : https://www.ifixit.com/Guide/MacBook+Pro+15-Inch+Unibody+Mid+2012+Hard+Drive+Replacement/10761 . Sinon il est aussi possible de le faire chez BricoMac … mais c’est pas le même prix 🙂 .

A noter qu’il existe un logiciel sous Mac pour tester la vitesse du disque dur : https://itunes.apple.com/us/app/id425264550?mt=12 : Blackmagic Disk Speed Test.

iOS 10.13.3 : com.apple.imfoundation.IMRemoteURLConnectionAgent : Unknown key for integer: _DirtyJetsamMemoryLimit

J’ai dans le fichier /var/log/system.log (syslog) sans arrêt l’erreur :
com.apple.xpc.launchd[1] (com.apple.imfoundation.IMRemoteURLConnectionAgent): Unknown key for integer: _DirtyJetsamMemoryLimit

Pour information : « IMRemoteURLConnectionAgent – help: IMRemoteURLConnectionAgent.xpc is part of Apple’s messaging/chat services. (I don’t want apple chat or messages or facetime) « .

Par contre je n’arrive pas à savoir d’où cela vient. Sur google j’ai pu trouver : « This error message is because the code is shared between OSX and iOS but the _DirtyJetsamMemoryLimit key is only available on iOS. ». Bizarre …

J’ai commencé par faire un « locate IMRemoteURLConnectionAgent | grep plist  » :

/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/tvOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Info.plist
/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/watchOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Info.plist
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Info.plist
/System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Contents/Info.plist
/System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Contents/version.plist

Recherche de la version du soft :

cat /System/Library/PrivateFrameworks/IMFoundation.framework/XPCServices/IMRemoteURLConnectionAgent.xpc/Contents/version.plist 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildAliasOf</key>
<string>IMFoundation</string>
<key>BuildVersion</key>
<string>6</string>
<key>CFBundleShortVersionString</key>
<string>10.0</string>
<key>CFBundleVersion</key>
<string>1000</string>
<key>ProjectName</key>
<string>IMFoundation</string>
<key>SourceVersion</key>
<string>694006000000000</string>
</dict>
</plist>

J’ai donc commencé par faire :

rm -rf ~/Library/Caches/com.apple.imfoundation.IMRemoteURLConnectionAgent*

Mais sans succès.

Ensuite j’ai essayé de supprimer iMessage du Mac ( c’est bien plus pratique WhatsApp, et moins propriétaire  ) : ouvrir Messages -> menu préférences -> onglet Comptes -> sélectionner le compte dans la colonne de gauche -> décocher Activer ce compte.

Puis un rebut … mais sans succès.

A suivre.

Les agents com.spotify.webhelper.plist & com.onlineapplicationrequest.AppRequest.plist

Rien à voir mais j’ai supprimé des fichiers dans Library/LaunchAgents/

rm -rf ~/Library/LaunchAgents/com.spotify.webhelper.plist
rm -rf ~/Library/LaunchAgents/com.onlineapplicationrequest.AppRequest.plist

Pour le second com.onlineapplicationrequest.AppRequest.plist, je tiens a indiquer que je n’ai aucune extension dans Safari ( version 11.0.3 )  :