Interagir par programmation avec une activité cible Adobe basée sur le mouvement de Mercure
Je souhaite proposer des ventes spéciales sur les produits de ma boutique en ligne uniquement lorsque Mercure est rétrograde. Cela se produit quelques fois par an pendant environ une semaine à la fois. Il est connu que les acheteurs en ligne sont particulièrement sensibles aux bonnes affaires, entre autres maladies planétaires…

Depuis que j'utilise Adobe Target pour afficher mes bannières de vente, j'aurai juste besoin de regarder à travers mon télescope chaque nuit et de voir si Mercure est en rétrograde. Si c'est le cas, j'irai dans Target, créerai mon contenu de vente et activerai l'activité. Je devrai également désactiver l'activité lorsque Mercure ne rétrogradera plus . De toute façon, je sors tous les soirs.
Comme je ne sais même pas à quoi ressemble Mercure et que je ne possède pas de télescope, je pense que je devrais automatiser ce processus. Comment puis-je activer automatiquement mon activité lorsque Mercure est rétrograde et la désactiver automatiquement lorsque Mercure n'est plus rétrograde ?

Commençons par créer une activité XT dans Target avec une bannière affichant du contenu accrocheur :



Parce que nous sommes en 2022 (c'est-à-dire le futur), il existe une API pour suivre le mouvement de Mercure. Je peux automatiser l'activation et la désactivation de cette activité à l'aide de cette API :
https://mercuryretrogradeapi.com/
The future is crazy
Une fois que j'ai mes clés API, je peux maintenant interagir avec Target via son API. Normalement, je ferais cela en Python, mais Adobe possède d'excellentes bibliothèques Node JS que vous devez malheureusement creuser pour les trouver. Sérieusement, regardez autour de vous sur NPM. Voici ce que je vais utiliser :
- La bibliothèque Target AIO Node JS
interagit avec les activités Target - Bibliothèque d'authentification Adobe
S'authentifier auprès d'Adobe pour effectuer des appels d'API - Axios
appelle l'API rétrograde - dotenv
lit un fichier .env avec des variables d'environnement (crédits API)
const auth = require('@adobe/jwt-auth');
const axios = require('axios');
const dotenv = require('dotenv');
const targetSDK = require('@adobe/aio-lib-target');
// get my env variables
dotenv.config();
// Adobe API Config vars
const config = {
clientId: process.env.clientId,
clientSecret: process.env.clientSecret,
technicalAccountId: process.env.technicalAccountId,
orgId: process.env.orgId,
metaScopes: ['ent_marketing_sdk'],
privateKey: process.env.privateKey.replace(/\\n/g, '\n'), // make the PK readable as a string
};
// returns boolean
const isRetrograde = async () => {
const response = await axios.get(`https://mercuryretrogradeapi.com/`);
return response.data.is_retrograde;
};

async function updateActivity() {
let activateTest = await isRetrograde();
let { access_token } = await auth(config);
const targetClient = await targetSDK.init(process.env.companyID, process.env.clientId, access_token);
const options = {
headers: {
'content-type': 'application/vnd.adobe.target.v1+json',
Accept: 'application/vnd.adobe.target.v1+json',
},
};
// - approved : corresponds to Live in Target UI.
// - deactivated : corresponds to Inactive in Target UI.
// - saved : corresponds to Inactive in Target UI.
const updateActivityState = await targetClient.setActivityState(123456, activateTest ? 'approved' : 'saved', options);
// //get offer by id activity
const activity = await targetClient.getABActivityById(123456);
console.log(activity);
return;
}
// call to change activity state
updateActivity()
const auth = require('@adobe/jwt-auth');
const axios = require('axios');
const dotenv = require('dotenv');
const targetSDK = require('@adobe/aio-lib-target');
// get my env variables
dotenv.config();
// Adobe API Config vars
const config = {
clientId: process.env.clientId,
clientSecret: process.env.clientSecret,
technicalAccountId: process.env.technicalAccountId,
orgId: process.env.orgId,
metaScopes: ['ent_marketing_sdk'],
privateKey: process.env.privateKey.replace(/\\n/g, '\n'), // make the PK readable as a string
};
// returns boolean
const isRetrograde = async () => {
const response = await axios.get(`https://mercuryretrogradeapi.com/`);
const { is_retrograde } = response.data;
return is_retrograde;
};
async function updateActivity() {
let activateTest = await isRetrograde();
let { access_token } = await auth(config);
const targetClient = await targetSDK.init(process.env.companyID, process.env.clientId, access_token);
const options = {
headers: {
'content-type': 'application/vnd.adobe.target.v1+json',
Accept: 'application/vnd.adobe.target.v1+json',
},
};
// - approved : corresponds to Live in Target UI.
// - deactivated : corresponds to Inactive in Target UI.
// - saved : corresponds to Inactive in Target UI.
const updateActivityState = await targetClient.setActivityState(12345, activateTest ? 'approved' : 'saved', options);
// //get offer by id activity
const activity = await targetClient.getABActivityById(12345);
console.log(activity);
return;
}
updateActivity();
Tout d'abord, la méthode setActivityState du SDK nécessite des en-têtes de type de média spéciaux spécifiés dans les options. Le SDK n'a pas cela intégré dans les méthodes et ne spécifie rien dans les définitions de méthode, mais c'est obligatoire. Si vous obtenez des erreurs 415 avec n'importe quelle méthode, vérifiez les en-têtes de ce document :https://developers.adobetarget.com/api/
Le deuxième paramètre de setActivityState est un opérateur ternaire basé sur ce que l'API Retrograde renvoie. Si Mercury est rétrograde ( vrai à partir de l'API), l'activité sera définie sur approuvée. Si rétrograde est faux, l'activité sera désactivée. Ces statuts sont plutôt vagues et ne reflètent pas la terminologie de l'interface utilisateur cible, ce qui est plutôt ennuyeux. Les définitions dans les commentaires sont tirées directement de la documentation. Je ne sais pas exactement quelle est la différence entre enregistré et désactivé . Quoi qu'il en soit, vous obtenez le point. Passons à la partie amusante…
Il y a quelques options ici pour automatiser cela. Vous pouvez utiliser un AWS Lambda, mais vous devez ensuite apprendre à déployer un projet de nœud dans lambda et à planifier des tâches cron via AWS Event Bridge. Ces tâches sont en fait plus délicates qu'elles n'en ont l'air si vous ne les avez jamais faites auparavant. Plutôt que de donner plus d'argent à Amazon. Au lieu de cela, je vais donner de l'argent à Akamai et utiliser une machine virtuelle Linode. Ensuite, je peux l'utiliser pour exécuter de nombreuses tâches cron différentes. Si vous n'avez jamais utilisé Linode auparavant, consultez leur chaîne Youtube. Je peux soit lancer une nouvelle machine virtuelle préchargée avec NodeJS, soit en lancer une vierge et installer Node manuellement. Je choisirai le premier.
Après avoir créé ma machine virtuelle et vérifié que je peux m'y connecter via SSH , je transfère mon fichier mercury.js et mon fichier package.json via SCP . Concernant les variables d'environnement, je peux également transférer mes .env , ou les définir directement sur la machine virtuelle. Votre choix. Une fois les fichiers transférés, je peux accéder à leur répertoire et exécuter npm i pour installer tous les packages dont j'aurai besoin. J'exécuterai également mercure.js plusieurs fois pour m'assurer que tout fonctionne :
# transfer files via scp from source machine to VM
# scp <source> <username@destination>
scp mercury.js [email protected]:/home/mercury/mercury.js
# scp other files...
#SSH into my virtual machine. (Not the real IP address :) )
ssh [email protected]
# move to mercury directory and install node libraries
cd mercury && npm i
# run the file to make sure it works!
node mercury.js
Au final, mon fichier crontab aura ceci en bas :
# etc
# etc
# m h dom mon dow
0 8 * * * cd /somepath/mercury && node mercury.js

Une note rapide que l'interface utilisateur cible ne se met pas toujours à jour immédiatement pour refléter les modifications de l'API, mais vous pouvez vérifier que l'activité est activée via la section Changelog. Les modifications de l'interface utilisateur apparaîtront après quelques minutes.
Maintenant, cet exemple est trivial , certains pourraient même le qualifier de stupide ( comment osez-vous ! ), mais la configuration est réelle. Et si vous exécutiez tous les types d'activités Target spécifiques à une date ? Black Friday, Cyber Monday, Super Bowl, President's Day, Flag Day, l'anniversaire de John, etc. Je pourrais avoir toutes sortes d'activités cibles qui s'allument et s'éteignent par programmation en fonction de la date. Avec une configuration initiale, je pourrais planifier une année entière de bannières de vente en quelques heures !