SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
Statistiques de ventes des
Applications AppStore et
       MacAppStore


   Frank Lefebvre & Jacques Foucry



       Cocoaheads Paris 14/03/2013
L’existant
 iTunesConnect : site web et application iOS
   Données agrégées après 15 jours
   C’est beau mais bon...
 Les applications dans le cloud
   Obligation de laisser un login/mot de passe
   Non sérieux, le cloud...
 Récupération des données
   Solution fournie par Apple (même s’ils ne sont pas
   au courant)
Autoingestion.class

 C’est une classe Java fournie par Apple
 Documentation
   iTunes Connect Sales and Trends Guide
 Limitations
 ... Et si on refaisait le truc ?
Reverse engineering
...

String   body   =   "USERNAME=" + URLEncoder.encode(paramArrayOfString[0], "UTF-8");
body =   body   +   "&PASSWORD=" + URLEncoder.encode(paramArrayOfString[1], "UTF-8");
body =   body   +   "&VNDNUMBER=" + URLEncoder.encode(paramArrayOfString[2], "UTF-8");
body =   body   +   "&TYPEOFREPORT=" + URLEncoder.encode(paramArrayOfString[3], "UTF-8");
body =   body   +   "&DATETYPE=" + URLEncoder.encode(paramArrayOfString[4], "UTF-8");
body =   body   +   "&REPORTTYPE=" + URLEncoder.encode(paramArrayOfString[5], "UTF-8");
body =   body   +   "&REPORTDATE=" + URLEncoder.encode(str1, "UTF-8");

URL url = new URL("https://reportingitc.apple.com/autoingestion.tft?");
HttpsURLConnection connection = url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
OutputStreamWriter localOutputStreamWriter = new
OutputStreamWriter(connection.getOutputStream());
localOutputStreamWriter.write(body);
localOutputStreamWriter.flush();
localOutputStreamWriter.close();

...
Que nous envoie Apple ?
Daily summary avec différenciation des ventes, des
mises à jour, des in-app purchases
NewsStand : abonnements et données personnelles
Données iOS et MacAppStore
Apple ne fournit que deux semaines de données
  Obligation de récupérer tous les jours et de
  stocker localement (+backup)
Format du fichier


 C’est du texte Gzippé
 Tab delimited
 Avec les entêtes
 Attention, les dates sont au format US (mm/dd/yyyy)
Un compte spécifique


Dans iTunesConnect, il est possible de créer des
comptes avec des droits restreints
  Cela va faciliter l’automatisation
  Et surtout sécuriser l’accès au compte
Connexion à iTC / Manage
Users
Choisir le type de compte
Résumé des utilisateurs
existants
Nommer l’utilisateur
Droits d’accès de l’utilisateur
Territoires d’intervention
Et boum...
Stockage


Archivage (et backup) des fichier txt.gz
une base données sqlite3
  Disponible directement sous OSX
  Facile à installer sur d’autres environnements
Schéma de la base

          product         daily_summary             report_date
    product_id         product_version       date
    apple_product_id   transaction_type
    product_sku        units
    iap_parent_sku     customer_country
    product_name       customer_currency
    developer          payment_currency
                       customer_price
                       payment_price
                       promo_code
                       subscription_type
                       subscription_period
Le script Python

 Pourquoi Python ?
  Parce que pas perl !
  Simple à mettre en œuvre, présent sur toutes les
  plateformes
  Intégration sqlite3
Dépendances

Python 2.7
  Dispo sans problème sur OSX, ça peut être
  amusant sur d’autres OS (par exemple CentOS)
Mako, pour les gabarits
Flotr2, pour le rendu
Architecture de l’application

                         iTunesStats




     its_download.py    its_import.py    its_report.py




                       its_database.py   its_format.py
Ligne de commande

iTunesStats

--download config_file [--date yyyy-mm-dd]

--download-import config_file [--date yyyy-mm-dd]

--import config_file path

--report config_file
Fichier de configuration

 Trois sections :
   [iTunes] : les informations nécessaires à la
   connection à iTunesConnect
   [data] : les informations de stockage (fichiers tgz
   et base de données)
   [report] : l’emplacement des templates et le
   répertoire où son stockés les rapports
Fichier de configuration, un
 exemple
[iTunes]
username = sales@foucry.net
password = Tucroyaisquejelaisseraismonmotdepasse
vendor = 12345678

