Interagir Avec Google Analytics Sans Ouvrir De Navigateur

Introduction au Measurement Protocol ou comment faire du Google Analytics côté serveur

Google analytic est un outil pour mesurer le trafic Web sur votre site web. Il nécessite de mettre un bout de code pour traquer les visites des internautes

Mais il est aussi possible d'envoyer les informations vers google analytics sans passer par un navigateur. Vous pouvez donc depuis un script côté serveur envoyer des informations vers Google analytic pour qu'il enregistre des informations
Pour ce faire nous devons utiliser une API qui s'appelle Measurement Protocol. Le principe est simple, il faut faire une requête de type POST vers le serveur de Google Analytics point

Je vais vous expliquer pourquoi connaître cet aspect de Google Analytics avec important, c'est relatif au tracking des achats sur votre site web. Dans le cas où le paiement s'effectue sur le site de la banque, et que le client revient sur votre site web, l'achat et suivi. Mais dans le cas où le paiement se finit et que la personne ne reviens pas sur votre site web, vous ne pouvez pas suivre les conversions.

Measurement protocol nous permet donc d'envoyer l'information comme quoi là ça a été réussi même si l'internat ne reviens pas sur votre site web après avoir payé sur le site de la carte bancaire

Le principe est simple, vous allez envoyer une requête vers le serveur de Google Analytics avec des paramètres bien défini, les paramètres doivent être au complet, sinon la requête échoue. Mais Google vous fournit à d'outils pour simuler et valider vos requêtes. cet outil c'est le Hitbuilder.

Mais d'abord nous allons voir un exemple très simple pour simuler une première requête vers le serveur de Google Analytics.

 

Il y a énormément de paramètres à envoyer car vous pouvez construire les mêmes requêtes que le script de Google Analytics sur le site web
Il vous faut vous référer à la page de documentation sur les paramètres pour voir la liste complète
Mais sans plus attendre faisant de notre première requête vers le serveur de Google Analytics
Il y a 4 paramètres obligatoire le premier paramètre concerne la version vous pouvez mettre ça n'a pas d'importance, le deuxième paramètre et le paramètre qui concerne le type de requêtes que vous allez vous allez faire , le plus simple c'est la pageview.
Le troisième paramètre est l'identifiant de votre compte Google Analytics et le dernier paramètres concerne le type de campagne pour simplifier nous allons mettre direct.

Voyons d'abord dans le HitBuilder comment nous allons construire à cette requête, dans un premier temps on construit les paramètres, en fait c'est la chaîne de paramètres que vous avez envoyer, ensuite vous allez cliquer sur le bouton Valider pour valider l'intégrité de cette requête et si tout se passe bien vous pouvez envoyer grâce à un bouton vers google Analytics la requête.

Pour visualiser le résultat de cette requête, basculer dans la vue temps réel de Google Analytics, vous aurez un retour immédiatement

HitbuilderConstruire requêtes dans le Hitbuiler et cliquer sur Validate Hit

 

 

Cliquer sur le bouton vert pour envoyer la requête

 

Allez ensuite sur votre interface Google Analytics dans le raport temps réel pour voir le résultat.

 

Étant donné que vous avez envoyé vraiment une requête vers votre serveur Google Analytics virgule les données Google Analytics de votre site de production seront affectés. Mais en développement vous pouvez vous permettre d'envoyer quelques données de test sont vraiment pollué les données de votre analytique.



Maintenant que l'on a réussi à envoyer une requête et à la visualiser grâce au graphique trafic temps réel de Google Analytics, on va essayer de faire une requête maintenant avec un script côté serveur. Attention, il y a un paramètre qui ne faut pas omettre et qui est le paramètre dp comme document path, je ne l'ai pas fait la première fois et aucune donnée n'a été envoyée,  ce n'est pas évident car si vous en mettez ce paramètre dans le tuto le HitBuilder, il va dire que la chaîne de requête est valide alors que aucune donnée n'a été envoyée, alors que dans la documentation de référence il est bien dit que dp et dh sont obligatoires dh étant le Host (nom de domaine).

