Interacción programática con una actividad de Adobe Target basada en el movimiento de Mercurio

Dec 02 2022
Quiero ofrecer ventas especiales de productos en mi tienda web solo cuando Mercurio esté retrógrado. Esto sucede solo unas pocas veces al año durante aproximadamente una semana a la vez.
Foto de la NASA en Unsplash

Quiero ofrecer ventas especiales de productos en mi tienda web solo cuando Mercurio esté retrógrado. Esto sucede solo unas pocas veces al año durante aproximadamente una semana a la vez. Se sabe que hace que los compradores en línea sean especialmente susceptibles a las mejores ofertas, entre otras enfermedades planetarias...

Comprador en línea que compra zapatos mientras Mercurio está retrógrado

Dado que uso Adobe Target para mostrar mis carteles de ventas, solo necesitaré mirar a través de mi telescopio cada noche y ver si Mercurio está retrógrado. Si es así, entraré en Target, crearé mi contenido de venta y activaré la actividad. También tendré que apagar la Actividad cuando Mercurio ya no esté retrógrado. De cualquier manera, voy a salir todas las noches.

Como ni siquiera sé cómo es Mercurio ni tengo un telescopio, creo que debería automatizar este proceso. ¿Cómo puedo activar mi Actividad automáticamente cuando Mercurio está retrógrado y desactivarla automáticamente cuando Mercurio ya no está retrógrado?

¡Mi increíble tienda web!

Comencemos creando una actividad XT en Target con un banner que muestre contenido llamativo:

Una bandera roja tentadora seguramente impulsará mis ventas.
El banner de venta está activo, ¡pero desconozco el estado de Mercury!
Cuando las personas visiten myawesomewebstore.com mientras Mercurio esté retrógrado, se les presentará este increíble banner.

Debido a que es 2022 (también conocido como el futuro), existe una API para rastrear el movimiento de Mercurio. Puedo automatizar la activación y desactivación de esta actividad usando esta API:

https://mercuryretrogradeapi.com/

      
                
The future is crazy

Una vez que tengo mis claves de API, ahora puedo interactuar con Target a través de su API. Normalmente, haría esto en Python, pero Adobe tiene algunas bibliotecas de Node JS excelentes que desafortunadamente tienes que buscar para encontrarlas. En serio, mira a tu alrededor en NPM. Esto es lo que usaré:

  • La biblioteca Target AIO Node JS
    interactúa con las actividades de Target
  • Biblioteca de autenticación de Adobe
    Autenticarse con Adobe para realizar llamadas a la API
  • Axios
    llama a la API retrógrada
  • dotenv
    lee un archivo .env con variables de entorno (creds 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();

En primer lugar, el método setActivityState del SDK necesita algunos encabezados de tipo de medio especiales especificados en las opciones. El SDK no tiene esto integrado en los métodos ni especifica nada en las definiciones de los métodos, pero es obligatorio. Si obtiene errores 415 con cualquier método, vuelva a verificar los encabezados de este documento:https://developers.adobetarget.com/api/

El segundo parámetro en setActivityState es un operador ternario basado en lo que devuelve la API retrógrada. Si Mercurio está retrógrado ( verdadero según la API), la actividad se establecerá como aprobada. Si retrógrado es falso, la actividad se desactivará. Estos estados son un poco vagos y no reflejan la terminología en la interfaz de usuario de Target, lo cual es un poco molesto. Las definiciones en los comentarios se toman directamente de los documentos. No estoy seguro de cuál es exactamente la diferencia entre guardado y desactivado . De todos modos, pillas la idea. Vayamos a la parte divertida…

Aquí hay un par de opciones para automatizar esto. Podría usar AWS Lambda, pero luego debe aprender a implementar un proyecto de nodo en lambda y cómo programar trabajos cron a través de AWS Event Bridge. Estas tareas son en realidad más complicadas de lo que parecen si nunca las has hecho antes. En lugar de darle a Amazon más dinero. En su lugar, le daré algo de dinero a Akamai y usaré una máquina virtual Linode. Entonces puedo usarla para ejecutar muchos trabajos cron diferentes. Si nunca antes ha usado Linode, consulte su canal de Youtube. Puedo activar una nueva máquina virtual precargada con NodeJS o activar una en blanco e instalar Node manualmente. Elegiré lo primero.

Después de crear mi máquina virtual y verificar que puedo conectarme a ella a través de SSH , transfiero mi archivo mercury.js y el archivo package.json a través de SCP . Con respecto a las variables de entorno, también puedo transferir mi .env o configurarlos directamente en la máquina virtual. Tu elección. Una vez que se transfieren los archivos, puedo navegar a su directorio y ejecutar npm i para instalar todos los paquetes que necesitaré. También ejecutaré mercury.js un par de veces para asegurarme de que todo funcione:

# 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

Al final, mi archivo crontab tendrá esto en la parte inferior:

# etc
# etc
# m h dom mon dow
0 8 * * * cd /somepath/mercury && node mercury.js

Una nota rápida de que la interfaz de usuario de destino no siempre se actualiza de inmediato para reflejar los cambios de la API, pero puede verificar que la actividad se active a través de la sección Registro de cambios. Los cambios en la interfaz de usuario aparecerán después de unos minutos.

Ahora bien, este ejemplo es trivial , algunos incluso podrían llamarlo estúpido ( ¡cómo te atreves! ), Pero la configuración es real. ¿Qué sucede si ejecuta todos los tipos de actividades de Target con fechas específicas? Black Friday, Cyber ​​Monday, Super Bowl, Día del Presidente, Día de la Bandera, cumpleaños de John, etc. Podría tener todo tipo de actividades de destino que se activan y desactivan mediante programación en función de la fecha. Con una configuración inicial, ¡podría planificar un año completo de banners de ventas en unas pocas horas!