[data]
archive = /Users/jacques/its/sales
history = /Users/jacques/its/itc-history
database = /Users/jacques/its/sales/itunes-stats.db

[report]
templates = /Users/jacques/its/templates
output = /Users/jacques/its/output
Automatisation
Quelle est la meilleure heure pour lancer la
récupération des stats ?
  La plupart du temps, c’est 14h30 UTC
  Parfois il y a des ratés (serveurs surchargés par
  exemple)
Et pourquoi pas toutes les heures ?
  S’il n’y a rien à récupérer, on ne fait rien
Sur OSX


launchd
 une plist qui décrit au daemon launchd comment
 lancer le script et quand
<?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>Label</key>
! ! <string>net.correze-software.its</string>
! ! <key>ProgramArguments</key>
! ! <array>
! ! ! <string>/usr/local/scripts/iTunesStats</string>
! ! ! <string>--download-import</string>
! ! ! <string>/etc/its/its-param</string>
! ! </array>
! ! <key>StandardOutPath</key>
! ! <string>/var/log/its_download.log</string>
! ! <key>StartInterval</key>
! ! <integer>3600</integer>
! </dict>
</plist>
Emplacement des fichiers
Fichier Launchd
  à mettre dans /Library/LaunchDaemons
Fichier de paramètres
  par exemple dans /etc/itc (ou /Library/Application
  Support/its)
Les scripts
  j’aime bien mettre mes scripts dans /usr/local/
  scripts
Prise en compte par launchd
et vérification


sudo launchctl load -w /Library/LaunchDaemons/
net.correze-software.its.plist

sudo launchctl list
Sur un autre unix like (linux,
*BSD, Aix, Solaris, sco...)

 cron/crontab
 Deux posibilités :
   éditer la crontab
   utiliser le répertoire /etc/cron.hourly
Éditer la crontab

$ crontab -e

25! *! *! *! /usr/local/scripts/iTunesStats --
   *!
download-import /home/jacques/its-param 1> /dev/null
2> /var/log/its_download.log



   (Lancement toutes les heures de tous les jours,
          tous les mois... à 25 minutes)
Utiliser /etc/cron.hourly
     Il suffit de déposer dans ce répertoire un petit script
     shell qui lancera notre script avec les paramètres
     nécessaires



#!/bin/sh

if [ -x /usr/local/scripts/iTunesStats]
then
! /usr/local/scripts/iTunesStats --download-import /home/jacques/
its-param 1> /dev/null 2>/var/log/its_download.log
fi
Le rendu


Assuré par Flotr2 <http://humblesoftware.com/
flotr2/>
du json
un template mako
le json



 Généré par le script its_report.py (requête sur la
 base et écriture du résultat sous forme de json)
Le template Mako


Pour intégrer le json à du HTML++ (avec des
boucles, des variables, etc)
Génére le fichier HTML
template-stats.html
<html lang="fr">
<head>
    <meta charset="utf-8" />
    <title>iTunesStats</title>
    <script type="text/javascript" src="Flotr2/flotr2.min.js"></script>
    <script type="text/javascript" src="charts.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css" media="screen"/>
</head>
<body>
    % for product in products:
    <p>
         <details open>
             <summary class="gradient-background">${product[1]}</summary>
             <div class="container">
                 <div id="piechart_${product[0]}" class="country"></div>
                 <script type="text/javascript">
                 displayPieChart("piechart_${product[0]}", "country-${product[0]}.json");
                 </script>
             </div>
             <div class="container">
                 <div id="bargraph_${product[0]}" class="date"></div>
                 <script type="text/javascript">
                 displayBarGraph("bargraph_${product[0]}", "date-${product[0]}.json");
                 </script>
             </div>
             <div class="container">
                 <div id="version_${product[0]}" class="version"></div>
                 <script type="text/javascript">
                 displayPieChart("version_${product[0]}", "version-${product[0]}.json");
                 </script>
             </div>
         </details>
    </p>
    % endfor
</body>
</html>
Flotr2


 Un framework HTML
 Inclure le javascript du framework
 include notre propre définition des graphs que nous
 voulons et
HOP !
Disponible sur GitHub



 https://github.com/franklefebvre/iTunesStats.git

Weitere ähnliche Inhalte

Was ist angesagt?

Xcode Server - Jeffrey Macko
Xcode Server - Jeffrey MackoXcode Server - Jeffrey Macko
Xcode Server - Jeffrey MackoCocoaHeads France
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeadsRNS
 
