Interagindo programaticamente com uma atividade do Adobe Target com base no movimento de Mercúrio
Quero oferecer vendas especiais em produtos em minha loja virtual somente quando Mercúrio estiver retrógrado. Isso acontece apenas algumas vezes por ano, durante cerca de uma semana de cada vez. É conhecido por fazer com que os compradores online sejam especialmente suscetíveis a grandes negócios, entre outras doenças de base planetária…

Como uso o Adobe Target para exibir meus banners de vendas, só preciso olhar pelo meu telescópio todas as noites e ver se Mercúrio está retrógrado. Se for, entrarei no Target, criarei meu conteúdo de venda e ativarei a Atividade. Também precisarei desligar a Atividade quando Mercúrio não estiver mais retrógrado. De qualquer maneira, vou sair todas as noites.
Como nem sei como é Mercúrio nem possuo um telescópio, acho que devo automatizar esse processo. Como posso ativar minha Atividade automaticamente quando Mercúrio está retrógrado e desativá -la automaticamente quando Mercúrio não está mais retrógrado?

Vamos começar criando uma Atividade XT no Target com um banner exibindo algum conteúdo atraente:



Por ser 2022 (também conhecido como futuro), existe uma API para rastrear o movimento de Mercúrio. Posso automatizar a ativação e desativação dessa atividade usando esta API:
https://mercuryretrogradeapi.com/
The future is crazy
Depois de ter minhas chaves de API, agora posso interagir com o Target por meio de sua API. Normalmente, eu faria isso em Python, mas a Adobe tem algumas excelentes bibliotecas Node JS que, infelizmente, você precisa pesquisar para encontrar. Sério, dê uma olhada no NPM. Aqui está o que eu vou usar:
- A biblioteca Target AIO Node JS
interage com as atividades Target - Biblioteca de autenticação da Adobe
Autenticar com a Adobe para fazer chamadas de API - Axios
chama a API retrógrada - dotenv
lê um arquivo .env com variáveis de ambiente (API creds)
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();
Primeiro, o método setActivityState no SDK precisa de alguns cabeçalhos especiais de tipo de mídia especificados nas opções. O SDK não tem isso embutido nos métodos nem especifica nada nas definições do método, mas é obrigatório. Se você obtiver erros 415 com qualquer método, verifique os cabeçalhos deste documento:https://developers.adobetarget.com/api/
O segundo parâmetro em setActivityState é um operador ternário baseado no que a API Retrograde retorna. Se Mercúrio estiver retrógrado ( verdadeiro da API), a atividade será definida como aprovada. Se retrógrado for falso, a atividade será desativada. Esses status são meio vagos e não refletem a terminologia na interface do usuário do Target, que é meio irritante. As definições nos comentários são retiradas diretamente dos documentos. Não tenho certeza de qual é exatamente a diferença entre salvo e desativado . De qualquer forma, você entendeu. Vamos à parte divertida…
Há algumas opções aqui para automatizar isso. Você pode usar um AWS Lambda, mas precisa aprender como implantar um projeto de nó em lambda e como agendar tarefas cron por meio do AWS Event Bridge. Essas tarefas são realmente mais complicadas do que parecem se você nunca as fez antes. Em vez de dar mais dinheiro à Amazon. Em vez disso, darei algum dinheiro à Akamai e usarei uma máquina virtual Linode. Então, posso usá-la para executar várias tarefas cron diferentes. Se você nunca usou o Linode antes, confira o canal do Youtube. Posso criar uma nova máquina virtual pré-carregada com o NodeJS ou criar uma em branco e instalar o Node manualmente. Eu vou escolher o primeiro.
Depois de criar minha máquina virtual e verificar se posso me conectar a ela via SSH , transfiro meu arquivo mercury.js e o arquivo package.json via SCP . Em relação às variáveis de ambiente, posso transferir meu .env também, ou configurá-los diretamente na máquina virtual. Sua escolha. Depois que os arquivos são transferidos, posso navegar até o diretório e executar o npm i para instalar todos os pacotes necessários. Também executarei mercury.js algumas vezes para garantir que tudo 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
No final, meu arquivo crontab terá isso na parte inferior:
# etc
# etc
# m h dom mon dow
0 8 * * * cd /somepath/mercury && node mercury.js

Uma observação rápida de que a interface do usuário de destino nem sempre é atualizada imediatamente para refletir as alterações da API, mas você pode verificar se a atividade está ativada por meio da seção Changelog. As alterações da interface do usuário aparecerão após alguns minutos.
Agora, este exemplo é trivial , alguns podem até chamá-lo de estúpido ( como você ousa! ), mas a configuração é real. E se você executar todos os tipos de atividades de destino específicas de data? Black Friday, Cyber Monday, Super Bowl, Dia do Presidente, Dia da Bandeira, aniversário de John e assim por diante. Eu poderia ter todos os tipos de atividades de destino que ligam e desligam programaticamente com base na data. Com algumas configurações iniciais, eu poderia planejar um ano inteiro de banners de vendas em poucas horas!