Requêtes dans le Hitbuilder de type transactionnelle

Bien que cet exemple soit très simple, le plus simple possible, il nous faut quand même 6 paramètres pour compléter la requête. Avant d'aller plus loin vers les scripts côté serveur, regardons quand même comment est fait une requête de type e-commerce et transactionnelle puisque c'est le but de cet article c'est-à-dire qu'on voudrait identifier les transactions e-commerce grâce à un script côté serveur.

Je prendrai l'exemple du logiciel de e-commerce PrestaShop. dans le logiciel Prestashop les transactions sont identifiées par le numéro de commande (et non le numéro de panier), par exemple pour une commande dont le numéro de panier est 3012, le numéro de transaction est 3012.

Dans Google Analytics, vous pouvez voir les transaction dans Conversion > Transaction.

Envoi d'une transaction

Envoi d'une transaction

 ti : transaction id

ta : transaction affiliation, ou le nom de la boutique

tr : transaction revenue,

ts : transaction shipping, frais de port

tt : transaction tax

cu : currency

Envoi d'un item

Envoi d'un item de transaction

ti : transaction id, bien sûr si vous voulez que l'on sache dans quelle transaction cet item a été acheté !

in : item name

ip: item price

iq : item quantity

ic : item code (la référence de l'article)

iv : item category

cu : currency

 Lorsqu'on envoie vers google analytics un item, il faut spécifier bien sûr le numéro de la transaction à laquelle il est associé vous spécifiez un sous-total, mais attention il faut que lorsque vous envoyez les items du panier, le total des items doit être cohérent avec le montant de la transaction, je vous laisse faire ça à côté serveur, tout ceci pour vous dire que vous pouvez avoir une incohérence entre la transaction le montant de la transaction est le total des items du palier, le système vous le permet.

Measurement Protocol Validation Server

 

Url de validation : https://www.google-analytics.com/debug/collect?tid=fake&v=1 Elle ne diffère de la véritable url que de /debug/ Url d'envoi de requêtes : https://www.google-analytics.com/collect?tid=fake&v=1

Lorsque vous forger une requête et de vous envoyer vers le serveur de Google analytic même si elle échoue n'aurait pas de message d'erreur en retour.
C'est pour cela que Google Analytics vous propose une adresse pour tester vos requêtes.

Attention j'ai noté que même si une requête est bien formatée et qu'elle ne retourne pas d'erreur en mode débogage, ceci ne veut pas dire que vous avez réussi votre requête. J'ai eu le cas où j'ai essayé pour une première fois d'envoyer une requête transaction où je n'ai pas inclu tous les paramètres "optionnels" , la requête n'a rien donné, j'ai vérifié en mode débogage j'ai eu un retour ok mais je n'avais toujours rien dans le rapport de Google Analytics.


Finalement j'ai relu la documentation j'ai pris l'exemple et j'ai réussi ma requête comme quoi il faut toujours se reporter à la documentation et bien la lire.

 

Beaucoup d'exemples de la documentation officielle pour aide mémoire des différentes type de requêtes.

Measurement protocol n'est pas limité au web, les applications Android peuvent utiliser l'API de Measurement Protocol. Les requêtes en  POST ainsi que GET peuvent être utilisées.

J'espère vous avoir aidé dans votre quêtes du tracking intégrale de toutes les transactions, en particulier les transaction de clients pressé (souvent en BtoB) qui ne reviennent même pas vers le site d'origine, tellement ils ont confiance en leur fournisseur.

Il est absolument important de pouvoir tracker toutes les conversion afin de mesurer le retour sur investissement des campagnes de marketing. Sans mesure on ne peut rien améliorer.

 

2017-05-14 09:05:29 0 Commentaires

Commencez à Programmer En Javascript ES6 (ES2015) Doucement

Si vous faites du Web, vous avez sans doute entendu abondamment parler de Ecmascript 6.

C'est une norme qui décrit la syntaxe du langage Javascript (pour simplifier)

Voyons les innovations syntaxiques que vous devez absolument connaitre car tous les navigateurs les utilisent aujourd'hui.

Déclaration de variable avec var (méthode historique)

Jusqu'à présent vous ne déclariez les variables qu'avec var.

Or il cause beaucoup de poblèmes : son scope est global à l'objet window.

 

var prenom = 'Yvon' 

 

On dit que son scope (sa portée) est globale. Si vous venez du monde du php, vous avez dû voir qu'on peut déclarer une variable comme globale avec le mot clé global.

Pour des raisons de bonne pratique de sécurité, il faut éviter de déclarer des variables globales.

Revenons au Javascript, var déclare une variable de porté globale, c'est à dire qu'elle peut être utilisée partout.

Jusqu'à récemment avant ES6, nous ne pouvions déclarer de variable de porté de type bloc. Un bloc est tout ce qui est compris dans une parie d'accolade.

Une variable de type bloc, de portée bloc, n'existe que dans la paire d'accolade, en dehors on ne la connait pas.

Historiquement var a été introduit pou faciliter la programmation, afin que les programmeurs novices puissent utiliser rapidement Javascript. Mais au fil du temps cela s'est avéré être un mauvais choix. Aujourd'hui (seulement) les concepteur du langage on décidé d'introduire deux nouvelles façons de déclarer une variable. Ces deux nouvelles façons const et let déclarent des variables de porté de bloc.

 

Déclaration de variable avec const

A la différence de PHP par exemple, const ne déclare pas une constante ! La signification de const est que le binding est constant, invariable, vous ne pouvez pas réassigner la variable à un pointeur différent, mais vous pouvez modifier sa valeur. En Javascript, la notion de constante existe dans le cadre de la programmation fonctionnelle via des librairie comme immutable.js .

const prenom = 'Yvon'

Pour vous montrer que const a sa valeur qui peut changer :

const prenom = 'Yvon' prenom = 'Julien' console.log(prenom) // Erreur Uncaught TypeError: Assignment to constant variable. 

Le code ci-dessus montre que la valeur de la primitive n'est pas modifiable. Par contre, si on déclare un objet litéral :

const eleve = { prenom :'Yvon', nom : 'Huynh'} eleve.prenom = 'Julien' console.log(eleve.prenom) // Julien

 

 On peut modifier une propriété d'un objet litéral. eleve est bindée par référence à cet objet. Mais si on essai de réaffecter par référence :

const eleve = { prenom : 'yvon', nom : 'huynh' } eleve = { prenom : 'toto' } console.log(eleve.prenom) // Uncaught TypeError: Assignment to constant variable.

Une autre particularité de const est que vous devez initialiser dè sla déclaration de la variable, sinon vous avez une erreur.

const pays; //Uncaught SyntaxError: Missing initializer in const declaration

Block scope avec const

Enfin regardons l'aspect le plus important concernant const, il est block scoped, c'est à dire qu'en dehors (à l'extérieur) des accolades où la variable a été définie, elle n'existe pas.