5 android web_service
5 android web_service5 android web_service
5 android web_serviceSaber LAJILI
 
Gatekeeper par Guillaume Faure
Gatekeeper par Guillaume FaureGatekeeper par Guillaume Faure
Gatekeeper par Guillaume FaureCocoaHeads France
 
How javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible toolHow javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible toolCocoaHeads France
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads France
 
Ionic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,SassIonic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,Sassmarwa baich
 
Introduction to WebRTC on iOS
Introduction to WebRTC on iOSIntroduction to WebRTC on iOS
Introduction to WebRTC on iOSCocoaHeads France
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Yves-Emmanuel Jutard
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_threadSaber LAJILI
 
Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: AngularHabib Ayad
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsCocoaHeads France
 

Was ist angesagt? (20)

Plugins Xcode
Plugins XcodePlugins Xcode
Plugins Xcode
 
Xcode Server - Jeffrey Macko
Xcode Server - Jeffrey MackoXcode Server - Jeffrey Macko
Xcode Server - Jeffrey Macko
 
CocoaHeads Rennes #6
CocoaHeads Rennes #6CocoaHeads Rennes #6
CocoaHeads Rennes #6
 
5 android web_service
5 android web_service5 android web_service
5 android web_service
 
Gatekeeper par Guillaume Faure
Gatekeeper par Guillaume FaureGatekeeper par Guillaume Faure
Gatekeeper par Guillaume Faure
 
Multi-Threading Et Cocoa
Multi-Threading Et CocoaMulti-Threading Et Cocoa
Multi-Threading Et Cocoa
 
Nouveauté iOS 6
Nouveauté iOS 6Nouveauté iOS 6
Nouveauté iOS 6
 
How javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible toolHow javascript core helped PAW to move from a small app to an extensible tool
How javascript core helped PAW to move from a small app to an extensible tool
 
CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
Ionic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,SassIonic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,Sass
 
Introduction to WebRTC on iOS
Introduction to WebRTC on iOSIntroduction to WebRTC on iOS
Introduction to WebRTC on iOS
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
Introduction à Angular
Introduction à AngularIntroduction à Angular
Introduction à Angular
 
Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014Apéro techno node.js + AngularJS @Omnilog 2014
Apéro techno node.js + AngularJS @Omnilog 2014
 
4 asynch task_services_thread
4 asynch task_services_thread4 asynch task_services_thread
4 asynch task_services_thread
 
Android wear
Android wearAndroid wear
Android wear
 
Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
 
Introduction à Vaadin
Introduction à VaadinIntroduction à Vaadin
Introduction à Vaadin
 
Transition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers StoryboardsTransition de NIBs/XIBs vers Storyboards
Transition de NIBs/XIBs vers Storyboards
 
Présentation Angular 2
Présentation Angular 2 Présentation Angular 2
Présentation Angular 2
 

Andere mochten auch

SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRM
SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRMSunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRM
SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRMSunTseu
 
Indicateur FW Invest - 2e trimestre 2016
Indicateur FW Invest - 2e trimestre 2016Indicateur FW Invest - 2e trimestre 2016
Indicateur FW Invest - 2e trimestre 2016FrenchWeb.fr
 
Gérer ses signets en ligne
Gérer ses signets en ligne Gérer ses signets en ligne
Gérer ses signets en ligne URFIST de Rennes
 
The importation and exportation of foods by jimmy stepanian
The importation and exportation of foods by jimmy stepanianThe importation and exportation of foods by jimmy stepanian
The importation and exportation of foods by jimmy stepanianJimmy Stepanian
 
Etude de Rémunérations ADV & Import Export 2013-2014
Etude de Rémunérations ADV & Import Export 2013-2014Etude de Rémunérations ADV & Import Export 2013-2014
Etude de Rémunérations ADV & Import Export 2013-2014Page Personnel
 
Assistenza calibrazione-pipette
Assistenza calibrazione-pipetteAssistenza calibrazione-pipette
Assistenza calibrazione-pipetteUnimedScientifica
 
How to Break the Barriers of Office Ergonomics
How to Break the Barriers of Office ErgonomicsHow to Break the Barriers of Office Ergonomics
How to Break the Barriers of Office ErgonomicsFocal Upright
 
Les tableaux de bord & les indicateurs de performance
Les tableaux de bord & les indicateurs de performanceLes tableaux de bord & les indicateurs de performance
Les tableaux de bord & les indicateurs de performanceAhmed Mesellem
 
