itunes stats

37
Statistiques de ventes des Applications AppStore et MacAppStore Frank Lefebvre & Jacques Foucry Cocoaheads Paris 14/03/2013

Upload: cocoaheads-france

Post on 15-May-2015

2.536 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: iTunes Stats

Statistiques de ventes des Applications AppStore et

MacAppStore

Frank Lefebvre & Jacques Foucry

Cocoaheads Paris 14/03/2013

Page 2: iTunes Stats

L’existantiTunesConnect : 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)

Page 3: iTunes Stats

Autoingestion.class

C’est une classe Java fournie par Apple

Documentation

iTunes Connect Sales and Trends Guide

Limitations

... Et si on refaisait le truc ?

Page 4: iTunes Stats

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();

...

Page 5: iTunes Stats

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)

Page 6: iTunes Stats

Format du fichier

C’est du texte Gzippé

Tab delimited

Avec les entêtes

Attention, les dates sont au format US (mm/dd/yyyy)

Page 7: iTunes Stats

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

Page 8: iTunes Stats

Connexion à iTC / Manage Users

Page 9: iTunes Stats

Choisir le type de compte

Page 10: iTunes Stats

Résumé des utilisateurs existants

Page 11: iTunes Stats

Nommer l’utilisateur

Page 12: iTunes Stats

Droits d’accès de l’utilisateur

Page 13: iTunes Stats

Territoires d’intervention

Page 14: iTunes Stats

Et boum...

Page 15: iTunes Stats

Stockage

Archivage (et backup) des fichier txt.gz

une base données sqlite3

Disponible directement sous OSX

Facile à installer sur d’autres environnements

Page 16: iTunes Stats

Schéma de la base

product_idapple_product_idproduct_skuiap_parent_skuproduct_namedeveloper

productdate

report_dateproduct_versiontransaction_typeunitscustomer_countrycustomer_currencypayment_currencycustomer_pricepayment_pricepromo_codesubscription_typesubscription_period

daily_summary

Page 17: iTunes Stats

Le script Python

Pourquoi Python ?

Parce que pas perl !

Simple à mettre en œuvre, présent sur toutes les plateformes

Intégration sqlite3

Page 18: iTunes Stats

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

Page 19: iTunes Stats

Architecture de l’application

iTunesStats

its_download.py its_import.py its_report.py

its_database.py its_format.py

Page 20: iTunes Stats

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

Page 21: iTunes Stats

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

Page 22: iTunes Stats

Fichier de configuration, un exemple

[iTunes]username = [email protected] = Tucroyaisquejelaisseraismonmotdepassevendor = 12345678

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

[report]templates = /Users/jacques/its/templatesoutput = /Users/jacques/its/output

Page 23: iTunes Stats

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

Page 24: iTunes Stats

Sur OSX

launchd

une plist qui décrit au daemon launchd comment lancer le script et quand

Page 25: iTunes Stats

<?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>

Page 26: iTunes Stats

Emplacement des fichiersFichier 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

Page 27: iTunes Stats

Prise en compte par launchd et vérification

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

sudo launchctl list

Page 28: iTunes Stats

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

Page 29: iTunes Stats

É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)

Page 30: iTunes Stats

Utiliser /etc/cron.hourlyIl 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.logfi

Page 31: iTunes Stats

Le rendu

Assuré par Flotr2 <http://humblesoftware.com/flotr2/>

du json

un template mako

Page 32: iTunes Stats

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)

Page 33: iTunes Stats

Le template Mako

Pour intégrer le json à du HTML++ (avec des boucles, des variables, etc)

Génére le fichier HTML

Page 34: iTunes Stats

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>

Page 35: iTunes Stats

Flotr2

Un framework HTML

Inclure le javascript du framework

include notre propre définition des graphs que nous voulons et

Page 36: iTunes Stats

HOP !

Page 37: iTunes Stats

Disponible sur GitHub

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