function saluer(ami){ const pays = 'France' if(pays === 'France'){ const greet = ' Monsieur' console.log('Bienvenue en ' + pays + greet) } console.log('A une autre fois en ' + pays) console.log('Au revoir ' + greet) } saluer('Yvon') // imprime Bienvenue en France Monsieur,A une autre fois en France, mais affiche Uncaught ReferenceError: greet is not defined

 Alors que pays reste en valable, greet n'est plus connue en dehors des accolades où greet a été définie.

Un exemple encore plus flagrant on va créer deux variables portant le même nom,mais avec des valeurs différentes :

const ville = 'Paris' function saluer(nom){ const ville = 'Nantes' console.log('bienvenue à ' + ville) } saluer('Yvon') //bienvenue à Nantes console.log('Euh non on est à ' + ville) //Euh non on est à Paris

Nantes ne peut exister en dehors des accolades de la fonction.

 

Peut on rendre une variable const vraiment immuable?

Même si dans votre vie vous aurez probablement peu l'opportunitéde rendre un objet immuable, il existe une façon de rendre immuable une variable déclarée avec const.

const eleve = Object.freeze( {prenom : 'yvon', adresse : { rue : ' De gaulle', ville : 'Nantes', codepostal : 44000} }) eleve.prenom ='Julien' console.log(eleve.prenom) // yvon