Presentation des resultats annuels 2013 - Groupe Managem
Presentation des resultats annuels 2013 - Groupe ManagemPresentation des resultats annuels 2013 - Groupe Managem
Presentation des resultats annuels 2013 - Groupe ManagemGroupe Managem
 
Capitalizing on the shifting consumer food value equation
Capitalizing on the shifting consumer food value equationCapitalizing on the shifting consumer food value equation
Capitalizing on the shifting consumer food value equationDeloitte United States
 
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...FrenchWeb.fr
 
Productivity Facts Every Employee Should Know
Productivity Facts Every Employee Should KnowProductivity Facts Every Employee Should Know
Productivity Facts Every Employee Should KnowRobert Half
 

Andere mochten auch (14)

Groupe BPCE - Résultats 2013
Groupe BPCE - Résultats 2013Groupe BPCE - Résultats 2013
Groupe BPCE - Résultats 2013
 
SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRM
SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRMSunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRM
SunTseu, evenement SalesCloud chez Oracle, Automatisez vos Ventes grâce au CRM
 
Indicateur FW Invest - 2e trimestre 2016
Indicateur FW Invest - 2e trimestre 2016Indicateur FW Invest - 2e trimestre 2016
Indicateur FW Invest - 2e trimestre 2016
 
Import export-scouting
Import export-scoutingImport export-scouting
Import export-scouting
 
Gérer ses signets en ligne
Gérer ses signets en ligne Gérer ses signets en ligne
Gérer ses signets en ligne
 
The importation and exportation of foods by jimmy stepanian
The importation and exportation of foods by jimmy stepanianThe importation and exportation of foods by jimmy stepanian
The importation and exportation of foods by jimmy stepanian
 
Etude de Rémunérations ADV & Import Export 2013-2014
Etude de Rémunérations ADV & Import Export 2013-2014Etude de Rémunérations ADV & Import Export 2013-2014
Etude de Rémunérations ADV & Import Export 2013-2014
 
Assistenza calibrazione-pipette
Assistenza calibrazione-pipetteAssistenza calibrazione-pipette
Assistenza calibrazione-pipette
 
How to Break the Barriers of Office Ergonomics
How to Break the Barriers of Office ErgonomicsHow to Break the Barriers of Office Ergonomics
How to Break the Barriers of Office Ergonomics
 
Les tableaux de bord & les indicateurs de performance
Les tableaux de bord & les indicateurs de performanceLes tableaux de bord & les indicateurs de performance
Les tableaux de bord & les indicateurs de performance
 
Presentation des resultats annuels 2013 - Groupe Managem
Presentation des resultats annuels 2013 - Groupe ManagemPresentation des resultats annuels 2013 - Groupe Managem
Presentation des resultats annuels 2013 - Groupe Managem
 
Capitalizing on the shifting consumer food value equation
Capitalizing on the shifting consumer food value equationCapitalizing on the shifting consumer food value equation
Capitalizing on the shifting consumer food value equation
 
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...
Frenchweb 500 - Le classement des 500 premières entreprises de la Tech frança...
 
Productivity Facts Every Employee Should Know
Productivity Facts Every Employee Should KnowProductivity Facts Every Employee Should Know
Productivity Facts Every Employee Should Know
 

Ähnlich wie iTunes Stats

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Gestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerGestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerMohamet Lamine DIOP
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011Kevin Gaudin
 
Solution d'OTA
Solution d'OTASolution d'OTA
Solution d'OTASidereo
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPrestaShop
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASGuillaume Sauthier
 
Déploiement ELK en conditions réelles
Déploiement ELK en conditions réellesDéploiement ELK en conditions réelles
Déploiement ELK en conditions réellesGeoffroy Arnoud
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement webHouda TOUKABRI
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasMicrosoft
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Javatcouery
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 

Ähnlich wie iTunes Stats (20)

Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Gestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerGestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzer
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
 
Solution d'OTA
Solution d'OTASolution d'OTA
Solution d'OTA
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShop
 
Java dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnASJava dans Windows Azure, l'exemple de JOnAS
Java dans Windows Azure, l'exemple de JOnAS
 
