iTunes Stats

2 930 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
2 930
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2 364
Actions
Partages
0
Téléchargements
3
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

iTunes Stats

  1. 1. Statistiques de ventes desApplications AppStore et MacAppStore Frank Lefebvre & Jacques Foucry Cocoaheads Paris 14/03/2013
  2. 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. 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. 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 = newOutputStreamWriter(connection.getOutputStream());localOutputStreamWriter.write(body);localOutputStreamWriter.flush();localOutputStreamWriter.close();...
  5. 5. Que nous envoie Apple ?Daily summary avec différenciation des ventes, desmises à jour, des in-app purchasesNewsStand : abonnements et données personnellesDonnées iOS et MacAppStoreApple ne fournit que deux semaines de données Obligation de récupérer tous les jours et de stocker localement (+backup)
  6. 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. 7. Un compte spécifiqueDans iTunesConnect, il est possible de créer descomptes avec des droits restreints Cela va faciliter l’automatisation Et surtout sécuriser l’accès au compte
  8. 8. Connexion à iTC / ManageUsers
  9. 9. Choisir le type de compte
  10. 10. Résumé des utilisateursexistants
  11. 11. Nommer l’utilisateur
  12. 12. Droits d’accès de l’utilisateur
  13. 13. Territoires d’intervention
  14. 14. Et boum...
  15. 15. StockageArchivage (et backup) des fichier txt.gzune base données sqlite3 Disponible directement sous OSX Facile à installer sur d’autres environnements
  16. 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. 17. Le script Python Pourquoi Python ? Parce que pas perl ! Simple à mettre en œuvre, présent sur toutes les plateformes Intégration sqlite3
  18. 18. DépendancesPython 2.7 Dispo sans problème sur OSX, ça peut être amusant sur d’autres OS (par exemple CentOS)Mako, pour les gabaritsFlotr2, pour le rendu
  19. 19. Architecture de l’application iTunesStats its_download.py its_import.py its_report.py its_database.py its_format.py
  20. 20. Ligne de commandeiTunesStats--download config_file [--date yyyy-mm-dd]--download-import config_file [--date yyyy-mm-dd]--import config_file path--report config_file
  21. 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. 22. Fichier de configuration, un exemple[iTunes]username = sales@foucry.netpassword = 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
  23. 23. AutomatisationQuelle est la meilleure heure pour lancer laré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. 24. Sur OSXlaunchd une plist qui décrit au daemon launchd comment lancer le script et quand
  25. 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. 26. Emplacement des fichiersFichier Launchd à mettre dans /Library/LaunchDaemonsFichier 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. 27. Prise en compte par launchdet vérificationsudo launchctl load -w /Library/LaunchDaemons/net.correze-software.its.plistsudo launchctl list
  28. 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. 29. Éditer la crontab$ crontab -e25! *! *! *! /usr/local/scripts/iTunesStats -- *!download-import /home/jacques/its-param 1> /dev/null2> /var/log/its_download.log (Lancement toutes les heures de tous les jours, tous les mois... à 25 minutes)
  30. 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/shif [ -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
  31. 31. Le renduAssuré par Flotr2 <http://humblesoftware.com/flotr2/>du jsonun template mako
  32. 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. 33. Le template MakoPour intégrer le json à du HTML++ (avec desboucles, des variables, etc)Génére le fichier HTML
  34. 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. 35. Flotr2 Un framework HTML Inclure le javascript du framework include notre propre définition des graphs que nous voulons et
  36. 36. HOP !
  37. 37. Disponible sur GitHub https://github.com/franklefebvre/iTunesStats.git

×