Vous remarquez que la propriété prenom est inchangée. Si vous utilisez "use strict"; vous aurez une erreur Uncaught TypeError: Cannot assign to read only property 'prenom' of object '#'.

Object.freeze est 'shallow' comme on dit en anglais, cela veut dire que vous pouvez quand même altérer les propriétés des objets imbriquée.

"use strict"; const eleve = Object.freeze( {prenom : 'yvon', adresse : { rue : ' De gaulle', ville : 'Nantes', codepostal : 44000} }) eleve.adresse.codepostal = 44100 console.log(eleve.adresse.codepostal) // 44100

Le code ci-dessus est tout à fait valide.

A quoi ça sert const en Javascript?

On dit que les variables déclarées avec const sont "block scoped". Un bloc c'est ce qui est entre accolade dans la définition d'une fonction. C'est pour pallier au défaut de var (qui est défini dans les accolades d'une fonction, on dit que var est function scoped), qu'on a introduit const afin de mieux structurer son code et d'éviter des collisions.

 

Qu'est ce que la Temporal Dead Zone?

 Lorsqu'un code javascrip est exécuté, une variable ne peut être settée ou gettée tant que l'exécution n'a pas atteint la ligne de code où la variable a été définie.

function saluer(name){ // début de la fonction if(name === 'yvon'){ //début du block var ville = 'Paris' console.log('Pays = ' + pays + ' Ville destination = ' + ville) var pays = 'France' } } saluer('yvon') // Pays = undefined Ville destination = Paris

On voit que la variable pays étant définie après le console.log, il est à undefined. Par contre que se passe-t-il si on a const à la place de var ?

function saluer(name){ // début de la fonction if(name === 'yvon'){ //début du block var ville = 'Paris' console.log('Pays = ' + pays + ' Ville destination = ' + ville) const pays = 'France' } } saluer('yvon') //Uncaught ReferenceError: pays is not defined

 Vous avez une erreur (un avertissement) comme quoi votre variable n'est pas définie. Au moment ou le console.log s'exécute, pays n'est pas encore définie, elle n'a pas de valeur attribuée. L'utilité de la Temporal Dead Zone (TDZ) est de vous permettre de coder plus proprement, en lançant des avertissements.

2017-02-16 17:02:55 0 Commentaires

Résoudre Les Crash Mysql

J'ai récemment eu quelques souci sur une base mysql sous Linux, le disque étant plein, il y a eu quelques tables qui ont crashé.

Le résultat est un site web qui ne marche pas.

Premier réflexe : essayer de redémarrer Mysql

Seconde chose à faire quelquesoit le résultat de la première étape : regarder les logs mysql ! En génral c'est sauvé dans /var/log/

 

J'ai eu donc deux tables qui ont crashé avec le message suivant dans les logs :

Mysql : is marked as crashed and should be repaired

170127  8:58:26 [ERROR] /usr/libexec/mysqld: Table './mydatabase/user_sessions' is marked as crashed and should be repaired

Pourquoi? plus loin en arrière, j'ai le message très parlant :

170126 21:10:08 [Warning] Retry in 60 secs. Message reprinted in 600 secs
170126 21:20:08 [Warning] Disk is full writing './mydatabase/archives_factures.MYD' (Errcode: 28). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)

 

C'est bien un problème d'espace disque qui est à l'origine de la panne !

Pour s'en convaincre, on peut utiliser les comande Linux df et du pour diagnostiquer l'espace restant.

 

Réparer les tables Mysql crashées

Vous pouvez le faire en ligne de commande ou sous phpmyadmin, mais je vous conseille de le faire en ligne de commande dans le shell, parce que c'est plus performant et plus sûr.

Une fois connecté sous Mysql, la commande à faire est :

$ repair table table_defectueuse

Voilà c'est à peu près ce qu'i faut faire.

Mais il arrive que certaines tables soient plus endommagée que çà, et que la commande ci-dessus ne suffisent pas, on a le message :

 Can't find file: 'table_defectueuse' (errno: 2)

Pour connaitre la signification de l'erreur, faire la commande shell suivante :

$ perror 2

$ OS error code   2:  No such file or directory

 

 

 

 

2017-01-27 09:01:40 0 Commentaires

Magento Api: Invalid Webservice Adapter Specified

Que faire quand vous avez ce message lorsque vous désirez tester une API SOAP Magento

en local?

Lorsque vous tentez d'accéder à cette url dans votre navigateur :

http://www.magentostore.fr/api/v2_soap/?wsdl=1

Sachez que si vous recevez ce message "Magento api: Invalid webservice adapter specified" , vous pouvez accéder normalement à votre site en local, au moins, mais que pour une raison ou une autre le serveur ne peut retourner la ressource demandée.

La réponse est à trouver dans la configuration Apache, on rentre dnas le concept de négociation de contenu.

Il faut trouver la ligne :


            Options Indexes FollowSymLinks MultiViews

 

et la remplacer par ceci :


            Options Indexes FollowSymLinks -MultiViews

 

Appliquer cette modification dans le fichier httpd.conf d'Apache n'a pas produit les effets escomptés, mais le faire dans le fichier htaccess de Magento est couronné de succès. En plus cela vous évite de redémarrer les services de WAMP si vous êtes sous Windows.

En réalit sur Magento 1.9,la ligne à modififier est exactement :

     Options -MultiViews

Entendez bien ajouter un signe moins devant MultiViews.

C'est quoi la négociation de contenu?

Selon Wikipédia :

"La Négociation de contenu est un mécanisme défini dans la spécification HTTP qui offre la possibilité de proposer pour une même URI, différentes versions d'un même document (ou plus généralement, une ressource). Les User-Agent peuvent ainsi choisir la version la mieux adaptée à leurs capacités. Une des utilisations classiques de ce mécanisme est de proposer une image aussi bien au format GIF que PNG. Ainsi un User-Agent qui ne peut pas afficher le format PNG peut toujours utiliser la version en GIF."

Donc vous entendez parler de négociatin de coontenu que dans le domaine de HTTP puisqu'elle en est une spécification.

Mais il est probable que vous en entendrez parler peu mêmeen tant que développeur web.

2016-08-20 08:08:03 0 Commentaires

Comprendre L'objet Window Dans Javascript

Quelle est la différence entre Window, Document, Screen?

Window est l'objet principal du DOM, le document object model, qui est la base de la page web et quand je dis la base ça comprend vraiment tout, les images, les scripts javascript, et autres objets, bref ce que vous voyez dans la fenêtre de votre navigateur.

Quand vous faite un script javascript, vous ne le savez peut être pas, mais vous utiliser une méthode ou un objet de l'objet Window, qui est le parent de tous les objets javascripts.

 

Document est un sous objet de Window. Document est en fait la vraie partie visible de la page qui est dans votre navigateur.

Pour savoir ce que l'objet Window contient, je vous invite à faire tourner le script suivant dans la console javascript (pour Chrome, faire F12,cliquer sur console) :

console.log(window);

 

cette ligne de javascript va afficher l'objet Widow dans la console de debug. Déplier le et vous allez être submergé, car il contient beaucoup d'objet, et vous allez vous rendre compte qu'il est facile de faire une radiographie de la page web et très facilement.

Ne sous estimez pas la puissance d'un simple console.log, il vous permet d'afficher n'importe quel objet, même les lus obscure. Par exemple, quend vous chargez un script Jquery, il est rattaché au DOM donc à window. Vous pourrez afficher tout l'objet Jquery et regarder ce qu'il contient ! De même si vous ne savez pas ce qu'il y a dans l'objet Angular, vous pouvez l'afficher de cette façon. Attention, c'est gros et vous allez peut etre vous y perdre.

 

Cas des iframes

Lorsqu'il y a des iframes dans votre page html, le code JS qu'il y a dans le ifrmae ne peut pas accéder directement à la fenêtre qui le contient. Si vous êtes dans l'iframe, pour accéder à un élément du DOM de la fenêtre parente, vous devez faire :

var topWindow = window.top

votre variable topWindow contiendra une référence vers l'objet window le pus haut dans la hiérachie des windows, oui il peut avoir plusieurs windows dans une page web.

Le parent immédiat :

Si vous êtes dans une iframe et que vous voulez le parent immédiat :

var parentWindow = window.parent

 

 

 

 

2016-07-19 21:07:43 0 Commentaires

Utiliser NPM Script Au Lieu De Gulp Pour Builder

On entends sur le net beaucoup à propos de Grunt ou de Gulp, ces outils vous permettent de compiler du sass en css, de minifier les script css et javascript, de rassembler en un seul fichier etc.

Cependant, il vous est tout à fait possible de faire ce que fait Gulp par exemple rien qu'en utilisant ce qui est disponible avec NPM script.

NPM est le gestionnaire de package sous nodeJS. Il vous permet de télécharger les dépendances nécessaire au fonctionnement de votre application web et du développement de ce dernier.

Voyons voir comment on peut compiler du Sass en CSS en utilisant NPM script.

les scripts NPM sont logés dans le fichier package.json, dans la propriété scripts.

C'est un objet json qui contient des paire clé-valeurs. La clé étant le nom d'un script, et la valeur est la commande NPM que vous auriez tapé en ligne de commande.

 Bon assez parlé on y va !

Compiler du Sass en css

c'est la tâche que l'on aura le plus souvent à faire.

Donc je suppose que vous avez déjà installé nodeJS, donc que vous pouvez utiliser NPM.

> npm install node-sass

Ensuite dans l'objet scripts qu'il y a dans le fichier package.json, créez une entrée comme ceici:

  "scripts": {
    "scss-build": "node-sass --include-path src/scss src/scss/style.scss public/css/style.css",
    "watch-scss": "node-sass -w src/scss/ -o public/css/"
  },

 

les chemins sont relatifs à l'emplacement du fichier package.json

le premier script "scss-build" va dire à node de compiler le fichier style.scss en style.scss

  1. src/scss est le répertoire source
  2. src/scss/style.scss est le fichier sass à compiler
  3. public/css/style.css est le fhicer cible

Rien qu'avec ce premier script (n'ajoutez pas le second script watch-scss pour l'instant), faite ceci:

> npm run scss-build

 et voilà !

PAssons au second script, comme avez à modifier un grand nombre de fois le fichier sass, vous aurez envie que la compilation se fasse à chaque fois que vous sauvez le fichier sass,

le "watch-scss" va surveiller toute modification du ficheir et va le compiler.

Il suffit donc de lancer non pas le premier script, mais le second script seul.

> npm run watch-scss

 

et voilà !

Il y a plus dans les npm scripts que la compilation. On aura envie de minifier le css,minifier le javascript, linter le javascript (linter veut dire vérifier que le code soit aux normes),autopréfixer les propriétés css, et même compresser les images (ce qui est très intéressant !). Le top du top est de pouvoir travailler avec Browsersync quand vous développez en cross browser.

 

 

2016-04-15 02:04:50 0 Commentaires