[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker[Tuto] Big datatrack : Web Tracker
[Tuto] Big datatrack : Web Tracker
 
Déploiement ELK en conditions réelles
Déploiement ELK en conditions réellesDéploiement ELK en conditions réelles
Déploiement ELK en conditions réelles
 
Fascicule de tp atelier développement web
Fascicule de tp atelier développement webFascicule de tp atelier développement web
Fascicule de tp atelier développement web
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
Tapestry
TapestryTapestry
Tapestry
 
Java dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de JonasJava dans Windows Azure: l'exemple de Jonas
Java dans Windows Azure: l'exemple de Jonas
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Google App Engine For Java
Google App Engine For JavaGoogle App Engine For Java
Google App Engine For Java
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 

Mehr von CocoaHeads France

Mehr von CocoaHeads France (20)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
Handle the error
Handle the errorHandle the error
Handle the error
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 

iTunes Stats

  • 1. Statistiques de ventes des Applications AppStore et MacAppStore Frank Lefebvre & Jacques Foucry Cocoaheads Paris 14/03/2013
  • 2. L’existant iTunesConnect : site web et application iOS Données agrégées après 15 jours C’est beau mais bon... Les applications dans le cloud Obligation de laisser un login/mot de passe Non sérieux, le cloud... Récupération des données Solution fournie par Apple (même s’ils ne sont pas au courant)
  • 3. Autoingestion.class C’est une classe Java fournie par Apple Documentation iTunes Connect Sales and Trends Guide Limitations ... Et si on refaisait le truc ?
  • 4. Reverse engineering ... String body = "USERNAME=" + URLEncoder.encode(paramArrayOfString[0], "UTF-8"); body = body + "&PASSWORD=" + URLEncoder.encode(paramArrayOfString[1], "UTF-8"); body = body + "&VNDNUMBER=" + URLEncoder.encode(paramArrayOfString[2], "UTF-8"); body = body + "&TYPEOFREPORT=" + URLEncoder.encode(paramArrayOfString[3], "UTF-8"); body = body + "&DATETYPE=" + URLEncoder.encode(paramArrayOfString[4], "UTF-8"); body = body + "&REPORTTYPE=" + URLEncoder.encode(paramArrayOfString[5], "UTF-8"); body = body + "&REPORTDATE=" + URLEncoder.encode(str1, "UTF-8"); URL url = new URL("https://reportingitc.apple.com/autoingestion.tft?"); HttpsURLConnection connection = url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setDoOutput(true); OutputStreamWriter localOutputStreamWriter = new OutputStreamWriter(connection.getOutputStream()); localOutputStreamWriter.write(body); localOutputStreamWriter.flush(); localOutputStreamWriter.close(); ...
  • 5. Que nous envoie Apple ? Daily summary avec différenciation des ventes, des mises à jour, des in-app purchases NewsStand : abonnements et données personnelles Données iOS et MacAppStore Apple ne fournit que deux semaines de données Obligation de récupérer tous les jours et de stocker localement (+backup)
  • 6. Format du fichier C’est du texte Gzippé Tab delimited Avec les entêtes Attention, les dates sont au format US (mm/dd/yyyy)
  • 7. Un compte spécifique Dans iTunesConnect, il est possible de créer des comptes avec des droits restreints Cela va faciliter l’automatisation Et surtout sécuriser l’accès au compte
  • 8. Connexion à iTC / Manage Users
  • 9. Choisir le type de compte
  • 12. Droits d’accès de l’utilisateur
  • 15. Stockage Archivage (et backup) des fichier txt.gz une base données sqlite3 Disponible directement sous OSX Facile à installer sur d’autres environnements
  • 16. Schéma de la base product daily_summary report_date product_id product_version date apple_product_id transaction_type product_sku units iap_parent_sku customer_country product_name customer_currency developer payment_currency customer_price payment_price promo_code subscription_type subscription_period
  • 17. Le script Python Pourquoi Python ? Parce que pas perl ! Simple à mettre en œuvre, présent sur toutes les plateformes Intégration sqlite3
  • 18. Dépendances Python 2.7 Dispo sans problème sur OSX, ça peut être amusant sur d’autres OS (par exemple CentOS) Mako, pour les gabarits Flotr2, pour le rendu
  • 19. Architecture de l’application iTunesStats its_download.py its_import.py its_report.py its_database.py its_format.py
  • 20. Ligne de commande iTunesStats --download config_file [--date yyyy-mm-dd] --download-import config_file [--date yyyy-mm-dd] --import config_file path --report config_file
  • 21. Fichier de configuration Trois sections : [iTunes] : les informations nécessaires à la connection à iTunesConnect [data] : les informations de stockage (fichiers tgz et base de données) [report] : l’emplacement des templates et le répertoire où son stockés les rapports
  • 22. Fichier de configuration, un exemple [iTunes] username = sales@foucry.net password = Tucroyaisquejelaisseraismonmotdepasse vendor = 12345678 [data] archive = /Users/jacques/its/sales history = /Users/jacques/its/itc-history database = /Users/jacques/its/sales/itunes-stats.db [report] templates = /Users/jacques/its/templates output = /Users/jacques/its/output
  • 23. Automatisation Quelle est la meilleure heure pour lancer la récupération des stats ? La plupart du temps, c’est 14h30 UTC Parfois il y a des ratés (serveurs surchargés par exemple) Et pourquoi pas toutes les heures ? S’il n’y a rien à récupérer, on ne fait rien
  • 24. Sur OSX launchd une plist qui décrit au daemon launchd comment lancer le script et quand
  • 25. <?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>Label</key> ! ! <string>net.correze-software.its</string> ! ! <key>ProgramArguments</key> ! ! <array> ! ! ! <string>/usr/local/scripts/iTunesStats</string> ! ! ! <string>--download-import</string> ! ! ! <string>/etc/its/its-param</string> ! ! </array> ! ! <key>StandardOutPath</key> ! ! <string>/var/log/its_download.log</string> ! ! <key>StartInterval</key> ! ! <integer>3600</integer> ! </dict> </plist>
  • 26. Emplacement des fichiers Fichier Launchd à mettre dans /Library/LaunchDaemons Fichier de paramètres par exemple dans /etc/itc (ou /Library/Application Support/its) Les scripts j’aime bien mettre mes scripts dans /usr/local/ scripts
  • 27. Prise en compte par launchd et vérification sudo launchctl load -w /Library/LaunchDaemons/ net.correze-software.its.plist sudo launchctl list
  • 28. Sur un autre unix like (linux, *BSD, Aix, Solaris, sco...) cron/crontab Deux posibilités : éditer la crontab utiliser le répertoire /etc/cron.hourly
  • 29. Éditer la crontab $ crontab -e 25! *! *! *! /usr/local/scripts/iTunesStats -- *! download-import /home/jacques/its-param 1> /dev/null 2> /var/log/its_download.log (Lancement toutes les heures de tous les jours, tous les mois... à 25 minutes)
  • 30. Utiliser /etc/cron.hourly Il suffit de déposer dans ce répertoire un petit script shell qui lancera notre script avec les paramètres nécessaires #!/bin/sh if [ -x /usr/local/scripts/iTunesStats] then ! /usr/local/scripts/iTunesStats --download-import /home/jacques/ its-param 1> /dev/null 2>/var/log/its_download.log fi
  • 31. Le rendu Assuré par Flotr2 <http://humblesoftware.com/ flotr2/> du json un template mako
  • 32. le json Généré par le script its_report.py (requête sur la base et écriture du résultat sous forme de json)
  • 33. Le template Mako Pour intégrer le json à du HTML++ (avec des boucles, des variables, etc) Génére le fichier HTML
  • 34. template-stats.html <html lang="fr"> <head> <meta charset="utf-8" /> <title>iTunesStats</title> <script type="text/javascript" src="Flotr2/flotr2.min.js"></script> <script type="text/javascript" src="charts.js"></script> <link rel="stylesheet" type="text/css" href="style.css" media="screen"/> </head> <body> % for product in products: <p> <details open> <summary class="gradient-background">${product[1]}</summary> <div class="container"> <div id="piechart_${product[0]}" class="country"></div> <script type="text/javascript"> displayPieChart("piechart_${product[0]}", "country-${product[0]}.json"); </script> </div> <div class="container"> <div id="bargraph_${product[0]}" class="date"></div> <script type="text/javascript"> displayBarGraph("bargraph_${product[0]}", "date-${product[0]}.json"); </script> </div> <div class="container"> <div id="version_${product[0]}" class="version"></div> <script type="text/javascript"> displayPieChart("version_${product[0]}", "version-${product[0]}.json"); </script> </div> </details> </p> % endfor </body> </html>
  • 35. Flotr2 Un framework HTML Inclure le javascript du framework include notre propre définition des graphs que nous voulons et
  • 36. HOP !
  • 37. Disponible sur GitHub https://github.com/franklefebvre/iTunesStats.git